This document contains the slides from a presentation given by WonoKaerun at the Indonesian Security Conference 2011 in Palembang. The presentation introduces rootkits and techniques for hiding malware at the kernel level on Linux systems. It covers topics like loadable kernel modules, interrupt descriptor table hooking, virtual file system hacking, page fault handler hijacking, debugging register abuse, and kernel instrumentation patching. The goal is to evade detection by security solutions by gaining control of the kernel before anti-rootkit defenses can activate. Throughout, the document emphasizes the cat-and-mouse nature of offensive and defensive security research.
7. Ring0 Levels Rootkit
“Rootkits that
are running at
Kernel Mode!”
Source: http://www.rayheffer.com/139/running-rings-around-virtualisation/
8. 1. LKM Based Rootkit
2. Non-LKM Based Rootkit
- So, What is LKM (Loadable Kernel Module)?
Source: http://www.ragepk.com/fn 5.7 Millimeter Pistol.html
9. 1.a. Hooking System Call Table Address
Source: http://www.slideshare.net/fisher.w.y/rootkit-on-linux-x86-v26
10. Historically, LKM-based rootkits used the
„sys_call_table[]‟ symbol to perform hooks on the
system calls
sys_call_table[__NR_sc] = (void *) hacked_sc_ptr;
However, since sys_call_table[] is not an exported
symbol anymore, this code isn‟t valid
We need another way to find „sys_call_table`[]
11. 1.b. Finding SysCallTable Address
1. Get the IDTR using SIDT
2. Extract the IDT address from the IDTR
3. Get the address of „system_call‟ from the
0x80th entry of the IDT
4. Search „system_call‟ for our code fingerprint
5. Finally, we should have the address of
„sys_call_table[]‟ !
12. 1.c. Bypass WP (Write Protection)
- Problem : sys_call_table[] is read-only!
- Solution : We must clear 16th bit of cr0!
static void disable_wp_cr0 (void) {
unsigned long value;
asm volatile("mov %%cr0,%0" : "=r" (value));
if (value & 0x00010000) {
value &= ~0x00010000;
asm volatile("mov %0,%%cr0": : "r" (value));
}
}
13. 1.d. On x86_64
- Actually this is NOT new architecture, it‟s just
specifically different in memory addresing plus
with additional of new CPU instructions.
- We can find sys_call_table[] by bruteforcing in
range memory address between:
[0xffffffff00000000 – 0xffffffffffffffff]
16. 2.a. IDT(Interrupt Descriptor Table) Handling
- Interrupt: “An event that alters the sequence
of instructions executed by a processor. Such
events correspond to electrical signals generated
by hardware circuits both inside and outside of
the CPU chip.” (Understanding the Linux kernel ,O‟reilly)
- The IDT is a linear table of 256 entries which
associates an interrupt handler with each
interrupt vector, and each entry of the IDT is a
descriptor of 8 bytes which blows the entire IDT
up to a size of 256 * 8 = 2048 bytes.
17. 2.b. Hijacking Methods
1. Create a fake IDT handler
2. Copy our handler's address into new_addr
3. Make the idt variable point on the first IDT
descriptor, via idt, idtr dan sidt.
(Ref. Phrack 58 article 7)
4. Save the old handler's address
(with get_stub_from_idt() function)
5. new_addr contain our handler's address!
19. 3.a. VFS(Virtual File System) Hacking
- VFS and /proc
1. It is a filesystem
2. It lives completely in kernel memory
- All access from the userland is limited to the
functionality of VFS layer provided by the kernel,
namely read, write, open and alike system calls .
- So, how the kernel can be backdoored without
changing system calls?
20. 3.b. System Call Flow in VFS Hijacking
Source: http://www.porcupine.org/forensics/forensic-discovery/chapter5.html
22. 4.a Page Fault Handler Hijacking
- “A page fault exception is raised when the
addressed page is not present in memory, the
corresponding page table entry is null or a
violation of the paging protection mechanism has
occurred.” (Underdstanding The Linux Kernel, O‟reilly)
- When? -> The kernel attempts to address a
page belonging to the process address space, but
either the corresponding page frame does not
exist (Demand Paging) or the kernel is trying to
write a read-only page.
23. 4.b. Schema on Page Fault Hijacking Process
Source: http://book.opensourceproject.org.cn/kernel/kernel3rd/opensource/0596005652/understandlk-chp-9-sect-4.html6
25. 5.a. Abusing Debug Register
“The IA-32 architecture provides extensive debugging
facilities for use in debugging code and monitoring code
execution and processor performance. These facilities
are valuable for debugging applications software,
system software, and multitasking operating systems.”
- A debug exception (#DB) is generated when a
memory or I/O access is made to one of these
breakpoint addresses.
- There are 8 debug registers supported by the Intel
processors, which control the debug operation of the
processor (dr0-dr7).
27. 5.c. References
- http://www.phrack.org/issues.html?issue=65&id=8
- http://seclists.org/dailydave/2008/q3/224
- http://l33ckma.tuxfamily.org/?p=174
- http://darkangel.antifork.org/publications/Abuso
dell'Hardware nell'Attacco al Kernel di Linux.pdf
- http://packetstormsecurity.org/files/view/57016/
mood-nt_2.3.tgz
28. 6.a. Kernel Instrumentation Patching
- Kprobe “Simple method to probe the running
kernel. At a fundamental level, it requires the address
of a kernel function that needs to be debugged”.
- Jprobe “Jprobe is another kind of probing
technique, which can be used to access the target
function‟s arguments, and thus display what was
passed to the function”.
- Kretprobes “A return probe fires when a specified
function returns ”.
29. 6.b. Schema of Kprobe and Jprobe Execution
Kprobes Flow Execution
Jprobes Flow Execution
34. “Any rootkit created with existing detection
capabilities in mind will evade the protective
measures provided by such systems. Warfare at
kernel level comes down to a question of who
takes over first – the rootkit or the anti-rootkit
solution.”
(http://www.securelist.com/en/analysis?pubid=204792011)
35. “Subtle and insubstantial, the expert leaves no
trace; divinely mysterious, he is inaudible. Thus,
he is the master of his enemy's fate.”
- The Art of War, Sun Tzu