← Zurück zum Blog

Alternate Data Streams: versteckte $DATA-Attribute auf NTFS

· 2 Min. Lesezeit

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:

  • $KSP für Tastatur-Layout-Dateien
  • OECustomProperty fü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".

Externe Ressourcen