A fost publicată o metodă de ocolire a sistemelor de execuție izolată a codului în limbajul Python, bazată pe utilizarea unei erori cunoscute de mult, apărute în Python 2.7, identificată în 2012 și care nu a fost încă remediată în Python 3. Această eroare permite, printr-un cod special compus în Python, inițierea unei apelări la memorie deja eliberată (Use-After-Free) în CPython. Inițial, s-a presupus că eroarea nu reprezintă o amenințare la adresa securității și că, în foarte rare cazuri, de obicei în condiții artificiale, poate duce la prăbușirea scriptului.
Un cercetător în securitate sub pseudonimul kn32 a fost interesat de problemă și a reușit să pregătească un exploit funcțional care permite apelarea oricărei comenzi de sistem, fără a avea acces direct la metodele de tip os.system. Exploit-ul este realizat în Python simplu și funcționează fără a importa biblioteci externe și fără a instala un handler pentru „code.__new__”. Din hook-uri este utilizat doar „builtin.__id__”, care de obicei nu este interzis. Din punct de vedere practic, codul propus poate fi utilizat pentru a ocoli mecanismele de izolare în diverse servicii și medii (de exemplu, în medii de învățare, shell-uri online, handleri încorporați etc.) care permit execuția codului în Python, dar care limitează apelurile disponibile și nu permit accesul la metode precum os.system.
Codul propus reprezintă un echivalent al apelului os.system, funcționând prin exploatarea unei vulnerabilități în CPython. Exploit-ul funcționează cu toate versiunile de Python 3 pe sisteme cu arhitectura x86-64 și demonstrează o funcționare stabilă în Ubuntu 22.04, chiar și cu modurile de protecție PIE, RELRO și CET activate. Funcționarea constă în obținerea din codul Python a informațiilor despre adresa uneia dintre funcțiile din codul executabil CPython. Pe baza acestei adrese, se calculează adresa de bază a CPython în memorie și adresa funcției system() în instanța libc încărcată în memorie. La final, se inițiază o tranziție directă la o adresă specifică a system cu înlocuirea pointer-ului primului argument cu stringul „/bin/sh”.

Sursa: opennet.ro
