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 安全基线假设

任何安全方案都基于一组合理的信任假设。显式声明这些假设有助于避免盲区:

  1. 信任构建环境 – CI Agent或开发机未被入侵,系统与JDK补丁已更新。
  2. 信任插件与脚本 – 所有build.gradle插件来自可信来源,并经过校验。
  3. 信任依赖来源 – Maven Central、Google Maven等官方仓库未被篡改(依赖验证除外)。
  4. 信任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构建链的攻击面,从源代码到最终分发,标注每个阶段的主要风险入口:

AGP构建链攻击面 AGP构建链攻击面框架 源代码 & 资源 IDE注入/恶意Lint 依赖解析 仓库投毒/依赖混淆 编译 & 字节码 插件后门/R8注入 打包 & 签名 密钥泄露/ZIP穿越 交付 & 分发 中间人/产物替换 ⚠ 攻击面 代码投毒 / 权限提升 ⚠ 攻击面 供应链投毒 / 信息泄露 ⚠ 攻击面 任意代码执行 / 后门 ⚠ 攻击面 签名欺诈 / 拒绝服务 JDK漏洞 Gradle版本 AGP版本 NDK/CMake Android SDK 图:AGP构建链攻击面与工具链风险点 每个阶段对应一种以上常见漏洞,工具链风险贯穿全流程

1.7 调试与验证

在加固构建链之前,建议先启用Gradle的调试日志输出,确认依赖解析和插件加载过程没有异常:

# 启用详细日志
gradle build --info
# 查看依赖树
gradle dependencies
# 检查AGP版本
gradle -q androidDependencies

如果发现不熟悉的依赖或插件来源,应立即暂停构建并审查仓库配置。

1.8 常见错误与避坑

  • 忽视Gradle包装器校验 – 不设置 distributionSha256Sum 会导致中间人轻松替换包装器。
  • 允许HTTP仓库 – 部分旧项目仍使用 http:// 仓库,明文传输易被篡改。
  • 使用全局未锁定依赖 – + 版本号会动态拉取最新快照,可能引入未审计的二进制。
  • 签名密钥硬编码 – 将密钥直接写在构建脚本或环境变量中,泄露后永久失效。