谷歌的 reCAPTCHA 验证系统
对于谷歌浏览器的用户来说,上面这幅画面想必并不陌生。这是谷歌开发的验证码系统 reCaptcha,旨在确认访问者是人还是程序,并防止恶意程序的入侵。
reCAPTCHA 项目是由卡内基梅隆大学创建的系统,于 2009 年 9 月被谷歌收购。reCAPTCHA v1 将从书本上扫描下来、无法被 OCR 准确识别的文字显示在 CAPTCHA 问题中,从而判断访问者到底是程序还是人类。该版本被 Bursztein 等人破解,他们使用基于机器学习的系统对文本进行分割和识别,准确率达 98%。
为了反破解,谷歌引入了基于音频和图像的 reCAPTCHA v2。该系统使用了一些高级的分析工具来判断一个用户到底是人还是机器人。
他们使用了多种元素,包括 cookie、解题的速度、鼠标的移动以及解题的成功率。但尽管如此,还是有研究人员宣称自己破解了 ReCAPTCHA,其中比较有名的就是美国马里兰大学四位研究人员开发的 unCapture。
用 unCaptcha 攻破 reCAPTCHA
unCaptcha 项目最早创建于 2017 年 4 月,并在当时实现了 85% 的 ReCaptcha 对抗率。后来,谷歌发布了新的 ReCaptcha,实现了更好的浏览器自动检测,而且开始使用短语语音进行验证。这些改进最开始成功地防御了第一版 unCaptcha 的攻击,但这一改进版很快又被第二版 unCaptcha 破解了。
由于 ReCaptcha 添加了语音形式的验证码识别,破解 ReCaptcha 变得比以前更加容易。破解者表示,「因为我们只需要调用一个免费的语音识别 API,对所有验证码的识别准确率就能达到 90% 左右。」今年一月份,破解者还开源了 ReCaptcha 的破解代码。
用强化学习「攻破」reCAPTCHA v3
当然,谷歌也没有闲着,一直在迭代自己的验证系统。2018 年 10 月,谷歌正式发布 reCAPTCHA v3。谷歌这次放出的大招是:移除所有用户界面。
前两个版本的 reCAPTCHA 有可利用的文本、图像或音频,可以将其用作训练神经网络的输入。但 reCAPTCHA v3 移除了所有用户界面,没有拆开乱码文本或街道标志,甚至也没有勾选「我不是机器人」的方框。
它会分析一系列信号,使用机器学习技术返回一个 0 到 1 之间的风险评估分数(这个分数表征了用户的可信任度,越接近 1 越有可能是人类)。与前两个版本相比,这种打分完全是在后台进行的,根本没有人类交互,因此破解难度更大。
破解从哪儿入手?
这么高难度的项目当然会引得各路「黑客」跃跃欲试。近日,来自法国和加拿大的研究人员声称自己破解了谷歌的 reCAPTCHA v3,并根据自己的研究成果发表了一篇名为《Hacking Google reCAPTCHA v3 using Reinforcement Learning》(使用强化学习破解谷歌的 reCAPTCHA v3)的论文。与之前研究的不同之处在于,他们使用的是强化学习方法,测试准确率达到了 97.4%。
实际上,这项强化学习技术并非针对 reCAPTCHA v3 中不可见的分数,而是 reCAPTCHA v2 中首次引入的鼠标移动分析。也就是说,这项研究并非真正攻破 reCAPTCHA v3,而是用机器学习欺骗二级系统(即旧版的「我不是机器人」打勾操作),以绕过 reCAPTCHA v3。
等等,「我不是机器人」这种界面不是已经在 v3 中被移除了吗?理论上是该这么做,但在实际操作中并没有。
论文一作 Akrout 表示,在 reCAPTCHA v3 中,网站设置其分数阈值以判定用户是否为机器人。如果访客在某个设定点低于阈值(比如当他们输入评论或登录细节时),网站可以选择立即谴责该访客是机器人,不过真这么做的话,如果访客是真人就会很尴尬了。
想象一下在网购的时候,你正在查看的页面突然消失,随之而来的是满屏的「你是机器人」谴责。就问你糟不糟心?从用户体验的角度来看这种做法实在太……emmm…
因此,Akrout 表示,很多网站会选择更友好地缓和这个过程。如果网站访客低于分数阈值,网站会显示旧版的「我不是机器人」复选框页面,这个复选框用来发现机器人的分析行为,包括鼠标移动等。
这样可以让用户更好地理解为什么他们的网购或其它正在干的事会被打断,而且会给他们一个证明自己人类身份的机会。
「我认识的大部分程序员会添加复选框,因为他们不知道如何选择恰当的时机来询问 v3 系统的判断。」
正是这个复选框的存在让 Akrout 和他的同事们发现了绕过 reCAPTCHA v3 的可能。
怎么破解?
Akrout 及其同事利用强化学习来欺骗部分 reCAPTCHA v3 系统,其中软件智能体试图找到最佳的可能途径,并通过正确方向上每一步的奖励受到鼓励。
他们的系统在页面中放置一个正方形网格,鼠标沿对角线穿过网格到达「我不是机器人」按钮。如果成功,则给予正面强化;如果失败,则给予负面强化。该系统学会了控制正确的移动方法以欺骗 reCAPTCHA 系统。该论文中称其准确率达到了 97.4%。在论文发表后,谷歌未对该论文置评。
这样破解真的可以吗?
这种做法并没有让伯恩茅斯大学的 Nan Jiang 信服,他没有参与这次研究。「理论上来说,任何仅依赖于检查用户行为的验证码方法都可以用定制的机器学习算法破解,比如那种可以轻易地模拟用户在页面上交互的算法。
但是,谷歌的 ReCAPTCHA 结合了其它技术来预测用户的可信程度,然后尝试把该用户纳入白名单。一旦你被纳入白名单,无论你做什么都可以通过测试。」他表示。
破解 reCAPTCHA 版本 2 的伊利诺伊大学计算机科学助理教授 Jason Polakis 指出,reCAPTCHA 版本 3 的工作要比论文中描述的更多。
他说道:「本文试图展示的攻击仅仅是从页面中的随机起点移至复选框。这是用户在实践中与实际页面产生交互的非常具体和有限的子集(如填写表格、与多页面元素交互以及跨越更复杂模式等)。」
他还补充:「如果谷歌也已经改善浏览器/设备指纹等更先进技术的利用(我们在进行广泛深入分析和破解 ReCaptcha 版本 2 时已经发现了这些迹象),实际上展开攻击将会变得更为复杂。」
Akrout 同意基于鼠标移动的攻击存在局限,但这些也揭露了一点关于 reCAPTCHA 版本 3 工作的信息。他表示,「如果你通过一个常规 IP 连接谷歌账户,则系统大部分时间都会认为你是人类。」如果你通过 TOR 或者代理服务器连接谷歌账户,则系统通常会认为你是机器人。
如果测试的网站已经具有这种默认设置,了解这些则更容易迫使 reCAPTCHA 系统显示「我不是机器人」按钮。
Akrout 表示攻击需要对谷歌表现出中立性—所以没有登录账户,也没有通过代理服务器或使用 Selenium 等浏览器控制工具进入。他说道:「这就好像是我在要求该系统直接进入第二个页面,其目的仅是为了获得大量移动检测。」
Akrout 认为谷歌可以通过这项技术(特别是根据用户点击按钮花费的时间),使用更简单的方法来保护 reCAPTCHA。Akrout 表示,「该智能体点击复选框花费的时间比人类更多。在没有任何交互的情况下,任何用户通常都不会影响 reCaptcha 在后台的工作。」
肯特大学的网络安全教授 Shujun Li 先前已经设计了自己用于破解 reCAPTCHA 早期版本的系统,但并没有参与这个项目。他表示这项工作从技术层面看似可行,但也认为谷歌可轻易更新其系统以避免此类攻击。
他说道:「尚未清楚的是,该攻击方法被重新训练至何种程度才能赶上谷歌系统。可能更加稳健的一种方法是收集真正人类用户对 reCAPTCHA 的响应,并构建机器学习模型来模拟此类响应。这些模型很容易被重复训练,而且能够保证有用,除非 reCAPTCHA 对常规人类用户不可用。」
Li 表示破解这些系统的确还有很多其他方法。虽然这种特定攻击受到限制,但 reCAPTCHA 将继续沦为人工智能系统牺牲品的事实并不意外。
Li 表示:「破解验证码并不是什么新闻了。最近的 AI 进展已经大大提高了自动攻击的成功率。原则上,验证码技术已证明无法抵制先进的攻击。」本文的研究或许无法破解第 3 版 reCAPTCHA,但这是一个开始。
论文:Hacking Google reCAPTCHA v3 using Reinforcement Learning
论文链接:https://arxiv.org/pdf/1903.01003.pdf
摘要:本文提出了一种可以欺骗谷歌 reCAPTCHA v3 的强化学习方法。我们将 reCAPTCHA v3 视为一个网格世界,智能体在这个世界里学习如何移动鼠标并点击 reCAPTCHA 按钮获得高分。
我们研究了在改变网格中格子大小时智能体的性能,结果显示,当智能体向目标大步前进时,其性能会大大降低。最后,我们用了一个分治策略来应对任意网格分辨率,以攻破 reCAPTCHA 系统。我们提出的方法在 100 × 100 的网格中实现了 97.4% 的胜率,在 1000 × 1000 的屏幕分辨率上实现了 96.7% 的胜率。
实验结果
研究人员在一个特定尺寸的网格上训练了一个强化学习智能体。他们的方法是将训练得到的策略用于在 reCAPTCHA 环境中选择最佳行动。实验结果是在训练 1000 轮之后得到的。
如果智能体得到 0.9 分,他们就认为该智能体成功攻破了 reCAPTCHA。策略网络是一个全新的双层全连接层网络。参数是以 10^(-3) 的学习率训练得到的,批大小为 2000。
下图显示了智能体在 100 × 100 的网格上得到的结果。该方法以 97.4% 的胜率成功攻破了 reCAPTCHA 测试。
接下来考虑在更大的网格上测试该方法。如果增加网格的大小,状态空间的维数就会指数级增加,在这种情况下训练强化算法并不可行。这是本研究解决的另一个难题:如果不为每个分辨率的网格重新训练智能体,该如何攻破 reCAPTCHA 系统?
为此,研究人员提出了一种分治方法,可以攻破任意网格大小的 reCAPTCHA 系统而无需重新训练强化学习智能体。中心思想是将网格进一步切分为子网格,然后将训练得到的智能体应用到这些子网格上,以为更大的屏幕寻找最优策略(见图 2)。图 3 显示了该方法的有效性,在不同大小的网格上胜率超过了 90%。
图 2:分治方法图示:智能体在紫色的对角网格世界上运行。红色网格世界还没有被探索。
图 3:强化学习智能体在不同网格分辨率上的胜率。