Automatize a verificação de falhas em Python com Thoth
O Projeto Thoth reúne muitas ferramentas de código aberto para automatizar a construção de programas com verificações de segurança como parte do processo de resolução.
A maioria dos ataques cibernéticos aproveita vulnerabilidades conhecidas publicamente. Muitos programadores podem automatizar compilações usando integração contínua/implantação contínua (CI/CD) ou técnicas de DevOps. Mas como podemos automatizar as verificações de falhas de segurança que surgem de hora em hora em diferentes bibliotecas gratuitas e de código aberto? Muitos métodos existem agora para descobrir versões com erros de bibliotecas ao construir um aplicativo.
Este artigo se concentrará em Python porque ele possui algumas ferramentas sofisticadas para verificar a segurança de dependências. Em particular, o artigo explora o Projeto Thoth porque reúne muitas dessas ferramentas para automatizar a construção de programas Python com verificações de segurança como parte do processo de resolução. Um dos autores, Fridolín, é um contribuidor chave para Thoth.
Entradas para esforços de segurança automatizados
Esta seção lista os esforços para fornecer ao público informações sobre vulnerabilidades. Tem como foco ferramentas relacionadas ao tema do artigo: Relatos de vulnerabilidades em bibliotecas Python de código aberto.
Programa de vulnerabilidades e exposições comuns (CVE)
Qualquer discussão sobre segurança de software deve começar com o abrangente banco de dados CVE, que reúne falhas descobertas por milhares de pesquisadores dispersos. Os outros projetos neste artigo dependem fortemente deste banco de dados. É mantido pelo Instituto Nacional de Padrões e Tecnologia dos EUA (NIST), e as adições a ele são curadas pela MITRE, uma corporação sem fins lucrativos especializada em software de código aberto e apoiada pelo governo dos EUA. O banco de dados CVE alimenta vários projetos relacionados, como o site de estatísticas CVE Details.
Uma pessoa ou ferramenta automatizada pode encontrar pacotes e versões exatos associados a vulnerabilidades de segurança em um formato estruturado, juntamente com um texto menos estruturado explicando a vulnerabilidade, conforme visto abaixo.
(Fridolín Pokorný e Andy Oram, CC BY-SA 4.0)
Esforços de segurança da Python Packaging Authority
A Python Packaging Authority (PyPA) é a principal organização que cria melhores práticas para pacotes de código aberto na linguagem Python. Voluntários de muitas empresas apoiam o PyPA. As iniciativas relacionadas à segurança da PyPA são avanços significativos para tornar o Python robusto.
O banco de dados consultivo do PyPA seleciona vulnerabilidades conhecidas em pacotes Python em um formato legível por máquina. Ainda outro projeto, pip-audit, apoiado pelo PyPA, audita os requisitos do aplicativo e relata quaisquer vulnerabilidades conhecidas nos pacotes usados. A saída do pip-audit pode estar em formatos estruturados e legíveis por humanos, como JSON. Assim, ferramentas automatizadas podem consultar o Advisory Database ou pip-audit para alertar os desenvolvedores sobre os riscos em suas dependências.
Um vídeo de Dustin Ingram, mantenedor do PyPI, explica como esses projetos funcionam.
Informações de código aberto
Uma iniciativa chamada Open Source Insights tenta ajudar os desenvolvedores de código aberto, fornecendo informações em formatos estruturados sobre dependências em ecossistemas de linguagens populares. Essas informações incluem avisos de segurança, informações de licença, dependências de bibliotecas, etc.
Para exercitar um pouco o Open Source Insights, pesquisamos a popular biblioteca de ciência de dados TensorFlow e descobrimos que (no momento em que este artigo foi escrito) ela tinha um aviso de segurança sobre PyPI (veja abaixo). Clicar no botão MAIS DETALHES mostra links que podem ajudar na pesquisa da assessoria (segunda imagem).
(Fridolín Pokorný e Andy Oram, CC BY-SA 4.0)
(Fridolín Pokorný e Andy Oram, CC BY-SA 4.0)
Curiosamente, a versão do TensorFlow fornecida pelo gerenciador de pacotes Node.js (npm) não tinha avisos de segurança naquele momento. As linguagens de programação utilizadas neste caso podem ser a razão da diferença. Porém, a aparente inconsistência nos lembra que a procedência pode fazer uma grande diferença, e mostraremos como um processo automatizado para resolução de dependências pode se adaptar a tais problemas.
O Open Source Insights obtém informações de dependência de pacotes Python instalando-os em um ambiente limpo. Os pacotes Python são instalados pelo resolvedor pip – a ferramenta de instalação mais popular para bibliotecas Python – do PyPI, o índice mais popular que lista bibliotecas Python de código aberto. As informações de vulnerabilidade de cada pacote são recuperadas do banco de dados Open Source Vulnerability (OSV). OSV atua como um serviço de triagem, agrupando vulnerabilidades em ecossistemas de vários idiomas.
Open Source Insights seria um recurso realmente valioso se tivesse uma API; esperamos que os desenvolvedores adicionem um em algum momento. Embora as informações estejam atualmente disponíveis apenas como páginas da web, o formato estruturado permite que ferramentas automatizadas raspem as páginas e procurem informações críticas, como avisos de segurança.
Scorecards de segurança da Open Source Security Foundation
A qualidade do software – que está intimamente ligada à segurança – exige práticas básicas, como a realização de testes de regressão antes de verificar as alterações em um repositório, anexar assinaturas criptográficas às versões e executar análises estáticas. Algumas dessas práticas podem ser detectadas automaticamente, permitindo que especialistas em segurança avaliem a segurança dos projetos em larga escala.
Um esforço chamado Security Scorecards, lançado em 2020 e apoiado pela Open Source Security Foundation (OpenSSF), lista atualmente algumas dúzias dessas verificações automatizadas. A maioria dessas verificações depende dos serviços do GitHub e só podem ser executadas em projetos armazenados no GitHub. O projeto ainda é muito útil, dado o domínio do GitHub para projetos de código aberto, e representa um modelo para sistemas de classificação mais gerais.
Projeto Thoth
O Projeto Thoth é uma ferramenta baseada em nuvem que ajuda os programadores Python a construir aplicativos robustos, uma tarefa que inclui verificação de segurança junto com muitas outras considerações. A Red Hat iniciou o Thoth e ele é executado no serviço de nuvem Red Hat OpenShift, mas seu código é totalmente de código aberto. O projeto construiu uma comunidade entre desenvolvedores Python. Os desenvolvedores podem copiar as inovações do projeto em outras linguagens de programação.
Uma ferramenta que ajuda os programadores a encontrar bibliotecas e construir aplicativos é chamada de resolver. O popular resolvedor pip geralmente escolhe a versão mais recente de cada biblioteca, mas é sofisticado o suficiente para considerar as dependências de dependências em uma hierarquia chamada gráfico de dependência. pip pode até voltar atrás e escolher uma versão diferente de uma biblioteca para lidar com as especificações de intervalo de versões encontradas percorrendo o gráfico de dependência.
Quando se trata de escolher a melhor versão de uma dependência, Thoth pode fazer muito mais do que pip. Aqui está uma visão geral de Thoth com foco especial em como ele ajuda na segurança.
Visão geral de Thoth
Thoth considera muitos elementos do ambiente de um programa ao instalar dependências: a CPU e o sistema operacional no qual o programa será executado, metadados sobre o contêiner do aplicativo, como os extraídos pelo Skopeo, e até mesmo informações sobre a GPU que um aplicativo de aprendizado de máquina usará . Thoth pode levar em conta diversas outras variáveis, mas você provavelmente pode adivinhar pela lista anterior que Thoth foi desenvolvido primeiro para oferecer suporte ao aprendizado de máquina em contêineres. O desenvolvedor fornece a Thoth informações sobre o ambiente do aplicativo em um arquivo de configuração.
Que vantagens oferece a informação ambiental? Permite que Thoth exclua versões de bibliotecas com vulnerabilidades conhecidas no ambiente especificado. Um desenvolvedor que percebe que uma compilação falha ou tem problemas durante a execução pode armazenar informações sobre quais versões de dependências usar ou evitar em uma especificação chamada prescrição, consultada por Thoth para futuros usuários.
Thoth pode até executar testes em programas e seus ambientes. Atualmente, ele usa Clair para executar testes estáticos no conteúdo de imagens de contêineres e armazena informações sobre as vulnerabilidades encontradas. No futuro, os desenvolvedores de Thoth planejam executar aplicativos reais com várias combinações de versões de biblioteca, usando um projeto da Python Code Quality Authority (PyCQA) chamado Bandit. Thoth executará o Bandit no código-fonte de cada pacote separadamente e combinará os resultados durante o processo de resolução.
As diferentes versões das diversas bibliotecas podem causar uma explosão combinatória (muitas combinações possíveis para testar todas elas). Thoth, portanto, modela a resolução de dependências como um Processo de Decisão Markov (MDP) para decidir sobre o subconjunto mais produtivo a ser executado.
Às vezes, a segurança não é a principal preocupação. Por exemplo, talvez você planeje executar um programa em uma rede privada isolada da Internet. Nesse caso, você pode dizer a Thoth para priorizar algum outro benefício, como desempenho ou estabilidade, em vez de segurança.
Thoth armazena suas opções de dependência em um arquivo de bloqueio. Os arquivos de bloqueio "bloqueiam" versões específicas de dependências específicas. Sem os arquivos de bloqueio, vulnerabilidades sutis de segurança e outros bugs podem invadir o aplicativo de produção. Na pior das hipóteses, sem bloqueio, os usuários podem ser confrontados com os chamados “ataques de confusão de dependência”.
Por exemplo, um resolvedor pode optar por obter uma biblioteca de um índice com uma versão com bugs porque o índice do qual o resolvedor normalmente obtém a dependência está temporariamente indisponível.
Outro risco é que um invasor possa aumentar o número da versão de uma biblioteca em um índice, fazendo com que um resolvedor escolha essa versão por ser a mais recente. A versão desejada existe num índice diferente, mas é negligenciada em favor daquela que parece mais atualizada.
Embrulhar
Thoth é uma coleção complicada e crescente de ferramentas de código aberto. Os princípios básicos por trás das suas resoluções de dependência podem servir de inspiração para outros projetos. Esses princípios são:
- Um resolvedor deve verificar rotineiramente vulnerabilidades, raspando sites como o banco de dados CVE, executando verificações estáticas e por meio de quaisquer outras fontes de informação. Os resultados devem ser armazenados em um banco de dados.
- O resolvedor precisa examinar as dependências das dependências e voltar atrás quando descobrir que algum bug ou falha de segurança exige a alteração de uma decisão tomada anteriormente pelo resolvedor.
- As descobertas e informações do resolvedor repassadas pelos desenvolvedores que usam o resolvedor devem ser armazenadas e usadas em decisões futuras.
Resumindo, com a riqueza de informações disponíveis atualmente sobre vulnerabilidades de segurança, podemos automatizar a resolução de dependências e produzir aplicações mais seguras.