[CVE-2021-25440] [Samsung] [FactoryCameraFB] CameraTestActivity导出存在文件读写权限泄露漏洞
2022.11.26
1.0
完整的漏洞分析与利用
wnagzihxa1n
0x00 漏洞概述
0x01 触发条件
FactoryCameraFB
com.sec.factory.camera
3.4.43
f1f9f8bf5250724bd461ed656c1dbe61
0x02 PoC
0x03 前置知识
0x04 Root Cause Analysis
组件com.sec.android.app.camera.CameraTestActivity导出
<activity
android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
android:excludeFromRecents="true"
android:label="@string/app_name"
android:name="com.sec.android.app.camera.CameraTestActivity"
android:noHistory="false"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>当组件CameraTestActivity被启动的时候,首先调用方法onCreate(),[1]获取外部传入的__mTestCode__,这个字段会在后续流程中使用到,方法isCameralyzerTest()返回false,不会进入[2],直接走入label_187,[3]将传入的Intent保存在__mIncomingIntent__
只需要系统种不存在包名为com.sec.factory.cameralyzer的应用或者字段__mTestCode__不为如下几个值,即可让isCameralyzerTest()返回false
方法getTestCode()的数据需要从全局变量里取,[2]先匹配,匹配上再获取[3]
方法onCreate()执行完后,进入onResume(),方法isCameralyzerTest()返回false,[2]取传入Intent,在方法onCreate()里赋值的__mTestCode__不能是TestCode.NONE,满足这几个条件之后,[3]调用方法runTest()
[2]会根据__testCode__构造Testlet,这里实际上有多种路径,如果方法isRestrictedTestByOsVersion()返回值为true,可以调用[4],如果返回值为false,则会直接返回
方法isRestrictedTestByOsVersion()通过构造参数可以返回true也可以返回false
不管走那个路径,最后都会走到方法sendResultAndFinish(),然后将传入Intent传入方法setResult(),如果这个Intent里包含读写标志位和文件URI,即可泄露文件的读写权限
方法sendResult()实际上是发送广播
完整的逻辑调用图
0x05 调试与利用
Oversecured实验室的PoC
0x06 漏洞研究
0x07 References
《Two weeks of securing Samsung devices: Part 2》
https://blog.oversecured.com/Two-weeks-of-securing-Samsung-devices-Part-2/
附录:调试过程记录
Last updated