Análisis forense del portapapeles en ActivitiesCache.db
Cómo guarda Windows el texto del portapapeles en ActivitiesCache.db: tipos 10 y 16, configuración necesaria, caducidad de 12 horas y decodificación Base64.
Resumen. El contenido del portapapeles es el tipo de actividad 10: texto en Base64 en ClipboardPayload, conservado 12 horas. Los eventos de copiar y pegar son el tipo 16, con Group = Copy o Paste y un clipboardDataId que los enlaza. El tipo 10 solo se ha observado con el historial del portapapeles y la sincronización entre dispositivos activados a la vez, así que la mayoría de las bases no lo tienen. Cuando aparece, vale oro: comandos, rutas y a veces credenciales.
La evidencia del portapapeles es poco frecuente en Timeline. Precisamente por eso conviene dominarla: cuando aparece, suele responder a la pregunta a la que el resto del caso solo da vueltas.
Los dos tipos de actividad
| Tipo 10 | Tipo 16 | |
|---|---|---|
| Qué | El contenido del portapapeles | Una operación de copiar o pegar |
| Columna clave | ClipboardPayload (Base64 en JSON) | Group («Copy» / «Paste») |
| Enlace entre ambos | clipboardDataId en Payload | |
| Aplicación | Aplicación de la que procedían los datos | Aplicación de origen / de destino |
| Duración | 12 horas (ExpirationTime - LastModifiedTime = 43.200 s) | Caducidad estándar |
| Fuente | kacos2000, inversecos | kacos2000 |
kacos2000 observó el tipo 10 por primera vez en una compilación Insider de Windows 10 1809 y señaló que solo había visto texto en el portapapeles; las imágenes no se sincronizaban igual en aquel momento (kacos2000).
Cuándo se registra el contenido del portapapeles
inversecos indica dos requisitos para que el portapapeles se registre en ActivitiesCache.db: el historial del portapapeles activado y la sincronización del portapapeles entre dispositivos activada (inversecos). Ninguno está activado por defecto en la mayoría de los entornos, por eso las filas de tipo 10 son poco comunes.
Dónde comprobar la configuración:
| Configuración | Ubicación |
|---|---|
| Historial del portapapeles | NTUSER.DAT\Software\Microsoft\Clipboard\EnableClipboardHistory (1 = activado) (kacos2000) |
| Última limpieza de elementos caducados | NTUSER.DAT\Software\Microsoft\Clipboard\HistoryOldItemsLastCleanupTimestamp (FILETIME) (kacos2000) |
| Directiva de la organización para la sincronización del portapapeles | AllowCrossDeviceClipboard en el CSP de directivas Privacy, Windows 10 1809 y posteriores (Microsoft Learn) |
Lea las colmenas de usuario con el parser del registro. Tenga en cuenta que Microsoft dejó de sincronizar en la nube el historial de actividades de las cuentas Microsoft en 2021 y de las cuentas Entra ID a partir de enero de 2024 (Microsoft Support). Cómo afecta esto a las filas locales del portapapeles en las compilaciones actuales no está documentado; pruébelo con sus propias imágenes en lugar de suponerlo.
Decodificar ClipboardPayload
La columna contiene un array JSON. Cada elemento tiene un content en Base64 y un formatName:
[{"content": "cmNsb25lIGNvcHkgRTpcZXhmaWwgbWVnYTpmaW4tYmFja3VwIC0tdHJhbnNmZXJzIDg=", "formatName": "Text"}]
Al decodificar el Base64 se obtiene el texto. inversecos lo resume así: los datos solo están codificados en Base64 (inversecos). El ejemplo anterior, tomado de la muestra ficticia de este sitio, se decodifica como un comando rclone copy.
Windows Timeline Parser decodifica ClipboardPayload en todas las filas que lo tienen, prueba UTF-8 y después UTF-16LE, elimina los caracteres NUL finales y une varios elementos de texto. El resultado aparece en la tabla, marcado como Portapapeles, se puede buscar con el filtro de texto y se exporta en la columna CSV ClipboardText. La entrada ClipboardPayload del glosario ofrece la versión breve.
El texto controlado por un atacante es peligroso en una hoja de cálculo. La exportación CSV de la herramienta antepone un prefijo a las celdas que empiezan por =, +, - o @ para que una fórmula copiada no se ejecute cuando el analista abra la exportación.
Leer los eventos de copiar y pegar
Las filas de tipo 16 no contienen el texto, pero indican la dirección y la aplicación:
- Filtre por Copiar / pegar.
- En la exportación JSON, lea
group(Copy o Paste) en cada fila; abra la fila para ver elclipboardDataIden el payload. - Empareje un Copy y un Paste con el mismo
clipboardDataId: la primera aplicación es el origen y la segunda el destino (kacos2000). - Si existe una fila de tipo 10 para el mismo elemento, también tiene el contenido.
Así, «el usuario copió una ruta del Bloc de notas y la pegó en una consola» se convierte en una secuencia que se puede mostrar en lugar de deducir.
Qué pueden revelar las filas del portapapeles
En casos reales, el portapapeles suele contener lo que los usuarios no escriben dos veces:
| Contenido | Por qué importa |
|---|---|
Comandos (net use, rclone, one-liners de PowerShell) | Intención y herramientas, a menudo con argumentos |
| Rutas UNC y URL | Objetivos: recursos compartidos, sitios de subida, paneles C2 |
| Nombres de usuario y contraseñas | Manejo de credenciales; también un dato sensible para su informe |
| Fragmentos de documentos | Qué datos se estaban moviendo |
Trátelo como material sensible: oculte las credenciales en los informes y restrinja el acceso a la exportación.
Triaje del portapapeles en cinco minutos
Una rutina que funciona con cualquier adquisición, espere o no datos del portapapeles:
- Cargue la base de cada usuario con su WAL en Windows Timeline Parser y lea el contador Portapapeles. Cero también es una respuesta: anótelo.
- Filtre por Portapapeles. En cada fila, anote la aplicación de origen, la hora UTC y el texto decodificado. Compruebe la marca Solo en el WAL: las filas del portapapeles viven poco, y las más recientes suelen estar solo en el WAL.
- Filtre por Copiar / pegar y alinee los eventos alrededor de cada fila del portapapeles. Una copia en el Bloc de notas seguida, segundos después, de un pegado en una consola merece una frase en el informe.
- Busque en el texto decodificado hosts, recursos compartidos, URL y nombres de cuenta, y pivote: las mismas cadenas pueden aparecer en los registros de eventos, el historial del navegador o las aplicaciones de mensajería.
- Obtenga la colmena del usuario y anote
EnableClipboardHistory, para que el informe explique por qué existen (o no) datos del portapapeles en ese equipo.
Límites
- Poco frecuente. Depende de la configuración, y la duración de 12 horas deja una ventana corta.
- Solo texto en las observaciones publicadas hasta ahora.
- Filas eliminadas. kacos2000 señala que muchas entradas de tipo 10 caducadas pueden recuperarse, incluso meses después, y ofrece herramientas de carving para ello (kacos2000/WindowsTimeline). El parser de este sitio solo muestra filas vivas (volcadas y del WAL).
- Otras fuentes. Los datos del portapapeles también pueden estar en memoria; vea el trabajo de inversecos sobre análisis del portapapeles en memoria (inversecos) y el parser de RAM. Velociraptor ofrece un artefacto
Windows.Forensics.Clipboarden su exchange (Velociraptor).
FAQ
¿ActivitiesCache.db contiene siempre el historial del portapapeles?
No. El contenido del portapapeles (tipo de actividad 10) solo se ha observado cuando el historial del portapapeles y la sincronización entre dispositivos estaban ambos activados, y esas entradas caducan a las 12 horas. La mayoría de las bases no tienen ninguna.
¿Cómo se guarda el texto del portapapeles en ActivitiesCache.db?
En la columna ClipboardPayload, como un array JSON cuyo campo content contiene el texto codificado en Base64. Al decodificar el Base64 se obtiene el texto copiado.
¿Se pueden recuperar entradas del portapapeles eliminadas?
A veces. kacos2000 afirma recuperar entradas caducadas de la base y de su WAL con una herramienta de carving. Los parsers estándar solo muestran filas vivas.