Megjelent egy Python nyelvű, szigetelt kódvégrehajtási rendszerek megkerülésére szolgáló módszer, amely egy régóta ismert hibán alapul, ami a Python 2.7-ben fordult elő, 2012-ben felfedezték, és a Python 3-ban eddig nem javították ki. A hiba lehetővé teszi, hogy egy különösen összeállított Python kód segítségével hozzáférést nyerjünk egy már felszabadított memóriahelyhez (Use-After-Free) a CPython-ban. Eredetileg azt feltételezték, hogy a hiba nem hordoz biztonsági kockázatot, és csak nagyon ritka esetekben, jellemzően mesterségesen létrehozott körülmények között okozhatja a szkript leállását.
A kn32 álnevű biztonsági kutató érdeklődést mutatott a probléma iránt, és sikerült kidolgoznia egy működő exploitot, amely lehetővé teszi bármilyen rendszerparancs végrehajtását anélkül, hogy közvetlen hozzáférése lenne az os.system típusú módszerekhez. Az exploit tiszta Python nyelven valósult meg, és működik külső könyvtárak importálása és a 'code.__new__' handler telepítése nélkül. Csak a 'builtin.__id__' hook-ot használja, amely általában nem tilos. Gyakorlati szempontból a javasolt kód alkalmazható az elszigetelési mechanizmusok megkerülésére különféle szolgáltatásokban és környezetekben (például oktatási környezetekben, online interfészekben, beágyazott kezelőkben stb.), ahol Python kód végrehajtása engedélyezett, de a hívások korlátozottak, és nem engedik olyan módszerek elérését, mint az os.system.
A javasolt kód az os.system hívásának analógja, amely a CPython sebezhetőségének kihasználásával működik. Az exploit minden Python 3 verzióval kompatibilis x86-64 architektúrájú rendszereken és stabilan működik az Ubuntu 22.04 alatt, még a PIE, RELRO és CET védelmi módok bekapcsolásakor is. A működés lényege, hogy a Python nyelvű kódból információt nyerünk a CPython végrehajtható kódjának egyik funkciójának címéről. E cím alapján kiszámítjuk a CPython alapcímét a memóriában és a system() függvény címét a betöltött libc példányban. Végül közvetlen ugrást kezdeményezünk a megadott címre, a system függvény első argumentumának mutatóját a '\/bin\/sh' szövegre állítva.

Forrás: opennet.ru
