条码这个古老的技术如今已成为物理世界和数字世界的接口。不管是随处可见的扫码器,还是人手一部的手机,扫一下码就在两个世界间穿越了。可能有人告诉过你随便扫码很危险,但到底有多危险?为什么危险?
昨天于旸在 GeekPwn 演讲中展示了它的危险性。如果你没有听说过于旸,也许对他另一个名字更熟悉——「TK 教主」——来自他用的 ID「Tombkeeper」,这是一个在安全行业如雷贯耳的名字。去年他加入腾讯,组建了玄武实验室,开展多项面向未来的安全技术研究。
他们研究条码后发现,利用一张印有条码的纸就能攻破一台计算机。
(于旸,腾讯玄武实验室负责人,他在 GeekPwn 大会上展示了条码的危险性。)
下面的内容在于旸演讲的基础上编辑而成。
条码:一种机器可读的数据表示形式条码的历史非常长,早在上世纪 40 年代末就有人想到条码这个主意并开始实验。它的原理很简单:使用某种协议将信息编成图像,用条码阅读器或手机获取图像,将图像交给芯片,把图像解码转换成信息,最后传输到电脑。
它的应用无处不在:超市收银时扫描包装袋上的条码获取价格;医院扫描病历上的条码读取病人信息;商家扫描微信支付条码收款……
这些条码大多是一维码,另一种条码是随着微信普及而重获新生的二维码(它还有个名字叫 QR Code)。条码使用的协议非常多,有一种协议叫 Code 128, 这是一个非常有野心的协议,它支持全部 ASCII 字符。ASCII 是二进制对应的字符,现代计算机使用这套字符编写代码。它对于计算机编程而言相当于拉丁字母之于各种西方语言。总之,用它能编写代码控制计算机。
市面上的大部分条码阅读器都支持这种协议,这意味着黑客可以编写一段程序,转化成条码,通过条码阅读器传输到计算机上。
这些代码怎么才能管用?绝大多数情况下,条码阅读器通过 USB 接口接入计算机,对计算机而言这就是一个输入设备,计算机只捕捉它们发过来的信号,从哪儿发过来对电脑来说是一样,如果它发送通常由键盘发送过来的信号,计算机也会一样执行。
如果你将键盘种的热键,比如 CTRL+2, CTRL+O 等编成条码,通过条码扫描器输入计算机,便能直接控制计算机。Code 128 协议不支持 Win+R 这种热键,但最大的条码阅读器厂商 Symbol 公司还有一种特有的技术叫 ADF,它支持 Win+。这样控制的内容就更广了,能直接调出计算机的命令窗口。
以前的攻击方式以前有过一个研究,将条码作为一笔输入源看待,能通过条码触发计算机内存的溢出,或触发格式化字符串,还能 SQL 注入等。
还有一种更简单的攻击方式,大部分应用场景下,条码种的数字都是按照序号排列的,比如你去商店买个东西,商家给你一个条码取货,你先获取条码种的数字,再在此基础上做改变,比如+1,+2…… 这样就能拿无限的东西。下一个在你后面买东西的人拿到的条码已经被你刷过。
对二维码来说还有一种常见的钓鱼攻击。
玄武实验室的研究:用条码做任何事之前那些攻击方式都关注在应用程序对条码输入的数据没有很好处理,而不是条码或者条码阅读器本身。
如果回头去看对条码和条码阅读器的研究,会发现其实条码可以作为控制计算机的一种方式。玄武实验室将这种方式叫做 BadBarcode。
Demo 1: 对话框攻击
正常情况下条码输入的是数字或字母,但现在不输入这些内容,而是一个系统热键,比如 xx,这样扫描条码时就会把对话框调出来,如果这时候计算机使用的是触摸屏(比如很多银行终端机所使用的那种),你就能执行你想执行的事情了。
Demo 2: 纸片攻击
不是所有设备都有触摸屏,能不能只用条码完成所有交互?这时候便可以通过一连串条码的组合来实现。
Demo 3:全自动攻击
自己一个个扫描很累对不对?把黑客精神发挥到极致,能不能找到一种全自动的攻击方式?之前我们考虑是否写个手机 App,里面自动滚动代码扫描,但发现大部分扫码器无法读取手机屏幕。因为扫码器使用激光阅读,激光的原理是反射光,但液晶屏背光,所以得到了对比度很低,肉眼看到的东西对激光来说是黑的。
最终发现,答案是 Kindle。它的显示基于反射环境光,DPI 足够高,Kindle 可编程。是完美的 BadBarcode 工具。
事先编写好程序,将 Kindle 放在扫码器下面,就能自动控制计算机做一系列的事情。
安全建议条码阅读器生产商:默认不开启类似 ADF 功能,默认不向主机传输 ASCII 控制字符;
使用者:尽量不要选用 PS/2 或 HID 键盘模拟条码阅读器;对使用 PS/2 或 HID 键盘模拟条码阅读器的设备,可通过禁用热键以阻止 BadBarcode 攻击。
(头图来自tattoosforyou.org;感谢极客公园李甘对本文提供的帮助。)
联系客服