Disassembler

Artificial intelligence is no match for natural stupidity.
02února2012

Sudo a bug v debugu


Sudo. Mocný nástroj, umožňující běžným uživatelům spouštět předem nakonfigurované příkazy s oprávněním roota. Stejně jako jiné mocné nástroje, nepatří do rukou nezkušeným a někteří staromilci, zamrzlí v dobách BSD 4, jej považují za bezpečnostní riziko jako celek. Právě ti se minulý týden museli radovat a říkat „Já vám to říkal“. V sudo byla totiž 30. ledna 2012, ve verzi 1.8.3p2, konečně zalepena poměrně snadno zneužitelná bezpečnostní díra, zející zde téměř rok.

Exploit


Sudo make me a sandwich
Sudo make me a sandwich. Originál na xkcd

Sudo ve verzi 1.8.0 přineslo podporu jednoduchého debugování, primárně určenou k vývoji bezpečnostních zásad a logování. Právě v tomto modulu existuje funkce sudo_debug() obsahující céčkovou funkci fprintf(), která má, stejně jako všechny *prinf(), jako jeden z parametrů formát řetězce, do kterého doplňuje další předané parametry. Ty se ale, v tomto konkrétním případě, do fprintf() dostávají přímo z příkazové řádky, resp. argv[0] proměnné, a protože někdo opomněl tyto parametry escapovat nebo jinak ošetřit, bylo možné udělat něco takového:

user@machine:~$ ln -s /usr/bin/sudo ./%s
user@machine:~$ ./%s -D9
 debug_level: settings: 9=裓▒
 progname: settings: %s=
 implied_shell: settings: true▒▒▒
 network_addrs: settings: 192.168.16.8/255.255.255.0 fe80::226:eaf:f01e:ec02/ffff:ffff:ffff:ffff::=
 Neoprávněný přístup do paměti (SIGSEGV)

Neoprávněný přístup do paměti, SIGSEGV, segmentation fault, je úplně jedno jak tomu říkáte u vás. Ty vysypané znaky jsou vyčteny z paměťového prostoru, kam byste se, v ideálním případě, vůbec neměli dostat. Právě tenhle stav je možno využít k přístupu „oprávněnému“, tedy alespoň do té míry, aby to systému nevadilo. Šikovným formátováním řetězce je tedy možno sudo navést k tomu, aby vás na rootovský účet pustilo, a to dokonce i nezávisle na tom, zda jste nebo nejste uvedeni v konfiguračním souboru /etc/sudoers. A vězte, že zrovna k tomuto typu zranitelnosti existuje spousta metod napadení, protože právě na tomhle většina exploiterů začíná. Běžte si tedy pro jistotu zkontrolovat, zda vaše sudo není ve verzi 1.8.0 - 1.8.3p1 a pokud ano, aktualizujte.