maandag 19 december 2016

Zero day exploit in Linux ontdekt: hoe de hack werkt

De bekende hacker Chris Evans heeft een manier gevonden om huidige versies van Ubuntu en Fedora te hacken. Het enige wat een Linux-gebruiker hoeft te doen om in de problemen te komen, is het downloaden van een kwaadaardig muziekbestand in Chrome en deze te starten. Ook wanneer je slechts de map opent waarin het bestand zich bevindt, zal de hack in gang worden gezet.
In een blogpost doet Evans uit de doeken hoe hij het lek op het spoor kwam. In zijn hack maakt de man gebruik van de Linux gstreamer, een media framework dat bij veel Linux-distributies standaard wordt geleverd. Dit framework bevat onder andere de mogelijkheid om Super Nintendo Entertainment System-muziekbestanden te emuleren. Deze emulatie vormt de basis van alle problemen die Evans over Linux-gebruikers kan heen roepen.

Out of bounds register

Evans is twee fouten op het spoor gekomen in de basiscode van de SNES-emulatie. Het eerste probleem doet zich voor in de opcode 0xAF, waarbij een schrijfoperatie naar het X-register wordt uitgevoerd. De waarde die naar het register kan worden geschreven, wordt niet beperkt, waardoor je een out of bound waarde in het register kan opslaan.
Het tweede probleem situeert zich in de instructie om de flags van een register en de instruction pointer naar de stack te restoren. Hierbij wordt gebruik gemaakt van het SP-register, welke normaal gezien een waarde tussen 0x00 en 0xff moet hebben. Bij deze instructie wordt de waarde van het SP-register niet veperkt, waardoor de stack pointer posities van het virtuele geheugenadres te groot kan worden. De stack pointer kan met andere worden een out of bounds waarde krijgen.

Memory leak

Om het nut van de twee fouten in de SNES-emulatiecode de testen, probeerde Evans zijn Linux-systeem te doen crashen met behulp van out of bounds waardes. De hacker genereerde met succes een te grote waarde in het X-register, maar jammer genoeg werd er geen crash veroorzaakt. Na enig onderzoek bleek de waarde van het X-register bij verdere bewerkingen toch beperkt te worden.
Ondanks het feit dat de out of bounds waarden niet onmiddellijk voor een exploit zorgen, kan de grote waarde wel andere bijwerkingen hebben. Bovendien ontdekte Evans een bug in de decoder wrapper van libgme, de software library Game Music Emu, waardoor een memory leak ontstond.

Watervaleffect

Met de verschillende fouten in de emulatiecode in zijn achterhoofd, zocht Evans verder naar een manier om via de bugs een hack uit te voeren. Hij ontdekte dat de y-waarde bij de vermenigvuldiginginstructie eveneens niet werd beperkt, waardoor je erg snel een erg grote waarde kan creëren.
Ook de instructie om waardes te delen, bevat hetzelfde probleem. Na experimenteren, slaagde Evans erin om met een grote waarde in het Y-register, gecreëerd met een vermenigvuldiging, een negatief getal uit te komen na de deelinstructie. Deze negatieve waarde kan gebruikt worden om achterwaarts te indexeren, waardoor de vtable waarde kan worden aangepast. Ook kan Evans op deze manier de pointer naar het host heap memory address van de virtuele RAM aanpassen, waarna de hacker met succes kwaadaardige code kan starten op het systeem van een slachtoffer.

Werkende zero day exploit

Samengevat zorgt Evans er in de eerste plaats voor dat het X-register een grote waarde krijgt. Hierna gebruikt hij de vermenigvuldiging- en deelinstructies om een negatieve waarde in het Y-register te creëren. Hierna zorgt hij ervoor dat de vtable corrupt geraakt en verwijst naar plaats 0x100 in de virtuele RAM. Hierdoor wordt vtable -2370739 opgeroepen, welke een instructie bevat die de pointer op plaats 0x10 laadt in %rdi. %rdi bevat de pointer naar offset 0xc0 in de virtuele RAM. In Evans zijn voorbeeld bevindt zich hier de de string ‘gnome-calculator’.
Hierna wordt de pointer bij offset 0x8 geladen in %rax, waar Evans eerder system() heeft opgeslagen. Deze variabele wordt opgeroepen, waarbij het eerste argument in de x86_64 ABI overeenkomt met %rdi, welke nog steeds naar de gnome-calculator verwijst. In dit geval zal er dus een rekenmachine worden gestart. Door de kwaadaardige code naar andere software te laten wijzen, kan er echter een hoop kattenkwaad worden uitgehaald.

Geen opmerkingen:

Een reactie posten