Skip to main content

Vulnerabilidade de execução arbitrária de código no NumPy

Escrito por
Headshot of Hayley Denbraver

Hayley Denbraver

NumPy Arbitrary Code Execution Vulnerability small

5 de fevereiro de 2019

0 minutos de leitura

Uma vulnerabilidade descoberta recentemente no NumPy, pacote de código aberto amplamente usado para computação científica em Python, permite a execução de código arbitrário potencialmente malicioso.

NumPy

O NumPy faz parte do ecossistema SciPy, que reúne pacotes de software de código aberto para matemática, ciências e engenharia. O NumPy é usado tanto na indústria quanto na academia e tem mais de 9 mil estrelas no GitHub e mais de 700 colaboradores. De acordo com os registros disponíveis no BigQuery do PyPI, o NumPy foi baixado quase 4 milhões de vezes nos últimos três meses.

A vulnerabilidade

Em 16 de janeiro de 2019, o usuário do GitHub nanshihui abriu uma issue informando que a função numpy.load era vulnerável à execução de código arbitrário devido à forma como usava o módulo pickle do Python. O módulo pickle do Python serializa e desserializa objetos Python. O “pickling” converte a hierarquia de objetos Python em um fluxo de bytes, enquanto o “unpickling” recebe um fluxo de bytes e o converte novamente em uma hierarquia de objetos. Aceitar arrays serializados com pickle de fontes não confiáveis é perigoso, pois não há como verificá-los antes da desserialização. Se um código malicioso de shell for fornecido como entrada, ele poderá ser executado durante a desserialização.

A vulnerabilidade está presente nas versões do NumPy entre a 1.10 (lançada em outubro de 2015) e a versão mais recente, a 1.16. Confira mais detalhes sobre essa vulnerabilidade no banco de dados da Snyk.

Por padrão, as versões afetadas do NumPy permitem o carregamento de arrays de objetos serializados com pickle. Isso só deve ser feito quando a fonte for confiável, mas adotar esse comportamento como padrão é uma prática inadequada.

Até o momento, não há casos conhecidos de exploração dessa vulnerabilidade, mas isso pode mudar à medida que o problema se tornar mais conhecido. A exploração não exige autenticação nem muito conhecimento técnico.

Até a publicação deste artigo, ainda não havia sido disponibilizado um patch nem uma atualização, embora a equipe do NumPy esteja trabalhando nisso. Para garantir que você não esteja vulnerável, passe allow_pickle=False a qualquer chamada de numpy.load que carregue dados de uma fonte não confiável.

Você foi afetado?

Se você usa a Snyk, receberá notificações nos alertas de rotina caso tenha projetos com dependências vulneráveis do NumPy.

Se você ainda não experimentou a Snyk, conheça nossa interface fácil de usar ou use nossa CLI para executar testes localmente.