Skip to content

Triage: verdächtige Einträge in RecentFileCache erkennen

Praktischer Leitfaden zu Pfad-Heuristiken, Basename-Eigenheiten und Laufwerk-Mustern, die eine Liste gecachter Pfade in Untersuchungs-Leads verwandeln.

Veröffentlicht am 4 Min. Lesezeit

Wenn du eine RecentFileCache.bcf geparst hast, hast du eine Liste von Pfaden und nichts weiter. Keine Zeitstempel, keine Hashes, keine Signierer. Die Triage-Frage lautet: welche dieser Pfade sind einen zweiten Blick wert? Dieser Post geht durch die Heuristiken, die sich in echten Fällen bewährt haben.

Die vier signalstarken Pfad-Nachbarschaften

Die meisten opportunistischen und gezielten Angreifer hinterlassen Executables in einer kleinen Auswahl beschreibbarer Verzeichnisse. Filtere deine .bcf zuerst nach diesen:

Muster (case-insensitive)Warum es interessant ist
\AppData\Local\Temp\Default-Ziel für Entpackungen / Office-Downloads — auch beliebter Drop-Spot für Loader und Second-Stages
\Windows\Temp\Als SYSTEM schreibbar; üblich für Malware mit Privilege Escalation
\Users\Public\Weltweit beschreibbar, oft zum Sharen von Staging-Tools zwischen Accounts benutzt
\ProgramData\Weltweit beschreibbarer Subtree, den manche Installer (und Malware) ausnutzen
\PerfLogs\Per Default leer, merkwürdig oft von Red Teams benutzt
\$Recycle.Bin\Fast nie legitim, von hier etwas auszuführen
\Recovery\, \System Volume Information\Sollten system-only sein; Einträge hier verdienen Untersuchung

In der Tabellenansicht des Parsers gruppieren sich verdächtige Nachbarschaften visuell, wenn nach Drive und dann Path sortiert wird.

Basename-Eigenheiten

Der Dateiname (letztes Segment) jedes Pfads trägt sein eigenes Signal:

  • Ein- oder zweibuchstabige Namena.exe, b.exe, xx.exe. Fast immer entweder Malware, Build-Artefakte oder das helloworld.exe eines Entwicklers. Ins Ursprungsverzeichnis pivotieren.
  • Zufällig aussehende Stringsj2k9f.exe, cfa31b.exe. Hohe Entropie im Basename deutet häufig auf Dropper-Output oder entpackte Stages hin.
  • Doppelte Erweiterungeninvoice.pdf.exe, image.jpg.scr. Klassisches Phishing-Payload-Muster. Schon allein einen Treffer wert.
  • GUID-ähnliche Namen{f3b3c8d4-...}.exe. Entweder die per-Session-Kopie eines legitimen Installers oder Malware, die sich als solche tarnt.
  • Legitimer Name am falschen Ortsvchost.exe unter C:\Users\Public\ (vs C:\Windows\System32\) ist ein lehrbuchhaftes Verschieben signierter Binaries.
  • Nachgestellte Leerzeichen / Unicode-Tricksnotepad .exe, Namen mit Right-to-Left-Override-Zeichen (U+202E). Der Parser bewahrt sie wortgetreu; eine Hex-Ansicht des Pfads oder ein schneller length(path)-Check entlarvt sie.

Laufwerksbuchstaben-Analyse

Der Parser zeigt eine drive-Spalte. Die meisten gecachten Einträge sind C:. Alles andere verdient Aufmerksamkeit:

  • D:, E:, F: und darüber hinaus — USB-Sticks, gemountete Shares, gemountete ISOs. Übliche Malware-Staging-Vektoren. Mit Shellbags / USBSTOR-Registry-Keys kreuzen, um das Gerät zu identifizieren.
  • UNC-Pfade (\\server\share\...) — Ausführung von Netzwerk-Shares. Es lohnt sich, mit SMB-Sitzungs-Logs zu korrelieren.
  • Gar kein Laufwerk — Pfade, die mit einem einzelnen Namen beginnen (kein C:, kein \\), sind für .bcf ungewöhnlich und bedeuten meist, dass ein relativer Pfad aufgezeichnet wurde — was an sich interessant ist, weil der Dienst fast immer auf absolut normalisiert.

Dateinamen-→-Prozess-Pivot

Ein gegebener Basename, der in .bcf erscheint, ist kein Beweis, dass er lief — nur, dass AppCompat ihn sah. Wenn du eine Shortlist von Kandidaten hast, pivotiere:

  1. Prefetch (C:\Windows\Prefetch\<NAME>-<HASH>.pf). Wenn eine entsprechende .pf existiert, hast du ein Ausführungsereignis mit Zeitstempel(n) und einem Lauf-Counter.
  2. Amcache.hve — gleiche Ära wie .bcf, aber mit Hash, Herausgeber, Installationsdatum. Der Schwester-Parser amcache-parser macht das client-seitig.
  3. Die Datei auf der Platte. Wenn der Pfad noch auflöst, hashe sie und pivotiere zu VirusTotal / deinem internen IOC-Store. Wenn der Pfad nicht auflöst, wurde die Binary gelöscht — und diese Löschung ist selbst ein Ereignis, nach dem du im MFT / $LogFile suchen kannst.

Was nicht drin ist

Genauso wichtig: Dinge, die du in .bcf nicht erwarten solltest.

  • Skripte. .ps1, .vbs, .js, .bat, .hta werden vom Application-Experience-Scanner nicht erfasst. Eine saubere .bcf bedeutet keine saubere Maschine.
  • DLLs, die von signierten Hosts geladen werden. RecentFileCache kümmert sich um EXE-artige Images, die den AppCompat-Codepfad des Loaders kreuzen. DLLs, die von rundll32.exe, regsvr32.exe oder mshta.exe geladen werden, tauchen normalerweise nicht auf.
  • Alles, was den Loader umgangen hat. Reflective Injection, Process Hollowing, In-Memory-PE — designbedingt unsichtbar für RecentFileCache.

Ein pragmatischer Filter

Ein pragmatischer erster Pass, ausgedrückt in jq über die JSON-Ausgabe des Parsers:

jq '.entries[] | select(
  (.path | ascii_downcase | test(
    "\\\\(appdata\\\\local\\\\temp|windows\\\\temp|users\\\\public|programdata|perflogs|\\$recycle\\.bin)\\\\"
  )) or
  ((.filename // "") | test("^[a-z0-9]{1,3}\\.exe$"; "i")) or
  ((.filename // "") | test("\\.(pdf|doc|docx|xls|xlsx|jpg|png)\\.exe$"; "i"))
) | "\(.drive // "?")\t\(.filename // "?")\t\(.path)"' rfc.json

Du bekommst eine tab-separierte Triage-Liste, bereit zum Einfügen in ein Notebook oder zum Einspeisen in eine Hash-und-VT-Schleife. Der nächste Post deckt ab, was mit den Kandidaten zu tun ist.

Verwandte Artikel

Der Lebenszyklus der BCF hängt an einer einzigen geplanten Aufgabe. Verstehen Sie, wann ProgramDataUpdater läuft, wann sie die Datei leert und wie Sie einen deaktivierten Appraiser erkennen.
Das BCF-Format ist ein Header, eine Liste von längen-präfixierten UTF-16LE-Pfaden, und das war's. Hier ist, was jedes Byte bedeutet und warum sich seit 2009 nichts geändert hat.
Ein vom SOC markierter Win7 Endpoint, 14 Pfade in der BCF, drei einer zweiten Betrachtung wert. Eine realistische Korroborationskette und wie viel die BCF tatsächlich beigetragen hat.