Wie kann es möglich sein, dass ein root-Zugang ohne Eingabe des Kennwortes akzeptiert wird?
Patrick Wardle hat den Fehler und seine Korrektur inzwischen im Assemblercode analysiert. Kurz zusammengefasst beruht der Fehler auf folgendem Ablauf:
1) Das System erhält den Auftrag, Name und Kennwort des Benutzers "root" zu prüfen.
2) Aus Sicherheitsgründen ist root normalerweise zur Anmeldung gesperrt, was durch den ungültigen Hash-Code "*" im Kennwortfeld des Benutzers-Accounts markiert ist. Bei der Prüfung des Kennworts erkennt macOS diese Sperre aber nicht sofort (noch kein Fehler, aber eine schlechte Design-Entscheidung), sondern ruft standardmäßig ein Unterprogramm auf, das in der Benutzerdatenbank veraltete gespeicherte Hashcodes im "crypt"-Standard routinemäßig in moderne Kennworte nach dem "shadowhash"-Verfahren umschreibt.
3) Nun wird geprüft, ob das Kennwort gültig ist. Im Code wurde jedoch vergessen, das Ergebnis dieser Prüfung auszuwerten! (Das ist der Fehler.)
4) Das Unterprogramm zum Upgrade der Hashcodes setzt fälschlicherweise seine Arbeit fort und will den Kennworteintrag aktualisieren.
5) Da die Kennworte nirgendwo im Klartext gespeichert werden und auch nicht rückermittelt werden können, muss die Aktualisierung des Hashcodes über die einzige Quelle erfolgen, die es gibt, nämlich die gerade erfolgte Eingabe des Benutzers.
6) Aus der Eingabe des Benutzers wird ein moderner Hashcode nach dem shadowhash-Verfahren berechnet und in der Benutzerdatenbank eingetragen.
Das hat folgende Auswirkung:
- Die Anmeldesperre für "root" wird gelöscht.
- Für root wird ein neues Kennwort angelegt, nämlich das, was der Benutzer gerade eingegeben hat. Wenn er nichts eingegeben hat, ist das eben das leere Kennwort …