跳过内容

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: appbuild.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"
    ...

可以在 此处 找到更多抑制误报的示例。