Kun execv-funktiota kutsutaan systeemikutsua numero 11 (sys_execv), joka kutsuu funktiota do_execve (tiedosto fs/exec.c).
do_execve-funktiossa etsitään tiedoston neljän ensimmäisen tavun perusteella tiedostolle käsittelijää linkitetystä listasta.
int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)Haavoittuvuus johtuu siitä, että kun kerneliin lisätään oma binääritiedostojen käsittelijä niin se lisätään linkitetyn listan alkuun, jolloin sitä kutsutaan aina kun tiedostoa yritetään suorittaa.
{
int try,retval;
struct linux_binfmt *fmt;
[...]
for (fmt = formats ; fmt ; fmt = fmt->next) {
int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary;
if (!fn)
continue;
[...]
Koska käsittelijä toimii täysin kernelin sisällä sitä ei voi havaita stracella eikä ltracella. Heikkouden parantamiseksi ehdotetaankin tiedostonkäsittelijöiden lisäämistä linkitetyn listan loppuun.
$ ls
-> sys_execve("/bin/ls", ["ls"], [...])
-> do_execve
-> search_binary_handler([...])
rootkit = -ENOEXEC // suorittaa rootkit-koodin ja palauttaa -ENOEXEC
script_handler // tiedosto ei ala merkeillä #!
elf_handler // tiedosto on elf-binääri, suorittaa koodin
Ei kommentteja:
Lähetä kommentti