Recientemente, un grupo de proyecto Evil32 anunció que han encontrado colisiones para todas las claves OpenPGP de los servidores de claves públicos ( enlace ).
¿A qué se refiere el término colisión?
Recientemente, un grupo de proyecto Evil32 anunció que han encontrado colisiones para todas las claves OpenPGP de los servidores de claves públicos ( enlace ).
¿A qué se refiere el término colisión?
Se están refiriendo a ID de claves cortas, que se consideran vulnerables a los ataques de colisión desde hace bastante tiempo. El problema ya está referenciado en RFC 4880, OpenPGP, 3.3. ID de clave :
Una ID de clave es un escalar de ocho octetos que identifica una clave. Las implementaciones NO DEBEN suponer que las ID de clave son únicas.
Cada clave OpenPGP tiene una huella digital adjunta, calculada principalmente a partir de su paquete de claves públicas que también contiene el tiempo de creación. El cálculo se define en RFC 4880, OpenPGP, 12.2. Identificación de claves y huellas digitales .
Hay identificadores de clave cortos y largos, que se parecen a los 32 bits respectivos de la huella digital. Por ejemplo, mirando los ID de mi clave OpenPGP:
fingerprint: 0D69 E11F 12BD BA07 7B37 26AB 4E1F 799A A4FF 2279
long id: 4E1F 799A A4FF 2279
short id: A4FF 2279
Se utilizan las huellas dactilares y las ID de clave, ya que compartir y comparar una clave completa con, por lo general, 1024 a 8096 bits (agregando algunos más para los encabezados como la fecha de creación) es muy impráctico.
Si bien las ID más cortas son más fáciles de compartir y comparar, también aumentan las posibilidades de colisiones. Esto está creciendo exponencialmente con la longitud, en números. Este es el número de ID de clave posibles para cada longitud:
2^32 = 4294967296
2^64 = 18446744073709551616
2^160 = 1461501637330902918203684832716283019655932542976
La probabilidad de colisión es la inversa de los números, dado que existe la posibilidad de generar dos claves diferentes con la misma ID.
Encontrar colisiones para todos los datos clave de OpenPGP disponibles públicamente requiere encontrar colisiones para apenas 4 millones de claves. En realidad, el proyecto se limitó al conjunto sólido (que contiene el conjunto de claves más grande, que están todos vinculados, posiblemente con bordes transitorios), y esto actualmente es contiene alrededor de 55.000 teclas .
Las colisiones de claves aún son posibles para identificaciones de claves largas y huellas digitales, pero es poco probable que sea muy probable. El número de posibles huellas dactilares es incluso mayor que el número posible de UUIDs y, por lo general, se espera que sean únicos. El mismo número de direcciones IPv6 está disponible, techtarget.com tiene algunos ejemplos para obtener una impresión de números tan grandes .
La generación de claves con seguridad razonable lleva algún tiempo, por lo que no es práctico enumerar las claves suficientes para encontrar esos cuatro millones de colisiones. Pero es por eso que ya mencioné el tiempo de generación de clave anterior: con una sola clave, puede crear lotes de diferentes claves OpenPGP desde una sola tecla (digamos, RSA) sin La costosa generación de claves, simplemente iteras con el tiempo. Esto ya fue propuesto por Micah Lee en su Charla sobre "Trolling the Web of Trust" .
Con respecto a la marca de tiempo de UNIX que se almacenará como un número de 32 bits, y suponiendo que SHA-1 como una buena función hash tiene una distribución de valores de resultados casi igual, iterando una clave RSA única con diferentes marcas de tiempo debería bastar para generar todas las ID de claves cortas posibles (en realidad, tendrá que repetir esto para varias claves). Si solo desea generar las claves razonables creadas dentro de un lapso de tiempo razonable (por ejemplo, los últimos años, definitivamente no antes del lanzamiento de PGP y no en el futuro) tendrá que usar algunas claves más, pero generar algunas más teclas aún es factible en un tiempo bastante corto.
Openpgp utiliza identificadores de clave para identificar claves. Una "ID de clave" es una parte del hash de la clave pública. Hay dos tipos, "corto" (32 bits) y "largo" (64 bits).
Para las ID de clave corta es bastante fácil construir una nueva clave que tenga la misma ID de clave corta y los mismos detalles visibles para el usuario como una clave existente. Es una práctica común (mala pero común) identificar las claves por sus identificadores de clave cortos.
Si está construyendo un sistema alrededor de openpgp, debe verificar cuidadosamente que las ID de claves cortas NUNCA se usen como un medio para indicar qué claves son confiables.
Incluso el propio gpg desordenado, al solicitar una clave de un servidor de claves, solicitaría una ID de clave corta (incluso si el usuario especificaba una clave larga). Si utiliza un archivo de "conjunto de claves" como una lista de claves confiables para un propósito determinado, esto hace que sea realmente fácil terminar confiando en una clave generada por un atacante.
Incluso si tiene un gpg actualizado, es casi seguro que es una buena idea realizar operaciones de "recv" y "actualizar" en un llavero donde la presencia de claves no confiables no es un problema, luego inspeccione cuidadosamente antes de copiarlas en un llavero "solo claves de confianza".