He löysivät Pythonista haavoittuvuuden, joka sallii komentojen suorittamisen hiekkalaatikkoskripteistä

Muutama päivä sitten julkisti menetelmän Pythonin eristetyn koodin suoritusjärjestelmien ohittamiseksi, perustuu pitkään tunnetun bugiin, joka ilmestyi Python 2.7:ssä, tunnistettiin vuonna 2012 ja jota ei ole vielä korjattu Python 3:ssa.

Mainitaan se bugi mahdollistaa erityisesti sidotun python-koodin käytön puhelun aloittamiseen Pythonissa jo vapautettuun muistiin (Use-After-Free). Aluksi oletettiin, että virhe ei ole turvallisuusuhka ja vain erittäin harvoissa tapauksissa, yleensä keinotekoisesti luotu, se voi johtaa skriptin epänormaaliin lopettamiseen.

Tietoturvatutkija salanimellä kn32 kiinnostui ongelmasta ja onnistui valmistelemaan toiminnallisen hyväksikäytön, joka mahdollistaa minkä tahansa järjestelmäkomennon kutsumisen ilman suoraa pääsyä menetelmiin, kuten os.system.

Hyödyntäminen on toteutettu puhtaalla Pythonilla ja toimii ilman ulkoisten kirjastojen tuontia ja asentamatta "code.__new__" -ohjainta. Koukuista käytetään vain "builtin.__id__", mikä ei yleensä ole kiellettyä. Käytännön puolella ehdotettua koodia voidaan käyttää eristysmekanismien ohittamiseen eri palveluissa ja ympäristöissä (esimerkiksi oppimisympäristöissä, online-shellissä, sisäänrakennetuissa ohjaimissa jne.), jotka mahdollistavat Python-koodin suorittamisen, mutta rajoittavat käytettävissä olevaa kutsuja ja estää pääsyn menetelmiä, kuten os.system.

Ehdotettu koodi on analogi os.system-kutsulle, joka toimii hyödyntämällä CPythonin haavoittuvuutta. Hyödyntäminen toimii kaikkien Python 3 -versioiden kanssa x86-64-järjestelmissä ja on vakaa Ubuntu 22.04:ssä, vaikka PIE-, RELRO- ja CET-suojaustilat ovat käytössä.

työ tiivistyy tietojen saamiseen yhden funktion osoitteesta Python-koodista CPython-suoritettavassa koodissa.

Tämän osoitteen perusteella lasketaan CPythonin perusosoite muistissa ja system()-funktion osoite ladatussa libc-instanssissa. Lopussa aloitetaan suora siirtyminen tiettyyn osoitejärjestelmään korvaamalla ensimmäisen argumentin osoitin merkkijonolla "/bin/sh".

Helpoin tapa hyödyntää on luoda lista, jonka pituus on yhtä pitkä kuin vapautetun puskurin pituus ja jonka nimikepuskuri (ob_item) on todennäköisesti varattu samaan paikkaan kuin vapautettu puskuri.

Tämä tarkoittaa, että saamme kaksi erilaista "näkymää" samalle muistipalalle. Yksi näkymä, muistinäkymä, ajattelee, että muisti on vain joukko tavuja, joihin voimme kirjoittaa tai lukea mielivaltaisesti. Toinen näkymä on luomamme luettelo, jonka mielestä muisti on luettelo PyObject-osoittimista. Tämä tarkoittaa, että voimme luoda väärennettyjä PyObject-sähköposteja jonnekin muistiin, kirjoittaa niiden osoitteet luetteloon kirjoittamalla muistinäkymään ja sitten käyttää niitä indeksoimalla luettelo.

PoC:n tapauksessa he kirjoittavat 0:n puskuriin (rivi 16) ja pääsevät sitten siihen painamalla print(L[0]). L[0] saa ensimmäisen PyObjectin*, joka on 0, ja print yrittää sitten käyttää joitakin sen kenttiä, mikä johtaa nollaosoittimen viittaukseen.

Mainitaan se tämä bugi on läsnä kaikissa python-versioissa ainakin python 2.7:n jälkeen ja vaikka hyväksikäyttö on suunniteltu toimimaan lähes kaikissa Python 3 -versioissa, tämä ei tarkoita, etteikö se olisi toistettavissa Python 2:ssa (tekijän mukaan).

Hyödyntämisen tarkoitus on kutsua system("/bin/sh") jonka vaiheet ovat seuraavat:

  • CPython leak binäärifunktion osoitin
  • Laske CPython-perusosoite
  • Laske järjestelmän tai PLT-tynkäsi osoite
  • Siirry tähän osoitteeseen, jossa ensimmäinen argumentti osoittaa /bin/sh
  • voitto

Lopuksi mainitaan, että hyväksikäyttö ei ole hyödyllinen useimmissa kokoonpanoissa. Siitä voi kuitenkin olla hyötyä Python-tulkeille, jotka yrittävät eristää koodia, rajoittaa tuontia tai valvontakoukkujen käyttöä.

Vihdoin jos olet kiinnostunut tietämään siitä lisää muistiinpanosta voit tutustua alkuperäiseen julkaisuun osoitteessa seuraava linkki.


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastaa tiedoista: AB Internet Networks 2008 SL
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.