2016-10-17 1 views
2

Ich benutze die einfache sys_call_table umgeschrieben auf log alle Execve Anrufe in einem System.Ist die sys_call_table im Kernel 4.8 geschützt?

Beim Wechsel zu Ubuntu 16.10 mit einem 4.8 Kernel wurde dieser Mechanismus plötzlich nicht mehr funktionieren. In 16.04 mit ein 4.6-Kernel funktionierte es.

1: write_cr0 (read_cr0() & (~ 0x10000)); 

    2: original_execve = (void *)syscall_table[__NR_execve]; 
    3: syscall_table[__NR_execve] = (unsigned long)&new_execve; 

    4: write_cr0 (read_cr0() | 0x10000); 

Der Seitenfehler geschieht bereits bei den alten Eintrag zu lesen, ist, dass Zeile 2. die sys_call_table Adresse retrive ich benutze:

sudo cat /boot/System.map-`uname -r` | grep -e '\ssys_call_table' | awk '{ print $1}')" 

-Code ist aus: https://github.com/eiselekd/shinterposer/tree/master/mod

niemanden Wissen was passiert ist? Vielleicht wurde ein Schutzmechanismus eingeführt?

+0

Bisher eine Lösung gefunden: Ich habe den 4.8-Kernel und das exportierte Symbol sys_call_table sowie neu kompiliert, da der const-Spezifizierer entfernt wurde. Auf diese Weise kann ich sys_call_table direkt vom Modul referenzieren. Immer noch nicht sicher, warum es mit der Version, die für 4.6 funktionierte, abgestürzt ist. Wird die Verknüpfung für schreibgeschützte Abschnitte geändert? –

+0

Sie können eine gute Übersicht über alle Maßnahmen finden, die Linux in der [this] (https://outflux.net/slides/2016/lss/kspp.pdf) Präsentation implementiert hat (bis zu 4,2). –

+0

Danke. Eine Frage: Gibt es eine Möglichkeit, die syscall-Tabellenadresse zurück zu bekommen, wenn kaslr vorhanden ist? Ich denke, das wäre ein Exploit, aber trotzdem ... –

Antwort

2

Es scheint Address Space Layout Randomization (kASLR) auf der syscall-Tabelle unter Ort standardmäßig im 4.8-Kernel zu sein. Wenn Sie das sys_call_table-Symbol als exportiert deklarieren und direkt von einem Modul aus verknüpfen, ändert sich die Adresse für sys_call_table für jeden Start. Die Adresse von /boot/System.map-xxx ist nutzlos.

Um kaslr in ubuntu 16.10 Kernel 4.8 ein deaktivieren

nokaslr 

an die Kernel-Kommandozeile hinzuzufügen.