这几天读了2篇关于流量分析攻击的文章,写下一些核心思想和主要问题。
情景设定:被攻击者通过SSH、SSL隧道连接到某个代理,通过该代理访问互联网;攻击者可以获得二者之间往来的加密数据包。由于数据包都是通过加密方式发送到某服务器,所以攻击者唯一能知道的就是数据包发送的大小和时间。如何推测出用户正在访问什么网站呢?
核心思想:不同的网站在访问时,链路上往来的数据包的大小是不一样的,例如,访问www.baidu.com 、www.sina.com.cn 和 www.njupt.edu.cn 时得到的IO吞吐数据分别如下面3张图所示:
将这些数据包的大小,按时间排序,得到一个序列(这个序列描述了这个网站的特征)。不同的网站访问时,得到的序列也是完全不同的。攻击者先花费一定的时间,通过SSH或SSL的加密隧道,对大量的网站进行访问,记录下这些网站的数据包序列,构成一个大的字典。攻击时,只需将被攻击者某次会话的所有数据包的包头截下来,将数据包的大小构成一个序列,然后用这个序列与字典中的候选序列进行比较,选择相似度最大的前几个网站,作为猜测的结果。
主要难点:如何判断两个序列的相似性?http://web2.0coder.com/archives/73 讲到了一个和这个问题相似的例子:
有五本书,a,b,c三个童鞋看过,它们对这五本书的评价如下(分数为1~5):
A = [1, 2, 4, 3, 5]
B = [2, 4, 3, 3, 4]
C = [3, 3, 2, 2, 3]
问题,谁和用户A的口味比较相似?
作者给出了几种方法,其中就包括论文中提到的 Jaccard系数。
论文中提到的另一种方法是朴素贝叶斯方法
(详情参看:
和http://blog.csdn.net/pongba/article/details/2958094)。前中一般在数据挖掘和机器学习中使用,后一种方法属于随机过程的知识。
作者分别使用上面的方法,制作出分类器进行实验,结果显示一次性猜对的可能性不是太高,在20%-40%之间,但是10次猜中的可能性高达80%。
当然,由于互联网上的网站实在太多,实验中作者并没有将所有的网站加入到字典中,而是从中选取了一定数量个访问频率最高的网站做成了一个字典,供查询匹配使用。
攻击的防范:在另一篇论文中,作者针对上面的方法提出提出了防范措施,主要就是通过改变数据包的大小,降低攻击者判断的准确性。具体如何改变,方法就有很多,比如:在数据包中添加一些额外的字节;将TCP包拆分成多个小的数据包发送;时不时地要求服务器重新发送某个TCP包;降低链路的MSS的大小;调整滑动窗口的大小等等。通过这些方法可以明显的降低攻击者判断的准确性。
论文链接(前两篇讲攻击原理,第三篇讲防范):
http://www.springerlink.com/content/1062w684754754h4/
http://dl.acm.org/citation.cfm?id=1180437
http://hostmaster.freehaven.net/anonbib/cache/LZCLCP_NDSS11.pdf