Un bug en la librería OpenSSL permite factorizar una clave RSA 1024 bits en 20 minutos

La semana pasada se celebró uno de los congresos más importantes en España de seguridad informática, la conocida Navaja Negra 2014. En esta conferencia, uno de los miembros de la organización presentó una herramienta que permite explotar una vulnerabilidad en RSA de 1024 bits de longitud de clave en la librería OpenSSL. Con esta herramienta se puede atacar por fuerza bruta la clave RSA en unos 20 minutos con la potencia de un ordenador portátil.

La herramienta explota un fallo en la implementación de RSA en OpenSSL, este fallo se encuentra actualmente en todas las versiones y se realiza a través de fuerza bruta. Cuando OpenSSL genera una clave de RSA utiliza la función rsa_builtin_keygen que se encuentra dentro de /crypto/rsa/rsa_gen.c


static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
{
BIGNUM *r0=NULL,*r1=NULL,*r2=NULL,*r3=NULL,*tmp;
BIGNUM local_r0,local_d,local_p;
BIGNUM *pr0,*d,*p;
int bitsp,bitsq,ok= -1,n=0;
BN_CTX *ctx=NULL;

ctx=BN_CTX_new();
if (ctx == NULL) goto err;
BN_CTX_start(ctx);
r0 = BN_CTX_get(ctx);
r1 = BN_CTX_get(ctx);
r2 = BN_CTX_get(ctx);
r3 = BN_CTX_get(ctx);
if (r3 == NULL) goto err;

bitsp=(bits+1)/2;
bitsq=bits-bitsp;

En la parte final se puede ver que para una clave de 1024 bits, se divide por 2 la longitud de la clave por lo que tendremos dos claves, una de 512,5 bits y otra 511,5 bits. Para un ataque a una clave de 1024 bits deberemos atacar una de 512 bits. En otras implementaciones como GNUPG se han dado cuenta de este error y en su librería sí está corregido este fallo.

La herramienta se llamada RSAhack y se puede descargar el programa Python desde GitHub de forma gratuita. En el siguiente vídeo se puede ver una demostración de su funcionamiento:

Os recomendamos visitar la página web oficial del autor de esta herramienta.

Actualización:

Parece ser que el autor cometió un error y la vulnerabilidad de RSA en OpenSSL no existe, de hecho se ha eliminado la entrada.