2010-04-26 12 views
6

szedłem artykule dzisiaj, kiedy to wymienione następujące:Stara wada w X Window System. Jak to działa?

„Odkryliśmy wiele błędów w ciągu lat Jeden z absolutnie najlepszy był następujących w X Window System.

 if(getuid() != 0 && geteuid == 0) { 
     ErrorF("Only root"); 
     exit(1); 
    } 

pozwoliło żadnego lokalnego użytkownika, aby uzyskać dostęp do roota . (Tautologiczna czek geteuid == 0 miała być geteuid() == 0. W obecnej formie kompresować adres geteuid do 0; zważywszy, że funkcja istnieje, jego adres nie jest 0). „

W artykule wyjaśniono, co było nie tak z kodem, ale chciałbym wiedzieć, co to znaczy, że ” Pozwoliło to żadnego użytkownika lokalnego uzyskać dostęp do roota ".Nie jestem ekspertem w C, ale czy ktoś może mi podać dokładny kontekst, w którym ten exploit będzie działał? W szczególności mam na myśli to, powiedzmy, że jestem lokalnym użytkownikiem, w jaki sposób uzyskać dostęp do roota, jeśli zakładamy, że ten kod jest gdzieś obecny?

Dla wszystkich zainteresowanych przeczytaniem całego artykułu, oto link:

A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in Real World

+0

Cytowany artykuł pochodzi z "Kilku miliardów linii kodu później: przy użyciu analizy statycznej, aby znaleźć błędy w rzeczywistym świecie" według Coverity. Dlaczego nie dać odniesienia? –

+0

@ Hu Hu: Dzięki za sugestię. Dodano link .. – Legend

Odpowiedz

5

Artykuł oznacza, że ​​kod po numerze if, który miał być wykonany tylko wtedy, gdy zweryfikowano, że użytkownik jest rootem, mógł zostać wykonany przez kogokolwiek. Aby z niego skorzystać, należy szukać oddziału w kodzie, w którym test jest używany do sprawdzania tożsamości użytkownika (którego artykuł nie zapewnia w sposób odpowiedzialny: trzeba trochę popracować) i zorganizować go w taki sposób. wykonany.

"uprawniony do uzyskania dostępu root" to elipsa opisująca, co dzieje się po if w oryginalnym kodzie. Nie ma to szczególnego sensu w odniesieniu do testu, ponieważ opisuje to, co dzieje się po nim.

Innymi słowy, sam test nie powoduje, że jesteś rootem. Kod po nim powoduje, że jesteś rootem. Należy również pamiętać, że serwer X często musi być zainstalowany z właścicielem root i setuid bit set, co jest przyczyną tego, że wadliwa logika w jego kodzie jest niebezpieczna.

To nie jest pytanie o C. To jest pytanie o uniksowy model bezpieczeństwa, który jest strasznie binarny (szczególnie w starszych implementacjach): musisz być rootem, aby cokolwiek zrobić, więc ilość programów ma właściciela root i setuid bit (trochę karykaturujący).

+0

Dzięki za szczegółowe wyjaśnienie. – Legend

2

Sposób uzyskania dostępu jest bezpośrednio związany z tym, gdzie ta usterka jest w kodzie.

Jeśli dokładnie wiedziałeś, gdzie jest ten kod, możesz zbadać ścieżki kodu, które mogą doprowadzić cię do tego wiersza kodu, a następnie po zbadaniu konsekwencji tego kodu, wykonaj czynność polegającą na wykorzystaniu błędnego sprawdzenia poziomu bezpieczeństwa.

Jednak; ten specyficzny test wydaje się dość trudny do wykorzystania. Jedyne, co robi, to (niepoprawnie) sprawdzanie dostępu do roota, a jeśli użytkownik go nie ma, wówczas kaucję z warunkiem błędu.

Kolejny kod musiałby zostać poddany audytowi, aby sprawdzić, czy można wykorzystać fakt, że kod wykonywany był przez użytkownika innego niż root.

+0

Dziękuję za wyjaśnienie. Jednak szukałem tego dodatkowego punktu, w którym X będzie instalowany z ustawionym bitem setuid. – Legend

0

Myślę, że oznacza to, że kontrola dostępu do roota nie była poprawna i możliwe było kontynuowanie przetwarzania na poziomie root. To, w jaki sposób zostałeś eskalowany, nie jest do końca jasne.

0

Sprawdzanie geteuid == 0 jest zawsze fałszywe, ponieważ geteuid to nazwa funkcji iw tym kontekście jest ona wynikiem wskaźnika, który nie ma wartości NULL. To powinno być geteuid() == 0. Zwróć uwagę na nawias.