Leia nosso artigo sobre

.

Um guia para estar ciente dos riscos aos quais o senhor está exposto e algumas dicas para se proteger contra eles.
Um novo tipo de ameaça cibernética surgiu recentemente: os ataques à cadeia de suprimentos de software. Embora raros, eles têm impactos enormes, e a proteção contra eles é uma preocupação crescente. Devido à variedade de casos de uso, não há uma regra única a ser aplicada aos seus projetos python para garantir a segurança e, como sempre, isso depende do seu contexto.

Introdução

Nos setores tradicionais, uma cadeia de suprimentos é tudo o que permite que uma empresa entregue um produto ao cliente. Por exemplo, quando o senhor compra um croissant na padaria, todos os ingredientes, a embalagem e o transporte fazem parte da cadeia de suprimentos.

No domínio do software, uma cadeia de suprimentos é tudo o que afeta o software antes de sua implantação na produção. Ela abrange tudo, desde a fase de desenvolvimento até o processo de lançamento, incluindo o código que o senhor escreveu, suas dependências, seu ambiente de compilação, seu IDE, seu registro de imagem - todos os componentes com os quais seu software interage em qualquer ponto!

O termo “cadeia de suprimentos” veio à tona recentemente devido a ataques cibernéticos que tiveram um grande impacto. Entre todos os ataques, o da Solarwinds talvez seja o mais famoso. De fato, o governo dos EUA, grandes empresas de tecnologia como a Microsoft e a Intel, mas também hospitais, empresas de energia e instituições financeiras foram afetados.

Ironicamente, a causa principal é a infecção do Solarwinds Orion, um monitor de segurança de rede. O sistema de compilação foi comprometido e todas as novas versões entre março e junho de 2020 foram infectadas por malware. O resultado é que todos os clientes que atualizaram seu software durante esse período foram comprometidos.

Embora o ataque da Solarwinds tenha sido amplamente coberto pela mídia, há dezenas de ataques semelhantes dos quais nunca ouvimos falar. Felizmente, a Cloud Native Computing Foundation mantém o controle de todos eles em um repositório público. O senhor pode se surpreender com a aceleração desses ataques nos últimos anos.

Não é possível cobrir tudo relacionado à segurança da cadeia de suprimentos em uma única postagem do blog, portanto, neste artigo, vamos nos concentrar principalmente em projetos que usam Python como linguagem principal.

Como gerenciar suas dependências em Python

Embora o Python tenha uma filosofia de “baterias incluídas”, muitas vezes o usuário precisa de bibliotecas externas que podem ser baixadas do PyPI, o índice oficial de pacotes, e é nesse ponto que o usuário precisa ser muito cuidadoso.

O ecossistema Python já foi visado, especialmente por meio do uso de duas técnicas:

  • Esbanjamento de erros de digitação
  • Confusão de dependência

A primeira técnica afeta um comando que todo desenvolvedor Python já executou pelo menos uma vez ao longo de sua carreira:

pip install 

Os hackers publicam pacotes com quase o mesmo nome dos pacotes existentes, esperando que o usuário cometa um erro de digitação e instale o pacote deles em vez do pacote oficial. Por exemplo, um pacote chamado python3-dateutil em vez do oficial dateutil tem sido detectado recentemente.

A comunidade python é trabalhando duro para mitigar o risco, mas o risco ainda é alto.

A segunda técnica, confusão de dependências, é mais sofisticada do que a primeira e tem a ver com a forma como o pip funciona sob o capô.

Dessa vez, esse comando expõe o senhor ao risco:

pip install --extra-index-url 

Quando o senhor digita esse comando, o que acontece é o seguinte:

Image

Vamos dar um exemplo:

Image

Neste exemplo, o pacote do hacker mal-intencionado será instalado no computador. De fato, o número de versão mais alto está no índice de pacotes públicos.

O senhor deve ter entendido o que pode dar errado nesse processo. Alguém com más intenções pode publicar pacotes em um repositório público com os mesmos nomes dos pacotes hospedados nos índices internos de pacotes e marcá-los com um número de versão ridiculamente alto. Além disso, encontrar nomes de pacotes relevantes não é tão difícil quanto demonstrado por este pesquisador de segurança.

Esse comando pode ser qualificado como “inseguro por design”. Esse ataque aproveita um recurso do gerenciador de pacotes Python e apenas alguns desenvolvedores estão cientes desse comportamento.

Image

Como se defender contra esses ataques à cadeia de suprimentos

Para se defender contra ataques de typo-squatting, o senhor pode usar um arquivo de bloqueio. A bom arquivo de bloqueio tem os seguintes atributos:

  • Pinos de versão:eles tornam suas compilações previsíveis e determinísticas.

  • Hashes: Eles são uma forma de verificar a integridade do pacote.

  • Gráfico de dependência completo: isso permite que o senhor também controle as dependências das suas dependências.

A boa notícia é que existe um pacote cuja finalidade é criar um arquivo de bloqueio para o senhor: pip-tools. Com apenas alguns comandos, o senhor pode gerar um arquivo de bloqueio com todos os atributos que descrevemos anteriormente.

$ python3 -m venv my-env # criar um novo ambiente virtual
$ source my-env/bin/activate # activate it
$ pip install pip-tools==6.3.0 # instale o pacote que permitirá ao senhor
o senhor gerenciar adequadamente suas dependências
$ echo “sacremoses==0.0.46” >> requirements.in # adicione o pacote de sua escolha em requirements.in
sua escolha em requirements.in
$ pip-compile --generate-hashes # compila requirements.txt com
hashes com base no que o usuário colocou em requirements.in

Seu arquivo requirements.txt deve ter a seguinte aparência:

Image

Agora que o senhor tem esse arquivo que contém todas as dependências com suas versões e hashes associados, pode executar o seguinte comando na próxima vez que fizer a implantação:

pip install --require-hashes -r requirements.txt

Assim, o senhor tem certeza de que os pacotes que usa na produção não foram alterados. Supondo que o senhor tenha sido cuidadoso ao escrever seu requisitos.in o senhor também pode ter certeza de que fará o download do pacote que realmente deseja, pois tudo é automatizado. Não há risco de erro de digitação!

Essa prática recomendada é boa para se defender contra ataques de typo-squatting, mas e quanto à confusão de dependências?

Se o senhor observar o pip o senhor verá que há duas opções que podem ser usadas para baixar pacotes de um repositório interno:

  • --extra-index-url
  • --index-url

A documentação diz:

Image

Como o senhor pode ver, há uma pequena diferença entre os dois e ela não é óbvia à primeira vista. A diferença é que, se o senhor especificou o --index-url opção, pip só extrairia pacotes do repositório com a URL que o senhor forneceu, e não de repositórios públicos. Portanto, se quiser evitar o comportamento que descrevemos anteriormente, use --index-url em vez de --extra-index-url e o senhor estará seguro!

Por fim, para acompanhar as vulnerabilidades mais recentes que são descobertas em suas dependências, o senhor pode optar por verificar periodicamente o Consultor do GitHub database Ou melhor, aproveite ferramentas como dependabot que enviará automaticamente um pull request em seu repositório para atualizar uma dependência na qual uma vulnerabilidade crítica foi identificada recentemente.

Resumo

Neste artigo, apresentamos o conceito de cadeia de suprimentos para o mundo do software. Estudamos especificamente como esse conceito se aplica ao ecossistema Python. O typo-squatting e a confusão de dependências foram explicados e soluções foram propostas para mitigar o risco de comprometimento.

Essa rápida introdução à segurança da cadeia de suprimentos cobriu apenas a ponta do iceberg, pois não tivemos a chance de discutir como a sistemas de construção ou até mesmo o seu IDEs pode ser comprometido, mas deixo isso para outro artigo!

Obrigado pelo senhor ter lido até aqui! Ficaria feliz em ouvir seus comentários. Se o senhor gostou da leitura, fique à vontade para conferir nosso posições em aberto em Artefact 🙂

Média Blog por Artefact.

Este artigo foi publicado inicialmente no Medium.com.
Siga-nos em nosso Medium Blog !