🎵 Headhunter — Front 242
En mayo de 2017, unos investigadores de Check Point mostraron un ataque que no necesitaba que la víctima hiciera casi nada. No un correo con adjunto, no un enlace, no un instalador disfrazado. Alcanzaba con que pusieras a reproducir una película y el reproductor cargara los subtítulos. VLC, Kodi, Popcorn Time, Stremio —los cuatro más usados para ver video en casa— tenían fallas en cómo procesaban los archivos de subtítulos, y un .srt fabricado con precisión les entregaba al atacante el control de la máquina. El acto más pasivo del día, el de sentarse a mirar algo, era el vector. Doscientos millones de instalaciones expuestas, según el conteo de entonces.
Lo notable no es la falla puntual —se parchó— sino lo que revela sobre dónde vive de verdad la superficie de ataque. Nadie audita un subtítulo. Es texto. Es lo más inofensivo que hay: unas líneas con marcas de tiempo que le dicen al reproductor cuándo mostrar qué frase. Y justamente por eso funcionó.
Todo lector es un intérprete, y todo intérprete es una máquina.
Un archivo de subtítulos parece una lista de datos, pero el programa que lo lee tiene que hacer cosas con esos datos: parsear tiempos, contar caracteres, elegir posiciones en pantalla, reservar memoria del tamaño que el archivo declara. Ese código que interpreta el formato es un programa dentro del programa. Y acá está el punto que casi nadie internaliza: cuando el formato es lo bastante complejo, el que controla el archivo controla, en parte, qué ejecuta ese intérprete.
Hay un nombre para esto en la disciplina que estudia la seguridad de los lenguajes. Se lo llama weird machine, la máquina rara: dentro de todo parser suficientemente rico hay, sin que nadie lo haya querido, un pequeño autómata programable, y su lenguaje de programación son las entradas malformadas. El desarrollador creyó estar escribiendo un lector de subtítulos. Lo que escribió, sin saberlo, fue una máquina que acepta programas escritos en forma de subtítulos rotos. El exploit no rompe el programa: lo programa, usando la única interfaz que quedó abierta —la de leer el archivo.
Por eso el formato aburrido es el peligroso. Cuanto más rico el formato —más campos, más variantes, más “por compatibilidad aceptamos también esta forma vieja”—, más grande la máquina rara escondida adentro. Los subtítulos parecen simples y no lo son: hay decenas de formatos (.srt, .sub, .ssa, .ass), algunos con estilos, colores, posiciones, fuentes embebidas. Cada rasgo “para que se vea lindo” es código de parseo nuevo, y cada línea de parseo nuevo es superficie. La complejidad del formato es la superficie de ataque, medida casi uno a uno.
El otro filo: el ranking como vector de entrega.
La falla de parseo era la mitad. La otra mitad era cómo lograr que la víctima cargara tu subtítulo y no cualquiera. Y ahí el ataque mostró un ingenio que me interesa más que el desbordamiento de memoria.
Los reproductores descargan subtítulos automáticamente de repositorios como OpenSubtitles, y eligen cuál bajar según un ranking. Los investigadores demostraron que se podía manipular ese ranking —jugar con la reputación, con las métricas de la plataforma— para que el subtítulo malicioso quedara arriba y fuera el que el reproductor elegía solo, sin que el usuario tocara nada. No hay que engañar a la persona para que descargue el archivo malo. Hay que engañar al algoritmo que descarga por ella. En un mundo donde el software elige por uno —qué subtítulo, qué actualización, qué dependencia, qué paquete— comprometer el criterio de elección es más rentable que comprometer a la persona. La víctima nunca decidió mal. La decisión ni siquiera pasó por ella.
Esto rima con algo que ya escribí sobre la carrera de verosimilitud: acá la verosimilitud no la evalúa un humano, la evalúa un ranking, y falsificar un ranking es puro trabajo de métricas. El eslabón débil no fue el ojo del que mira la película. Fue la cadena automática que le sirve el contenido antes de que mire.
La desagregación: el monocultivo de parsers.
Sería fácil leer esto como “cuidado con los subtítulos piratas” y perder el punto entero. El punto no es el subtítulo. Es que el mismo código de parseo está en todas partes, y cuando está en todas partes, una falla no es una falla: es una llave maestra.
La mayoría de los reproductores del mundo —incluidos los que no tienen nada que ver entre sí— procesan audio y video con las mismas bibliotecas de fondo: FFmpeg, libavcodec y compañía. Es software libre, excelente, mantenido por gente que sabe, y está debajo de casi todo lo que reproduce un archivo multimedia en el planeta: reproductores de escritorio, apps de teléfono, servicios de streaming, miniaturas de tu explorador de archivos, el preview de un chat cuando alguien manda un video. Una vulnerabilidad en cómo esa biblioteca parsea un contenedor de video no expone un programa. Expone la capa de parseo compartida de medio ecosistema a la vez.
Es el monocultivo otra vez, en el eje de la superficie de ataque. La ventaja de que todos usen el mismo parser probado es real: un solo lugar bueno que arreglar, un solo lugar donde concentrar la revisión. La desventaja es simétrica y nadie la paga hasta que la paga: un solo lugar que reventar. El atacante que encuentra un bug en la biblioteca compartida no ataca una app; obtiene un exploit que funciona contra la biblioteca donde sea que esté embebida, en programas cuyos autores ni saben que la incluyeron por transitividad. La misma economía que hace eficiente compartir el código hace catastrófica su falla. No es un argumento contra compartir —es un argumento para no descansar en que compartir volvió el problema seguro. La superficie sigue ahí; solo que ahora es una y da a todos lados.
Reformular.
La pregunta ingenua es "¿este archivo es peligroso?", y lleva a la respuesta tranquilizadora de siempre: es un subtítulo, es texto, es una foto, es un PDF, no es un ejecutable, no puede hacer nada. La pregunta que sirve es otra: "¿qué programa va a interpretar esto, cuánta máquina rara hay escondida en su parser, y qué pasa si la entrada está diseñada por alguien que sabe más que el que la escribió?".
Porque no existe el dato inerte cuando hay un intérprete del otro lado. El subtítulo es texto hasta que un parser lo lee, y en ese instante deja de ser texto y pasa a ser el programa que corre en la máquina rara del parser. Reducir la superficie —el hardening del que hablé en la defensa por capas— es, en el fondo, reducir cuántos intérpretes tocan entrada que no se controla y cuánta complejidad se les dio para tragar. Cada formato que se acepta “por comodidad” es una máquina más que alguien puede programar a costa de uno.
Lo más pasivo que hiciste hoy fue mirar algo. Detrás de esa quietud, un programa estuvo interpretando sin parar todo lo que le entró —subtítulos, metadatos, miniaturas, streams— y cada acto de interpretación fue una oferta abierta a que la entrada dijera algo que el autor no previó. El ocio no desconecta de la superficie de ataque. Es donde uno baja la guardia mientras la máquina, atrás, sigue leyendo.
commit w31rdm4ch
Date: 2026-08-12 22:30 PM
there is no inert data when there is an interpreter on the other side