虚假的安全:五大Android厂商自带隐私保护应用脆弱性分析及漏洞利用
Author: Xiangqian Zhang, Huiming Liu of Tencent Security Xuanwu Lab
0x00 简介
本文我们将详细介绍对Android手机厂商自带的隐私保护应用程序的研究。我们调查了排名前五的Android供应商提供的隐私保护应用程序,发现许多应用程序并不能很好地保护我们的隐私安全。我们针对隐私保护应用提出了3种威胁模型,并展示了4个隐私保护应用的攻击案例。该研究已经发表在Black Hat Asia 2021。
0x01 隐私保护应用简介
几乎所有的Android手机厂商都开发了一些隐私保护应用程序,例如安全文件夹,隐私空间,文件保密柜,应用锁等。不同厂商的隐私保护应用名字各不相同,但按照功能基本都可以分为以下三类:
1)保护文件安全,例如保密柜、文件保密柜、私密文件夹等。
2)保护应用安全,例如应用锁等。
3)独立的隔离空间,内部是一个独立于主空间的完整用户空间,例如安全文件夹、隐私空间、第二空间等。
左图是文件保密柜,用户可以将隐私文件保存在其中,访问隐私文件需要输入独立密码。中间的图片是应用锁,被加密的应用访问时需要输入独立的密码。右图是安全文件夹,是一种隔离空间类型的隐私保护应用。
我们调查了排名前五的Android手机厂商发布的隐私保护应用程序,结果如下表。它们至少发布了一种类型的隐私保护应用程序,其中两家厂商同时有这三种类型的隐私保护应用。
[*] 数据来自: https://www.counterpointresearch.com/global-smartphone-share/
0x02 威胁模型
隐私保护应用使用独立的密码保护文件、应用或者独立的空间。因此,即使攻击者能够进入手机系统(通过漏洞、指纹、锁屏密码),隐私应用也能够保证隐私数据的安全。所以这些隐私保护应用的目标如下:
文件保密柜:没有文件保密柜独立密码,即便能够进入手机系统,也无法获得保密柜中的文件。
应用锁:没有应用锁独立密码,即便能够进入手机系统,也无法访问被加密的应用。
隐私空间:没有隐私空间对密码,即便能够进入手机系统,也无法进入隐私空间,获取隐私空间中的数据。
对于隐私空间的攻击,我们想到了以下三种攻击手段:
A1:通过恶意应用发起攻击。
A2:通过拥有一定权限的恶意应用发起攻击。
A3:通过物理接触发起攻击。
我们的期望是无法通过以上三种攻击方式获取到被隐私保护应用所保护的数据。
但经过我们的研究发现,几乎所有的隐私保护应用都可以被以上三种攻击方式的至少一种攻破,详细情况如下图所示。
0x03 漏洞
根据以上攻击模型,我们发现了许多隐私保护应用漏洞。本文选取4个典型的例子详细介绍。
Vul Type #1 - 恶意应用窃取文件保密柜中的数据
用户可以将隐私数据存放到文件保密柜中,然后设置密码。通常文件保密柜会加密隐私文件。攻击者如果没有密码将无法获得该文件,也无法解密出文件。但是我们发现该文件保密柜将加密后的数据存储到了SD卡中,如图。
逆向分析后发现加密算法是 AES/CTS/NoPadding.
密钥Key是由deviceID生成的,Key = md5 (packagename + deviceID ) +10。
getDeviceId函数如下:
我们可以看到,如果IMEI不为空, Key = md5(packagename+imei)+10。
如果MAC不为空: Key = md5(packagename+mac)+01。
如果IMEI和MAC都是空: Key = md5(packagename+”0000000000”)+00。
因此,所以加密密钥Key仅依赖于IMEI、MAC,恶意应用程序或本地攻击者可以轻松获得加密密钥Key和加密后的文件,并恢复出原始文件。
看起来是一个很简单的漏洞,但我们发现其他厂商的安全文件夹也类似。例如:
该文件保密柜加密算法为AES / ECB。密钥是固定字符串:SHPLXYKZ(由字符串“SETTING”变换而来)。
还有另一个厂商的文件保密柜只用了单独的一个字符异或加密。
Vul Type #2 - 从TrustZone中提取出文件保密柜密码
在我们的研究中,我们发现有手机厂商的文件保密柜使用TrustZone。我们很高兴看到这一点,因为TrustZone能够非常安全地保护我们的隐私。如果手机厂商正确地将密钥和数据存储在TrustZone中,那么TrustZone将能够保证数据的安全性。
[*] https://arxiv.org/pdf/1506.07367.pdf
并且在该手机厂商的安全白皮书中也写到,用户的密码不会被存储,也不能够被恢复。
看起来似乎很安全了。我们设想正常的流程应该是:
Step 1: 用户输入密码。
Step2: 文件保密柜将密码发送到TEE接口验证。
Step3: TEE接口将用户密码发送到TrustZone去检查。
Step4: TrustZone应用检查用户的密码是否正确,返回检查结果。
Step5: 如果密码正确,TEE接口也会返回检查正确。
Step 6: 然后安全文件夹就可以使用用户输入的密码来解密文件。
Step 7: 用户就可以获得解密后的原始文件。
整个过程,安全文件夹的原始密码不会离开TrustZone,即便手机被root,攻击者也无法获得密码。这似乎是一个安全性很高的文件保密柜。但我们逆向后却发现实际流程是这样的:
在step 3中,TEE接口会直接从TrustZone中获取安全文件夹的原始密码。
Step 4: TrustZone应用会将原始明文密码返回到用户态,然后将其与用户输入的密码进行比较。如果用户输入的正确,就解密文件。这个过程中安全文件夹的明文密码从TrueZone中被传送至用户态,文件保密柜也就不再安全了。
下图是文件保密柜从TrustZone获取密码的函数。该函数的输入是boxFolderName,它是文件保密柜的文件夹名称,返回值是该保险柜的明文密码。
我们可以在用户态轻松地调用此函数来获取所有文件保密柜的密码。可以看到该厂商为了安全做了很大努力,使用了TrustZone来保护文件保密柜的密码,但是因为安全设计的失误,导致TrustZone完全没有起到应有的作用。
Vul type #3 绕过隐私密码
我们还发现几乎所有的隐私应用都可以通过指纹解锁。但是某些隐私应用并没有检查是否添加了指纹。因此,攻击者可以添加新的指纹来绕过隐私应用的独立密码。
此外某些隐私应用可以通过手机验证码重置密码。
所以隐私应用本来是为了在用户的手机被侵入后(通过漏洞进入、或者已经有指纹、锁屏密码的情况下)提供额外的一层保护,但实际上,当攻击者有解锁屏幕的权限后很容易绕过隐私空间的独立密码。
Vul type #4 打破隐私空间
最后,我们来看隐私空间。一个手机厂商在他们的隐私空间类产品“安全文件夹”中介绍说:用户可以在设备上创建安全空间,以加密和存储您的私人数据和应用程序。安全文件夹中的应用程序和数据将分别在设备上沙箱化,并获得了额外的安全性和隐私层,从而进一步保护了它们免受恶意攻击。
看起来“安全文件夹”似乎非常安全,因此对它的实现感到非常好奇,就对该应用程序进行了分析,结果发现它调用了Android UserManager多用户的API来创建另一个空间。
我们用adb命令列出所有的用户时,输出如下:
当我们启用“安全文件夹”后,系统会新建一个名为“Secure Folder”的用户,这也证实了上面的分析。Android官方文档对多用户的描述如下:
通过分离用户帐号和应用数据,Android 支持在一台 Android 设备上添加多个用户。例如,父母可能会允许他们的孩子使用家庭平板电脑,一个家庭可以共用一辆汽车,或者应急响应团队可能会共用一台移动设备用于呼叫值班。(https://source.android.com/devices/tech/admin/multi-user)
当系统中存在多用户时,用户的数据存储目录如下:
1 | /data/user/<userId>/<app.path> |
那么是否能够通过当前用户去获取到其他用户的数据呢?
在仔细阅读文档后我们发现Andoid多用户的设计目标与隐私空间的设计目标并不一样。多用户的场景是一个用户为主用户,可以控制其他用户的行为。而隐私空间的场景要求当前用户无法获得隐私空间的用户数据。而Android手机厂商却直接用多用户来实现隐私空间,那么当前用户是否能够获取到隐私空间的数据呢?
我们发现系统预留了一些adb接口,可以对其他用户空间进行操作。包括pm,am,adb install等。我们还可以使用Content Provider来读取或写入其他用户的数据。详细的命令参考:https://source.android.com/devices/tech/admin/multi-user-testing
分析了厂商的隐私空间后我们发现所有厂商的隐私空间类应用都没有patch掉该接口。也就是说,通过系统提供的接口,我们可以完全控制隐私空间。可以通过以下方式:
1. 向隐私空间安装恶意应用:
adb install --user ID myApp.apk
2. 启动隐私空间中的应用:
adb am start --user ID com.example.app
3. 给隐私空间中的应用授权:
adb shell pm grant --user ID com.herbo.test android.permission.READ_EXTERNAL_STORAGE
4. 获取隐私空间中的数据:
adb shell content write --user ID --uri content://android.tradefed.contentprovider/sdcard/some_file.txt < local_file.txt
adb shell content read --user ID --uri content://android.tradefed.contentprovider/sdcard/some_file.txt > local_file.txt
我们录制了一个demo来展示这种攻击。
这是一种通用的攻击方法,所有手机厂商隐私空间类的应用,例如安全文件夹、隐私空间、第二空间等都存在问题。
0x04 修补方案
基于以上漏洞,对于开发人员,我们提出了以下缓解方案:
1) 正确使用TrustZone。
2) SD Card并不安全,重要的数据不要存放在SD Card中。
3) 不要使用IMEI / MAC作为密钥或生成密钥。使用android_id会更好,因为不同应用的android_id是不同的(在Android O之后)。
4) 隐私保护应用应充分考虑本地攻击的情况。
0x05 结论
几乎所有的Android厂商都提供了隐私保护应用,例如安全文件夹、隐私空间、文件保密柜、应用锁等。它们声称这些应用非常安全,但是我们对这些隐私保护应用进行了全面研究后发现这些应用几乎都存在各种安全漏洞。许多设计和开发缺陷可以使攻击者轻易攻破这些隐私保护应用,这将影响数十亿用户。
我们在5大Android厂商中的隐私保护应用中发现了13个安全漏洞,本文展示了4个具体的攻击案例。所有的漏洞都已在2020年4月报告给了相关的手机厂商,大部分漏洞已修复。
0x06 Reference
[1] https://www.counterpointresearch.com/global-smartphone-share/
[3] https://source.android.com/devices/tech/admin/multi-user-testing