NTFS erlaubt einer Datei mehr als ein $DATA-Attribut. Das erste ist namenlos und hält den Hauptinhalt. Jedes zusätzliche $DATA-Attribut ist benannt und wirkt als paralleler Stream, der an dieselbe Datei gehängt ist. Diese Zusatz-Streams sind Alternate Data Streams (ADS).
Die Syntax
ADS liest und schreibt man aus PowerShell oder cmd:
echo verborgener text > notizen.txt:geheim
type notizen.txt:geheim
notizen.txt sieht im Explorer und in dir leer aus — ihr Haupt-$DATA hat null Bytes. Aber der benannte Stream geheim enthält deinen Text. Aus Sicht des Benutzers verhält sich die Datei normal; der alternative Stream reist mit.
Wo man ADS legitim trifft
Windows selbst nutzt ADS für eigene Buchhaltung. Am häufigsten ist Zone.Identifier, an jede aus dem Internet heruntergeladene Datei gehängt. Er enthält einen kurzen Textblock mit Herkunfts-URL und Sicherheitszone. Das ist es, was die Warnung „Diese Datei stammt von einem anderen Computer" auslöst.
Weitere legitime Nutzungen:
$KSPfür Tastatur-Layout-DateienOECustomPropertyfür Outlook-Anhänge- diverse Thumbnail- und Such-Index-Streams
Warum Angreifer ADS lieben
Alles, was abseits des Hauptstreams lebt, ist tendenziell unsichtbar für:
- Ordneransichten, die nur Dateigrößen anzeigen (gemeldet wird die Größe des unbenannten Streams)
- Antivirus-Engines, die nur den Default-Stream scannen
- manuelle Sichtung durch eine Analystin, die nicht explizit nach Streams fragt
Ein gängiges Muster: Payload in legit-dokument.docx:payload.exe ablegen und per WMI starten. Die Datei sieht aus wie ein Word-Dokument und bleibt das, solange man nicht die richtigen Fragen stellt.
Sie erkennen
dir /R listet jeden Stream jeder Datei in einem Verzeichnis. Die Ausgabe zeigt die Stream-Größe neben dem benannten Stream:
1.234.567 legit-dokument.docx
45.056 legit-dokument.docx:payload.exe:$DATA
PowerShells sauberes Äquivalent:
Get-Item legit-dokument.docx -Stream *
Warum $MFT die bessere Linse ist
Eine datei-für-datei-Aufzählung kann Streams auf Dateien übersehen, an die man nicht gedacht hat. $MFT hat dieses Problem nicht: Jedes Attribut liegt dort, im Eintrag. Das Durchlaufen der MFT und Auflisten aller $DATA-Attribute jedes Eintrags — benannte wie unbenannte — liefert in einem Durchgang eine vollständige Inventur aller Streams des Volumes.
In der Triage ist das der Unterschied zwischen „Ich sollte daran denken, ADS zu prüfen" und „Ich habe sie bereits alle geprüft".