2017-01-15 3 views
2

Angenommen, es gibt zwei Linux kernel modules. Es gibt eine global pointer, die zwischen diesen beiden Modulen geteilt wird. Module 1 versucht, auf diese pointer zuzugreifen, diesen Zeigerwert beschädigt und beendet. Jetzt versucht Module 2 auf diese pointer zuzugreifen, die nicht mehr gültig ist und abstürzt.Zwei Linux-Kernel-Module korrumpieren einen gemeinsamen Zeiger - Wie Debuggen?

Modul 1:

module_function() 
{ 
    //corrupt global_ptr 
} 

module2_function() 
{ 

    local_ptr = global_ptr; 
    //local_ptr corrupted 
    //Now if local_ptr is accessed, it will crash 
} 

Kann jemand erklären, wenn dieses Szenario gültig und möglich ist? Dann

i) Wie dieses Problem zu debuggen. Das heißt, herauszufinden, welches Modul den Zeiger korrumpiert?

ii) Wie behebt man dieses Problem, damit module2 niemals abstürzen sollte?

+0

0. Ja, dieses Szenario ist möglich. 1. Versuchen Sie, Änderungen am Zeiger abzufangen. Zum Beispiel mit Haltepunkten auf Daten. 2. Im Allgemeinen gibt es keinen Schutz gegen eine Fehlfunktion des Moduls. Alle Module und Kernel-Core-Shares ** einzelner Adressraum **. Es können also nicht nur globale Variablen, sondern auch lokale verfälscht werden. – Tsyvarev

Antwort

0
  1. Dies ist ein klassischer Fall von use-after-free oder use-after-modify Art von bug, die im Allgemeinen oops verursacht, wodurch die taintinglinux kernel mit G flag sets, was zu system hang and reboot. Sie können diese logs in /var/log/kern.log beobachten, wenn Sie dmesg logs wegen system hang nicht erhalten können.
  2. Um solche kernel memory pointer corruption Probleme zu debuggen, müssen Sie Enable Slab Corruption debug in Ihrem kernel menuconfig und damit .config. Für eine schnellere Referenz sind die Schritte, um dies zu tun: - make menuconfig ---> Kernel hacking ---> Memory debugging ---> Debug slab memory locations
  3. Die Entwurfslösung für dieses Problem wäre global pointers nicht zwischen Modulen zu verwenden, weil Sie nie wissen, welches Modul freed zuerst zu Zeiger Korruption erhalten könnte.
+0

Ja, ich weiß von SLUB_DEBUG_ON. Aber ich bin mir nicht sicher, wie dies dazu beitragen wird, das eigentliche Problem zu finden. Es ist möglich, solche Probleme mit gdb zu debuggen? –

+0

Wenn wir 'Slab Debug On 'aktivieren, schreibt der Kernel einen bekannten Wert' 0x6A6A6A6A' in die Speicherbereiche, die' beschädigt/freigegeben 'sind. Wenn also Ihr 'globaler Zeiger' versucht, auf diese' Speicherregion' zuzugreifen, wird er schließlich mit dem obigen Wert enden, der aus Ihren 'dmesg-Protokollen' ersichtlich ist. Ich würde auch darauf wetten, den Zeiger in gdb Variable zu beobachten, um solche Probleme zu debuggen. –

Verwandte Themen