CET - Intel Control-flow Enforcement Technology
Sissejuhatus
TODO
Tööpõhimõte
TODO
Haavatavuse näide
Haavatavuse ilmestamise programm rop_lab.c, tõenäoliselt on see märkimisväärne lihtsustus, aga ta illustreerib rop haavatavuse põhimõtet ning haavatavuse ärahoidmist
$ cat rop_lab.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// This is our "Gadget". The program never calls this function honestly!
void malicious_gadget() {
printf("\n⚡ [ATTACK SUCCESS] Control flow hijacked! Malicious code executing.\n");
exit(0);
}
void vulnerable_function(char *str) {
char buffer[16];
// VULNERABILITY: strcpy does not check bounds.
// It will overwrite the buffer, the frame pointer, and the Return Address!
strcpy(buffer, str);
printf("[CPU] Function executing normally inside buffer layout.\n");
}
int main() {
// We are crafting a malicious payload payload manually.
// 16 bytes to fill the buffer + 8 bytes to smash the saved frame pointer
// + 8 bytes containing the exact memory address of malicious_gadget()
char payload[32];
// Fill the padding area with 'A's (0x41)
memset(payload, 'A', 24);
// Get the exact memory address of our target gadget
unsigned long target = (unsigned long)malicious_gadget;
// Append the target address onto the end of our overflow payload
memcpy(payload + 24, &target, 8);
printf("[Lab] Target Gadget Address is at: %p\n", (void*)target);
printf("[Lab] Launching attack payload against vulnerable function...\n");
vulnerable_function(payload);
printf("[CPU] Returned safely to main. (This should not happen if hacked!)\n");
return 0;
}
kus
- malicious_gadget() on protsessi mälus olev nö ärakasutatav järgnevus - et ära kasutada, tuleb sattuda sobivale aadressile - võib olla see järgnevus pole üldse algselt programmeeritud isesesiva funktsioonina, aga ta nii praktiliselt toimib kui sobivalt pöörduda-kasutada
- vulnerable_function - haavatav funktsioon - asutakse ära kasutama tema potensiaali kirjutada üle rohkem stack mälu sisu kui on ette kujutatud
- main() - programmi töö algus, valmistatakse ette sobiva sisuga payload (mälu sisu) ja paigutatakse kohale
- tulemusena funktsioonist vulnerable_function tagasi pöördudes ei saabuta main() 'printf ...' juurde, aga gadget juurde
Väljakutsuvalt liberaalse binary kompileerimiseks sobib öelda
$ gcc -fno-stack-protector -z execstack -fcf-protection=none rop_lab.c -o lab_unhardened
kus
- -fno-stack-protector - ei moodustata nö tarkvarapõhist stack kaitset
- -z execstack - lisaks lülitatakse sisse stack'is oleva koodi käivitamise võimalus
- -fcf-protection=none - lülitatakse välja igasugune hardware-assisted st cet põhine stack kaitse
cet põhine kaitse
$ gcc -fno-stack-protector -fcf-protection=full rop_lab.c -o lab_hardened
kus
- -fcf-protection=full - sisse on lülitatud maksimaalne võimalik hardware-assisted st cet põhine stack kaitse
- -fno-stack-protector - ei moodustata nö tarkvarapõhist stack kaitset selleks, et katses pääseks mõjule cet põhine kaitse
Kui käivitada cet-võimestatud binary't nö tavalisel viisil ning cet riistvara toega arvutis, siis ta töötab haavatavalt
$ lscpu | grep shstk Flags: .. user_shstk ... $ ./lab_hardened [Lab] Target Gadget Address is at: 0x6552a7afc1c9 [Lab] Launching attack payload against vulnerable function... [CPU] Function executing normally inside buffer layout. ⚡ [ATTACK SUCCESS] Control flow hijacked! Malicious code executing.
Kui lülitada sisse cet kaitse, siis hoiab kernel ära haavatavuse mõjulepääsu
$ export GLIBC_TUNABLES=glibc.cpu.hwcaps=SHSTK $ ./lab_hardened [Lab] Target Gadget Address is at: 0x59f889ed41c9 [Lab] Launching attack payload against vulnerable function... [CPU] Function executing normally inside buffer layout. Segmentation fault (core dumped)
Samal ajal kirjutatakse kerneli logisse
# dmesg -T | tail -n 1 [Wed May 20 20:31:35 2026] lab_hardened[2872] control protection ip:59f889ed421e sp:7ffe4f9f7648 ssp:76edde5fffe0 error:1(near ret) in lab_hardened[121e,59f889ed4000+1000]
kus
- sp - stack pointer väärtus
- ssp - shadow stack pointer väärtus
- nad ei klapi
Kasutamine - Ubuntu
Näiteks zabbix agent kaudu haavatavuse esilekutsumine ja haavatavuse vältimine. Moodustada UserParameters abil kontroll
# cat /etc/zabbix/zabbix_agent2.d/misc.conf UserParameter=rop_hardened,/home/imre/20260520/lab_hardened 1>>/home/tmp/rop_hardened.log 2>&1 # systemctl restart zabbix-agent2 # zabbix_get -k rop_hardened -s 127.0.0.1
Tulemusena programmi ja seal sisalduva nö eksploidi käivitamine
# tail -n 5 /home/tmp/rop_hardened.log [Lab] Target Gadget Address is at: 0x616af0eed1c9 [Lab] Launching attack payload against vulnerable function... [CPU] Function executing normally inside buffer layout. ⚡ [ATTACK SUCCESS] Control flow hijacked! Malicious code executing.
Programmis sisalduva eksploidi töötamise takistamiseks sobib kasutada zabbix agent2 systemd service unit seadistustes GLIB_TUNABLES abil
# systemctl edit zabbix-agent2 [Service] Environment="GLIBC_TUNABLES=glibc.cpu.hwcaps=SHSTK" # systemctl restart zabbix-agent2
Tulemusena ütleb kernel segmentation fault rikkumise avastamisel
# tail -n 6 /home/tmp/rop_hardened.log [Lab] Target Gadget Address is at: 0x616af0eed1c9 [Lab] Launching attack payload against vulnerable function... [CPU] Function executing normally inside buffer layout. ⚡ [ATTACK SUCCESS] Control flow hijacked! Malicious code executing. Segmentation fault (core dumped) # dmesg -T | tail -n 1 [Wed May 20 20:50:28 2026] lab_hardened[3417] control protection ip:62ee74e0421e sp:7ffeadc19f28 ssp:7e27011fffe0 error:1(near ret) in lab_hardened[121e,62ee74e04000+1000]
Kasulikud lisamaterjalid
- teksti koostamisel on kasutatud ohtralt gemini google abi