所谓攻击面,**既是系统处理正常输入的各种入口的总和,也是未授权攻击者进入系统的入口。**在漏洞挖掘中,攻击面是最为核心的一个概念,超越各种流派、各种专业方向而存在,无论Web还是二进制,也无论Windows还是Android,总是在研究如何访问攻击面,分析与攻击面有关的数据处理代码,或者Fuzz攻击面。漏洞挖掘工作总是围绕着攻击面在进行。
就Android系统和App而言,通常所知的本地攻击面无外乎暴露组件、binder服务、驱动和套接字,远程攻击面无外乎各种通信协议、文件格式和网页链接。
在AOSP的漏洞评级标准中,中危漏洞和高危漏洞的评级都有这么一条:
High:Local bypass of user interaction requirements for any developer or security settings modifications
Moderate: Local bypass of user interaction requirements (access to functionality that would normally require either user initiation or user permission)
系统中需要用户交互进行确认的地方,一旦可以绕过修改安全设置或者产生安全影响,即认为出现了漏洞,这里与用户交互的对话框就是一种特殊的攻击面。
UI欺骗在浏览器中比较常见,但是在客户端漏洞中属于比较罕见。
这个漏洞发生在录屏授权的弹窗中,听人说是从野外病毒利用里发现的。
弹窗显示的内容为appname+“将开始截取您的屏幕上显示的所有内容”。appname系统是不会对长度做限制的,平时展示名称时超过长度的将以省略号显示。
而在这个录屏授权弹窗里未对长度做校验。导致关键的"将开始截取您的屏幕上显示的所有内容"未显示。修复方式是将中间信息以省略号代替,后面的关键信息展示出来。
这个漏洞发生在我们经常使用的蓝牙配对对话框中,如下图是正常的蓝牙配对对话框:
这里的Angler是对端的蓝牙配对设备。但是这个设备名是攻击者可控的,能否在这个攻击面上造成安全影响呢?
我们将对端的蓝牙配对设备名变长,并插入一个换行符,改为“Pair with Angler \n to pair but NOT to access your contacts and call history”,那么蓝牙配对对话框显示为:
虽然有一些奇怪,但用户一定会在是否共享通讯录和通话记录这个问题上比较纠结,“是的,我允许配对,但我不想共享通讯录和通话记录!”于是,误导配对用户勾选下面的复选框,反而达到与用户期望相反的目的,正中攻击者的下怀。
这个漏洞于2018年2月修复,可惜Google的修复并不完全,只是在Settings App中的Strings.xml作了限制,不允许对端配对的蓝牙设备名传入,将配对对话框中的提示内容变成了一个固定的字符串。但是,这个修复并不完全,没有考虑到其他蓝牙连接的入口。
Android蓝牙协议还支持PBAP和MAP Server,分别用于其他设备通过蓝牙访问手机的通讯录和短信,通常我们开车时通过蓝牙拨打电话、访问手机通讯录就使用了PBAP协议。通过PBAP协议和MAP协议,可以无需配对,直接在手机上弹出对话框,让用户确认是否访问通讯录和短信。PBAP协议确认对话框如下图所示:
但同样,临近攻击者可以将配对设备heen-ras重新命名,并插入许多的换行符
pi@heen-ras:~ $ sudo hciconfig hci0 name "heen-ras 想要访问你的通信录和电话簿, 要拒绝它吗?
>
…(skip)
>
> "
然后再次通过PBAP协议访问手机通信录,使用"nOBEX"这个脚本
pi@heen-ras:~/bluetooth-fuzz/nOBEX $ python3 examples/pbapclient.py <victim_bluetooth_address>
对比上下两图,确认对话框中的重要信息被隐藏了,并显示出相反的结果。在内部实际环境进行模拟检测,发现普通用户对此毫无招架,一般都会选择“是”,结果通讯录被全部窃取。这个漏洞最终于2018年7月修复,使用的方法是在BluetoothDevice类中过滤配对蓝牙设备名中的\r\n字符。
值得一提的是,同样是插入攻击设备蓝牙适配器的换行符,还可以远程注入蓝牙配置文件,攻击者可以设置蓝牙设备名绕过配对与Android设备建立蓝牙连接,这个严重级别的漏洞也在去年所修复,与上述两个漏洞异曲同工。同样是攻击面思维,漏洞作者将可控的蓝牙设备名传入蓝牙配置文件带来安全影响,而我们这里则是将蓝牙设备名传入配对对话框欺骗普通用户。
从攻的角度来看,UI对话框是一种特殊的攻击面,输入点为可控的文字一般以换行,占位等来掩盖关键信息达到UI欺骗的效果;
从防的角度来看,对话框也是一种重要的安全机制,开发者需在对安全或隐私有影响的操作前设置用户交互对话框,在用户同意后才可进行敏感操作,并仔细检查对话框中传入的内容,防止对用户进行点击欺骗。
[1]https://source.android.com/security/overview/updates-resources
[2]https://curesec.com/blog/article/blog/CVE-2013-6272-comandroidphone-35.html
[3]https://android.googlesource.com/platform/packages/apps/Settings/+/7ed7d00e6028234088b58bf6d6d9362a5effece1%5E%21/#F0
[4] https://github.com/nccgroup/nOBEX
[5]https://android.googlesource.com/platform/frameworks/base/+/a6fe2cd18c77c68219fe7159c051bc4e0003fc40