invisible CAPTCHA to defeat spam

Posted by c4pr1c3 on January 15, 2011

好久没有写与安全相关的技术文章了,没啥可写的是主因,没啥能写的是次因,没啥该写的是扯淡。今天一天的工作告一段落,各方面进展良好,看了看我的草稿箱,就挑这个主题update一下发布了。

写在前面的科普

anti-spam最早的含义应该就是指的反垃圾邮件,没别的原因,就是早期互联网的一个重要应用就是电子邮件,所以利用电子邮件进行垃圾信息传播是spammer们的主要工作内容。随着互联网技术的发展,BBS、Blog、SNS、Twitter等等信息载体、媒介成为互联网上更受关注的信息传媒,spam的目标也就自然而然的盯上了这些“新媒体”。

从spam的内容角度来说,上面提到的这些垃圾内容载体主要是文本、图像、二进制文件(例如PDF、Word等),VoIP的出现,又带来了语音垃圾信息——SPIT (Spam over Internet Telephony)。视频有吗?这个我还真没听说过。

从spammer的动机来说,套用我们从小到大政治考试一直在用的一个模版:“政治、经济、文化”。对,就是这三个方面的动机。政治,不用说了,大家都明白。经济,包括广告营销、市场推广、钓鱼欺诈等等,归根到底都是为了一个字——钱。文化,这个比较悬乎,但确实有案例,只是与本文主题关系不大。

好了,介绍了这么多关于spam和spammer的历史和背景,下面就快进入正题了。

anti-SPAM的方法论

信息安全这门学科的精髓是什么?我个人的最大一点体会就是:对抗!有对抗,一定至少有攻和守,即至少有2方势力的存在。只有一方势力的安全研究方向是什么呢?我看就是自己YY!对抗中可以有多于2方存在,但至少应该是有攻有守的。对于anti-SPAM来说,攻方就是spammer,守方呢可以是安全管理部门,也可以是网络应用的运营者,还可以是最终用户。

现在的spammer最偏爱的spam策略有哪些呢?我概括一下就是2个关键词:自动化批量。无论是自动化,还是批量,最终目的都是spammer们为了少花钱,多干事;撒大网,抓大鱼。

针对上述spam策略,安全研究人员们天天加班、通宵、吃泡面、敲键盘,捣腾出了一种经典的anti-SPAM方法:CAPTCHA

CAPTCHA的全称是Completely Automated Public Turing Test to tell Computers and Humans Apart,其精髓在于“区分计算机人类”。这里收集了15个极富创意的CAPTCHA应用,还有卡内基梅隆大学的reCAPTCHA项目在stop spam的同时,还可以帮助实现古籍和珍贵纸质文献材料的数字化保存。在看过了这些CAPTCHA方法之后,我们是不是发现这些anti-SPAM方法的一个共同特点?对,需要最终用户的交互过程!确实,计算机程序是无法和CAPTCHA进行即兴的交互的(不要和我谈虚拟机技术,这里只是泛指)。只有人类可以做到!所以CAPTCHA成功了。

从用户体验的角度来说,这些需要用户参与认证过程的CAPTCHA方法肯定是影响了正常用户体验的。特别是reCAPTCHA,经常有人抱怨说看不清上面的鸟文。

好了,我们可以开始头脑风暴了。能不能不要用户参与交互但仍然完成CAPTCHA过程?

答案是有的!就是我今天要隆重介绍的invisible CAPTCHA!

invisible CAPTCHA的原理

以Web应用的invisible CAPTCHA为例,其基本假设是spam bot无法准确解释执行和理解客户端代码(如Javascript)!正常用户访问和使用Web应用时,都是使用浏览器的。现代的浏览器,有谁不支持js?spam bot呢?前面已经讲过,自动化、批量是spam bot的主要设计原则。因此,我们就可以利用这个特点来区分计算机和人类!即:能正常执行js代码并返回“随机”(并不是强制的)认证token的,就可以识别为人类!否则,则是spam bot!

看两个例子吧:

例1:利用js生成邮件地址

例2:利用js阻止垃圾评论

我的站点联系方式用的就是例1,我的blog反垃圾评论就是例2。在这里就不再多浪费空间贴代码了,有兴趣的可以看看。基本思路都是一致的,区别在于例1是利用js代码去动态拼接字符串,在页面加载完毕后,延时组装出完整的邮件地址。例2是利用js代码hook几个DOM事件,并在用户触发这几个DOM事件之一时返回一个静态的token给服务器,服务器端代码见到此token就认为是一个“人”留言,而不是机器人。

可见,这两个例子都没有实现“随机”token。至少到目前为止应用效果还可以,如果被突破了,再update : )

invisible CAPTCHA的不足

说了半天,invisible CAPTCHA似乎很好用啊。但各位看官注意了,invisible CAPTCHA的应用基本假设是spam bot无法准确解释执行和理解客户端代码(如Javascript)!相比较于图像OCR技术,搞个支持js的spam bot还是更容易一些的。所以,只要spammer们愿意投入“金钱”去研发,完全是可以针对性的开发spam bot WordPress版、Discuz版、Drupal版等等。

invisible CAPTCHA还可以改进吗?

我目前能想到的一个主要改进思路,还是从用户的正常使用过程来入手。例如,预设一个正常用户的操作流程或者通过一些随机的延时,只有当用户按照预设操作流程(链)之一进行操作,才会逐个触发相应的invisible captcha,而不是一次性触发。增加spam bot的开发复杂度是这个思路的核心思想。对抗嘛,不要一成不变就好,咱都得持续演进: ) 还有就是多种anti-SPAM方法的综合使用,CAPTCHA毕竟只是众多anti-SPAM方法中的一种,而即使是CAPTCHA这一种方法在实际应用中也有很多有创意的新方案。根据信息安全对抗的“种群”理论,“物种”的多样性是维系“安全生态圈”“和谐”的最重要基础。

延伸阅读可以看看参考文献列的3篇文章,从时间上来看,都不是啥新东西了,但在我今天看来还是挺好的思路。本文权当是新瓶装旧酒,灌水一篇,谨记。

附录

收集了一些有创意的CAPTCHA实现:

  1. 利用鼠标手势http://designmess.com/tutorial/use-mouse-gestures-captchas-and-email-protection
  2. 类似iphone的解锁滑块http://accessibiliteweb.com/stuff/captcha-slider.html
  3. 视频广告中“插播”CAPTCHAhttp://emediavitals.com/content/creative-formats-online-display-advertising http://www.nucaptcha.com/products/engage
  4. 基于“云服务”的多因素(内容、来源、历史等)分析http://akismet.com/
  5. 微软的“猫狗识别”——asirrahttp://research.microsoft.com/en-us/um/redmond/projects/asirra/
  6. 3D图形分类数数——ironclad-captchahttp://www.securitystronghold.com/products/ironclad-captcha/
  7. 恶搞的BT验证码http://www.kingwq.cn/article/play/20100927558/

参考文献

  1. Lightweight Invisible CAPTCHA Validator Control
  2. What is a good invisible captcha?
  3. The Invisible Captcha Mechanism (ICM) against Form Spam