防止中间人攻击
去年,几个游戏组的同事给我描述了他们发现的针对游戏的中间人攻击(MITM attack)。有人做了一个代理服务,种植木马到用户机器上,使用户机器对游戏服务器的 tcp 连接都重定向到代理服务上。(这个步骤其实不一定在用户机器上做,网关和路由器上都理论上存在被做手脚的可能,这是用户自身无法保证的。
代理服务可以一直监听用户到服务器的通讯,直到认为认证过程结束,不再转发用户的数据,改由自己操作用户的帐号。这样就可以达到转移用户虚拟财产的目的。
今天,和几个同事讨论了这个问题和解决方案。
之前,游戏部门的同事已经做出很多改进,增强了通讯协议的安全。但仔细分析后,我发现还是有些漏洞,想总结一下,找到个更安全的方案。
先列出一个简化版的协议,后面再讨论其中的问题:
client 产生一个随机数,用 client 和 server 共知的秘密(在这里是用户密码和将军令产生的 OTP 一次性密码),加密个随机数,发还给 server 。为了保证 server 能认可这个结果,还需要附加一个校验值 checksum 共同编码。
server 解出一个随机数,校验完毕后,以此为通讯密钥,建立一个加密信道,和 client 保持通讯。
在这里,由于中间人不知道 client 和 server 公有的秘密,而这个秘密又没有在通讯中传递,所以它只能充当转发人的角色,而不能监听和伪造双方中的任一方。
这里存在的问题:
网易的将军令产品(以及市面上的类似产品)能产生的 OTP 长度有限,是 6 位 10 进制数字,大约是 20bit 左右。如果把安全寄托在 OTP 上,强度太低。
因为协议中的握手过程,大家需要相互认可,这个认可标准是不受保护的。唯一可以利用的是事先约定的秘密。中间人完全可以截获握手过程的一切通讯,然后离线暴力尝试,以这个握手成功的标准去找出 OTP。当 OTP 的强度只有 20bit 时,在很短的时间就可以试出来。而 OTP 的有效期可以长达一分钟,是很难理论上杜绝这种暴力攻击的。
我的建议:
第一,可以使用 RSA 这样的算法,把共有的秘密转移到 RSA 的 key pair 中。这样就有了 128bit 甚至更高的强度。RSA 的 public key 可以有更多的方案发放到 client 中,所以理论上可行。问题仅在于 RSA 等不对称加密算法运算量太大,仅靠软件实现时,有可能服务器承担不起。
第二,我们降低 checksum 的长度,不超过 8bit 。这样,不只合法的 OTP 会满足这个 checksum ,还会有大量的 fake OTP 也满足 checksum 。中间人在穷举的时候会拿到大量 fake OTP 。按 OTP 一共 20bit 计算,大约有 2^12 约四千种可能。由于 OTP 有一分钟的生命期,只需要限制在这一分钟内允许尝试的次数(比如说 4 次),那么,单次握手,被试出的可能性就只有千分之一了。在此基础上需要进一步限制同一 ip 对任意帐号的尝试频率。可以提高安全性。
有道 的周枫在我们讨论的时候找到了一份 ppt ,其中 16 到 19 页讨论了类似的问题( Page 16: How to set up a strong, shared key, given only a short OTP ),可供参考。
Comments
Posted by: cq12yue | (27) August 1, 2015 02:58 PM
Posted by: 猪立业 | (26) January 29, 2015 01:02 PM
Posted by: dylrockies | (25) December 2, 2008 11:31 AM
Posted by: Viruskiller | (24) November 5, 2008 09:06 AM
Posted by: struct | (23) August 10, 2008 08:30 PM
Posted by: kypck | (22) May 24, 2008 11:34 AM
Posted by: black | (21) May 23, 2008 04:15 PM
Posted by: 天堂的隔壁 | (20) May 23, 2008 03:22 PM
Posted by: JackH | (19) May 23, 2008 09:58 AM
Posted by: nothanks | (18) May 23, 2008 08:56 AM
Posted by: Hermit | (17) May 23, 2008 08:41 AM
Posted by: lbaby | (16) May 23, 2008 08:25 AM
Posted by: rocky | (15) May 23, 2008 03:36 AM
Posted by: Felix Wong | (14) May 23, 2008 03:06 AM
Posted by: luke | (13) May 23, 2008 01:21 AM
Posted by: Cloud | (12) May 23, 2008 12:01 AM
Posted by: 七生 | (11) May 22, 2008 11:02 PM
Posted by: zhuzhuor | (10) May 22, 2008 10:35 PM
Posted by: sboy | (9) May 22, 2008 10:30 PM
Posted by: sboy | (8) May 22, 2008 10:16 PM
Posted by: Hermit | (7) May 22, 2008 10:09 PM
Posted by: Hermit | (6) May 22, 2008 09:59 PM
Posted by: Hermit | (5) May 22, 2008 09:51 PM
Posted by: srdrm | (4) May 22, 2008 09:14 PM
Posted by: joeh | (3) May 22, 2008 05:57 PM
Posted by: Googol | (2) May 22, 2008 05:40 PM
Posted by: joe wulf | (1) May 22, 2008 05:34 PM