È stato pubblicato un metodo per eludere i sistemi di isolamento dell'esecuzione del codice in Python, basato su un errore noto da tempo, emerso in Python 2.7, scoperto nel 2012 e tuttora non corretto in Python 3. Questo errore consente, tramite un codice appositamente strutturato in Python, di accedere alla memoria già liberata (Use-After-Free) in CPython. Inizialmente si pensava che questo errore non rappresentasse una minaccia per la sicurezza e che potesse portare a un crash dello script solo in casi molto rari, generalmente artificialmente creati.
Un ricercatore di sicurezza con lo pseudonimo kn32 ha approfondito il problema e ha creato un exploit funzionante che permette di eseguire 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 o installare il gestore «code.__new__». Utilizza solo il hook «builtin.__id__», che di solito non è vietato. 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 incorporati, ecc.) che consentono l'esecuzione di codice Python ma limitano le chiamate disponibili e non permettono di accedere a metodi come os.system.
Il codice proposto funge da analogia alla chiamata di os.system, 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 con le modalità di protezione PIE, RELRO e CET attive. L'operazione consiste nel ottenere informazioni da un codice Python sull'indirizzo di una delle funzioni nel codice eseguibile di CPython. Sulla base di questo indirizzo, viene calcolato l'indirizzo base di CPython in memoria e l'indirizzo della funzione system() nell'istanza di libc caricata in memoria. Infine, viene avviato un salto diretto a un indirizzo specifico di system, sostituendo il puntatore del primo argomento con la stringa «/bin/sh».

Fonte: opennet.ru
