一串字符居然要了腾讯QQ的“命”!这并不是危言耸听,早在去年就发生过此事,你通过腾讯QQ给你的任何一位好友发送一条特定的代码过去,对方的QQ便会突然退出系统……
后来,通过补丁程序,这个问题得以解决。但紧接着,针对腾讯QQ的恶意代码似乎越来越多,腾讯QQ也只能对应这些代码来更新自己的程序。但总不可能每出一种代码就得更新QQ吧,腾讯难道只有招架之力?腾讯QQ的“病”到底出在什么地方?
病魔现身 QQ病魔的两段字符串都很复杂,代码模式上也大同小异。然而如果你在腾讯QQ上将以上两段字符串发送给任意一个好友,结果可大不一样。前一个字符串会使对方的屏幕上出现非常可爱的“Merry Christmas”字样,而后一个字符串则会使对方的QQ在瞬间当掉,出现“非法操作”,也就是这样的代码便可轻易除掉QQ(在上期E6“查漏补缺”栏目中已介绍)。
为什么治不了 可能会有人说,这是腾讯QQ的一个消息漏洞。但为什么这个漏洞频频曝光而不能根治呢?这个漏洞其实是一个明显的解析器漏洞,但这个漏洞出在腾讯QQ的身上却似乎把自己的大门向任何一个人敞开。目前的腾讯已经无法控制别人的进入……
因为,即时通讯工具之间的消息和控制传递是通过包装后的文本流进行的。其目的是为了传送可以修饰的字体等控制字符。在网络上通过即时通讯工具传递的,除了文本流没有别的东西。引起显示和控制动作的,只是文本流的解析器的解析。
注:文本流是指消息文本和控制指令在网络中的传递形式,是以文本的形式传递的。
然而,腾讯QQ的设计败笔便在此,也就是腾讯QQ的病根。因为它的通讯协议竟然不能够分辨文本流中的消息和控制字。这是什么意思呢?打个有趣的比方,现在从一端发送“Format C��”,如果另一端的解析器解析成控制字,它就会把硬盘给格式化了。当然腾讯QQ还不至于此,但通过一段代码便可当掉QQ的原理和这个是完全一样的。当一个用户在消息框中输入文本的时候,这些文本当然应该被作为消息显示,而不是作为控制字来引起控制动作。但是遗憾的是,腾讯QQ并没能够做到这看起来几乎是最基本的要求。
紧急关头 为了让聊天的用户能够用多种表达方式来聊天,用单纯的纯文本形式是很难办到的。这也是为什么腾讯QQ会把用户键入的消息文本视为一种脚本的原因。但目前的问题在于腾讯自始至终都没有将这种脚本编写纳入正常的设计考虑(腾讯给出的官方帮助中只字未提在消息文本中可以编写脚本一事),而一旦在一端可以写脚本控制另一端,事情就变得比较危险。
目前,比较严重的一个问题是缓冲区溢出漏洞,这是黑客们的老把戏了。黑客利用程序代码中没有仔细检查用户输入参数的缺陷,有意地植入大体积数据造成缓冲区溢出,这样,溢出的部分就可以被CPU解释成指令,从而得到意外程序代码的执行。或者就简单导致程序崩溃。在文章开头的B例中,便是如此的攻击消息代码,代码很简单,目的也只是为了让QQ程序崩溃,似乎也只是一个新手所为,如果是一位对机器指令极为熟悉的高手,那么格式化硬盘可就不只是一句玩笑了。
注:缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出从而导致程序崩溃。
真的无药可治? 为了防止这个病根,民间也给QQ打了不少补丁,但几乎都是治标不治本。现在要让这种病永远不会发作,似乎也是不可能的事情,因为腾讯QQ的消息传送构架早已设计,半途来完全改造也不切实际。
要让这个问题有所好转,腾讯有必要对通信协议作一次彻底的改动,保证在发送文本流的时候做合适的捆扎,在接收的时候作出正确的解析,以使那些和控制字相同的消息文本与真正的控制字完全地区分开来。如果能让腾讯QQ能有效地判断并区分消息和控制字,便可减少恶意代码的出现,也许会大大降低被攻击的概率。比如以“\font��字体名��”表示字体控制,就要有办法表示内容是这段文本的消息,而不会意外地将它解析成为控制指令。这是腾讯很容易办到的,但遇到熟悉机器指令的一样也会骗过QQ。如果让一切控制字由系统生成,而不由用户自己指定也许更加有效。
腾讯QQ是不少网友的必备工具,它也让我们的网上生活更加丰富,我们也希望腾讯公司能够尽快解决这个问题,别让QQ太危险! (狄立赫列)
|