“任意TCP远程劫持”亮相GeekPwn,这是真的吗?

 

想象一列火车从你面前呼啸而过,你蒙着眼睛,要用鸡蛋砸中十号车厢最右侧窗玻璃下方的一颗铆钉——...



今天不打广告,说点干货。

相信大家对今年澳门站的项目一定所有耳闻了,其中最难“为外人道”的项目便是“远程TCP劫持”。

2015年极棒最高奖清华团队带队段海新教授在“网络安全研究国际学术论坛"上,与受邀前去清华大学进行学术交流的钱志云教授谈及了极棒。无独有偶的是百度安全实验室负责人韦韬也曾与钱志云谈论过GeekPwn是一个很专业的极客平台,这些都为钱志云教授及团队和GeekPwn正式相遇埋下了伏笔。

不负众望的是在2016年5月12日GeekPwn澳门站现场,代表钱志云教授研究团队只身前来参加GeekPwn比赛的是来自美国加州大学博士生曹跃,他凭借成功地演示斩获了大赛三等奖、“最大脑洞奖”以及共计15万元的奖金。

连评委在现场评述时,都说“评价这个项目简直就是在考验评委”,还笑称自己也难以胜任让普通观众理解这是一个怎样的项目,选手所完成的是一件影响多么惊人的事情!

这里,我们先简单了解一下TCP协议的学术解释。


TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

连接建立整个过程,如下(即三次握手协议):

首先,客户机发送一个特殊的TCP报文段;

其次,服务器用另一个特殊的TCP报文段来响应;

最后,客户机再用第三个特殊报文段作为响应。
【果然还是搞不明白...】

或许,这么高质量的一个问题果然还是交给高质量的问答社区来解释一下,于是便有人问了这样的问题:
获得最多点赞数的人竟然是......
看到“对一般人生活没什么影响”这句,大家是不是都惊觉:难道是又被忽悠了?!继续看下去才知道原来另有玄机。

tombkeeper原版回答:

是真的。对一般人生活没什么影响。

这个问题的核心是发现了最近十年发布的所有Linux内核在TCP/IP协议栈实现上都存在一个安全问题,可以在几分钟内探测到一个TCP会话序列号。知道了序列号,就可以伪造数据包插入到该会话中。

这是一项非常了不起的研究,足以发表在四大顶级学术安全会议上,甚至可能拿到Best Paper。不过由于所需攻击条件较多,比如对网络稳定性的要求,特别是难以控制数据注入时机——想象一列火车从你面前呼啸而过,你蒙着眼睛,要用鸡蛋砸中十号车厢最右侧窗玻璃下方的一颗铆钉——所以虽然理论上能劫持任意TCP会话,但对大多数TCP应用来说,要利用这个技术最终实现入侵或窃密,还是有难度的。

------------------------------

补充一下:刚刚和作者确认,他们这项研究的论文前几天已经被四大顶级安全会议之一的USENIX Security接受了。



在今年GeekPwn澳门站,完成这一挑战的选手曹跃也进行了详细的解答:

感谢TK教主通俗易懂的回答。受邀来回答这个问题,也是我在知乎上的一血了。

这个工作是由我们加州大学河滨分校的安全研究团队完成。除了网络安全方向,我们团队也有进行系统安全方面的研究。团队目前还非常年轻,非常欢迎有兴趣有志向的朋友能够加入我们团队。

回到正题。因为攻击相关的报道也很多了,那这里长话短说:

1. 该攻击是真的。

2. 该攻击与中间人攻击无关,攻击者不需要获得任何通信双方的报文。

3. 在Geekpwn大会上展示的攻击分为两步:TCP连接劫持,TCP连接注入。第一步TCP劫持是对于TCP连接本身的劫持,是我们最大的创新贡献(contribution)。而第二步可以理解为对TCP协议上层的应用程序所做的攻击。因为每个程序的执行逻辑不同,注入的数据必须要依据程序本身的规则被理解,所以攻击者还必须要对应用程序的请求报文行为有个正确的预估。(TK教主所说的扔鸡蛋难题也正是针对这一步)。还有个限制是该报文不能被加密,也是由于注入的报文需要被理解这一个基本要求。

4. 攻击影响

因为时间有限,我们团队并没有花很大的精力去寻找相关的应用。当前已经找到的能预估的应用场景有部分网页,以及部分app的推送消息。我们非常怀疑有更多的应用程序,甚至是一些IOT设备(智能家居)能够被劫持。但很可惜在比赛中我们并没能展示这一点。

总体上来说这个工作还是偏研究,在实际的应用攻击方面我们并没有做足够深入的探索。但这并不代表没有其他安全人员甚至恶意黑客能找到对应的应用程序并进行攻击。而国内很多网页,应用程序重功能效果而轻安全,从而使得该攻击更容易达成。

而我们能做的就是马上上报该漏洞给linux开发者协会并期待他们尽快打补丁来弥补这个漏洞。而对于个人或者企业的影响是希望到时候能尽快更新补丁。对于开发者来说,在考虑到performance的同时,希望尽量加密报文从而杜绝攻击的可能性。

“乎友”圈圈也对这个问题进行了回答:

听去GeekPwn现场的人讲,评委判定这个TCP劫持项目成功了,那应该还是真的吧。据说是选手实现了一种能够在短时间内就探测到TCP连接端口号和序列号的技术,几乎所有的安卓和Linux系统都受影像。

TCP劫持/破解TCP序列号为什么被视为“不可能的任务”?

当主机与服务器通过TCP协议建立初始连接时,它们之间会发送一系列数据包,来创建一个连接。TCP协议要求把传输的数据分成大小适合的“包”,并给每个“包”一个序列号,接受者成功接收后也会发回一个相应的确认号(ACK)。

因此是否能够有效劫持一个连接,取决于攻击者是否能够预测出TCP序列号和端口号。序列号这是一个32位随机数,有40多亿种可能;端口号则6万多种可能,两者相叠加一共有超过280万亿种可能。在实际网络环境中,由于网络带宽以及相应TCP连接持续时长有限,这样的连接是不可能被暴力猜解的。当今TCP连接序列号的设计就是为了防止被破解。

当然,还有人是这么说的:个人愚见,‘任意TCP’应该是新闻稿记者偷偷实现的。:)
真相大白(●—●):这个漏洞是曹跃的指导老师钱志云在飞机上的时候审阅Linux内核代码时挖到的。而曹跃则将这个漏洞进行了横向和纵向的延伸。利用该侧信道,攻击者可以以较少的代价猜测出TCP连接的状态。

因为这个漏洞利用的是侧信道,研究困难主要是攻击复杂度以及不确定性,从想法到实现曹跃和团队花了半年多的时间优化攻击的成功率以及效率。在这半年多的时间里,他们对攻击进行了深入演化,最终达到了现在的TCP劫持攻击。

很有意思的是,他们发现了有三处侧信道漏洞,分别导致TCP状态被泄露: 1) 连接的端口号 (port number),2) 序列号 (Sequence number),3) 确认号(Ack number) 。虽然这些漏洞的利用方式稍有不同,但它们在RFC的同一个版本上引入,让研究者一度很费解。

这应该是世界上第一个做到完全不需要中间人或者执行任何恶意代码就可以劫持TCP连接的工作。TCP已经是古董级的协议了,但还能在里面挖到重量级的漏洞还是很不容易的(允许我们老王卖瓜一下)。这个漏洞是TCP的新规范以及Linux的实现双重问题导致,对将来制定TCP新规范有很好的参考意义。

——曹跃所在团队

最后还是一句话概括下:
“任意TCP远程劫持”亮相GeekPwn,这是真的。


GeekPwn澳门站

让舞台找到主人,让漏洞找到归宿
这八个GeekPwn澳门站彩蛋,你收到了没?
极棒澳门站前夜,他们真的都“给跪”了
这是欠你们的澳门站精彩开场视频
微信号: GeekPwn


    关注 GeekPwn


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册