Razzer: Finding Kernel Race Bugs through Fuzzing
Dae R. Jeong† Kyungtae Kim∗ Basavesh Shivakumar∗ Byoungyoung Lee‡∗ Insik Shin†
†Korea Advanced Institute of Science and Technology ‡Seoul National University ∗Purdue University
through Fuzzing Dae R. Jeong Kyungtae Kim Basavesh Shivakumar - - PowerPoint PPT Presentation
Razzer: Finding Kernel Race Bugs through Fuzzing Dae R. Jeong Kyungtae Kim Basavesh Shivakumar Byoungyoung Lee Insik Shin Korea Advanced Institute of Science and Technology Seoul National University Purdue
Dae R. Jeong† Kyungtae Kim∗ Basavesh Shivakumar∗ Byoungyoung Lee‡∗ Insik Shin†
†Korea Advanced Institute of Science and Technology ‡Seoul National University ∗Purdue University
2
2
2
3
4
5
6
Race window
strcpy(file_name, longer_name); strcpy(buf, file_name);
len = strlen(file_name); buf = kmalloc(len);
Syscall: open() Syscall: rename()
6
Race window
strcpy(file_name, longer_name); strcpy(buf, file_name);
len = strlen(file_name); buf = kmalloc(len);
Syscall: open() Syscall: rename()
6
Race window
strcpy(file_name, longer_name); strcpy(buf, file_name);
len = strlen(file_name); buf = kmalloc(len);
Syscall: open() Syscall: rename()
6
Race window
strcpy(file_name, longer_name); strcpy(buf, file_name);
len = strlen(file_name); buf = kmalloc(len);
Syscall: open() Syscall: rename()
6
Race window
strcpy(file_name, longer_name); strcpy(buf, file_name);
len = strlen(file_name); buf = kmalloc(len);
Syscall: open() Syscall: rename()
6
Race window
strcpy(file_name, longer_name); strcpy(buf, file_name);
len = strlen(file_name); buf = kmalloc(len);
Syscall: open() Syscall: rename()
7
8
strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len); strcpy(buf, file_name);
9
Race window
len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name); strcpy(buf, file_name);
Syscall: open() Syscall: rename()
9
Race window
len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name); strcpy(buf, file_name);
BP BP Syscall: open() Syscall: rename()
9
Race window
len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name); strcpy(buf, file_name);
BP BP Syscall: open() Syscall: rename()
9
Race window
len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name); strcpy(buf, file_name);
BP Syscall: open() Syscall: rename()
9
Race window
len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name); strcpy(buf, file_name);
Syscall: open() Syscall: rename()
9
Race window
len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name); strcpy(buf, file_name);
Syscall: open() Syscall: rename()
Multi-thread input
10
Source code
Over-approximated data races
Multi-thread input
11
Source code
Over-approximated data races
12
13
13
Source code
14
Multi-thread input
Over-approximated data races
15
rename()
Single-thread input
strcpy(file_name, longer_name); strcpy(buf, file_name); len = strlen(file_name); buf = kmalloc(len);
15
rename()
Single-thread input
Syscall: open() Syscall: rename()
16
rename()
16
rename()
strcpy(buf, file_name); len = strlen(file_name); buf = kmalloc(len); strcpy(file_name, longer_name);
16
rename()
BP BP
Over-approximated data races
Source code
17
Multi-thread input
strcpy(buf, file_name); strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len);
CPU 1 CPU 2
Guest VM
Thread 1 Syscall n
Thread 2 Syscall m
18 BP BP
strcpy(buf, file_name); strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len);
CPU 1 CPU 2 Thread 1 Thread 2
Guest VM Hypervisor
Thread 1 Syscall n
Thread 2 Syscall m
18 BP BP
strcpy(buf, file_name); strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len);
CPU 1 CPU 2 Thread 1 Thread 2
Guest VM Hypervisor
Thread 1 Syscall n
Thread 2 Syscall m
Hypercall Hypercall
18 BP BP
strcpy(buf, file_name); strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len);
CPU 1 CPU 2 Thread 1 Thread 2
Guest VM Hypervisor
Thread 1 Syscall n
Thread 2 Syscall m
Hypercall Hypercall
18 BP BP
strcpy(buf, file_name); strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len);
strcpy(buf, file_name);
CPU 1 CPU 2 Thread 1 Thread 2
Guest VM Hypervisor
Thread 1 Syscall n
Thread 2 Syscall m
Hypercall Hypercall
18 BP BP
strcpy(file_name, other_name);
strcpy(buf, file_name); strcpy(file_name, longer_name); len = strlen(file_name); buf = kmalloc(len);
strcpy(buf, file_name);
CPU 1 CPU 2 Thread 1 Thread 2
Guest VM Hypervisor
Thread 1 Syscall n
Thread 2 Syscall m
Hypercall Hypercall
18 BP BP
strcpy(file_name, other_name);
19
Race bugs Syzkaller Razzer # of exec Time Found # of exec Time Found CVE-2016-8655 29 M 10 hrs X 1,170 K 26 min ✓ CVE-2017-17712 37 M 10 hrs X 807 K 18 mins ✓ CVE-2017-2636 5 M 10 hrs X 246 K 7 mins ✓
21
22