
Notas de recuperación para el ID de aviso de proxmox: PSA-2026-00043-1 (CVE-2023-54391)
Recuperación de un wiper que se presentó como ransomware, tras un ataque contra infraestructura Proxmox expuesta a internet (PSA-2026-00043-1 / CVE-2023-54391).
El atacante borró los invitados y dejó los sistemas de archivos dañados. Dos vías de recuperación según el tipo de invitado:
Estas son las herramientas y la metodología, generalizadas para que sean útiles a cualquiera en la misma situación. Solo lectura sobre el origen, CC0. No se incluyen datos reales recuperados; la salida de ejemplo usa marcadores de posición.
El disco dañado es ahora tu única copia de lo que queda. No lo repares. Haz una imagen.
blockdev --setro /dev/<source> # 1. solo lectura, inmediatamente
dd if=/dev/<source> of=/safe/disk.img bs=4M conv=noerror,sync # 2. imagen a almacenamiento seguro
# 3. NO ejecutes fsck, montes en rw ni "repares"; eso sobrescribe bloques que un carver necesita
# 4. envuelve cada pasada sobre el origen en scripts/source_guard.sh
# 5. recupera solo desde la imagen, nunca desde el original
Disciplina compartida, carvers separados. Ejecuta cualquiera con -h. Python 3.8+ / bash, sin
paquetes de terceros. source_guard.sh necesita /proc/diskstats de Linux.
| script | vía | qué hace |
|---|---|---|
scripts/source_guard.sh | compartida | Envuelve un comando de recuperación; demuestra que el origen permaneció en solo lectura mediante un diff del contador de escrituras. Falla ante cualquier escritura en el origen. |
scripts/wt_leaf_carve.py | base de datos | Extrae BSON de páginas hoja WiredTiger crudas. Tamaño de página por decodificación, no por ajuste; control positivo obligatorio. |
scripts/bson_frame.py | base de datos | Cuenta/valida documentos BSON según el marco en disco. Archivo completo por defecto; una muestra se marca como PISO. |
scripts/fs_carve_classify.py | sistema de archivos | Clasifica fragmentos de archivos extraídos por contenido, no por nombre; escribe un manifiesto por archivo; escaneo exhaustivo de secretos. |
scripts/sensitivity_scan.py | compartida | Clasifica los datos recuperados en ROJO/ÁMBAR/VERDE por exposición de credenciales/PII. Imprime conteos, nunca valores. |
scripts/integrity_verify.py | compartida | Demuestra que una copia reorganizada es fiel al origen. Clave por contenido (sobrevive renombrados); lee columnas OK/FAILED, no códigos de salida. |
scripts/make_demo.py | — | Genera fixtures BSON sintéticos (sin datos reales) para ejercitar el kit de herramientas. |
python3 scripts/make_demo.py
python3 scripts/bson_frame.py --total demo/*.bson
python3 scripts/sensitivity_scan.py demo/*.bson
python3 scripts/integrity_verify.py --compare demo/source demo/copy
Se ejecutó en este orden. El paso de extracción se ramifica según el invitado; los extremos setro/imagen y la verificación por clave de contenido son iguales en ambos casos.
disco dañado ──setro+imagen──► imagen de solo lectura
│
base de datos ─────►│◄────────── sistema de archivos
extraer páginas WT │ extraer archivos
contar documentos │ clasificar por contenido + manifiesto
│
clasificar exposición (ROJO/ÁMBAR/VERDE)
verificar copia (clave por contenido)
│
recuperar
find | sort | xargs sha256sum | sha256sum también hashea rutas y locale. Usa LC_ALL=C, o un manifiesto por archivo.sha256sum -c sale con 0 mientras imprime FAILED. Lee las columnas, no $?.Puntos de partida, no soluciones llave en mano. WiredTiger en producción usa compresión de páginas (snappy/zstd) y codificación de celdas que el carver genérico deja sin implementar. Conecta tu propio decodificador robusto para páginas comprimidas. Contrasta cada número contra un control positivo y un segundo instrumento diferente: dos herramientas que comparten una suposición coinciden por la suposición, no porque sea correcta; leer los bytes es lo que detecta eso.
Si tus datos no son los mismos (otra base de datos, app o sistema de archivos), la metodología sigue siendo válida: pon el origen en solo lectura, haz una imagen, extrae desde la copia, haz control positivo antes de creer en un cero, cuenta todo, verifica por contenido. Cambia el carver; mantén la disciplina.
Refuerza la causa raíz: la interfaz web de Proxmox en :8006 no debería ser accesible desde
internet. Sigue los avisos de seguridad oficiales de Proxmox:
https://forum.proxmox.com/threads/proxmox-virtual-environment-security-advisories.149331/
Un informe más amigable con el consejo general del autor sobre recuperación y refuerzo: https://claude.ai/code/artifact/621495ce-4972-405a-ad90-f7703f7dc2f1
CC0 / dominio público. Ver LICENSE.