Linux-Kernel: Denial-of-Service-Attacke

Eine Sicherheitslücke im Linux-Kernel hat zur Folge, dass ein lokaler Angreifer Denial-of-Service-Attacken ausführen kann. Ursache ist ein Programmierfehler in der “get_wchan()”-Funktion. Diese in der “arm/kernel/process.c”-Datei implementierte Funktion enthält eine Schwachstelle, die es dem Angreifer ermöglicht, Stack-Frames zu beschädigen.

Insgesamt wurden zwei Patches zum Beheben dieses Problems in den Kernel eingespielt:

diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 94f6b05..92f7b15 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -404,6 +404,7 @@ EXPORT_SYMBOL(dump_fpu);
 unsigned long get_wchan(struct task_struct *p)
 {
     struct stackframe frame;
+    unsigned long stack_page;
     int count = 0;
     if (!p || p == current || p->state == TASK_RUNNING)
         return 0;
@@ -412,9 +413,11 @@ unsigned long get_wchan(struct task_struct *p)
     frame.sp = thread_saved_sp(p);
     frame.lr = 0;            /* recovered from the stack */
     frame.pc = thread_saved_pc(p);
+    stack_page = (unsigned long)task_stack_page(p);
     do {
-        int ret = unwind_frame(&frame);
-        if (ret < 0)
+        if (frame.sp < stack_page ||
+            frame.sp >= stack_page + THREAD_SIZE ||
+            unwind_frame(&frame) < 0)
             return 0;
         if (!in_sched_functions(frame.pc))
             return frame.pc;

Dieser erste Patch korrigiert die fehlerhafte “get_wchan()”-Funktion. Ihm folgt ein zweiter Patch:

diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c
index 00f79e5..af4e8c8 100644
--- a/arch/arm/kernel/stacktrace.c
+++ b/arch/arm/kernel/stacktrace.c
@@ -31,7 +31,7 @@ int notrace unwind_frame(struct stackframe *frame)
     high = ALIGN(low, THREAD_SIZE);
 
     /* check current frame pointer is within bounds */
-    if (fp < (low + 12) || fp + 4 >= high)
+    if (fp < low + 12 || fp > high - 4)
         return -EINVAL;
 
     /* restore the registers from the stack frame */

Dieser zweite Patch korrigiert die Validierung des Stack-Zeigers, da es im “fp + 4”-Fall unter Umständen zu Überläufen kommen kann.

Nach oben