Explorar a análise de composição de software
A SCA (Análise de Composição de Software) é um processo automatizado para identificar componentes de software livre e de terceiros em aplicativos, analisando suas vulnerabilidades de segurança, conformidade de licença e qualidade de código. À medida que os aplicativos modernos dependem cada vez mais de dependências externas, o SCA tornou-se essencial para gerenciar os riscos associados às cadeias de fornecimento de software.
O que é Análise de Composição de Software?
A Análise de Composição de Software é a prática de descobrir, catalogar e analisar automaticamente todos os componentes de software livre e de terceiros usados em um aplicativo. As ferramentas de SCA analisam manifestos de pacote, arquivos de bloqueio de dependências, código-fonte e binários compilados para criar uma lista abrangente de materiais de software (SBOM).
Principais recursos de SCA
Descoberta de dependência:
- Análise de manifesto: As ferramentas SCA leem arquivos de manifesto do pacote (package.json, requirements.txt, pom.xml, *.csproj) para identificar dependências declaradas.
- Análise de arquivo de bloqueio: Analisar arquivos de bloqueio (package-lock.json, Pipfile.lock, Gemfile.lock) mostrando versões instaladas exatas, incluindo dependências transitivas.
- Verificação binária: Ferramentas avançadas verificam artefatos compilados, imagens de contêiner e aplicativos implantados para descobrir dependências inseridas não declaradas em manifestos.
- Suporte a vários idiomas: Ferramentas abrangentes dão suporte a dezenas de linguagens de programação e ecossistemas de pacotes (módulos npm, PyPI, Maven, NuGet, RubyGems, Go).
Análise de vulnerabilidade:
- Correspondência de CVE: compare as dependências descobertas com os bancos de dados de Vulnerabilidades e exposições comuns (CVE).
- Pontuação de severidade: Calcule as pontuações comuns do CVSS (Common Vulnerability Score System) indicando a gravidade da vulnerabilidade de 0 (nenhum) para 10 (crítico).
- Inteligência de exploit: Identifique quais vulnerabilidades têm exploits conhecidos usados ativamente por invasores.
- Recomendações de patch: Sugira atualizações de versão específicas que resolvam vulnerabilidades, mantendo a compatibilidade.
Conformidade de licença:
- Detecção de licença: Identifique licenças para todas as dependências analisando arquivos de licença, metadados de pacote e cabeçalhos de código-fonte.
- Imposição de política: Sinalizar automaticamente dependências que violam políticas de licença organizacional.
- Análise de compatibilidade: Detecte licenças conflitantes que não podem ser combinadas legalmente no mesmo aplicativo.
- Acompanhamento de obrigações: Requisitos de licença de documento, como avisos de atribuição, divulgação de código-fonte ou restrições de trabalho derivadas.
Avaliação de qualidade:
- Status da manutenção: Avalie se as dependências são mantidas ou abandonadas ativamente.
- Saúde da comunidade: Avaliar a atividade dos contribuintes, o tamanho da comunidade e a sustentabilidade do projeto.
- Práticas de segurança: Verifique se os projetos têm processos de divulgação responsáveis e avisos de segurança.
- Recomendações de atualização: Identifique dependências desatualizadas e sugira alternativas mais seguras e atuais.
Por que o SCA é crítico para o DevOps
As práticas modernas de desenvolvimento de software tornam o SCA indispensável:
A explosão de dependência
Os aplicativos contêm centenas de dependências:
- Dependências diretas: O aplicativo típico faz referência direta a pacotes externos de 20 a 50.
- Dependências transitivas: Cada dependência direta traz suas próprias dependências, criando árvores de dependência com 200 a 500 pacotes totais.
- Vários ecossistemas: Os aplicativos geralmente combinam dependências de vários ecossistemas de linguagem (front-end JavaScript, back-end do Python, microsserviços Java).
- Dependências de contêiner: Aplicativos em contêineres incluem dependências de imagem base mais dependências de aplicativo.
O acompanhamento manual é impossível:
- Escala: O acompanhamento manual de centenas de dependências em dezenas de aplicativos é impraticável.
- Velocidade: Novas vulnerabilidades são divulgadas diariamente, tornando qualquer inventário manual imediatamente desatualizado.
- Complexidade: Entender as cadeias de dependência transitiva e suas interações requer análise automatizada.
- Propriedade distribuída: Dependências mantidas por milhares de projetos independentes de software livre em todo o mundo.
O imperativo de segurança
As vulnerabilidades nas dependências são exploradas ativamente:
- Violações de alto perfil: Os principais incidentes de segurança envolvem regularmente a exploração de vulnerabilidades conhecidas em pacotes populares de software livre.
- Ataques na cadeia de suprimentos: Os invasores comprometem pacotes legítimos para distribuir malware para consumidores downstream.
- Vulnerabilidades de dia zero: Vulnerabilidades até então desconhecidas em pacotes amplamente usados podem afetar milhares de organizações simultaneamente.
- Urgência de patch: Vulnerabilidades críticas exigem identificação rápida e correção em todos os aplicativos afetados.
As ferramentas de segurança tradicionais perdem vulnerabilidades de dependência:
- Análise estática: As ferramentas de verificação de código-fonte analisam seu código, mas não o código de dependência.
- Teste dinâmico: O teste de penetração pode não detectar vulnerabilidades em dependências que não são ativadas durante os testes.
- Revisão manual: As equipes de segurança não podem examinar o código-fonte de centenas de pacotes de terceiros.
- Detecção especializada: Ferramentas SCA especificamente projetadas para identificar vulnerabilidades de dependência são necessárias.
O requisito de conformidade
As violações de licença têm riscos significativos:
- Responsabilidade legal: O uso de dependências sem cumprir os termos de licença pode resultar em ações judiciais e danos.
- Fornecimento aberto forçado: licenças de copyleft fortes (GPL, AGPL) podem exigir aplicativos inteiros de fornecimento aberto.
- Restrições de distribuição: Algumas licenças proíbem a distribuição comercial ou impõem limitações de uso.
- Requisitos de auditoria: Estruturas regulatórias exigem cada vez mais que as organizações mantenham uma lista precisa de materiais de software.
Complexidade da licença:
- Centenas de tipos de licença: O ecossistema de software livre inclui centenas de licenças distintas com obrigações variadas.
- Problemas de compatibilidade: Licenças diferentes têm termos conflitantes que proíbem seu uso juntos.
- Licenciamento transitivo: As obrigações de licença referentes às dependências transitivas devem ser controladas e atendidas.
- Alterações de licença: Os projetos às vezes alteram licenças entre versões, exigindo monitoramento contínuo.
Como funcionam as ferramentas de SCA
As ferramentas de SCA empregam várias técnicas para descobrir e analisar dependências:
Mecanismos de descoberta
Análise de arquivo de manifesto:
- Formatos específicos do idioma: As ferramentas entendem os formatos de manifesto do pacote para cada idioma (package.json para npm, requirements.txt para Python, pom.xml para Maven).
- Resolução de dependência: Analise as especificações de versão de dependência, incluindo intervalos, restrições e regras de resolução.
- Verificação do workspace: examine recursivamente os diretórios do projeto para localizar todos os arquivos de manifesto em monorepos e workspaces de vários projetos.
- Reconhecimento de configuração: Considere dependências específicas do ambiente (desenvolvimento, teste, produção) separadamente.
Análise do arquivo de bloqueio de dependências:
- Versões exatas: Arquivos de bloqueio registram versões precisas de todas as dependências, incluindo dependências transitivas.
- Estado de instalação: Represente dependências instaladas reais em vez de requisitos abstratos.
- Resolução determinística: Os arquivos de bloqueio garantem versões de dependência consistentes entre ambientes.
- Gráficos de dependência completos: Inclua a árvore de dependência transitiva completa com resoluções de versão.
Escaneamento de binários e artefatos:
- Artefatos compilados: Examine arquivos JAR, arquivos de roda, DLLs e executáveis para identificar dependências inseridas.
- Camadas de imagem de contêiner: Analise camadas de imagem de contêiner para descobrir componentes de imagem base e dependências de aplicativo.
- Verificação do sistema de arquivos: Examine os sistemas de arquivos de aplicativos implantados para localizar dependências não declaradas em manifestos.
- Impressões digitais: Use o hash criptográfico para identificar versões de pacote específicas mesmo sem metadados.
Integração de compilação:
- Plug-ins de ferramentas de build: Integrar com sistemas de build (Maven, Gradle, webpack, pip) para capturar informações de dependência durante as compilações.
- Ganchos de resolução: Conecte-se aos processos de resolução de dependência para registrar as versões exatas instaladas.
- Geração de artefatos: gerar artefatos de lista de materiais software (SBOM) durante builds para consumo downstream.
- Integração de pipeline: execute como etapas automatizadas em pipelines de CI/CD para analisar cada build.
Recursos de análise
Correspondência de vulnerabilidades:
- Consulta de banco de dados: Consultar bancos de dados de vulnerabilidade nacional (NVD), banco de dados de consultoria do GitHub e bancos de dados de vulnerabilidade proprietários.
- Correspondência do intervalo de versão: Determine se as versões de pacote específicas se enquadram dentro de intervalos de versão vulneráveis.
- Validação de patch: Verifique se os patches aplicados realmente resolvem vulnerabilidades relatadas.
- Priorização: Classificar vulnerabilidades por severidade, explorabilidade e impacto nos negócios.
Identificação de licença:
- Várias fontes: Extraia informações de licença de metadados de pacote, arquivos de licença, cabeçalhos de código-fonte e arquivos README.
- Normalização da licença: Mapeie vários nomes e identificadores de licença (SPDX, OSI) para tipos de licença padronizados.
- Licenciamento duplo: Gerenciar pacotes lançados em várias licenças alternativas.
- Licenças personalizadas: Identifique licenças não padrão que exigem revisão legal.
Análise de acessibilidade:
- Construção de grafo de chamadas: Crie grafos de chamadas mostrando qual código de dependência é realmente executado pelo seu aplicativo.
- Detecção de código morto: Identificar dependências agrupadas, mas nunca realmente usadas.
- Análise de caminhos de exploração: Determine se caminhos de código vulneráveis são acessíveis a partir dos pontos de entrada do aplicativo.
- Refinamento de risco: Reduza o ruído concentrando-se em vulnerabilidades exploráveis no código realmente usado.
Monitoramento contínuo:
- Alertas em tempo real: Receba notificações imediatas quando novas vulnerabilidades que afetam suas dependências forem divulgadas.
- Verificação agendada: Reanalise regularmente os programas para detectar vulnerabilidades recentemente descobertas em dependências inalteradas.
- Comparação de linha de base: Acompanhe as alterações no status de vulnerabilidade e conformidade ao longo do tempo.
- Prevenção de regressão: Alerta quando novas dependências introduzem vulnerabilidades ou violações de licença.
Padrões de integração do SCA
A implementação efetiva do SCA envolve a integração em vários pontos do ciclo de vida de desenvolvimento:
Estação de trabalho do desenvolvedor
Integração do IDE:
- Comentários em tempo real: Examine as dependências à medida que os desenvolvedores as adicionam a projetos.
- Avisos embutidos: Exiba avisos de vulnerabilidade e licença diretamente no IDE.
- Sugestões de correção: Sugerir versões alternativas de pacote ou pacotes de substituição.
- Imposição de política: Impedir a adição de dependências que violam políticas organizacionais.
Validação de pré-confirmação:
- Ganchos do Git: Execute verificações de SCA antes dos commits para impedir a introdução de dependências vulneráveis.
- Verificação local: Analise as alterações localmente antes de enviar por push para repositórios remotos.
- Comentários rápidos: Forneça comentários imediatos aos desenvolvedores durante o desenvolvimento ativo.
- Detecção antecipada: detecte os problemas antes que eles atinjam branches compartilhados e pipelines de CI/CD.
Controle do código-fonte
Validação da solicitação de pull:
- Verificações automatizadas: Execute a análise de SCA em todas as solicitações de pull para detectar alterações de dependência.
- Comentários de revisão: Postar descobertas como comentários de pull request para visibilidade do revisor.
- Bloqueio de mesclagem: Impedir a mesclagem de solicitações de pull que introduzem vulnerabilidades críticas ou violações de licença.
- Controle de alterações de dependência: Documente claramente quais alterações de dependência cada solicitação de pull apresenta.
Integração do GitHub Dependabot:
- Atualizações automatizadas: Crie solicitações de pull automaticamente quando as atualizações de segurança de dependência estiverem disponíveis.
- Alertas de vulnerabilidade: Receba alertas de segurança do GitHub para dependências vulneráveis.
- Grafo de dependência: Visualize as relações de dependência no recurso de grafo de dependência do GitHub.
- Examinar fluxos de trabalho: Aproveite os processos de revisão e aprovação do GitHub para atualizações de dependência.
Pipelines de CI/CD
Verificação em tempo de compilação:
- Etapas do pipeline: adicionar a verificação de SCA como etapas de build automatizadas em pipelines de CI/CD.
- Portões de qualidade: compilações com falha que não atendem aos requisitos de segurança e conformidade.
- Geração de SBOM: crie uma fatura de software de artefatos de materiais junto com saídas de build.
- Trilhas de auditoria: Registre os resultados da verificação para fins de conformidade e perícia.
Portões de implantação:
- Validação de pré-implantação: Examine os artefatos antes de implantar em ambientes de produção.
- Políticas específicas do ambiente: Aplique políticas mais rigorosas para implantações de produção do que implantações de desenvolvimento.
- Gatilhos de reversão: reverter automaticamente as implantações em que vulnerabilidades críticas são descobertas.
- Aprovações de implantação: Exigir aprovação manual para implantações com riscos conhecidos, mas aceitos.
Monitoramento de tempo de execução
Verificação de produção:
- Análise de aplicativo implantada: Examinar aplicativos realmente implantados para detectar dependências de runtime.
- Verificação do registro de contêiner: Examine continuamente as imagens de contêiner armazenadas em registros.
- Análise de função sem servidor: Examine as funções sem servidor implantadas e suas dependências.
- Detecção de desvio: Identifique as diferenças entre as dependências pretendidas e as realmente implantadas.
Monitoramento contínuo de vulnerabilidades:
- Vigilância contínua: Monitore aplicativos implantados para vulnerabilidades recentemente divulgadas que afetam as dependências atuais.
- Resposta a incidentes: Ativar fluxos de trabalho de resposta a incidentes quando vulnerabilidades críticas são descobertas em ambiente de produção.
- Planejamento de patch: Gere planos de implantação de patch para lidar com vulnerabilidades em aplicativos implantados.
- Conformidade com o SLA: Acompanhe os quadros de tempo de correção para garantir a conformidade com os SLAs de segurança.
Práticas recomendadas de fluxo de trabalho de SCA
A implementação bem-sucedida do SCA segue fluxos de trabalho comprovados:
Estabelecer linha de base
Inventário inicial:
- Descoberta abrangente: Execute ferramentas de SCA em todos os aplicativos para criar um inventário de dependência completo.
- Avaliação do risco: Entenda a exposição atual a vulnerabilidades e problemas de conformidade de licença.
- Priorização: Identificar quais aplicativos e vulnerabilidades exigem atenção imediata.
- Documentação da linha de base: Documente o estado atual como linha de base para medir a melhoria.
Definir políticas
Políticas de segurança:
- Limites de severidade de vulnerabilidade: Defina quais níveis de gravidade são aceitáveis (por exemplo, sem alta crítica e limitada).
- Quadros de tempo de correção: Estabeleça SLAs para corrigir diferentes severidades de vulnerabilidade (críticas dentro de 7 dias, altas dentro de 30 dias).
- Processos de exceção: Crie fluxos de trabalho para aceitar riscos quando a correção imediata não for viável.
- Acompanhamento de isenção: mantenha o rastro de auditoria dos riscos aceitos com justificativas comerciais.
Políticas de conformidade:
- Listas de permissões de licença: Especifique quais licenças são sempre aceitáveis (MIT, Apache 2.0, BSD).
- Listas de negação de licença: Proibir licenças específicas incompatíveis com o modelo de negócios (GPL para software proprietário).
- Fluxos de trabalho de aprovação: Exigir revisão legal para dependências com determinadas licenças (LGPL, MPL, licenças personalizadas).
- Requisitos de atribuição: Defina como as atribuições de licença devem ser fornecidas no software distribuído.
Automatizar a imposição
Integração do pipeline:
- Verificação automatizada: Execute verificações de SCA automaticamente em cada solicitação de build e pull.
- Portões de qualidade: configure portões de pipeline que bloqueiam builds ou implantações que violam políticas.
- Correção automatizada: Use ferramentas como o GitHub Dependabot para criar automaticamente solicitações pull para atualizações de segurança.
- Relatórios: Gere relatórios de conformidade para visibilidade de auditoria e gerenciamento.
Melhoria contínua
Acompanhamento de métricas:
- Tempo médio para correção (MTTR): Medir a rapidez com que as vulnerabilidades são corrigidas após a descoberta.
- Redução de vulnerabilidade: Acompanhe a diminuição das contagens de vulnerabilidades ao longo do tempo.
- Taxa de conformidade: Monitorar o percentual de dependências que atendem às políticas de licença.
- Cobertura: Verifique se as ferramentas de SCA verificam todos os aplicativos e dependências.
Refinamento do processo:
- Gerenciamento de falsos positivos: Ajuste as ferramentas para reduzir falsos positivos por meio de configuração e exceções.
- Treinamento do desenvolvedor: Eduque os desenvolvedores sobre a seleção e o gerenciamento de dependências seguras.
- Evolução da política: Atualize as políticas com base em ameaças emergentes e requisitos de negócios.
- Avaliação da ferramenta: Avalie periodicamente novas ferramentas e recursos de SCA.
A Análise de Composição de Software fornece os recursos automatizados essenciais para gerenciar riscos de segurança e conformidade em aplicativos modernos que dependem fortemente de componentes de software livre. A próxima unidade explora como implementar o GitHub Dependabot, uma ferramenta SCA específica integrada ao GitHub.