Zeitleistenanalyse · Lektion 2 von 5
MACB unter NTFS: $SI im Vergleich zu $FN
11 Min. Lesezeit
Jede Datei auf einem NTFS-Volume besitzt mindestens acht Zeitstempel, und eine Zeitleiste ist nur so gut wie das Wissen des Prüfers darüber, wodurch jeder einzelne verändert wird. Diese Lektion erläutert die in Zeitleisten verwendete MACB-Notation, wo die acht Werte gespeichert sind, welche Komponente sie aktualisiert, wie normale Vorgänge wie Kopieren, Umbenennen und Bearbeiten sie verändern und wie Sie Werte erkennen, die nicht zu diesen Mustern passen. Modul 7 behandelt Timestomping als antiforensische Technik; hier geht es darum, eine Zeitleiste richtig zu lesen.
MACB-Notation
Zeitleisten kennzeichnen jeden Dateisystem-Zeitstempel mit einem von vier Buchstaben:
| Buchstabe | Bedeutung unter NTFS | Typische Ursache |
|---|---|---|
| M | Modified: Inhalt zuletzt geschrieben | Daten in das $DATA-Attribut der Datei geschrieben |
| A | Accessed: letzter Zugriff | Lesen oder Ausführen, sofern Aktualisierungen aktiviert sind |
| C | Changed: MFT-Eintrag zuletzt geändert | Jede Metadatenänderung: Umbenennung, Attribute, Sicherheit, Größe |
| B | Born: erstellt | Datei auf diesem Volume erstellt |
C ist die Falle: Unter NTFS bedeutet es, dass der MFT-Eintrag (die Metadaten) geändert wurde, nicht „erstellt“. Der Windows-Explorer zeigt diesen Wert überhaupt nicht an.
Zeitleistenwerkzeuge fassen identische Werte in einer Zeile zusammen und zeigen die Buchstaben als vierstelligen Code mit Punkten für nicht zutreffende Positionen an. In der mactime-Ausgabe von The Sleuth Kit bedeutet m.c., dass dieser Zeitpunkt sowohl die Inhaltsänderung als auch die Änderung des MFT-Eintrags bezeichnet; .a.. steht nur für einen Zugriff und macb bedeutet, dass alle vier Werte gleich sind, was bei der Erstellung normal ist. Die Bodyfile von TSK (fls -m) führt die $FN-Werte als separaten Eintrag auf, dessen Name auf ($FILE_NAME) endet, sodass eine Datei Zeilen für beide Sätze erzeugen kann. Die l2tcsv-Ausgabe von Plaso enthält eine MACB-Spalte mit denselben Buchstaben in Großschreibung (Lektion 3.3).
Wo die acht Zeitstempel gespeichert sind
Lektion 1.3 führte die beiden Attribute ein. Ihre Zeitstempel befinden sich an diesen Offsets innerhalb des Attributinhalts:
| Wert | $STANDARD_INFORMATION (0x10) | $FILE_NAME (0x30) |
|---|---|---|
| B, erstellt | 0x00 | 0x08 |
| M, geändert | 0x08 | 0x10 |
| C, MFT-Eintrag geändert | 0x10 | 0x18 |
| A, Zugriff | 0x18 | 0x20 |
$FN beginnt mit dem 8-Byte-Verweis auf das übergeordnete Verzeichnis, weshalb seine Zeitstempel bei 0x08 beginnen. Alle acht sind FILETIME-Werte: 64-Bit-Zähler von 100-Nanosekunden-Intervallen seit 1601-01-01 00:00:00 UTC (Lektion 3.1). Sie werden unabhängig von der Zeitzone des Systems in UTC gespeichert.
Eine Datei hat ein $SI-Attribut, aber ein $FN-Attribut pro Name. Wenn 8.3-Kurznamen aktiviert sind, besitzt Quarterly Report.xlsx ein Win32-$FN und ein DOS-$FN (QUARTE~1.XLS), die jeweils vier eigene, normalerweise identische Zeitstempel enthalten. Harte Links fügen weitere $FN-Attribute hinzu. Der $I30-Indexeintrag des übergeordneten Verzeichnisses enthält eine weitere Kopie von $FN einschließlich der Zeitstempel, die vom Datensatz abweichen kann; im Index-Slack verbliebene Einträge können Zeitstempel gelöschter oder umbenannter Dateien bewahren.
Wer sie aktualisiert
$SI wird bei normalen Dateivorgängen von NTFS gepflegt, und jeder Prozess mit Schreibzugriff auf die Dateiattribute kann es auch aus dem Benutzermodus setzen. SetFileTime setzt die Erstellungs-, Zugriffs- und Änderungszeit; der native Aufruf NtSetInformationFile mit der Klasse FileBasicInformation (sowie SetFileInformationByHandle) kann alle vier setzen, einschließlich der Änderungszeit des MFT-Eintrags. Administratorrechte sind nicht erforderlich. Legitime Software verwendet diese Aufrufe ständig: Archivierungsprogramme, Kopier- und Sicherungswerkzeuge, Installationsprogramme und Cloud-Synchronisierungsclients stellen Zeitstempel gezielt wieder her.
$FN wird vom NTFS-Treiber im Kernel geschrieben, wenn ein Name erstellt wird, was hauptsächlich beim Erstellen, Umbenennen und Verschieben geschieht. Es gibt keine dokumentierte API, um $FN direkt zu setzen. Deshalb ist $FN schwieriger zu fälschen und ein Vergleich mit $SI nützlich. Schwieriger bedeutet nicht unmöglich: Da beim Umbenennen oder Verschieben normalerweise $SI-Werte in das neue $FN kopiert werden, kann jemand $SI setzen und anschließend die Datei verschieben; direkte Schreibzugriffe auf den Datenträger können alles verändern (Modul 7).
Der letzte Zugriff ist ein schwaches Indiz
Der Registrierungswert NtfsDisableLastAccessUpdate unter HKLM\SYSTEM\CurrentControlSet\Control\FileSystem steuert die Aktualisierung von A. Seit Windows Vista ist sie standardmäßig deaktiviert. Ab Windows 10 Version 1803 kann der Wert zwischen 0x80000000 und 0x80000003 liegen: Ist Bit 0x2 gesetzt, bedeutet dies „Systemverwaltet“, wobei Windows anhand der Größe des Startvolumes entscheidet (vor Windows 10 Version 2004 höchstens 128 GB; seitdem anhand des Schwellenwerts in NtfsLastAccessUpdatePolicyVolumeSizeThreshold); ist Bit 0x1 gesetzt, ist die Aktualisierung deaktiviert. fsutil behavior query disablelastaccess zeigt die Einstellung auf einem laufenden System an. Ob A aktualisiert wird, hängt also von der Version und dem Volume ab: Gehen Sie niemals ungeprüft vom einen oder anderen aus. Selbst bei aktivierter Aktualisierung verzögert NTFS das Schreiben einer neuen Zugriffszeit auf den Datenträger um bis zu eine Stunde. Behandeln Sie A als schwaches Indiz: Ein alter A-Wert beweist nicht, dass die Datei nicht geöffnet wurde, und ein aktueller A-Wert kann von Virenscans, der Indizierung oder einer Sicherung stammen. Verwenden Sie Prefetch, LNK-Dateien und Sprunglisten, um nachzuweisen, dass eine Datei oder ein Programm geöffnet wurde (Modul 2).
Faustregeln unter Windows 10 und 11
Untersuchungen zu NTFS unter Windows 10 und 11 haben tabellarisch erfasst, wie häufige Vorgänge die acht Werte verändern. Die Tabelle zeigt das typische Ergebnis; das Verhalten variiert je nach Windows-Build und ausführendem Programm. Testen Sie daher auf derselben Version, bevor Sie sich in einem Bericht auf eine Regel stützen.
| Vorgang | $SI M | $SI A | $SI C | $SI B | $FN M | $FN A | $FN C | $FN B |
|---|---|---|---|---|---|---|---|---|
| Erstellen | Neu | Neu | Neu | Neu | Neu | Neu | Neu | Neu |
| Inhalt ändern | Neu | Falls aktiviert | Neu | – | – | – | – | – |
| Lesen (Zugriff) | – | Falls aktiviert | – | – | – | – | – | – |
| Umbenennen, gleiches Volume | – | – | Neu | – | Aus $SI | Aus $SI | Aus $SI | Aus $SI |
| Verschieben, gleiches Volume | – | – | Neu | – | Aus $SI | Aus $SI | Aus $SI | Aus $SI |
| Kopieren (neue Datei) | Quelle | Neu | Neu | Neu | Neu | Neu | Neu | Neu |
| Auf anderes Volume verschieben | Quelle | Neu | Neu | Quelle | Neu | Neu | Neu | Neu |
„Neu“ ist der Zeitpunkt des Vorgangs, „–“ bedeutet unverändert, „Quelle“ bedeutet von der ursprünglichen Datei übernommen, und „Aus $SI“ bedeutet, dass das neue $FN die unmittelbar vor dem Vorgang vorhandenen $SI-Werte übernimmt. Das Verschieben auf ein anderes Volume ist ein Kopiervorgang mit anschließendem Löschen: Der neue Datensatz erhält wie beim Kopieren neue $FN-Zeitstempel, aber beim Ausschneiden und Einfügen im Explorer bleibt auch der $SI-B-Wert der Quelle erhalten, sodass sowohl M als auch B alt erscheinen.
Drei Konsequenzen sind besonders wichtig:
- Kopierindikator. Eine Kopie behält M der Quelle bei, erhält aber ein neues B. Daher ist M früher als B das normale Anzeichen für eine kopierte Datei, nicht für eine Manipulation.
- Archive und Downloads. Entpackprogramme setzen M normalerweise auf den im Archiv gespeicherten Zeitpunkt, und einige stellen auch B und A wieder her, sodass entpackte Dateien Jahre alt erscheinen können. Ein Browserdownload erhält B normalerweise beim erstmaligen Erstellen der Datei und M beim Abschluss des Schreibens; einige Downloadwerkzeuge setzen M anhand des Last-Modified-Headers des Servers. Ein alternativer Datenstrom namens
Zone.Identifierhilft dabei, Downloads zu identifizieren. - Anwendungen mit sicherem Speichern. Viele Editoren, darunter Office-Pakete, speichern, indem sie eine temporäre Datei schreiben und sie so umbenennen, dass sie das Original ersetzt. Die Datei befindet sich dann in einem neuen MFT-Datensatz, während NTFS-Tunneling (ein namensbasierter Cache mit standardmäßig 15 Sekunden Gültigkeit) der neuen Datei die alte $SI-Erstellungszeit zuweist. Ein unverändertes B beweist nicht, dass der Datensatz derselbe ist.
Durchgearbeitetes Beispiel: budget-q3.xlsx
(a) Von einem USB-Laufwerk kopiert. Das FAT32-Laufwerk enthielt budget-q3.xlsx, zuletzt geändert am 2026-07-28T16:42:10Z. Die Datei wurde nach C:\Users\ana\Documents\ kopiert. Der Datensatz (beispielsweise in der Ausgabe von istat) zeigt:
| Wert | $SI (0x10) | $FN (0x30) |
|---|---|---|
| Erstellt | 2026-08-03T09:15:42.6183420Z | 2026-08-03T09:15:42.6183420Z |
| Geändert | 2026-07-28T16:42:10.0000000Z | 2026-08-03T09:15:42.6183420Z |
| MFT geändert | 2026-08-03T09:15:42.7401138Z | 2026-08-03T09:15:42.6183420Z |
| Zugriff | 2026-08-03T09:15:42.6183420Z | 2026-08-03T09:15:42.6183420Z |
Begründung: $SI M liegt 5 Tage, 16 Stunden und 33 Minuten vor $SI B, was dem Kopiermuster entspricht (die Spalte Copied von MFTECmd kennzeichnet dies). $SI B entspricht $FN B, sodass nichts auf eine Rückdatierung hindeutet. Der Sekundenbruchteil von $SI M besteht aus Nullen, weil FAT32 Änderungszeiten in 2-Sekunden-Schritten speichert und dieser Wert beim Kopieren erhalten blieb; 16:42:10 ist eine gerade Sekunde. FAT speichert Ortszeit, sodass bei der Umrechnung in UTC die Zeitzone des kopierenden Systems verwendet wurde (Lektion 3.5). Die Datei gelangte um 09:15:42Z auf das Volume; bestätigen Sie das USB-Gerät anhand der Artefakte aus Lektion 2.6.
(b) Am 2026-08-04T22:31:07.4410023Z bearbeitet und am selben Ort gespeichert. $SI M und $SI C werden auf 2026-08-04T22:31:07.4410023Z gesetzt. $SI B bleibt bei 09:15:42.6183420Z, und $SI A bleibt unverändert, weil die Aktualisierung des letzten Zugriffs deaktiviert ist. Alle vier $FN-Werte bleiben bei 2026-08-03T09:15:42.6183420Z. Nun liegt M nach B, sodass der Kopierindikator aus $SI verschwunden ist; der Zeitpunkt, zu dem die Datei auf das Volume gelangte, bleibt in $SI B und in allen vier $FN-Werten erhalten. Falls ein Editor mit sicherem Speichern verwendet wurde, gleichen Sie die Datensatznummer mit früheren Artefakten ab, bevor Sie davon ausgehen, dass es sich um denselben Datensatz handelt.
Anomalien interpretieren
Muster, die nicht zur Tabelle passen, verdienen eine genauere Betrachtung:
- $SI B früher als $FN B. Nach dem Erstellen, Kopieren, Umbenennen und Verschieben innerhalb desselben Volumes entspricht $SI B dem Wert von $FN B. Beim Ausschneiden und Einfügen von einem anderen Volume sowie bei manchen Archivextraktionen entsteht ebenfalls ein älteres $SI B, aber dabei bleibt $SI C auf dem Zeitpunkt des Vorgangs.
- Sekundenbruchteile mit Nullwerten. Ein FILETIME-Wert, dessen 100-Nanosekunden-Anteil 0000000 beträgt. NTFS zeichnet mit voller Genauigkeit auf, während viele Werkzeuge zum Setzen von Zeitstempeln ganze Sekunden verwenden.
- $SI-Datumswerte vor der Installation des Betriebssystems, ermittelt anhand von
InstallDate(Unix-Sekunden) unterHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion. Funktionsupgrades setzen diesen Wert zurück; vergleichen Sie daher sorgfältig.
Jedes dieser Muster kann harmlose Ursachen haben: Archivextraktion, Installationsprogramme, Synchronisierungsclients und Dateien von FAT-Medien. Behandeln Sie sie als Anhaltspunkte, nicht als Feststellungen, und bestätigen Sie sie mit $UsnJrnl (einem Änderungsgrund BASIC_INFO_CHANGE zu dem Zeitpunkt, an dem die Werte gesetzt wurden) und $LogFile (Lektion 1.4 und Modul 7). MFTECmd gibt die acht Werte beispielsweise als Created0x10, Created0x30, LastModified0x10, LastModified0x30, LastRecordChange0x10, LastRecordChange0x30, LastAccess0x10 und LastAccess0x30 aus (0x10 ist $SI, 0x30 ist $FN) und kennzeichnet Datensätze mit SI<FN (ein $SI-Zeitstempel liegt vor dem $FN-Zeitstempel), uSecZeros (Sekundenbruchteile mit Nullwerten) und Copied. Einige Werkzeuge lassen $FN-Spalten leer, wenn deren Werte $SI entsprechen. Prüfen Sie daher, wie Ihr Werkzeug diese Werte darstellt.
Durchgearbeitetes Beispiel: eine durch Timestomping manipulierte Datei
C:\ProgramData\Intel\igfxupd.exe zeigt für alle vier $SI-Werte 2019-03-19T04:12:00.0000000Z und für alle vier $FN-Werte 2026-08-05T02:14:48.9917304Z. InstallDate beträgt 1.676.037.931, was 2023-02-10T14:05:31Z entspricht.
Der rohe $SI-Erstellungswert besteht aus den 8 Bytes 00 E8 45 E6 09 DE D4 01, als Little-Endian gelesen 0x01D4DE09E645E800 = 131.974.423.200.000.000. Geteilt durch 10.000.000 ergibt das 13.197.442.320 Sekunden mit Rest 0: kein Sekundenbruchteil. Der $FN-Wert 134.303.696.889.917.304 ergibt einen Rest von 9.917.304, also 0,9917304 s.
Begründung: $SI B liegt sieben Jahre vor $FN B; bei $SI besteht der Sekundenbruchteil aus Nullen, bei $FN nicht; $SI liegt vor der Installation; und $SI C wurde ebenfalls gesetzt, was SetFileTime allein nicht leisten kann. Ein normaler Kopiervorgang würde ein neues $SI B erzeugen, und beim Verschieben von einem anderen Volume oder bei einer Extraktion, die B wiederherstellt, bliebe $SI C dennoch auf dem Zeitpunkt des Vorgangs. Die belastbare Aussage lautet, dass der Dateiname auf diesem Volume am 2026-08-05T02:14:48Z erstellt wurde und seine $SI-Werte wahrscheinlich danach gesetzt wurden, vorbehaltlich einer Bestätigung durch $UsnJrnl.
Prüfungsschwerpunkt: Rechnen Sie damit, erkennen zu müssen, welche der acht Zeitstempel ein Vorgang verändert, M früher als B als Hinweis auf eine Kopie zu erkennen und $FN gegenüber $SI zu bevorzugen, wenn $SI manipuliert erscheint. Fragen können den Zeitpunkt betreffen, zu dem eine Datei auf ein Volume gelangte; dieser ergibt sich aus B und wird in UTC angegeben. Fragen zum letzten Zugriff prüfen, ob Sie wissen, dass dessen Aktualisierung normalerweise deaktiviert und er deshalb ein schwaches Indiz ist.
Kernpunkte
- MACB steht für Modified, Accessed, MFT entry Changed und Born; unter NTFS bezeichnet C eine Metadatenänderung, nicht die Erstellung.
- $SI und jedes $FN enthalten vier FILETIME-Werte in UTC; eine Datei hat ein $SI-Attribut, aber ein $FN-Attribut pro Name sowie eine Kopie im $I30-Index des übergeordneten Verzeichnisses.
- $SI kann aus dem Benutzermodus von jedem Prozess mit Schreibzugriff auf die Attribute gesetzt werden; $FN wird beim Erstellen, Umbenennen und Verschieben vom Kernel geschrieben und ist daher schwieriger zu fälschen.
- Eine Kopie behält M der Quelle und erhält ein neues B, sodass M früher als B bei kopierten Dateien normal ist.
- Ob der letzte Zugriff aktualisiert wird, hängt von der Version und dem Volume ab; behandeln Sie A als schwaches Indiz.
- $SI B früher als $FN B, Sekundenbruchteile mit Nullwerten und Datumswerte vor der Installation sind Anhaltspunkte, die mit $UsnJrnl und $LogFile bestätigt werden müssen.