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.