¿Para qué actualizar el código si ya funciona? Trail of Bits arremete contra los programadores perezosos

¿Para qué actualizar el código si ya funciona? Trail of Bits arremete contra los programadores perezosos

Basta un solo error para convertir un sistema protegido en un coladero.

image

Los errores en criptografía rara vez permanecen dentro de un solo proyecto. A veces un detalle «conveniente» en una biblioteca popular desencadena una cadena de vulnerabilidades en cientos o miles de dependencias, y después todo depende de cómo reaccionen los desarrolladores ante el problema.

La empresa Trail of Bits publicó un artículo sobre dos implementaciones populares de AES, la biblioteca de JavaScript «aes-js» y la biblioteca de Python «pyaes». Ambas, en la API para AES-CTR, usan un vector de inicialización por defecto si no se especifica explícitamente. El valor es fijo, por lo que los usuarios tienden a reutilizar la misma pareja de clave y vector de inicialización. Y este es uno de los errores más peligrosos para CTR y varios otros modos. En ese escenario, un atacante con dos textos cifrados puede extraer el XOR de los mensajes originales y, si hay fragmentos de datos predecibles, reconstruir el flujo de cifrado y revelar secretos.

El problema se agrava por la documentación. En los ejemplos con «pyaes» se muestra una llamada a CTR solo con la clave, sin generar un vector de inicialización único, por lo que los desarrolladores que copian el ejemplo prácticamente garantizan reutilizar la misma pareja de clave y vector de inicialización. Según los autores, el efecto podría afectar a miles de proyectos, ya que «aes-js» y «pyaes» se han propagado ampliamente entre dependencias.

Trail of Bits también señala riesgos asociados. En las bibliotecas no hay modos modernos como AES-GCM y AES-GCM-SIV, que ofrecen no solo cifrado sino también control de integridad. Para CTR esto es crítico, ya que el texto cifrado sigue siendo modificable y una sustitución inadvertida de bits conduce a cambios predecibles en el texto claro. Se señalan además posibles fugas por canales laterales debido a tablas de sustitución, así como problemas con la implementación de PKCS7 que, combinada con CBC, puede abrir la vía a un ataque Padding Oracle. Además, «aes-js» no se actualiza desde 2018, «pyaes» desde 2017, y las solicitudes sobre el vector de inicialización fijo, según los autores, no han producido cambios.

En la práctica, el equipo encontró proyectos vulnerables; entre ellos se halló strongMan VPN Manager —una herramienta web para gestionar la infraestructura de strongSwan. En strongMan las claves privadas en formato PKCS8 y los certificados se almacenaban en SQLite y se cifraban con «pyaes» en CTR usando ese mismo vector de inicialización por defecto.

Los autores describen un escenario en el que un atacante que obtiene el archivo de la base puede reconstruir el flujo de cifrado a partir de datos predecibles de los certificados y luego descifrar las claves privadas. Esto abría la puerta a la suplantación de la identidad del titular del certificado y a ataques de intermediario en sesiones VPN ajenas.

Trail of Bits comunicó el hallazgo al equipo de strongSwan de forma privada. Tobias Brunner, mantenedor de strongMan, preparó rápidamente una corrección, creó una rama para la actualización de seguridad, acordó los cambios con los autores del informe y añadió herramientas de migración para que los usuarios pudieran convertir las bases antiguas al nuevo formato.

En la propia aplicación reemplazaron «pyaes» por una biblioteca con modos modernos, pasaron de CTR a GCM-SIV, añadieron verificación de etiquetas de autenticidad y un esquema de derivación de claves a nivel de registros individuales para evitar cualquier repetición. Para strongMan preparan un aviso de seguridad separado con la descripción del riesgo y las medidas adoptadas.