Time-of-Check-to-Time-of-Use-Problem

Der Begriff Time-of-Check-to-Time-of-Use-Problem (abgekürzt auch als TOCTOU, TOCTTOU oder TOC/TOU, ausgesprochen als TOCK-tuu), beschreibt einen aus einem Programmfehler (Software-Bug) resultierenden und bei der letztendlichen Ausführung von Computerprogrammen gegebenenfalls auftretenden Sachverhalt. Allgemein wird damit eine Form der Wettlaufsituation (Race Condition) bezeichnet, bei der der Zeitraum zwischen der Überprüfung eines Systemzustandes (Time-of-check) – zum Beispiel ob Schreibzugriff auf eine Datei besteht – und der Verwendung des Prüfergebnisses (Time-of-use) – also zum Beispiel einer erwünschten Änderung dieser Datei – genutzt wird, um den geprüften Zustand, hier den Schreibzugriff auf eine 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, sofern zwischen der Überprüfung der Datei auf Virenfreiheit und deren Verwendung im nachfolgenden Programmablauf diese Datei so verändert wird, dass sie einen Virus enthält, oder dessen Aktivierung, bzw. Ausführung erst erlaubt.

Der Begriff wurde 1996 von Matt Bishop und Michael Dilger in diesem Zusammenhang eingeführt. 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-of-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 Wettlaufsituation eröffnet folgende Angriffsmöglichkeit:

  1. Man legt eine für den Benutzer lesbare Datei an.
  2. Man startet dieses Programm.
  3. 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 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, dass 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

Weblinks