1. AGP安全基础与威胁模型
Android Gradle Plugin(AGP)构建链是从源代码、资源和依赖项到最终APK/AAB的核心管道。攻击者可以瞄准构建链的多个环节,植入恶意代码、替换依赖项或篡改输出。理解攻击面与漏洞类型是构建安全基线的起点。
1.1 AGP构建链攻击面
构建过程可划分为以下关键阶段,每个阶段都存在不同的安全风险:
- 源代码与资源阶段 – 被感染的IDE插件、恶意代码生成器、不安全的Lint配置。
- 依赖解析阶段 – 第三方仓库投毒、依赖混淆、拦截Gradle包装器下载。
- 编译与字节码阶段 – 恶意的编译插件、Java/Kotlin编译器后门、R8/ProGuard规则注入。
- 打包与签名阶段 – 签名密钥泄露、未签名APK部署、ZIP解压路径穿越。
- 交付与分发阶段 – 中间人篡改APK、构建产物被替换、CI/CD凭证泄露。
实战视角:超过70%的Android供应链攻击发生在依赖解析阶段。锁定依赖版本、校验Gradle包装器哈希值是成本最低的高优先级防线。
1.2 常见漏洞类型
| 漏洞类型 | 描述 | AGP构建链典型场景 |
|---|---|---|
| 任意代码执行 | 攻击者在构建过程中执行任意命令 | 恶意Gradle插件、任务注入 |
| 权限提升 | 低权限构建环境获得系统级访问 | 不安全的Gradle守护进程配置 |
| 信息泄露 | 密钥、令牌、源码被窃取 | 未加密的签名密钥、日志输出 |
| 拒绝服务 | 构建流程被耗尽资源或崩溃 | 无限递归依赖、恶意dex文件 |
| 供应链投毒 | 篡改上游依赖或构建工具 | 不校验Gradle包装器、不验证仓库签名 |
1.3 安全基线假设
任何安全方案都基于一组合理的信任假设。显式声明这些假设有助于避免盲区:
- 信任构建环境 – CI Agent或开发机未被入侵,系统与JDK补丁已更新。
- 信任插件与脚本 – 所有
build.gradle插件来自可信来源,并经过校验。 - 信任依赖来源 – Maven Central、Google Maven等官方仓库未被篡改(依赖验证除外)。
- 信任AGP与Gradle核心 – 发行版签名、校验和与发布方一致。
基线失效风险:如果攻击者突破了上述任意假设(例如通过社会工程学获取CI权限),则需要升级为运行时完整性监控与不可变构建管道。本章的后半部分会讨论工具链层面的防护手段。
1.4 工具链风险点
以下工具组件是攻击者最常利用的薄弱环节,需要优先加固:
- JDK – 使用旧版JDK可能存在远程代码执行漏洞(如RCE-2022-21363),需定期升级。
- Gradle版本 – 低于7.5的版本缺少依赖验证、输出完整性检查等安全特性。
- AGP版本 – 旧版AGP在签名、资源处理方面有已知漏洞(CVE-2023-21010)。
- NDK与CMake – 本机代码编译时若依赖不安全的工具链工具(如旧版GCC)可能引入内存安全漏洞。
- Android SDK – 不完整的安装或签名失效的SDK平台可能被降级攻击。
1.5 安全基线检查示例
以下 build.gradle 配置片段展示了如何锁定Gradle包装器、强制依赖验证并禁止不安全的HTTP仓库:
// gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip
distributionSha256Sum=5c5b5e6d2f...
// build.gradle (project level)
buildscript {
repositories {
// 只允许HTTPS仓库
maven { url 'https://maven.google.com' }
maven { url 'https://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:8.3.0'
}
}
allprojects {
repositories {
maven { url 'https://maven.google.com' }
maven { url 'https://repo1.maven.org/maven2' }
}
// 强制依赖校验,拒绝未签名或缓存不一致的模块
configurations.all {
resolutionStrategy {
cacheDynamicVersionsFor 0, 'seconds'
cacheChangingModulesFor 0, 'seconds'
// 启用仓库签名验证(需仓库支持)
// enabled = true
}
}
}
1.6 威胁模型框架图
下图完整概括了AGP构建链的攻击面,从源代码到最终分发,标注每个阶段的主要风险入口:
1.7 调试与验证
在加固构建链之前,建议先启用Gradle的调试日志输出,确认依赖解析和插件加载过程没有异常:
# 启用详细日志
gradle build --info
# 查看依赖树
gradle dependencies
# 检查AGP版本
gradle -q androidDependencies
如果发现不熟悉的依赖或插件来源,应立即暂停构建并审查仓库配置。
1.8 常见错误与避坑
- 忽视Gradle包装器校验 – 不设置
distributionSha256Sum会导致中间人轻松替换包装器。 - 允许HTTP仓库 – 部分旧项目仍使用
http://仓库,明文传输易被篡改。 - 使用全局未锁定依赖 –
+版本号会动态拉取最新快照,可能引入未审计的二进制。 - 签名密钥硬编码 – 将密钥直接写在构建脚本或环境变量中,泄露后永久失效。