
Code-Injection, bösartige Payload über Pagetables pml4 injizieren.
Code-Injektion, Injizieren von schädlicher Nutzlast über Pagetables PML4.
Dies ist nur ein Proof-of-Concept der Page-Table-Injection-Technik, um schädlichen Code in beliebige Benutzerprozesse einzuschleusen.
Unter Windows (und einigen modernen Betriebssystemen) besitzt jeder Prozess sein eigenes PML4, auch Directory Table Base genannt. Daher kann Prozess A nicht ohne APIs auf Prozess B zugreifen. Aber was wäre, wenn wir einen beliebigen PML4-Eintrag injizieren könnten? Natürlich zeigt der PML4-Eintrag dann auf die entsprechende physische Adresse der Einträge PDP, PD und PT, genau wie im zugrunde liegenden Prozess.
Um einen schädlichen PML4-Eintrag in den Zielprozess zu injizieren, benötigen wir eine tatsächliche residente Seite (physischer Speicher), die den schädlichen PML4-Eintrag unterstützt. Diese residente Seite muss buchstäblich resident sein, da sonst das System abstürzen oder instabil werden würde – während der MMU-Übersetzung zur physischen Adresse gibt es nichts, was die MMU erwartet, und auch der Windows-Speicher-Manager erwartet nichts.
Betrachten wir die Puffer des zugrunde liegenden Prozesses und des Zielprozesses. In diesem Fall sind die Puffer:
0x1A45F8100000x6EA45F810000Bevor wir weitermachen, denken einige vielleicht, dass die zweite Adresse (0x6EA45F810000) seltsam aussieht – normalerweise allokieren wir Puffer über malloc oder VirtualAlloc, dann sollte die virtuelle Adresse wie 0x17C7CAC0000, 0x23BE9D80000, 0x19FE76F0000 oder ähnlich aussehen. Das liegt daran, dass der schädliche PML4-Eintrag nicht vom Windows-Speicher-Manager verwaltet wird und auch nicht verwaltet wird. Natürlich kann jede virtuelle Adresse in einem 64-Bit-Windows-Prozess jeden Wert innerhalb des Benutzerspeicherbereichs annehmen.
Wenn wir uns nun beide Adressen ansehen...
0: kd> .process ffff9803d8037080
Implicit process is now ffff9803`d8037080
0: kd> db 0x6EA45F810000 l2
00006ea4`5f810000 4d 5a MZ
0: kd> !vtop 7968b000 0x6EA45F810000
Amd64VtoP: Virt 00006ea45f810000, pagedir 000000007968b000
Amd64VtoP: PML4E 000000007968b6e8
Amd64VtoP: PDPE 000000005849b488
Amd64VtoP: PDE 0000000059e9c7e0
Amd64VtoP: PTE 000000003251d080
Amd64VtoP: Mapped phys 0000000014306000
Virtual address 6ea45f810000 translates to physical address 14306000.
0: kd> .process ffff9803d9f6b080
Implicit process is now ffff9803`d9f6b080
0: kd> db 0x1A45F810000 l2
000001a4`5f810000 4d 5a MZ
0: kd> !vtop 564f6000 0x1A45F810000
Amd64VtoP: Virt 000001a45f810000, pagedir 00000000564f6000
Amd64VtoP: PML4E 00000000564f6018
Amd64VtoP: PDPE 000000005849b488
Amd64VtoP: PDE 0000000059e9c7e0
Amd64VtoP: PTE 000000003251d080
Amd64VtoP: Mapped phys 0000000014306000
Virtual address 1a45f810000 translates to physical address 14306000.
Beide Adressen entsprechen denselben Seitentabelleneinträgen: PDP, PD, PT und einer physischen Adresse. Wenn wir also den Puffer des zugrunde liegenden Prozesses ändern, wird die Änderung auch im Zielprozess sichtbar. Dies ist dem Shared Memory unter Windows sehr ähnlich, mit dem Unterschied, dass der Speicherbereich im Zielprozess in keiner VAD-Eintrag seines Prozesses angezeigt wird. Andererseits, wenn der Puffer des zugrunde liegenden Prozesses freigegeben wird, geschieht dies auch im Zielprozess, jedoch ohne Bereinigung der Seitentabelleneinträge des Zielprozesses – was dazu führt, dass der Speicher-Manager einen Bugcheck MEMORY_MANAGEMENT auslöst oder sogar einen schwerwiegenden Triple-Fault auf der CPU verursacht.
Diese Technik hat massive Stabilitätsprobleme, da der injizierte schädliche PML4-Eintrag – wie bereits erwähnt – weder vom Windows-Speicher-Manager noch vom Kernel verwaltet wird. Es gibt keine Garantie, dass der zugrunde liegende Prozess so lange lebt, bis der Zielprozess beendet wird, und der Zielprozess hat auch nichts mit der Bereinigung des schädlichen PML4-Eintrags zu tun, wenn der zugrunde liegende Prozess beendet wird.
MIT Copyright Kento Oki <[email protected]>
Der Quellcode kann externe Inhalte enthalten; diese Inhalte unterliegen den Rechten ihrer jeweiligen Inhaber.