Um grupo de pesquisadores da Universidade de Turku (Finlândia) publicou os resultados de uma análise de pacotes no repositório PyPI em busca do uso de construções potencialmente perigosas que podem levar ao surgimento de vulnerabilidades. Durante a análise de 197 mil pacotes, foram identificados 749 mil problemas potenciais de segurança. Em 46% dos pacotes, há pelo menos um desses problemas. Entre os problemas mais comuns estão falhas relacionadas ao tratamento de exceções e ao uso de recursos que permitem a injeção de código.
Dos 749 mil problemas identificados, 442 mil (41%) foram classificados como menores, 227 mil (30%) como problemas de risco moderado e 80 mil (11%) como perigosos. Alguns pacotes se destacam e contêm milhares de problemas: por exemplo, no pacote PyGGI foram encontradas 2589 questões, principalmente relacionadas ao uso da construção 'try-except-pass', e no pacote appengine-sdk foram identificados 2356 problemas. Um grande número de problemas também está presente nos pacotes genie.libs.ops, pbcore e genie.libs.parser.
É importante notar que os resultados foram obtidos com base em uma análise estática automatizada, que não leva em consideração o contexto de uso das diversas construções. O desenvolvedor da ferramenta bandit, que foi utilizada para escanear o código, expressou a opinião de que, devido ao número relativamente alto de falsos positivos, os resultados da verificação não devem ser considerados diretamente como vulnerabilidades sem uma revisão manual adicional de cada problema.
Por exemplo, o analisador considera como um problema de segurança o uso de geradores de números aleatórios e algoritmos de hash não confiáveis, como o MD5, enquanto no código tais algoritmos podem ser usados para fins que não afetam a segurança. O analisador também considera um problema qualquer manipulação de dados externos em funções inseguras, como pickle, yaml.load, subprocess e eval, mas esse uso não está necessariamente relacionado ao surgimento de vulnerabilidades, e na prática a utilização dessas funções pode ser implementada sem risco à segurança.
Entre as verificações utilizadas no estudo:
- Uso de funções potencialmente inseguras como exec, mktemp, eval, mark_safe, etc.
- Configuração insegura de permissões para arquivos.
- Conexão de socket de rede a todas as interfaces de rede.
- Uso de senhas e chaves codificadas no código.
- Uso de um diretório temporário predefinido.
- Uso de pass e continue em manipuladores de exceções do tipo catch-all;
- Execução de aplicações web baseadas no framework Flask com o modo de depuração ativado.
- Uso de métodos inseguros de desserialização de dados.
- Uso de funções de hash MD2, MD4, MD5 e SHA1.
- Uso de cifradores inseguros DES e modos de criptografia.
- Uso de uma implementação insegura de HTTPSConnection em algumas versões do Python.
- Especificação do esquema file:// em urlopen.
- Uso de geradores de números pseudoológicos durante tarefas criptográficas.
- Uso do protocolo Telnet.
- Uso de parsers XML inseguros.
Além disso, é importante notar a descoberta de 8 pacotes maliciosos no diretório PyPI. Antes da remoção, os pacotes problemáticos foram baixados mais de 30 mil vezes. Para ocultar a atividade maliciosa e contornar os avisos de analisadores estáticos simples, os pacotes usaram codificação de blocos de código com Base64 e execução após decodificação através da chamada eval.
Nos pacotes noblesse, genesisbot, are, suffer, noblesse2 e noblessev2 foi identificado código para interceptar números de cartão de crédito e senhas armazenadas nos navegadores Chrome e Edge, bem como para transmitir tokens de contas do aplicativo Discord e enviar dados do sistema, incluindo capturas de tela do conteúdo da tela. Nos pacotes pytagora e pytagora2 havia a possibilidade de carregar e executar código executável de terceiros.
Fonte: opennet.ru
