Analyse forensique du presse-papiers dans ActivitiesCache.db
Comment Windows stocke le texte du presse-papiers dans ActivitiesCache.db : types 10 et 16, paramètres requis, expiration à 12 heures et décodage Base64.
En bref. Le contenu du presse-papiers correspond au type d'activité 10 : du texte Base64 dans ClipboardPayload, conservé 12 heures. Les événements de copie et de collage sont de type 16, avec Group = Copy ou Paste et un clipboardDataId qui les relie. Le type 10 n'a été observé qu'avec l'historique du presse-papiers et la synchronisation entre appareils tous deux activés : la plupart des bases n'en ont pas. Quand il est là, c'est de l'or : commandes, chemins, parfois des identifiants.
Les preuves issues du presse-papiers sont rares dans Timeline. C'est justement pour cela qu'il faut les connaître parfaitement : quand elles apparaissent, elles répondent souvent à la question autour de laquelle le reste du dossier ne fait que tourner.
Les deux types d'activité
| Type 10 | Type 16 | |
|---|---|---|
| Quoi | Le contenu du presse-papiers | Une opération de copie ou de collage |
| Colonne clé | ClipboardPayload (Base64 dans du JSON) | Group (« Copy » / « Paste ») |
| Lien entre les deux | clipboardDataId dans Payload | |
| Application | Application d'où proviennent les données | Application de copie / de collage |
| Durée de vie | 12 heures (ExpirationTime - LastModifiedTime = 43 200 s) | Expiration standard |
| Source | kacos2000, inversecos | kacos2000 |
kacos2000 a observé le type 10 pour la première fois sur une build Insider de Windows 10 1809, en notant n'avoir vu que du texte ; les images ne se synchronisaient pas de la même façon à l'époque (kacos2000).
Quand le contenu du presse-papiers est enregistré
inversecos signale deux conditions pour que le presse-papiers soit journalisé dans ActivitiesCache.db : l'historique du presse-papiers activé et la synchronisation du presse-papiers entre appareils activée (inversecos). Aucune des deux n'est active par défaut dans la plupart des environnements, d'où la rareté des lignes de type 10.
Où vérifier les paramètres :
| Paramètre | Emplacement |
|---|---|
| Historique du presse-papiers | NTUSER.DAT\Software\Microsoft\Clipboard\EnableClipboardHistory (1 = activé) (kacos2000) |
| Dernier nettoyage des éléments expirés | NTUSER.DAT\Software\Microsoft\Clipboard\HistoryOldItemsLastCleanupTimestamp (FILETIME) (kacos2000) |
| Stratégie d'organisation pour la synchronisation du presse-papiers | AllowCrossDeviceClipboard dans le CSP de stratégie Privacy, Windows 10 1809 et ultérieur (Microsoft Learn) |
Lisez les ruches utilisateur avec le parseur de registre. Gardez à l'esprit que Microsoft a arrêté la synchronisation cloud de l'historique des activités pour les comptes Microsoft en 2021 et pour les comptes Entra ID à partir de janvier 2024 (Microsoft Support). L'effet sur les lignes locales du presse-papiers dans les builds actuelles n'est pas documenté : testez sur vos propres images plutôt que de supposer.
Décoder ClipboardPayload
La colonne contient un tableau JSON. Chaque élément comporte un content en Base64 et un formatName :
[{"content": "cmNsb25lIGNvcHkgRTpcZXhmaWwgbWVnYTpmaW4tYmFja3VwIC0tdHJhbnNmZXJzIDg=", "formatName": "Text"}]
Décoder le Base64 donne le texte. inversecos le résume simplement : les données sont seulement encodées en Base64 (inversecos). L'exemple ci-dessus, tiré de l'échantillon fictif de ce site, se décode en une commande rclone copy.
Le Windows Timeline Parser décode ClipboardPayload sur chaque ligne qui en possède un, essaie l'UTF-8 puis l'UTF-16LE, supprime les caractères NUL de fin et assemble les éléments texte multiples. Le résultat s'affiche dans le tableau, marqué Presse-papiers, se retrouve avec le filtre texte et part dans la colonne CSV ClipboardText. L'entrée ClipboardPayload du glossaire en donne la version courte.
Du texte contrôlé par un attaquant est dangereux dans un tableur. L'export CSV de l'outil préfixe les cellules qui commencent par =, +, - ou @ afin qu'une formule copiée ne s'exécute pas quand l'analyste ouvre l'export.
Lire les événements de copie et de collage
Les lignes de type 16 ne contiennent pas le texte, mais elles donnent la direction et l'application :
- Filtrez sur Copier / coller.
- Dans l'export JSON, lisez
group(Copy ou Paste) pour chaque ligne ; ouvrez la ligne pour voir leclipboardDataIddans le payload. - Associez un Copy et un Paste qui partagent le même
clipboardDataId: la première application est la source, la seconde la destination (kacos2000). - Si une ligne de type 10 existe pour le même élément, vous avez aussi le contenu.
C'est ainsi que « l'utilisateur a copié un chemin depuis Notepad et l'a collé dans une console » devient une séquence que l'on montre au lieu de la déduire.
Ce que les lignes du presse-papiers peuvent révéler
Dans les dossiers réels, le presse-papiers contient souvent ce que les utilisateurs ne tapent pas deux fois :
| Contenu | Pourquoi c'est important |
|---|---|
Commandes (net use, rclone, one-liners PowerShell) | Intention et outillage, souvent avec les arguments |
| Chemins UNC et URL | Cibles : partages, sites de dépôt, panneaux C2 |
| Noms d'utilisateur et mots de passe | Manipulation d'identifiants ; aussi une donnée sensible pour votre rapport |
| Fragments de documents | Quelles données étaient déplacées |
Traitez-les comme des éléments sensibles : masquez les identifiants dans les rapports et restreignez l'accès à l'export.
Triage du presse-papiers en cinq minutes
Une routine qui fonctionne sur n'importe quelle collecte, que vous attendiez des données de presse-papiers ou non :
- Chargez la base de chaque utilisateur avec son WAL dans le Windows Timeline Parser et lisez le compteur Presse-papiers. Zéro est aussi une réponse : notez-le.
- Filtrez sur Presse-papiers. Pour chaque ligne, notez l'application source, l'heure UTC et le texte décodé. Vérifiez le marqueur Uniquement dans le WAL : les lignes du presse-papiers vivent peu de temps, et les plus récentes ne sont souvent que dans le WAL.
- Filtrez sur Copier / coller et alignez les événements autour de chaque ligne de presse-papiers. Une copie dans Notepad suivie, quelques secondes plus tard, d'un collage dans une console mérite une phrase dans le rapport.
- Cherchez dans le texte décodé des hôtes, partages, URL et noms de compte, puis pivotez : les mêmes chaînes peuvent apparaître dans les journaux d'événements, l'historique du navigateur ou les applications de messagerie.
- Récupérez la ruche utilisateur et notez
EnableClipboardHistory, pour que le rapport explique pourquoi des données de presse-papiers existent (ou non) sur cette machine.
Limites
- Rare. Dépend des paramètres, et la durée de vie de 12 heures laisse une fenêtre courte.
- Texte uniquement dans les observations publiées à ce jour.
- Lignes supprimées. kacos2000 note que de nombreuses entrées de type 10 expirées peuvent être récupérées, même des mois plus tard, et propose des outils de carving pour cela (kacos2000/WindowsTimeline). Le parseur de ce site n'affiche que les lignes actives (reportées et WAL).
- Autres sources. Les données du presse-papiers peuvent aussi résider en mémoire ; voir inversecos sur l'analyse du presse-papiers en mémoire (inversecos) et le parseur de RAM. Velociraptor propose un artefact
Windows.Forensics.Clipboarddans son exchange (Velociraptor).
FAQ
ActivitiesCache.db contient-il toujours l'historique du presse-papiers ?
Non. Le contenu du presse-papiers (type d'activité 10) n'a été observé que lorsque l'historique du presse-papiers et la synchronisation entre appareils étaient tous deux activés, et ces entrées expirent au bout de 12 heures. La plupart des bases n'en contiennent aucune.
Comment le texte du presse-papiers est-il stocké dans ActivitiesCache.db ?
Dans la colonne ClipboardPayload, sous forme de tableau JSON dont le champ content contient le texte encodé en Base64. Décoder le Base64 donne le texte copié.
Peut-on récupérer des entrées du presse-papiers supprimées ?
Parfois. kacos2000 indique récupérer des entrées expirées dans la base et son WAL avec un outil de carving. Les parseurs standard n'affichent que les lignes actives.