Spokojnie, to tylko lokalny exploit

Co jakiś czas światem linuksowym trzęsą w posadach doniesienia o kernelowym błędzie, umożliwiającym nabycie przez atakującego praw roota. To doskonała pożywka dla wszelkiej maści kasandrystów, głoszących komunał ‘a nie mówiłem, że ten Linux jest dziurawy”. Rzeczywistość jest jednak o wiele bardziej skomplikowana, bo pomimo wielu wysiłków, do tej pory nie udało się mi zatrząść w posadach użytkowanym kernelem – w większości przypadków takim zwykłym, prosto z repozytoriów. Podobnie jest i z najnowszym doniesieniem o exploicie umożliwiającym przejęcie praw roota poprzez umiejętne wykorzystanie niedopatrzenia w jednej z funkcji kernela. Błąd dotyka kerneli od 3.4 wzwyż i pozostałych, do których został zaimplementowany wadliwy kod. I wszystko wygląda poważnie i niebezpiecznie, poza szczegółem, że u mnie exploit nie zadziałał na kernelu 3.12.8.

Autor rzeczonego exploita, upublicznionego na Githubie, fachowo opisuje działanie swojego dzieła:

The X86_X32 recvmmsg syscall does not properly sanitize the timeout pointer
passed from userspace.

Jak zwał, tak zwał, ale i tak liczy się efekt końcowy, czyli uzyskanie praw roota. Ponieważ cała sprawa dotyczy kerneli z włączoną opcją CONFIG_X86_X32, musimy się upewnić, że serce naszego systemu jest podatne na opisaną metodę:

grep CONFIG_X86_X32 /boot/config-$(uname -r)
zgrep CONFIG_X86_X32 /proc/config.gz
zcat /proc/config.gz |grep CONFIG_X86_X32

Jeżeli na którekolwiek z powyższych otrzymaliśmy odpowiedź:

CONFIG_X86_X32=y

… to potencjalnie nasz kernel może ulec urokowi exploita.

Aby to przetestować, należy pobrać plik timeoutpwn.c, skompilować sobie, uruchomić i oczekiwać efektów. Niestety, u mnie efekt był mizerny:

$ ./timeout
preparing payload buffer…
changing kernel pointer to point into controlled buffer…
clearing byte at 0xffffffff81fb312d
clearing byte at 0xffffffff81fb312e
clearing byte at 0xffffffff81fb312f
waiting for timeouts…
0s/255s
10s/255s
(…)
240s/255s
250s/255s
releasing file descriptor to call manipulated pointer in kernel mode…
failed to get root 🙁

Sprawa podobnież dotyczyła kernela Ubuntu 13.10 i Canonical już błąd poprawiło. Jednak kernele w openSUSE, jak i w Manjaro również posiadają w swoim zestawie CONFIG_X86_X32, lecz tutaj exploit nie zadziałał. Spisek?