Enforcing Kernel Security Invariants with Data Flow Integrity

Chengyu Song, Byoungyoung Lee, Kangjie Lu, William R. Harris, Taesoo Kim, Wenke Lee · 2016

The operation system kernel is the foundation of the whole system and is often the de facto trusted computing base for many higher level security mechanisms.Unfortunately, kernel vulnerabilities are not rare and are continuously being introduced with new kernel features.Once the kernel is compromised, attackers can bypass any access control checks, escalate their privileges, and hide the evidence of attacks.Many protection mechanisms have been proposed and deployed to prevent kernel exploits.However, a majority of these techniques only focus on preventing control-flow hijacking attacks; techniques that can mitigate noncontrol-data attacks either only apply to drivers/modules or impose too much overhead.The goal of our research is to develop a principled defense mechanism against memory-corruption-based privilege escalation attacks.Toward this end, we leverage dataflow integrity to enforce security invariants of the kernel access control system.In order for our protection mechanism to be practical, we develop two new techniques: one for automatically inferring data that are critical to the access control system without manual annotation, and the other for efficient DFI enforcement over the inference results.We have implemented a prototype of our technology for the ARM64 Linux kernel on an Android device.The evaluation results of our prototype implementation show that our technology can mitigate a majority of privilege escalation attacks, while imposing a moderate amount of performance overhead.The objective of this work is to provide a defense system that is both principled (i.e., cannot be easily bypassed by future attacks) and practical (i.e., with reasonable performance overhead).We achieve the first goal by utilizing data-flow integrity (DFI) [15] to enforce kernel security invariants against memory-corruption-based attacks.Similar to CFI, DFI guarantees that runtime data-flow cannot deviate from the data-flow graph generated from static analysis.For example, data from a string buffer should never flow to the return address on stack (control-data), or to the uid (non-control-data).Utilizing this technique, we can enforce a large spectrum of security invariants in the kernel to defeat different attacks.For instance, to prevent rootkits from hiding malicious processes, we can enforce that only the process scheduler can modify

Read the paper · More papers on PaperTik