Skip to content

MASTG-TECH-0131: Análise de Composição de Software (SCA) de Dependências do Android no Momento da Compilação

Os aplicativos Android modernos dependem fortemente de bibliotecas de terceiros, tornando a segurança das dependências uma preocupação crítica. As ferramentas de Software Composition Analysis (SCA) inspecionam metadados de dependência, como nomes de pacotes e versões, e os comparam com bancos de dados públicos de vulnerabilidades, como o National Vulnerability Database (NVD), para ajudar a identificar vulnerabilidades conhecidas.

No desenvolvimento Android, as dependências são resolvidas e compiladas durante o processo de build e, eventualmente, tornam-se parte dos arquivos DEX do aplicativo. Portanto, é essencial escanear as dependências conforme elas aparecem no ambiente de build, e não apenas no APK final. Essa abordagem garante que todas as bibliotecas, incluindo as transitivas, sejam analisadas com precisão.

Uma vez que as dependências são declaradas e resolvidas no ambiente de build, integrar ferramentas SCA ao sistema de build é a estratégia mais eficaz. O Gradle é especialmente relevante nesse contexto, pois é a ferramenta de build padrão usada pelo Android Studio e o sistema de gerenciamento de dependências mais comum em projetos Android.

Usando Verificação de Dependências (dependency-check)

Para testar dependências com vulnerabilidades conhecidas, integre o plugin dependency-check ao projeto Android via Gradle. As dependências do projeto Android estão localizadas no diretório ~/.gradle/caches/modules-2/files-2.1 e não no diretório do projeto Android.

Antes de executar a verificação, obtenha uma chave de API para o NVD para recuperar as informações mais recentes de CVE. Você pode solicitar a chave de API para acessar a API do NVD em https://nvd.nist.gov/developers/request-an-api-key.

Info

Em versões recentes do Verificação de Dependências (dependency-check) (até e incluindo a versão 12.1.1 no momento da escrita), você pode encontrar várias mensagens 'NoSuchMethodError' relacionadas a ZipFile.builder(). Isso pode ser resolvido fixando a versão de org.apache.commons:commons-compress.

No build.gradle do Module: app (não no arquivo build.gradle do projeto), adicione a dependência dependencycheck na versão mais recente e a configuração dependencyCheck:

plugins {
    ...
    id("org.owasp.dependencycheck") version "12.1.1" // Esta é a versão mais recente no momento da escrita, atualize conforme necessário
}

dependencyCheck {

    formats = listOf("HTML", "XML", "JSON") // Gera relatórios nos formatos HTML, JSON e XML

    nvd {
        apiKey = "<SUA CHAVE DE API DO NVD>"
        delay = 16000
    }

}

Abra um terminal no Android Studio e execute o seguinte comando:

$ ./gradlew dependencyCheckAnalyze
...
BUILD SUCCESSFUL in 6s
1 actionable task: 1 executed

O relatório foi gerado em 3 formatos diferentes (HTML, JSON e XML) e pode ser encontrado no diretório do projeto em app/build/reports.

Suprimindo Falsos Positivos:

Se houver dependências que você deseja suprimir por serem falsos positivos ou por não estarem incluídas no APK, mas que podem ser necessárias para a construção do APK, você pode usar um arquivo de supressão. O seguinte suppression.xml excluiria todas as vulnerabilidades dos URLs de pacote pkg:maven/io.grpc/grpc.* e 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[
        Isso suprime falsos positivos identificados no grpc que não são adicionados ao APK.
        ]]></notes>
        <packageUrl regex="true">^pkg:maven/io\.grpc/grpc.*</packageUrl>
        <vulnerabilityName regex="true">.*</vulnerabilityName>
    </suppress>

    <suppress>
        <notes><![CDATA[
        Isso suprime falsos positivos identificados no netty que não são adicionados ao APK.
        ]]></notes>
        <packageUrl regex="true">^pkg:maven/io\.netty/netty.*</packageUrl>
        <vulnerabilityName regex="true">.*</vulnerabilityName>
    </suppress>

</suppressions>

Para usar o arquivo suppression.xml, adicione a seguinte linha ao seu arquivo build.gradle.kts:

dependencyCheck {

    formats = listOf("HTML", "XML", "JSON") // Gera relatórios nos formatos HTML, JSON e XML

    suppressionFile = "suppression.xml"
    ...

Mais exemplos de supressão de falsos positivos podem ser encontrados aqui.