6 Stimmen

Eine alte Schwachstelle im X Window System. Wie funktioniert er?

Ich habe heute einen Artikel gelesen, in dem Folgendes erwähnt wurde:

"Wir haben im Laufe der Jahre viele Fehler gefunden. Jahren. Einer der absolut besten war der folgende im X Window System:

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

Es ermöglichte jedem lokalen Benutzer den Zugang zu Root Zugriff. (Die tautologische Prüfung geteuid == 0 sollte eigentlich lauten geteuid() == 0 sein. In seiner jetzigen Form, komprimiert sie die Adresse von geteuid auf 0; da die Funktion existiert, ist ihre Adresse niemals 0 ist)."

In dem Artikel wird erklärt, was mit dem Code nicht stimmt, aber ich würde gerne wissen, was es bedeutet, wenn ich sage, dass "Es ermöglichte jedem lokalen Benutzer, Root-Zugriff zu erhalten" . Ich bin kein C-Experte, aber kann mir jemand einen genauen Zusammenhang nennen, in dem dieser Exploit funktionieren würde? Konkret meine ich damit, dass ich als lokaler Benutzer Root-Zugriff erhalten würde, wenn wir davon ausgehen, dass dieser Code irgendwo vorhanden ist?

Wenn Sie den vollständigen Artikel lesen möchten, finden Sie hier den Link:

Ein paar Milliarden Codezeilen später: Statische Analyse zur Fehlersuche in der realen Welt

5voto

Pascal Cuoq Punkte 77147

Der Artikel bedeutet, dass der Code nach der if die nur ausgeführt werden sollte, wenn überprüft wurde, dass es sich bei dem Benutzer um Root handelt, konnte tatsächlich von jedem ausgeführt werden. Um dies auszunutzen, müssen Sie die Verzweigung im Code suchen, in der der Test zur Überprüfung der Identität des Benutzers verwendet wird (die der Artikel verantwortungsbewusst nicht bereitstellt: Sie müssen ein wenig arbeiten), und Sie müssen dafür sorgen, dass er ausgeführt wird.

"erlaubt, Root-Zugriff zu erhalten" ist eine Auslassung, um zu beschreiben, was nach dem if im ursprünglichen Code. Sie macht im Zusammenhang mit dem Test keinen besonderen Sinn, weil sie beschreibt, was danach passiert.

Mit anderen Worten: Der Test selbst macht Sie nicht zu Root. Der Code danach macht Sie zu Root. Denken Sie auch daran, dass der X-Server oft mit Root-Besitzer installiert werden muss und setuid-Bit gesetzt Das ist der Grund, warum fehlerhafte Logik in seinem Code gefährlich ist.

Dies ist keine Frage über C. Es ist eine Frage über das Unix-Sicherheitsmodell, das furchtbar binär ist (besonders in den älteren Implementierungen): Sie müssen Root sein, um irgendetwas zu tun, also haben viele Programme Root-Besitzer und ein setuid-Bit (ein wenig karikierend).

2voto

John Weldon Punkte 38199

Wie man sich Zugang verschafft, hängt direkt damit zusammen, wo sich die Schwachstelle im Code befindet.

Wenn Sie genau wüssten, wo sich dieser Code befindet, könnten Sie Codepfade erforschen, die Sie zu dieser Codezeile führen, und dann, nachdem Sie die Folgen dieses Codes untersucht haben, etwas tun, um die fehlerhafte Sicherheitsstufenprüfung auszunutzen.

Dieser spezielle Test scheint jedoch ziemlich schwer auszunutzen zu sein. Alles was er tut, ist (fälschlicherweise) zu prüfen, ob der Benutzer Root-Zugriff hat, und wenn er ihn nicht hat, dann mit einer Fehlerbedingung abzubrechen.

Der nachfolgende Code müsste geprüft werden, um festzustellen, ob die Tatsache, dass Nicht-Root-Benutzer den Code ausführen, ausgenutzt werden könnte.

0voto

Preet Sangha Punkte 62622

Ich denke, das bedeutet, dass die Prüfung auf Root-Zugriff nicht korrekt war und die Verarbeitung auf Root-Ebene fortgesetzt werden konnte. Wie Sie möglicherweise eskaliert wurden, ist nicht klar.

0voto

Arjun Singri Punkte 575

Der Scheck geteuid == 0 ist immer falsch, da geteuid ist der Name einer Funktion und wird in diesem Zusammenhang zu einem Zeiger ausgewertet, der nicht NULL ist. Es hätte sein müssen geteuid() == 0 . Beachten Sie die Klammer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X