上一篇
安卓代码审计
- 行业动态
- 2025-04-24
- 4401
安卓代码审计需审查权限配置、组件暴露风险,检测数据存储加密,排查Intent破绽及第三方库隐患,确保应用安全合规
安卓代码审计核心流程
阶段 | 关键操作 |
---|---|
环境准备 | 搭建Android Studio/命令行开发环境 配置逆向工程工具(如Jadx/Apktool) 准备代码版本管理工具(Git/SVN) |
静态分析 | 代码结构审查(包名规范/目录结构) 权限体系检查 敏感API调用追踪 加密实现验证 |
动态分析 | 沙盒环境部署 运行时日志监控 网络流量捕获 异常处理测试 |
结果处理 | 破绽分级(高危/中危/低危) 修复建议生成 复测验证闭环 |
关键审计维度与检测点
权限体系审计
权限类型 | 审计重点 |
---|---|
危险权限 | • 定位权限滥用(后台持续定位) • 读写存储权限与文件操作匹配性 |
特殊权限 | • 无障碍服务权限使用场景 • 系统警报窗口权限合理性 |
权限动态申请 | • 是否符合Android 6.0+运行时权限机制 • 权限申请时机合理性 |
组件安全审计
组件类型 | 风险点 |
---|---|
BroadcastReceiver | • 隐式广播注册 • 未设置exported属性导致外部调用风险 |
Service | • 未设置android:exported=”false” • Intent过滤器暴露风险 |
ContentProvider | • 未明确定义read/write权限 • URI路径遍历破绽 |
加密实现审计
加密场景 | 常见错误 |
---|---|
本地存储 | • Hardcode密钥(SharedPreferences/SQLite) • 弱加密算法(DES/MD5) |
网络传输 | • HTTP明文传输 • TLS版本低于1.2 • 证书锁定不完整 |
代码混淆 | • ProGuard规则不完善(保留类/方法) • 混淆强度不足导致逆向破解 |
典型破绽案例分析
WebView安全隐患
<WebView android:layout_width="match_parent" android:layout_height="match_parent" android:javascriptEnabled="true" />
风险点:
- 未开启
domStorageEnabled
限制 - 未设置
webViewClient
导致URL跳转劫持 - 未启用
safeBrowsingEnabled
防御反面网页
SQL注入风险代码
public void login(String username, String password) { String query = "SELECT FROM users WHERE name='" + username + "' AND pwd='" + password + "'"; // 执行SQL查询... }
修复方案:
SQLiteStatement stmt = db.compileStatement("SELECT FROM users WHERE name=? AND pwd=?"); stmt.bindString(1, username); stmt.bindString(2, password);
审计工具矩阵
工具类别 | 推荐工具 |
---|---|
静态代码分析 | • LintChecks • FindSecBugs • PMD with Android ruleset |
逆向工程 | • Jadx(Java反编译) • Apktool(资源解析) • Frida(动态hook) |
行为监控 | • Burp Suite(代理分析) • Charles(HTTPS抓包) • Systrace(性能追踪) |
自动化扫描 | • MobSF(移动安全框架) • AppScan • Accuvant |
代码加固建议清单
防护层级 | 实施措施 |
---|---|
代码混淆 | • 启用ProGuard/R8混淆 • 过滤关键类(防核心逻辑被逆向) |
完整性校验 | • APK签名防改动 • 关键文件MD5校验 • 安全启动页(防二次打包) |
运行时防护 | • PIE(位置无关执行) • JNI层地址空间布局随机化(ASLR) • 堆栈保护 |
【问题与解答】
Q1:如何检测安卓应用中的硬编码敏感信息?
A1:可通过以下方式检测:
- 静态扫描:使用正则表达式搜索
.java/.xml
文件中符合密钥特征的字符串(如-----BEGIN CERTIFICATE-----
) - 字节分析:通过
xxd
或strings
命令查看APK二进制,搜索连续数字/特殊字符组合 - 行为监控:在动态调试时,关注网络请求头/加密函数参数中的固定值
- 工具辅助:MobSF等自动化工具会标记明文密钥和硬编码凭证
Q2:如何防范安卓应用被逆向工程?
A2:多层防护策略:
- 代码层面:
- 启用ProGuard混淆(最小化保留类)
- DEX文件加密(如微信的mm.jar)
- 关键逻辑拆分到NDK层(增加逆向难度)
- 运行时防护:
- 检测调试器(
Debug.isDebuggerConnected()
) - 校验应用完整性(签名校验+文件哈希比对)
- 防内存dump(
PTRACE_TRACEME
反调试)
- 检测调试器(
- 法律手段:
- 添加版权声明和反爬虫条款
- 关键接口加入频率限制和IP黑名单