Vulnerabilità in Python che consente di richiamare comandi di sistema da script isolati

È stato pubblicato un metodo per aggirare i sistemi di esecuzione del codice isolati in Python, basato sull'uso di un bug noto da tempo apparso in Python 2.7, identificato nel 2012 e non è stato ancora corretto in Python 3. Il bug consente di utilizzare link appositamente Codice Python per avviare l'accesso alla memoria già liberata (Use-After-Free) in Python. Inizialmente si presumeva che l'errore non rappresentasse una minaccia per la sicurezza e solo in casi molto rari, di solito creati artificialmente, potesse portare ad una chiusura anomala dello script.

Un ricercatore di sicurezza sotto lo pseudonimo kn32 si è interessato al problema ed è riuscito a preparare un exploit funzionante che permette di richiamare qualsiasi comando di sistema senza avere accesso diretto a metodi come os.system. L'exploit è implementato in puro Python e funziona senza importare librerie esterne e senza installare l'handler “code.__new__”. Degli hook viene utilizzato solo “builtin.__id__”, che di solito non è proibito. Dal punto di vista pratico, il codice proposto può essere utilizzato per aggirare i meccanismi di isolamento in vari servizi e ambienti (ad esempio, in ambienti di apprendimento, shell online, gestori integrati, ecc.), che consentono l'esecuzione del codice Python, ma limitano la chiamate disponibili e non consentono metodi di chiamata come os.system.

Il codice proposto è un analogo della chiamata os.system, che funziona sfruttando una vulnerabilità in CPython. L'exploit funziona con tutte le versioni di Python 3 su sistemi con architettura x86-64 e dimostra un funzionamento stabile su Ubuntu 22.04, anche quando le modalità di protezione PIE, RELRO e CET sono abilitate. Il lavoro consiste nell'ottenere informazioni dal codice Python sull'indirizzo di una delle funzioni nel codice eseguibile CPython. In base a questo indirizzo vengono calcolati l'indirizzo base di CPython in memoria e l'indirizzo della funzione system() nell'istanza libc caricata in memoria. Alla fine, con la sostituzione del puntatore del primo argomento sulla riga “/bin/sh”, viene avviata una transizione diretta ad un indirizzo di sistema specifico.

Vulnerabilità in Python che consente di richiamare comandi di sistema da script isolati


Fonte: opennet.ru

Aggiungi un commento