文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。
来源 | AI科技大本营(公众号ID:rgznai100)
1. 前言
相信大家在日常上网的时候都会遇到“千奇百怪”的验证码,而在种类繁多的验证码家族中,文本验证码是使用最广泛的一种,也是我们遇到最多的一种验证码方案。近年来,随着深度学习技术的突破性发展,文本验证码的安全性也受到了挑战。通过收集大量目标网站的验证码,并训练一个深度网络模型,就可以实现对目标网站验证码的攻击。为了抵抗基于深度学习模型的攻击,一方面,各大网站都采用诸如字符扭曲、粘连、旋转,背景混淆,空心字体等多种复杂变换方案来提高文本验证码的安全性;另一方面,有些网站采用了诸如前端代码混淆、关键代码加密等反分析方式来防止验证码被恶意收集和自动爬取,进而通过增大攻击的成本来降低验证码被攻击的可能性。然而,上述两种方式真的能够增强验证码的安全性吗?
接下来,我将介绍一篇 ACM CCS 2018 上的一篇基于少量样本构建验证码求解器的论文:《Yet Another Text Captcha Solver: A Generative Adversarial Network Based Approach》,该论文是由中国西北大学的房鼎益、陈晓江教授团队、北京大学以及英国兰卡斯特大学联合发表的。
论文地址:
https://dl.acm.org/citation.cfm?doid=3243734.3243754
论文公开了部分源码:
https://github.com/yeguixin/captcha_solver
2. Idea的由来
我们在一次研究小组内关于AI的讨论中了解到了Generative Adversarial Networks(GANs),当时我们了解到GANs不仅可以生成目标数据,而且其改进技术Conditional Generative Adversarial Networks(CGANS)还可以实现图像自动标注的任务(如图像风格间的转换)。
图 1:“RGB->油画”转换效果图”
既然GANs有强大的生成能力,那么就可能生成海量与目标网站风格类似的验证码。CGANs既然可以实现图像风格间的转换(如图1所示),那么就能够去掉图像中的颜色,换句话说,就可以去掉验证码图像中复杂的混淆背景。上述两点设想对于减少训练样本、降低攻击成本有至关重要的作用。具体地,如果能够自动生成大量的验证码,就直接让攻击者从手动收集和标注验证码的繁重工作中解脱出来,进而降低攻击成本;如果能够去掉验证码中的背景,就能够减少训练样本的数量,从而提高模型的识别率。
图 2:预处理结果示例
然而,事情并没有我们预想的那样一帆风顺。虽然CGANs可以有效地去除验证码的背景(如图2所示)。但GANs的生成效果却没有想象中的好。GANs是通过随机噪声或高斯噪声来生成数据的,并且训练过程中需要大量的真实数据作为参考,而当前验证码中加入了非常复杂的字符变换,若要训练验证码生成模型,势必需要更多真实验证码作为参考。
既然使用随机噪声生成验证码需要大量的真实数据,那么我们就开始考虑使用传统验证码生成器去生成,将生成的验证码替换成随机噪声作为GANs的输入,让GANs对生成的验证码做微调。然后使用鉴别器评估生成的验证码的风格是否与真实验证码风格类似,即生成数据与真实数据同分布。于是,我们首先将验证码参数化表示,即所用的字符、字符旋转角度、扭曲程度、所用背景、所用字体等参数化,然后利用网络自动调整生成参数。这样就实现了数据的自动生成,减少了人工参与的工作量。利用生成的数据,就可以训练验证码识别模型。为了进一步降低生成数据与真实数据之间的差别,我们使用了迁移学习技术调优模型,从而提高模型的泛化能力和识别精度。于是,我们的整个Idea就这样产生了。
图 3:系统架构图
3. 系统架构和各模块简介
该系统主要分为4个模块(如图3所示),下面来简单介绍下各个模块的功能与作用。
(1)验证码合成模块。合成验证码之前,首先需要手动分析组成验证码的主要元素(论文中称为security features),如由哪些字符或数字组成,字符是否有扭曲和旋转特征,由哪些背景组成等,然后将上述元素参数化,并赋予初始值生成初始的验证码输入到GANs里面。随着GANs的训练,生成器不断调整生成参数,直到鉴别器无法鉴别是生成的还是真实的验证码。为了保证风格的一致性,我们使用了500个真实验证码参与到训练过程中。训练好生成器后,便可以生成大量的验证码用于构建初始的验证码求解器。需要说明的是,对于有背景的验证码,需要分别生成有背景和无背景的验证码,以便进行下一步的预处理。特别地,为了生成无背景的验证码,只需要将背景的那一项参数置为NULL。
(2)预处理模块 。这一模块主要针对具有背景或空心字体的验证码而设计的,主要目的是去除复杂的混淆背景,或者统一字体类型,以减少使用训练数据的数量,进而降低模型的复杂度、加快模型收敛速度。我们使用了Pix2Pix模型来完成这一步骤。以复杂混淆背景验证码为例(如图2所示),训练时输入有背景的验证码,同时输入无背景验证码作为参考数据。由于生成器使用了L1 Loss,能够很好的处理图像中的低频部分(图像的色块),故根据目标函数,生成器通过调整模型参数,最终能够将有背景的验证码转换成无背景的验证码。
(3)验证码识别模型的构建。该验证码识别模型使用生成数据来构建,对于每一种类型的验证码,我们使用了20万生成数据,利用LeNet-5来构建验证码识别模型,与LeNet-5稍有不同,我们增加了2层卷积层和3层池化层来增强其模型的识别能力。其中,每一层卷积层的卷积核大小为3*3,在池化层中使用了max-pooling。
(4)模型优化。为了进一步缩小生成数据与真实数据之间的差异,我们使用了迁移学习,利用少量的真实样本,将(3)中的模型进行调优。由于CNN模型的后面几层是更为抽象的特征,而由于真实样本数量的限制,我们的生成器在抽象特征上面与真实数据存在差异,故需要训练和调整模型后面几层的参数,并保持前面几层的参数不变。
4. 简单说说实验
实验数据方面,共使用了33种验证码方案,涉及网站超过50个,其中几乎全部都是世界主流网站包括Alexa全球排名前50的32个著名网站。对于每一种验证码,自动或手动收集和标记1500个真实验证码,其中500个用于训练生成器和调优CNN模型,1000个用于测试。实验结果表明,我们方法不仅识别率明显高于state-of-the-arts(如图5所示),而且时间开销明显要小(如图4所示)。对于有些验证码方案,我们的方法的识别率高于了人类的识别率。
图 4:当前网站验证码识别结果图
5. 如何应对
为了缓解此类攻击,建议网站同时使用多套验证码方案,验证码中每个字符都使用不同的字体和风格,并且需要频繁的更新(最好更新频率为一天)验证码方案,以增加攻击的成本使攻击难以成功。但这只是暂时的缓解措施,并不能从根源上增强验证码的安全性,而且复杂的验证码方案由于用户友好性差并不能很好的推广使用。我们也相信,资深的攻击者(或者黑产)会以更高的效率和更短的时间来发起攻击。目前,我们正致力于新的文本验证码生成方案。
图 5:与 state-of-the-arts 比较结果图
6. 对当前网站验证码的安全性分析和思考
我们发现,有些网站后台使用了机器人自动检测技术,即根据输入验证码时的输入速度、但应时间等行为特征来判断前端操作是人还是计算机自动程序。然而,我们近期的研究发现,这种检测技术也可以被骗过。若故意在相邻的两个操作之间间隔一定的时间,就可以很轻松的绕过这种检测机制。利用我们训练好的验证码识别模型,在两个仍然使用文本验证码的主流网站(其中一个使用了机器人自动检测技术)上进行了实验,大多数情况下攻击一次就成功了。
我们通过该研究来提高业界对验证码安全性的重视和关注,并呼吁业界开发和使用更加安全、用户更友好的验证码方案,也希望能与业界一道,在身份认证技术上,寻求更高的突破。
网友评论