Saltar al contenido
Nuevo

DeepSeek V4.1 Flash gratis por 7 días: 10M tokens al día tras cualquier recarga. Hasta el 30/11.

Cómo funciona

Hashes de archivos en DFIR y la ética de subir archivos a VirusTotal

Cómo los hashes identifican archivos, por qué SHA-256 reemplazó a MD5, cómo NSRL filtra software conocido y por qué subirlo a VirusTotal lo comparte.

Principiante10 min de lecturaPor NotHoly

Qué es un hash

Una función hash criptográfica recibe una entrada de cualquier tamaño y devuelve un valor de longitud fija llamado digest. SHA-256 siempre devuelve 256 bits, que se leen como 64 caracteres hexadecimales. La misma entrada siempre produce el mismo digest. Si cambias un solo carácter, el digest cambia por completo. El NIST define el Secure Hash Standard en la FIPS 180-4, que cubre SHA-256 y los demás algoritmos SHA, y dice que los digests sirven para detectar si un mensaje fue modificado.

Para un analista, la idea útil es simple. Un digest es una etiqueta corta y repetible para una secuencia exacta de bytes. Dos personas que calculan el hash del mismo archivo en máquinas distintas deben obtener el mismo digest. Por eso los hashes aparecen en informes de incidentes, feeds de inteligencia de amenazas y páginas de descarga de software.

Un hash identifica bytes, no un nombre. Un archivo llamado factura.pdf y otro llamado setup.exe tienen el mismo digest si sus bytes son idénticos. Renombrar un archivo no cambia su digest. El nombre dice cómo alguien llamó al archivo. El digest dice qué bytes tienes realmente.

Por qué SHA-256 reemplazó a MD5 para identificar archivos

MD5 produce un digest de 128 bits y durante años se usó mucho como checksum. Después, investigadores demostraron que MD5 es vulnerable a ataques de colisión: alguien puede construir dos entradas distintas que producen el mismo digest MD5. SHA-1 tiene un problema parecido con otra construcción.

Para un archivo que descargaste tú mismo, una colisión accidental es muy improbable. La preocupación es la colisión deliberada. Un atacante que logra fabricar un segundo archivo con el mismo digest puede cambiarlo por el archivo que ya confías, y el digest en tus registros seguirá coincidiendo. Cuando las colisiones son prácticas, que un digest coincida ya no prueba que dos archivos son el mismo, y esa prueba es justamente lo que necesitas de un hash.

La regla de trabajo es directa. Usa SHA-256 para identificar archivos, para registros de evidencia y para todo lo que quizá tengas que defender después. Seguirás encontrando MD5 y SHA-1 en feeds antiguos, herramientas viejas e informes anteriores. Trata esos valores como claves de búsqueda, no como prueba de que dos archivos coinciden.

Conjuntos de hashes: filtrar lo que ya conoces

Un investigador no lee todos los archivos de un disco. La primera pregunta útil es cuáles archivos ya son conocidos. La National Software Reference Library (NSRL), mantenida por el NIST, reúne software y crea perfiles de archivos que van a un Reference Data Set (RDS). El RDS es una colección de firmas digitales de aplicaciones de software conocidas y rastreables. Incluye hashes de software legítimo y también de algunas aplicaciones que pueden ser maliciosas, como herramientas de esteganografía y scripts de intrusión. Los investigadores lo usan para comparar archivos de computadoras incautadas con perfiles conocidos y separar el software de rutina de los archivos que podrían importar.

Los conjuntos de hashes son un filtro y responden a una pregunta estrecha: ¿este archivo exacto está en el conjunto? Un archivo que no está en el conjunto puede ser una herramienta propia, un documento o malware. Un archivo que sí está en el conjunto es un archivo conocido, y eso no es lo mismo que un archivo seguro. Un conjunto creado con una versión de un programa no coincidirá con otra versión del mismo programa.

Puedes armar una versión pequeña de esa misma idea para tu entorno. Calcula el hash de los archivos que trae una imagen limpia de laptop, guarda la lista con la versión y la fecha, y compara los equipos nuevos contra ella. Lo que no coincida merece una segunda revisión. Esa comparación no prueba nada por sí sola, pero reduce el trabajo a los archivos que son distintos.

Un hash coincidente no dice nada sobre un archivo modificado

La comparación de hashes es exacta. Si cambia un solo byte, el digest cambia. Eso deja tres reglas para recordar.

Cuando un digest coincide con un valor conocido como bueno, los bytes son idénticos al archivo de ese conjunto. Es una evidencia fuerte sobre los bytes. No dice qué hace el programa al ejecutarse, y los mismos bytes pueden comportarse de otra forma con otra configuración o con otras entradas.

Cuando un archivo fue modificado, su digest no coincide, aunque el cambio sea trivial. Un instalador recompilado, un binario parcheado, un valor de configuración cambiado o un archivo de texto guardado con otros finales de línea producen un digest nuevo. La diferencia muestra que los bytes son distintos. No muestra si el cambio es dañino o inofensivo. Para decidirlo necesitas otro método.

Cuando un digest coincide con un valor conocido como malicioso, sabes que ese archivo exacto ya se vio antes. Una variante nueva es otro archivo con otro digest, así que una lista de hashes maliciosos no la detecta. Una búsqueda sin resultados para una muestra nueva tampoco es un veredicto sobre ella.

Además, un mismo programa puede tener digests distintos entre versiones. El Bloc de notas de Windows es un buen ejemplo: su digest puede cambiar de una compilación de Windows a otra. Un hash sin la versión al lado dice muy poco, así que registra la versión cada vez que registres un digest.

Buscar un hash frente a subir el archivo

VirusTotal permite buscar un archivo por su hash. Pegas un SHA-256, MD5 o SHA-1 en el cuadro de búsqueda y el sitio muestra una página para cualquier archivo que ya conozca con ese digest. Una búsqueda por hash envía el digest al servicio. No envía el archivo.

Subir es otra acción. La documentación de VirusTotal dice que cualquier usuario puede seleccionar un archivo de su computadora y enviarlo a VirusTotal. También dice que los informes de análisis se comparten con la comunidad pública de VirusTotal, que el contenido de los archivos enviados puede compartirse con clientes premium de VirusTotal y que los resultados básicos se comparten con quien envió el archivo y entre los socios que lo examinan.

Subir un archivo es una decisión de publicación. Una vez que el archivo sale de tu máquina, no puedes recuperarlo y no controlas quién lo recibe. En el caso de una muestra de malware público, compartirla puede ayudar a otros defensores. En el caso de un archivo con datos de un cliente, un contrato sin firmar, código fuente de un cliente, una base de contraseñas o registros personales, compartirlo puede romper un contrato, violar la ley de protección de datos y exponer a alguien que nunca lo aceptó.

La regla para el trabajo de campo es corta. Nunca subas archivos confidenciales o de clientes a VirusTotal ni a ningún otro escáner público. Revisa la política de tu empleador o de tu cliente antes de enviar cualquier muestra a cualquier lugar. Si solo necesitas un digest, busca el digest. Si necesitas un veredicto sobre una muestra que no puedes compartir, usa una herramienta que controles, como un sandbox local o un servicio interno que tu organización haya aprobado.

Una búsqueda por hash también tiene consecuencias. El servicio recibe el digest, y el digest de un archivo de un cliente puede revelar lo que estás buscando. Revisa también la política para las búsquedas por hash, sobre todo en un caso activo.

Laboratorio práctico: calcula el hash de tus propios archivos

Necesitas una computadora con terminal. Vas a calcular el hash de programas del sistema y de un archivo que crees tú, y después vas a buscar un digest conocido e inofensivo en VirusTotal. No vas a subir nada. Usa solo archivos de tu propia máquina.

Paso 1: calcula el hash de un programa del sistema

En Linux, ejecuta:

bash
sha256sum /bin/ls

En macOS, ejecuta:

bash
shasum -a 256 /bin/ls

En Windows, abre PowerShell y ejecuta:

powershell
Get-FileHash C:\Windows\System32\notepad.exe -Algorithm SHA256

En Windows con Git Bash, también puedes hacer la misma comprobación desde la terminal:

bash
sha256sum /c/Windows/System32/notepad.exe

En la máquina donde probamos este artículo, Windows 11 con Git Bash, estos fueron los resultados observados:

text
$ sha256sum /bin/ls
b45981580702029cfeeffc8ca69e2a4d1e9c68914009e94c31ffec9cbc544aa5 */bin/ls
text
Algorithm : SHA256
Hash      : 468FFE129C395ABF6B21A09EFDF261910A95FB98AA982EAD73CAA7B2B684577E
Path      : C:\Windows\System32\notepad.exe
text
$ sha256sum /c/Windows/System32/notepad.exe
468ffe129c395abf6b21a09efdf261910a95fb98aa982ead73caa7b2b684577e */c/Windows/System32/notepad.exe

El digest de ls viene de la copia de ls que trae Git Bash, así que no coincidirá con el ls de tu Linux o macOS. El digest de Notepad es el mismo en ambos shells, porque la única diferencia es la capitalización de las letras hexadecimales. Compara los digests sin distinguir mayúsculas de minúsculas. En la misma máquina, Notepad también reportó la versión de archivo 10.0.26100.9949 y un tamaño de 360448 bytes. Anótalos junto al digest, porque otra compilación de Windows puede producir otro digest para el mismo nombre de programa.

Paso 2: observa cómo un carácter cambia el digest

Ejecuta esto en Git Bash o en cualquier shell POSIX:

bash
echo 'lab' > a.txt && sha256sum a.txt && echo 'lab.' > a.txt && sha256sum a.txt

La salida observada fue:

text
b76025a9ca630b026d630d59a18cf414f5724d2bbf5dc4b11dd165c9c1ea8e01 *a.txt
d233123b7c71a1b7234066f700e03452959ce5bb0b4802f0cbd2c2437004a879 *a.txt

El único cambio fue un punto. Los dos digests tienen 64 caracteres y no comparten ningún patrón visible. El comando echo además agrega un salto de línea, así que el primer archivo contiene lab seguido de un salto, y el segundo contiene lab. seguido de un salto. Puedes revisar los bytes exactos con od -c a.txt. Los finales de línea son una causa común de que dos copias del "mismo texto" den digests distintos. Un archivo guardado en Windows con finales CRLF produce un digest diferente al del mismo texto guardado con LF.

Paso 3: busca en VirusTotal un digest conocido e inofensivo

Abre el navegador y ve a https://www.virustotal.com/gui/search/ seguido del SHA-256 de Notepad que calculaste en el paso 1. También puedes pegar el digest en el cuadro de búsqueda del sitio. No arrastres ningún archivo a la página y no hagas clic en ningún control de subida.

En nuestra prueba, la dirección de búsqueda llevó a una página de archivo para ese digest, pero la página mostró primero una verificación reCAPTCHA. No completamos esa verificación, así que los resultados del informe no aparecen en este artículo. Si quieres verlos, completa la verificación por tu cuenta. VirusTotal la pide para frenar el tráfico automatizado, y esa decisión corresponde al sitio, no a nosotros.

Cuando la página cargue, anota cuatro cosas:

  • Los nombres y tipos de archivo que la página lista para ese digest.
  • El número de motores que marcaron el archivo y el total de motores.
  • Las fechas de primera y última detección.
  • Si el digest de la página coincide con el que calculaste en tu máquina.

Después anota lo que la página no dice. Un resultado sin detecciones significa que ningún motor marcó ese digest en ese momento. No prueba que el archivo sea seguro. La página tampoco dice nada sobre tu copia, salvo que los digests coincidan, y no dice qué hace el programa cuando se ejecuta.

Errores comunes

Calcular el hash del archivo equivocado. Una descarga puede copiarse, renombrarse o convertirse antes de que la mires. Calcula el hash del archivo exacto que investigas, registra la ruta y la hora del cálculo, y confirma que cualquier copia tenga el mismo digest que el original.

Tratar MD5 o SHA-1 como prueba. Usa SHA-256 para identificar archivos. Guarda los digests antiguos solo como claves de búsqueda.

Leer un resultado limpio como seguro. Un digest sin detecciones puede ser malware nuevo, malware dirigido o un archivo que ningún motor ha visto todavía. Limpio significa "no marcado", y nada más.

Confiar en el nombre del archivo. Los nombres son fáciles de cambiar. El identificador es el digest, y el nombre es solo una etiqueta.

Subir el archivo para ver qué es. Este es el error que provoca incidentes reales. Una búsqueda por hash responde la pregunta sobre un archivo conocido. Una subida publica el archivo en sí.

Olvidar la versión. Un mismo nombre de programa puede generar muchos digests. Registra la versión y la compilación junto a cada digest, o el digest no significará nada más adelante.

Cómo seguir avanzando

Calcula los digests de todos los archivos de una carpeta y guárdalos en un manifiesto, para detectar cambios después. En Linux o macOS, ejecuta sha256sum * > manifiesto.txt dentro de la carpeta. Guarda el manifiesto junto con la evidencia y vuelve a calcular los digests más tarde para ver qué cambió. El comando es estándar, pero no lo ejecutamos en el laboratorio de este artículo, así que revisa la salida en tu propia máquina.

Lee la FIPS 180-4 para ver las definiciones exactas de los algoritmos SHA y sus tamaños de salida. Lee la página de la NSRL para entender cómo se construye y se usa en la práctica un conjunto de datos de referencia. Lee la documentación de VirusTotal sobre cómo se manejan los envíos antes de usar cualquier escáner público en tu trabajo.

El siguiente paso es escribir lógica de detección contra un archivo que controlas. El artículo Escribe una regla YARA contra un archivo de prueba inofensivo muestra cómo buscar patrones en lugar de digests completos, lo que cubre los casos que un hash exacto no alcanza.

Fuentes

Lectura relacionada: Cifrado, codificación y hash, comparados y el artículo anterior de esta serie, Primer análisis con Ghidra de un binario que compilas tú.

Fuentes

  1. FIPS 180-4, Secure Hash Standard (NIST)
  2. National Software Reference Library (NIST)
  3. How VirusTotal works (VirusTotal documentation)

Más en Malware y forense