MASTG-TECH-0133: Análise de Composição de Software (SCA) de Dependências iOS por meio da Varredura de Artefatos do Package Manager

O iOS possui vários gerenciadores de dependências, onde os mais populares são:

As dependências são integradas ao projeto durante o processo de build e, em seguida, compiladas no arquivo IPA. No entanto, as informações de versão das dependências podem ser removidas durante a compilação, o que significa que não podemos escanear o arquivo IPA. Felizmente, podemos escanear os artefatos produzidos pelos gerenciadores de dependências.

Ferramentas como Verificação de Dependências (dependency-check) podem escanear arquivos criados pelos três gerenciadores de dependências. Esses arquivos listam as dependências como Common Platform Enumeration (CPE) e suas versões. O CPE será incluído no aplicativo iOS. Essas ferramentas então buscam vulnerabilidades conhecidas, ou CVEs (Common Vulnerability and Exposure), nas dependências, verificando-as em um banco de dados de vulnerabilidades, como o National Vulnerability Database (NVD).

Observe que Verificação de Dependências (dependency-check) oferece suporte a Carthage, CocoaPods e SwiftPM, mas esses analisadores são considerados experimentais. Embora esses analisadores possam ser úteis e fornecer resultados válidos, mais testes devem ser concluídos para garantir que as taxas de falsos negativos/positivos sejam aceitáveis.

Para testar com Verificação de Dependências (dependency-check), precisamos recuperar o arquivo correspondente do gerenciador de dependências:

  • Para Carthage, é o arquivo Cartfile.resolved.
  • Para CocoaPods, é o arquivo *.podspec ou Podfile.lock
  • Para SwiftPM, é o arquivo Package.Swift ou Package.resolved

Lembre-se de que os desenvolvedores podem usar mais de um gerenciador de dependências, portanto, pode ser necessário realizar mais de uma verificação. Ao escanear com Verificação de Dependências (dependency-check), escanear o arquivo criado pelo gerenciador de dependências é suficiente; você não precisa ter acesso ao projeto completo do Xcode ou ao código-fonte.

Antes de executar a verificação, obtenha uma chave de API para o NVD. Essa chave é usada 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.

  • Para iniciar uma verificação para um projeto usando SwiftPM, execute o seguinte comando para escanear o Package.Swift ou Package.resolved:
$ dependency-check --enableExperimental -f SARIF --nvdApiKey <SUA-CHAVE-API> -s Package.resolved
  • Para iniciar uma verificação para um projeto usando CocoaPods, execute o seguinte comando para escanear o Podfile.lock ou *.podspec:
$ dependency-check --enableExperimental -f SARIF --nvdApiKey <SUA-CHAVE-API> -s Podfile.lock
  • Para iniciar uma verificação para um projeto usando Carthage, execute o seguinte comando para escanear o Cartfile.resolved.:
$ dependency-check --enableExperimental -f SARIF --nvdApiKey <SUA-CHAVE-API> -s Cartfile.resolved

A saída é sempre um arquivo SARIF, que pode ser visualizado usando o plugin visualizador de Sarif no Visual Studio Code (vscode). Quaisquer vulnerabilidades conhecidas encontradas serão listadas com seu número CVE e descrição.

Você só pode escanear um arquivo por vez. Ao escanear para CocoaPods ou Carthage, use o mesmo comando, mas escaneie o arquivo correspondente do gerenciador de dependências.