- Time-of-Check-to-Time-Of-Use-Problem
-
Der Begriff Time-of-Check-to-Time-Of-Use-Problem, abgekürzt auch als TOCTTOU (ausgesprochen als TOCK too) beschreibt ein durch einen Programmfehler (Software-Bug) bei der Ausführung Computerprogrammen auftretendes Problem. Allgemein wird damit eine Form der Race Condition beschrieben, bei der der Zeitraum zwischen der Überprüfung eines Systemzustandes (Time-to-check), zum Beispiel der Beschreibbarkeit einer Datei, und der Verwendung des Prüfergebnisses (Time-to-use), also zum Beispiel der erwünschten Änderung dieser Datei, genutzt wird, um den geprüften Zustand, also hier die Beschreibbarkeit dieser Datei, zu verändern und damit das Prüfergebnis für den weiteren Programmlauf irrelevant zu machen. Somit wäre zum Beispiel auch ein durchgeführter Virencheck eines Antivirenprogrammes eventuell hinfällig, wenn zwischen der Überprüfung der Datei auf Virenfreiheit und deren Verwendung im nachfolgenden Programmablauf diese Datei so verändert wird, das sie einen Virus enthält oder dessen Aktivierung oder Ausführung erlaubt.
Der Begriff wurde 1996 von Matt Bishop und Michael Dilger in diesem Zusammenhang benutzt. Andrey Kolishak beschrieb 2003 das gleiche Problem für die Verwendung von Windows Hooks.
Beispiele
Eine Webanwendung kann es beispielsweise deren Nutzern erlauben, bestimmte Seiten zu verändern, dem Administrator der Anwendung jedoch zusätzlich die Möglichkeit einräumen, Seiten gegen Änderungen zu sperren. Wenn der Benutzer seine Änderung durchführen möchte, wird für ihn eine Eingabemaske dargestellt, in der er seine Daten eingeben oder ändern kann. Ein mit dem TOCTTOU-Problem behaftetes System hat ihm in diesem Augenblick die Änderung erlaubt (Time-to-Check), da es seine Berechtigung zur Änderung geprüft hat. Wenn jedoch der Administrator anschließend, nachdem der Benutzer die Rechte erhalten und bevor er seine Änderungen gespeichert hat, die Seite gegen Änderungen sperrt und damit prinzipiell eine Änderung verbietet, wird diese Administratoraktion bei einem fehlerbehafteten System bei einem anschließenden Abspeichern der Benutzerdaten und damit zum Nutzungszeitpunkt (Time-to-Use) der Schreiberlaubnis ignoriert werden.
In Unix würde der folgende Abschnitt eines in C geschriebenen Programmes das TOCTTOU-Problem aufweisen, wenn er für ein mit setuid-Rechten ausgestattetes Programm genutzt würde:
if (access(file, R_OK) != 0) { exit(1); } fd = open(file, O_RDONLY); // do something with fd…
Dieses Programmstück soll überprüfen, ob der angemeldete Benutzer, der dieses Programm benutzt, mit dem Rechten des eigenen Benutzerkontos (Real Userid im Gegensatz zur Effective Userid, die andere Rechte beinhalten kann) eine bestimmte Datei (hier file) lesen (R_OK für Read, dt. Lesen) darf. Diese Race Condition eröffnet folgende Angriffsmöglichkeit
- Man legt eine für den Benutzer lesbare Datei an.
- Man startet dieses Programm.
- Man ändert die Datei zu einer symbolischen Verknüpfung (symlink), die auf eine für den Benutzer nicht lesbare Datei zeigt.
Für einen Angreifer ist es durchaus ohne große Schwierigkeiten möglich, diese Bedingungen für einen Angriff zu schaffen, das Verfahren erfordert allerdings eine genaue zeitliche Abstimmung der einzelnen Aktionen.
Daraus ergibt sich in diesem Falle, das der in derzeitigen Unix-Systemen verwendete Systemaufruf (system call) access in der hier benutzten Form nur in speziellen Fällen eingesetzt werden sollte, etwa als erster Schritt zur Erlangung exklusiver Zugriffsrechte (Mutex, Test and Test-and-set).
Literatur
- Matt Bishop und Michael Dilger: Checking for race conditions in file accesses; Computing Systems, Vol. 9, No. 2, 1996, S. 131–152 (online, englisch)
- Nikita Borisov, Rob Johnson, Naveen Sastry, David Wagner: Fixing Races for Fun and Profit: How to abuse atime; Proceedings of the 14th Conference on USENIX Security Symposium (Security'05), Baltimore (MD), July 31–August 5, 2005, Vol. 14, 2005, S. 303–314 (online, englisch)
- Dan Tsafrir, Tomer Hertz, David Wagner, Dilma Da Silva: Portably Solving File TOCTTOU Races with Hardness Amplification, Proceedings of the 6th USENIX Conference on File and Storage Technologies (FAST '08), San Jose (CA), February 26–29, 2008, S. 189–206 (online, englisch)
Quellen
Wikimedia Foundation.