MASTG-TECH-0131: 在构建时对 Android 依赖项进行软件组成分析 (SCA)
现代 Android 应用程序严重依赖第三方库,这使得依赖项安全成为一个至关重要的问题。软件成分分析 (SCA) 工具检查依赖项元数据,例如包名称和版本,并将其与公共漏洞数据库(如国家漏洞数据库 (NVD))进行比较,以帮助识别已知的漏洞。
在 Android 开发中,依赖项在构建过程中被解析和编译,最终成为应用程序 DEX 文件的一部分。因此,必须扫描在构建环境中出现的依赖项,而不仅仅是在最终 APK 中。这种方法确保准确分析所有库,包括传递依赖。
由于依赖项是在构建环境中声明和解析的,因此将 SCA 工具集成到构建系统中是最有效的策略。 Gradle 在这种情况下尤为重要,因为它是 Android Studio 使用的默认构建工具,也是 Android 项目中最常见的依赖项管理系统。
使用 dependency-check¶
要测试具有已知漏洞的依赖项,请通过 Gradle 将 dependency-check 插件集成到 Android 项目中。 Android 项目的依赖项位于目录 ~/.gradle/caches/modules-2/files-2.1
中,而不是位于 Android 项目目录中。
在运行扫描之前,获取 NVD 的 API 密钥以检索最新的 CVE 信息。您可以从 https://nvd.nist.gov/developers/request-an-api-key 请求 API 密钥以访问 NVD API。
信息
在最新版本的 dependency-check (在撰写本文时,最高版本为 12.1.1)中,您可能会遇到多个与 ZipFile.builder()
相关的 'NoSuchMethodError' 消息。可以通过 固定 org.apache.commons:commons-compress
的版本 来解决此问题。
在 Module: app
的 build.gradle
中(不是项目 build.gradle
文件),添加最新版本的 dependencycheck
依赖项和 dependencyCheck
配置
plugins {
...
id("org.owasp.dependencycheck") version "12.1.1" // This is the latest version at the time of writing, please update accordingly
}
dependencyCheck {
formats = listOf("HTML", "XML", "JSON") // Generate reports in HTML, JSON and XML format
nvd {
apiKey = "<YOUR NVD API KEY>"
delay = 16000
}
}
在 Android Studio 中打开一个终端并执行以下命令
$ ./gradlew dependencyCheckAnalyze
...
BUILD SUCCESSFUL in 6s
1 actionable task: 1 executed
该报告以 3 种不同的格式(HTML、JSON 和 XML)生成,可以在项目目录的 app/build/reports
中找到。
抑制误报
如果有一些您想要抑制的依赖项,因为它们是误报或者未包含在 APK 中,但可能构建 APK 所必需,您可以使用抑制文件。以下 suppression.xml
将排除来自包 URL pkg:maven/io.grpc/grpc.*
和 pkg:maven/io.netty/netty.*
的所有漏洞
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
<suppress>
<notes><![CDATA[
This suppresses false positives identified on grpc that are not added into the APK.
]]></notes>
<packageUrl regex="true">^pkg:maven/io\.grpc/grpc.*</packageUrl>
<vulnerabilityName regex="true">.*</vulnerabilityName>
</suppress>
<suppress>
<notes><![CDATA[
This suppresses false positives identified on netty that are not added into the APK.
]]></notes>
<packageUrl regex="true">^pkg:maven/io\.netty/netty.*</packageUrl>
<vulnerabilityName regex="true">.*</vulnerabilityName>
</suppress>
</suppressions>
要使用 suppression.xml
文件,请将以下行添加到您的 build.gradle.kts
文件中
dependencyCheck {
formats = listOf("HTML", "XML", "JSON") // Generate reports in HTML, JSON and XML format
suppressionFile = "suppression.xml"
...
可以在 此处 找到更多抑制误报的示例。