Project Zero vyvinul metódu na využitie zraniteľností v systéme Linux

Linux

Využitie nulových odkazov v jadre Linuxu

Nedávno bolo oznámené, že výskumníci z tímu Google Project Zero vyvinuli metódu na zneužitie zraniteľností v jadre Linuxu spôsobených dereferencovaním ukazovateľa NULL.

Doteraz sa problémom s jadrom súvisiacim s dereferencovaním ukazovateľov NULL nevenovala náležitá pozornosť , pretože sa považovalo za nereálne premeniť takéto problémy na útoky vedúce k eskalácii privilégií alebo spusteniu vlastného kódu (mapovanie neprivilegovaných procesov do nižšej oblasti adresného priestoru je zakázané).

Vo všeobecnosti takéto chyby vedú k vygenerovaniu varovaní oops jadrom, po ktorých sa problematické úlohy dokončia a stav sa obnoví bez nutnosti zastavenia systému.

Nová metóda útoku je založená na spracovaní stavov „oops“ , ktoré môžu viesť k zvýšeniu hodnoty referenčného počítadla (refcount), čo môže následne spôsobiť pretečenie počítadla a uvoľnenie pamäte spojenej s refcount.

V tomto prípade sa využitie redukuje na manipulácie typické pre útoky typu use-after-free (nastáva situácia, keď sa referenčný počet objektu zníži na nulu, pamäť sa uvoľní, ale v skutočnosti existujú funkčné odkazy smerujúce na uvoľnenú pamäť).

V súčasnosti, keď jadro Linuxu spustí dereferenciu null z kontextu procesu, generuje chybu oops , ktorá sa líši od paniky jadra. Panika nastáva, keď jadro zistí, že neexistuje bezpečný spôsob, ako pokračovať v vykonávaní, a preto musí zastaviť všetko vykonávanie. Jadro však počas oops nezastaví všetko vykonávanie; namiesto toho sa jadro pokúsi čo najlepšie obnoviť proces a pokračovať v vykonávaní.

Dereferencovanie ukazovateľa NULL sa tu používa ako spôsob, ako riadeným spôsobom vygenerovať stav „ops“. Problém je v tom, že na dosiahnutie 232-bitového pretečenia refcount je potrebných približne 32 volaní stavu „oops“.

Z praktického hľadiska trvá útok s použitím navrhovaného exploitu približne osem dní nepretržitého generovania nemiestneho (OOP) stavu . Ak bude úspešný, exploit vám umožní spustiť kód na úrovni jadra.

Dereferencia ukazovateľa NULL použitá v exploite bola opravená v októbri, ale keďže podobné problémy nie sú nezvyčajné a predtým sa považovali za chyby, nie ako zraniteľné miesta, vývojári pridajú všeobecnú ochranu jadra Linuxu, aby zabránili útokom, ktoré manipulujú s generovaním „oops“ ."

 V prípade úlohy to znamená zahodiť existujúci zásobník jadra a prejsť priamo na make_task_dead, ktorá volá do_exit. Jadro tiež odošle do dmesg protokol "crash" a stopu jadra ukazujúce, v akom stave bolo jadro, keď sa vyskytla chyba. Môže sa to zdať ako zvláštna voľba, keď došlo k poškodeniu pamäte; Zámerom však je, aby sa chyby jadra ľahšie zisťovali a zapisovali podľa filozofie, že bežiaci systém sa oveľa ľahšie ladí ako vyradený.

Jadro 6.2 obsahuje najmä zmeny na obmedzenie maximálneho počtu „oops“ . Po dosiahnutí limitu, ktorý je štandardne nastavený na 10 000 oops (v prípade potreby ho môžete zmeniť pomocou parametra oops_limit), jadro prejde do stavu „panika“, po ktorom nasleduje reštart, ktorý neumožní počet iterácií potrebný na vynulovanie refcountu.

Plánuje sa tiež, že obmedzenie sa prenesie na už vydané, no stále podporované vetvy jadra, ako aj kernel balíčky populárnych distribúcií.

Na záver, ak sa chcete o tom dozvedieť viac , podrobnosti nájdete na nasledujúcom odkaze.


Pridať ako preferovaný zdroj v Google