Lo que estás pidiendo que hagas es posible pero bastante difícil. En primer lugar, debe comprender algunas ideas, así que aquí vamos.
En primer lugar, los esquemas de firma. Sin duda, ha visto los esquemas de firmas digitales en la web y puede preguntar correctamente, ¿por qué no firma todo el archivo? Bueno, la respuesta es que, al menos en el caso de RSA, te abres a ataques de falsificación de clave única existencial . Es decir, puedo generar firmas válidas para diferentes pares de mensajes simplemente al conocer su clave pública.
La solución a esto es usar resúmenes de mensajes - hashes, en otras palabras. Una función hash criptográficamente segura es una que no solo tiene preimagen, sino también resistencia a la colisión.
Ahora a lo que tú (y la NSA, y todo el inframundo criminal ruso) quieren hacer. Desea pasar un archivo firmado con una firma digital válida utilizando una firma digital que haya encontrado en otro lugar. Bueno. Hay dos cosas que puedes hacer:
- Puede tomar su clave pública, generar un par de firma / mensaje válido, luego tratar de encontrar una imagen previa del hash que realmente funcione. Buena suerte. No hay ataques de pre-imagen ni siquiera en MD5, que yo sepa.
- Puedes intentar encontrar una colisión con el valor hash que usaron, y simplemente agregar la firma al final.
El número 2 es exactamente lo que los autores de malware malicioso - tomaron una firma válida y explotaron una colisión MD5 para hacerla válida.
Con un ejecutable completo que funciona, te oigo decir? ¿Cómo no segfault? Bueno, aguanta un minuto. Ver, las firmas digitales sostienen toda la cadena de certificados desde las CA raíz hasta su código. Confía en las CA raíz porque están en su tienda local. Confías en las cosas que firman porque sus firmas son válidas. Esas "cosas" pueden ser certificados intermedios, que luego pueden firmar otros objetos. Confía en la cadena porque cuando verifica cada firma, todas son firmas válidas que solo pueden hacerse con la clave privada.
Entonces, en lugar de encontrar una colisión con el hash del binario, hazlo con un hash de otro certificado y usa esa colisión para permitirte generar un certificado que puede firmar cualquier cosa y ser válido en la cadena.
Desafortunadamente, desde que la NSA alguien ya hizo esto con MD5, el mundo ha descubierto el problema. Los certificados MD5 son cosa del pasado ahora y SHA1 incluso está en la puesta del sol, pero, solo en caso . Según mis conocimientos, en este momento, nadie sabe cómo generar colisiones SHA256 válidas a pedido.
Por lo tanto, debe a) apuntar a la cadena de certificados, ya que los analizadores de ASN.1 son malos yb) romper SHA256.
Si desea intentar reproducir esto, le recomendaría una copia de Windows XP que aún acepte los certificados MD5 (no deje que se actualice Windows), genere algunos certificados MD5 con openssl y luego intente reproducir el resultado de la llama: )