[CVE-2021-25440] [Samsung] [FactoryCameraFB] CameraTestActivity导出存在文件读写权限泄露漏洞

Date
Version
Description
Author

2022.11.26

1.0

完整的漏洞分析与利用

wnagzihxa1n

0x00 漏洞概述

0x01 触发条件

上线日期
应用名
包名
版本号
MD5
下载链接

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