Gerenciador de pacotes Python Poetry e integração de segurança com ferramenta de análise de composição de software
Abhay Bhargav
13 de novembro de 2020
0 minutos de leituraSempre acreditei que os gerenciadores de pacotes podem ser a arma definitiva no combate a dependências vulneráveis. Se eles puderem ser usados para detectar dependências vulneráveis, os desenvolvedores conseguirão identificar e corrigir vulnerabilidades nas dependências com mais facilidade e rapidez, em vez de deixar que elas se infiltrem no processo de build.
No entanto, para que isso funcione, a solução precisa ser:
simples — muito fácil de usar
integrada — deve fazer parte do fluxo de trabalho do desenvolvedor e funcionar com o gerenciador de pacotes em questão
Comecei a usar recentemente o sistema de gerenciamento de pacotes Python Poetry. Gosto muito da forma como ele é organizado e de algumas maneiras como atende aos objetivos que propõe — por isso, esperava encontrar um recurso de análise de segurança que pudesse ser integrado a ele.
Por isso, fiquei feliz ao saber que a Snyk lançou recentemente um novo recurso compatível com o gerenciador de pacotes Poetry e a poetry lock syntax. Para ver mais de perto como isso funciona, acessei minha conta de teste recém-criada na Snyk e criei um projeto com algumas dependências intencionalmente vulneráveis.

Digitei o comando para criar um novo projeto chamado Poetry snyk, que criou um diretório chamado “poetry snyk” e um pacote chamado poetry_snyk — basicamente, arquivos iniciais junto com um pacote TOML.
Então, se eu acessar poetry_snyk e executar tree, vou ver um arquivo readme com o nome do pacote raiz poetry_snyk. O arquivo TOML é o descritor do Poetry e também contém testes iniciais — mais ou menos um teste pi que ele escreveu.

Se você olhar o projeto TOML, estamos usando Python 3.7(uma versão um pouco antiga do Python, admito, mas ainda assim é a versão local do Python que uso por motivos de dependência). Também estamos usando uma dependência de desenvolvimento para testes chamada pi test— neste caso, a pi test 5.2 version (3.7 é o pi core Python, que também tem um build que não estou usando).
Uma coisa que você deve saber sobre o Poetry é que o arquivo TOML substitui os arquivos requirements.txt e setup.py, que antes eram necessários. Assim, com o Poetry, você pode não só configurar e acompanhar dependências, mas também criar projetos e usá-lo para publicar na lojinha de queijos do Python. É interessante notar que um único arquivo TOML pode substituir os arquivos setup.py e requirements.txt inteiros.

Uma coisa de que gosto no Poetry, em comparação com os gerenciadores de pacotes anteriores, é que ele oferece uma solução integrada, em vez de uma solução improvisada.
Muitos dos gerenciadores de pacotes anteriores com que trabalhei — até mesmo o Pipenv — pareciam incompletos, pois se baseavam no código do gerenciador de pacotes pip, funcionando mais como um wrapper. Acho que o Poetry eleva o nível porque reformula o problema, combinando essencialmente o melhor do npm, com seu descritor e arquivo de lock, e do sistema de gerenciamento de pacotes Cargo, do Rust. Se você observar o gerenciador de pacotes Cargo para Rust, verá que ele já vem com documentação e testes. Acho que o Poetry tentou combinar esses dois aspectos e oferecer essa abordagem.
Agora criamos um novo projeto Poetry chamado poetry_snyk e configuramos o projeto, mas também precisamos instalar algumas bibliotecas para começar. Como estou usando o projeto com a Snyk, quero testá-lo com bibliotecas inseguras — geralmente, aquelas que já são conhecidas — para ver se a Snyk consegue detectá-las durante a análise. A Snyk precisa que dois arquivos estejam disponíveis. Então, vamos adicionar algumas dependências ao projeto com o seguinte código:

Este é um projeto docx project python.xque permite analisar e criar arquivos docx. Ele é vulnerável a uma falha de entidades externas XML. É uma falha bastante grave que já demonstrei várias vezes nas minhas sessões de treinamento.
Basicamente, se você carregar um documento do Word malicioso com uma variável de entidade XML definida como algo como /etc/passwd, a biblioteca docx resolverá essa entidade, levando à inclusão de arquivos locais e podendo até ser encadeada para criar um exploit de execução remota de código. No entanto, vou instalá-la, e ela resolverá as dependências e as dependências aninhadas. Também atualizará o arquivo TOML e adicionará um arquivo poetry.lock. O arquivo poetry.lock lista todas as dependências aninhadas daquela dependência de nível superior.

Você pode ver que ele lista todas as dependências aninhadas necessárias, pois todas as ferramentas de análise, especialmente a Snyk e muitas outras ferramentas de análise de código-fonte ou de pacotes, precisam dessas informações para analisar as dependências aninhadas.
Além das dependências aninhadas, ele também informa a versão utilizada de cada uma delas e o valor de hash correspondente, garantindo que sejam fixadas corretamente. Essa era uma lacuna importante no ecossistema Python, porque o gerenciador de dependências pip, que é o padrão do Python, não fornecia todos esses detalhes — apenas listava as dependências, sem fixar as versões com precisão. Por isso, não fazia um bom trabalho ao gerenciar as dependências secundárias.
Digamos que eu instale outro pacote com o Poetry. Vou instalar outro pacote Python vulnerável, neste caso, pyyaml. Vou usar a versão 3.13, vulnerável a uma falha de desserialização insegura. Se essa falha for explorada, o invasor poderá executar código remotamente no ambiente da aplicação-alvo. Vou instalá-lo, e você verá que o arquivo TOML e o arquivo de lock também serão atualizados.


Agora, vamos monitorar com a Snyk inserindo o seguinte código:


Parece que ela analisou todas as minhas dependências. Este é meu projeto na Snyk — ou minha organização na Snyk — criado com todos os meus projetos listados. E você pode ver que criei este projeto.


Como você pode ver, foram sinalizados problemas, todos de alta gravidade — a desserialização insegura do pyyaml, a mesma execução remota de código no pyyaml, um exploit bastante conhecido e sério, e também as injeções de entidades externas XML no python-docx. Graças ao banco de dados abrangente e à facilidade de integração, a Snyk conseguiu detectar todas as vulnerabilidades nas dependências usadas neste projeto!


Como começar
Para começar a usar essa integração, basta instalar o projeto Poetry. A partir daí, a Snyk consegue monitorá-lo — e também envia notificações por e-mail sobre essas dependências, o que é muito legal!
Consegui configurar um projeto Poetry muito rapidamente, analisá-lo em busca de problemas de segurança com a Snyk e receber um relatório detalhado das consequências.
Lembre-se de que a integração só funciona se os dois arquivos — o arquivo de lock e o arquivo TOML — estiverem disponíveis.

