几天前,The Intercept公布了一个有关英国和美国的情报部门(GCHQ和NSA) 的故事,讲述了他们如何在代号为“Anarchist” 的项目中截获以色列无人机和战斗机的实时视频信源。文章中提到了分析师如何于1998年首次收集到加密的视频信号,以及信号是如何从各种各样的无人驾驶飞机和战斗机中获取的,而这样做是为了识别信号所属的飞机、武器系统或雷达。这篇文章打算稍微深入地研究故事中的技术细节,附带一些泄露出来的文件。
无人机通信
无人机通常通过卫星和被称为“下行”传输装置与地面控制人员沟通。Troodos天线通过为每个无人机寻找合适的频率截获了下行数据。泄露文档提到,来自以色列无人机的一个被称为S455N的SOI在不同的时刻被发现。这种采用移频键控(FSK)调制的信号被编码成9.11 兆波特,占据大约10 MHz带宽。后续信号处理显示出一个包含IP / UDP数据包的有效载荷,并携带多个协议,其中主要是实时传输协议(RTP),用于提供音频和视频内容。RTP流中包含的数据是一种多流MPEG 4视频,每个流对应不同的相机。
无人机信号加密
文档中名为S455e的SOI存在加密和不加密两种形式,但实际上它们在频域中受到检查时很难区分。在扰频信号中,视频帧没有改变, 在持有加密的元数据的屏幕顶部, 数字信息有两行被编码在文本区域内,这种加扰技术被称为“线割和旋转”。这种技术能够在特定位置切割视频信源的每一行,用相反的顺序传输两个部分.
手册中讨论了很多开源材料的实用性。GCHQ培训手册中概述的方法如下:
•拦截SOI
•从加工过的SOI中捕获视频帧位图(BMP)
•使用ImageMagick将位图转换为便携式象素映射(PPM)
•使用AntiSky对图像解扰
•使用ImageMagick查看清晰的形象,如果需要可以将它转换成一个更方便的格式
手册中提到, 解扰图像所需的计算量相当大,但通过解扰单个的框架来确定图像内容仍然是可行的。
VideoCrypt
让我们看看VideoCrypt方案。VideoCrypt作用于PAL编码格式的视频信源。PAL视频信息以交错形式从上到下存储在线路中。组成一个视频帧的线路上的256个可能的切割点都被切断,然后两部分的每一行都会进行交换传输。一连串的切割点是由智能卡上PRNG生成的一个伪随机序列确定的。
为了将信号解码,译码器将与智能卡连接检查卡片是否为一个特定的频道授权,如果是,那么译码器将在卡的PRNG中找到视频信号的信源。
显然,线割和旋转的方法有些不足,因为它在某一时刻只沿着一个轴(x轴)改变图像。BBC使用了一种叫做VideoCrypt-S的变体,可以将图像沿y轴改变(如第5行可能被传播到第10行),支持三种格式。但是这种变体只能在BBC选择服务中使用,并不适用于文章中所讨论的用于获取无人机视频文件的算法。
VideoCrypt 的PRNG和键控散列函数
60位PRNG信源适用于一个给定的框架,并送入PRNG产生一系列的8位秘密割点,有效地制定密钥流,VideoCrypt所使用的键控散列函数是一个定制的哈希函数。哈希函数在Python中如下:
#!/usr/bin/env python """ VideoCrypt Keyed Hash Algorithm as described in http://www.cl.cam.ac.uk/~mgk25/vc-slides.pdf """ class VideoCryptHash: def __init__(self): # PRNG sequence self.answ = [0]*8 self.j = 0 # Secret-key based S-Box (details unpublished so replaced with identity mapping) self.sbox = [i for i in xrange(0x00, 0x100)] return # Round function as per BSkyB P07 card def round_function(self, p): self.answ[self.j] = (self.answ[self.j] ^ p) c = self.sbox[self.answ[self.j] / 16] + self.sbox[(self.answ[self.j] % 16) + 16] c = ((((~c) << 1) + p) >> 3) % 0x100 self.j = (self.j + 1) % 8 self.answ[self.j] = (self.answ[self.j] ^ c) return # Keyed hash function with 'signature check' def keyed_hash(self, msg): assert(len(msg) == 32) self.answ = [0]*8 self.j = 0 for i in xrange(0, 27): self.round_function(msg[i]) b = 0 for i in xrange(27, 31): self.round_function(b) self.round_function(b) if (self.answ[self.j] != msg[i]): return [] self.j = (self.j + 1) % 8 # Only in P07 b = msg[i] for i in xrange(1, 65): self.round_function(msg[31]) return self.answ v = VideoCryptHash() print v.keyed_hash([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x03,0xF6,0xED,0])
键控的散列函数是为了抵御攻击者的复制。在最初的VideoCrypt系统中没有卡或解码器特有信息,因此一张卡可被用于多个解码器(即“卡共享攻击”)。是否被用于无人机地面控制人员和无人机个体信源取决于VideoCrypt中的智能卡得到多大程度的改造。
对VideoCrypt加扰方案的分析
一个被动的攻击者截获视频信源后需要处理如下几件事:
•加密元数据:来自于使用了键控散列函数的PRNG信源的32字节的消息
•视频信源“密文”
鉴于我们对PRNG一无所知,无法获得键控散列函数。最直接的方法就是对扰频视频进行密文分析。幸运的是不规则排列可以在不需要秘密割点密钥流的情况下被打破。鉴于两条连续的线在大多数图像中几乎相同,可以尝试所有256个可能的割点并选择最佳的两个相邻行。马库斯·库恩的AntiSky项目所使用就是这样方法,对每个图像进行强力图像处理攻击在实践中似乎足够有效,尽管图像质量会受到损失。情报分析人员拦截无人机信源不会太关心图像清不清楚,只需要提炼出有价值的情报。AntiSky用优化的方法衡量两条线的相关性,并使用动态规划算法来降低整体的复杂性。
Michael Niedermayer 对AntiSky算法的一个改进版本如下:
• (可选) 缩减像素采样来加速互相关
•互相关:尽管AntiSky使用基于FFT的互相关,自适应互相关将更为可取
•配错的线检测方法:不适用于互相关的线(即不能正确匹配)需要标记为“不匹配”,防止影响对周围的线的评估。
•PAL相位检测和发现彩度相位差: 如果我们想要将颜色解码就需要做到这一点
•边缘检测: 使用一个动态边缘检测器检测图像左和右边界,计算从顶部到任何像素最优路径。边缘检测可以检测出最小距离的范围,因此排除许多假的“替代边缘”。
•割点序列发现:使用动态规划我们可以结合上述信息来找到最优割点序列。
•割点缓存:使用缓存查找防止候选割点重复
•切割和交换: 沿着最好的候选割点切割扰频行,交换线段给复原图像让位。
示范
我们可以有效地遵循“Anarchist”的手动过程,尝试库恩网站上提供的videocrypt扰频图像。
usr@machine:~# mogrify -format ppm r-vc1.jpg usr@machine:~# gcc -lm -o antisky antisky.c antisky.c: In function ‘main’: antisky.c:615:5: warning: incompatible implicit declaration of built-in function ‘memcpy’ [enabled by default] usr@machine:~# ./antisky -1 -r20 r-vc1.ppm r-vc1.decrypted.pgm usr@machine:~# mogrify -format png r-vc1.decrypted.pgm
培训手册中提到,解扰是一个反复试验的过程,直到能够产生像样的复原图像。
Video解码:另一种整理方法
在他的网站上讨论了另一种解扰的方法。尽管库恩在获得图像时使用标准PC视频捕捉卡和任意分辨率/扫描速率, Steer却依靠对目标系统的一些基本假设,“完美”地译解了图像。Steer给了一个例子,常见的机顶盒采样视频信号在14 mhz,每行256个可能的割点,割点不存在于图像左/右边缘的最小距离,但可以确定割点都落在1 /(7 mhz)间隔上。Steer的算法首先过滤掉PAL副载波,只留下亮度信息,通过每一行的所有可能的割点旋转计算平方差异,找出最适合的。经过上述过程后,结果是一个像素完美的图像,但左/右边界在水平上会存在全反失真。整理后,图像会经过Steer的PalColour程序的处理。
经验教训?
最明显的经验是, 90年代初的模拟PayTV加扰算法已经不适合无人机信源“加密”。本文利用的信息可以追溯到2010年,现在这些东西很可能已经改变了。现成的硬件解决方案看起来很有吸引力,因为强大的加密方案将需要不断纠错,从而对无人机模型进行改进。
还没有评论,来说两句吧...