Il 46% dei pacchetti Python nel repository PyPI contiene codice potenzialmente non sicuro

Un gruppo di ricercatori dell'Università di Turku (Finlandia) ha pubblicato i risultati di un'analisi dei pacchetti nel repository PyPI per l'utilizzo di costrutti potenzialmente pericolosi che potrebbero portare a vulnerabilità. Durante l'analisi di 197mila pacchi sono stati individuati 749mila potenziali problemi di sicurezza. Il 46% dei pacchetti presenta almeno uno di questi problemi. Tra i problemi più comuni ci sono le carenze legate alla gestione delle eccezioni e all'uso di funzionalità che consentono la sostituzione del codice.

Dei 749mila problemi individuati, 442mila (41%) sono stati etichettati come minori, 227mila (30%) come moderati e 80mila (11%) come pericolosi. Alcuni pacchetti si distinguono dalla massa e contengono migliaia di problemi: ad esempio, il pacchetto PyGGI ha identificato 2589 problemi, principalmente legati all'uso del costrutto “try-Exception-pass”, e il pacchetto appengine-sdk ha rilevato 2356 problemi. Un gran numero di problemi sono presenti anche nei pacchetti genie.libs.ops, pbcore e genie.libs.parser.

È opportuno notare che i risultati sono stati ottenuti sulla base di un'analisi statica automatizzata, che non tiene conto del contesto di applicazione di determinate strutture. Lo sviluppatore del toolkit Bandit, utilizzato per scansionare il codice, ha espresso l'opinione che, a causa del numero piuttosto elevato di falsi positivi, i risultati della scansione non possono essere considerati direttamente vulnerabilità senza un'ulteriore revisione manuale di ogni problema.

Ad esempio, l'analizzatore considera un problema di sicurezza l'uso di generatori di numeri casuali inaffidabili e algoritmi di hashing, come MD5, mentre nel codice tali algoritmi possono essere utilizzati per scopi che non influiscono sulla sicurezza. L'analizzatore considera un problema anche qualsiasi elaborazione di dati esterni in funzioni non sicure come pickle, yaml.load, subprocess ed eval, ma questo utilizzo non comporta necessariamente una vulnerabilità e infatti l'uso di queste funzioni può essere implementato senza una minaccia alla sicurezza .

Tra i test utilizzati nello studio:

  • Utilizzo di funzioni potenzialmente non sicure exec, mktemp, eval, mark_safe, ecc.
  • Impostazione non sicura dei diritti di accesso ai file.
  • Collegamento di una presa di rete a tutte le interfacce di rete.
  • Utilizzo di password e chiavi rigorosamente specificate nel codice.
  • Utilizzando una directory temporanea predefinita.
  • Utilizzo di passa e continua nei gestori di eccezioni in stile catch-all;
  • Avvio di applicazioni Web basate sul framework Web Flask con la modalità di debug abilitata.
  • Utilizzo di metodi di deserializzazione dei dati non sicuri.
  • Utilizza le funzioni hash MD2, MD4, MD5 e SHA1.
  • Utilizzo di cifrari DES e modalità di crittografia non sicure.
  • Utilizzo di un'implementazione HTTPSConnection non sicura in alcune versioni di Python.
  • Specificando lo schema file:// in urlopen.
  • Utilizzo di generatori di numeri pseudocasuali durante l'esecuzione di attività crittografiche.
  • Utilizzando il protocollo Telnet.
  • Utilizzo di parser XML non sicuri.

Inoltre, si può notare che sono stati rilevati 8 pacchetti dannosi nella directory PyPI. Prima della rimozione, i pacchetti problematici venivano scaricati più di 30mila volte. Per nascondere attività dannose e ignorare gli avvisi provenienti da semplici analizzatori statici nei pacchetti, i blocchi di codice sono stati codificati utilizzando Base64 ed eseguiti dopo la decodifica utilizzando una chiamata eval.

I pacchetti noblesse, genesisbot, soffr, noblesse2 e noblessev2 contengono codici per intercettare numeri di carte di credito e password memorizzati nei browser Chrome ed Edge, nonché trasferire token di account dall'applicazione Discord e inviare dati di sistema, inclusi screenshot dei contenuti dello schermo. I pacchetti pytagora e pytagora2 includevano la possibilità di caricare ed eseguire codice eseguibile di terze parti.

Fonte: opennet.ru

Aggiungi un commento