BAM vs. UserAssist: zwei benutzerbezogene Ausführungsspuren
BAM und UserAssist ordnen Programmausführung einem Benutzer zu. Vergleich von Speicherort, Zeitstempeln, Zählern, GUI- und Hintergrundstarts sowie Aufbewahrung.
TL;DR. Beide Artefakte sagen, welcher Benutzer was gestartet hat. BAM (SYSTEM-Hive, pro SID) erfasst Prozesse unabhängig davon, wie sie gestartet wurden – außer Wechsel-/Netzwerkpfaden und aus der Kommandozeile gestarteten Konsolenprogrammen –, behält aber nur den letzten Zeitstempel für etwa eine Woche. UserAssist (das NTUSER.DAT jedes Benutzers) sieht nur Starts über die Explorer-Shell, ergänzt aber Ausführungszähler, Fokuszähler und Fokuszeit und behält sie viel länger. Widersprechen sie sich, liegt es meist an der Startmethode.
Die meisten Vergleiche stellen BAM neben systemweite Artefakte (Prefetch, ShimCache, Amcache). Spannender ist der Nachbar UserAssist, das andere klassische benutzerbezogene Ausführungsartefakt. Hintergrund zu BAM: der komplette BAM/DAM-Leitfaden.
Auf einen Blick
| BAM | UserAssist | |
|---|---|---|
| Hive | SYSTEM (eine Datei pro Host) | NTUSER.DAT (eines pro Benutzerprofil) |
| Schlüssel | Services\bam\State\UserSettings\<SID> | Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count |
| Zuordnung | Schlüsselname = SID | Der Hive gehört dem Benutzer |
| Wertname | NT-Gerätepfad oder Paketname | Mit ROT13 verschleierter Pfad, oft mit Known-Folder-GUID |
| Zeitstempel | Ein FILETIME (zuletzt erfasste Aktivität) | FILETIME der letzten Ausführung |
| Zähler | Keine | Ausführungszähler, Fokuszähler, Fokuszeit |
| Was erfasst wird | Von bam.sys gesehene Prozesse (ab Windows 10 1709) | Starts über die Explorer-Shell |
| Aufbewahrung | ~7 Tage, Bereinigung beim Start | Lange |
| Blinde Flecken | Wechsel-/Netzwerkpfade, Konsolen-Tools aus der Kommandozeile | Alles, was nicht über den Explorer gestartet wird |
Quellen: Suhanov, BAM internals; libyal winreg-kb, UserAssist; Didier Stevens, UserAssist.
UserAssist in zwei Minuten
Unter UserAssist verfolgt jeder GUID-Unterschlüssel eine Kategorie; ab Windows 7 deckt {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} Starts ausführbarer Dateien und {F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} Starts von Verknüpfungen ab (libyal). Die Wertnamen sind der Programmpfad mit ROT13 auf den Buchstaben – P:\Jvaqbjf\... steht für C:\Windows\.... Pfade beginnen oft mit einer Known-Folder-GUID statt mit einem Laufwerksbuchstaben.
Die Wertdaten (72 Bytes ab Windows 7) enthalten den Ausführungszähler an Offset 4, den Fokuszähler an Offset 8, die Fokuszeit an Offset 12 und den FILETIME der letzten Ausführung an Offset 60 (libyal). libyal führt auf, was der Schlüssel erfasst: Starts über Systemsteuerung, Startmenü und Verknüpfungen, den Ausführen-Dialog, Tastenkürzel, Quick Launch und ähnliche Explorer-Wege.
Einen Wertnamen von Hand dekodieren
ROT13 verschiebt jeden Buchstaben um 13 Stellen und lässt Ziffern und Satzzeichen unverändert – es ist also seine eigene Umkehrung. Nehmen Sie diesen UserAssist-Wertnamen:
P:\Jvaqbjf\Flfgrz32\pzq.rkr
Verschieben Sie die Buchstaben um 13 zurück, und Sie erhalten C:\Windows\System32\cmd.exe. Jedes UserAssist-Tool erledigt das für Sie, aber das Muster zu erkennen hilft, wenn Sie einen rohen Hive in einem Viewer durchblättern oder eine Suche nach cmd.exe im rohen Hive nichts findet: Der Klartextname ist dort nicht gespeichert.
BAM in zwei Minuten
Ein Schlüssel pro SID im SYSTEM-Hive, ein REG_BINARY pro ausführbarer Datei, die ersten 8 Bytes ein FILETIME, der bei Prozessstart und -ende aktualisiert wird; etwa sieben Tage Aufbewahrung; nichts für Wechseldatenträger oder Netzwerkfreigaben (Suhanov). Details: wo der BAM-Schlüssel liegt und das Werteformat.
Wo sie sich widersprechen – und warum
| Gesehen in | Typische Ursache |
|---|---|
| Nur BAM | Von einem Skript, einer Kommandozeile (keine Konsolenprogramme), einem Dienst oder einer Aufgabe unter dem Benutzer oder per Fernausführung gestartet; oder UserAssist wurde geleert |
| Nur UserAssist | Älter als BAMs Woche; von USB-Stick oder Netzwerkfreigabe gestartet (Explorer-Start, aber BAM schließt den Pfad aus); ausführbare Datei gelöscht und Host neu gestartet |
| Beide | Kürzlich über den Explorer von einer lokalen Platte gestartet |
| Keines | Konsolenprogramm aus cmd.exe/PowerShell gestartet, oder beide bereinigt |
In der ersten Zeile verdient sich BAM seinen Platz: Angreifer-Tools laufen selten über das Startmenü. Im fiktiven Lateral-Movement-Fall sind PsExec64.exe und rclone.exe unter svc_backup genau die Art von Starts, die man in UserAssist nicht erwarten würde, während BAM sie zeigt.
In der zweiten Zeile verdient sich UserAssist seinen: Historie. Begann der Vorfall drei Wochen vor der Sicherung, ist BAM für die frühe Phase wahrscheinlich leer, während UserAssist den ersten Start eines Tools samt Zähler noch zeigen kann.
Unterschiedliche Hives, unterschiedliche Sicherung
- BAM: ein
SYSTEM-Hive (+ Protokolle) deckt alle Benutzer des Hosts ab. - UserAssist: ein
NTUSER.DAT(+ntuser.dat.LOG1/LOG2) pro Profil unterC:\Users\<Name>\. Gelöschte Profile nehmen ihr UserAssist mit; die BAM-Schlüssel dieser SID liegen in SYSTEM und können das Profil daher bis zur Bereinigung überdauern.
Eine KAPE-Sammlung mit Registry-Targets erfasst meist beides (KapeFiles). Unser BAM/DAM Parser übernimmt die SYSTEM-Seite; NTUSER.DAT-Artefakte wie UserAssist lesen Sie mit Registry Parser oder den Tools aus dem Parser-Vergleich.
Zeitstempel: vorsichtig vergleichen
Beide sind FILETIMEs in UTC, bedeuten aber nicht dasselbe:
- Die letzte Ausführung in UserAssist wird geschrieben, wenn der Explorer das Programm startet.
- BAM wird bei Erzeugen und Beenden des Prozesses aktualisiert und kann für denselben Lauf später als die UserAssist-Zeit liegen, wenn das Programm geöffnet blieb.
Eine BAM-Zeit einige Stunden nach der UserAssist-Zeit für denselben Pfad ist also kein Widerspruch; es kann das Schließen des Programms sein.
Anti-Forensik
Beides sind gewöhnliche Registry-Daten. UserAssist-Werte kann der Benutzer selbst oder ein Bereinigungsprogramm löschen, da der Hive ihm gehört; BAM-Einträge lassen sich mit ausreichenden Rechten löschen und verschwinden von selbst nach einer Woche oder wenn die ausführbare Datei gelöscht und der Host neu gestartet wird (Grenzen von BAM). Ein Benutzer mit leerem UserAssist, während BAM interaktiv wirkende Programme (Browser, Office) zeigt, verdient einen zweiten Blick.
Checkliste für die Untersuchung
- BAM für jede SID des Hosts auswerten (ein SYSTEM-Hive deckt alle ab).
- UserAssist aus dem
NTUSER.DATjedes Profils auswerten, auch von Konten, die Sie für irrelevant halten. - Für jedes relevante Programm notieren: in BAM? in UserAssist? Zähler? letzte Zeiten in beiden?
- Jeden Widerspruch mit der Tabelle oben erklären (Startmethode, Alter, Pfadtyp), bevor Sie etwas als verdächtig einstufen.
- Für Zeilen, die dann noch nicht aufgehen, Prefetch und Ereignisprotokolle hinzuziehen.
Häufige Fragen
Was ist der Unterschied zwischen BAM und UserAssist?
BAM liegt im SYSTEM-Hive, ein Schlüssel pro SID, mit einem einzigen aktuellen Zeitstempel pro ausführbarer Datei und etwa einer Woche Aufbewahrung. UserAssist liegt im NTUSER.DAT jedes Benutzers, erfasst Starts über die Explorer-Shell und speichert Zähler, Fokuszeit und letzte Ausführungszeit deutlich länger.
Warum erscheint ein Programm in BAM, aber nicht in UserAssist?
UserAssist erfasst Starts über die Explorer-Shell (Startmenü, Desktop, Verknüpfungen, Ausführen-Dialog). Programme, die von einem Skript, einer Kommandozeile, einem Dienst oder einem Fernwerkzeug gestartet werden, laufen nicht über diese Wege, können aber dennoch einen BAM-Eintrag erzeugen.