Sebezhetőséget találtak a Pythonban, amely lehetővé teszi parancsok futtatását sandbox-szkriptekből

Pár napja közzétett egy módszert a Python izolált kódvégrehajtási rendszereinek megkerülésére, a Python 2.7-ben megjelent, 2012-ben azonosított, és a Python 3-ban még nem javított, régóta ismert hiba használatán alapul.

Azt emlegetik a hiba lehetővé teszi a speciálisan kötött python kód használatát a hívás kezdeményezéséhez a Pythonban már felszabadított memóriába (Use-After-Free). Kezdetben azt feltételezték, hogy a hiba nem jelent biztonsági fenyegetést, és csak nagyon ritkán, általában mesterségesen előidézett esetekben vezethet a szkript rendellenes leállásához.

A kn32 fedőnevű biztonsági kutató érdeklődni kezdett a probléma iránt, és sikerült egy olyan funkcionális exploitot készítenie, amely lehetővé teszi bármely rendszerparancs meghívását anélkül, hogy közvetlenül hozzáférnének olyan módszerekhez, mint például az os.system.

Az exploit tiszta Pythonban van megvalósítva, és külső könyvtárak importálása nélkül működik és a "code.__new__" illesztőprogram telepítése nélkül. A horgok közül csak a "builtin.__id__" használatos, ami általában nem tiltott. Gyakorlati szempontból a javasolt kóddal megkerülhetőek az elkülönítési mechanizmusok különböző szolgáltatásokban és környezetekben (például tanulási környezetekben, online shellekben, beépített vezérlőkben stb.), amelyek lehetővé teszik Python kód futtatását, de korlátozzák az elérhetőséget. hívásokat, és nem engedélyezi az olyan hozzáférési módszereket, mint például az os.system.

A javasolt kód az os.system hívás analógja, amely a CPython biztonsági rését kihasználva működik. Az exploit a Python 3 összes verziójával működik x86-64 rendszereken, és stabil az Ubuntu 22.04-en, még akkor is, ha a PIE, RELRO és CET biztonsági módok engedélyezettek.

A munka Ennek lényege, hogy a Python-kódból információt szerezzünk az egyik függvény címéről a CPython futtatható kódjában.

Ez a cím alapján kerül kiszámításra a CPython alapcíme a memóriában és a system() függvény címe a betöltött libc példányban. A végén egy adott címrendszerre való közvetlen áttérés indul úgy, hogy az első argumentum mutatóját a „/bin/sh” karakterláncra cseréljük.

A kiaknázás legegyszerűbb módja a felszabadított puffer hosszával megegyező hosszúságú lista létrehozása, amelynek az elempuffere (ob_item) nagy valószínűséggel ugyanott lesz lefoglalva, mint a felszabadított pufferé.

Ez azt jelenti, hogy két különböző "nézetet" kapunk ugyanarról az emlékről. Az egyik nézet, a memórianézet, úgy gondolja, hogy a memória csak bájtok tömbje, amelybe tetszőlegesen írhatunk vagy kiolvashatunk. A második nézet az általunk létrehozott lista, amely szerint a memória PyObject mutatók listája. Ez azt jelenti, hogy valahol a memóriában létrehozhatunk hamis PyObject e-maileket, amelyek címét a memórianézetbe írva írhatjuk a listába, majd a lista indexelésével elérhetjük őket.

A PoC esetében 0-t írnak a pufferbe (16. sor), majd a print(L[0]) paranccsal érik el. Az L[0] megkapja az első PyObject*-et, amely 0, majd a print megpróbál hozzáférni néhány mezőhöz, ami nulla mutatóhivatkozást eredményez.

Azt emlegetik ez a hiba minden python verzióban jelen van legalább a python 2.7 óta és bár az exploitot úgy tervezték, hogy a Python 3 szinte bármely verzióján működjön, ez nem jelenti azt, hogy ne reprodukálható a Python 2-ben (a szerző szerint).

A kihasználás célja a system("/bin/sh") meghívása melynek lépései a következők:

  • CPython leak bináris függvény mutatója
  • Számítsa ki a CPython alapcímét
  • Számítsa ki a rendszer vagy a PLT csonk címét
  • Ugrás erre a címre úgy, hogy az első argumentum a /bin/sh-ra mutat
  • győzelem

Végül megemlítjük, hogy az exploit nem lesz hasznos a legtöbb konfigurációban. Hasznos lehet azonban a Python-tolmácsok számára, akik megpróbálják elkülöníteni a kódot, korlátozzák az importálást vagy az Audit Hooks használatát.

Végül ha érdekel, hogy többet tudjon meg róla a jegyzetről az eredeti kiadványt tekintheti meg a következő link.


Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: AB Internet Networks 2008 SL
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.