OpenSSH, es una
popular suite de utilidades criptográficas que permiten establecer una
comunicación cifrada entre cliente y servidor.
Prácticamente omnipresente en el ámbito UNIX, OpenSSH fue escrita como
parte del proyecto OpenBSD a partir de un fork de SSH; posee una licencia de
código BSD.
El problema se ha
hallado en la función userauth_pubkey. Como podemos ver en el código original:
authctx es una
estructura que contiene información del contexto de autenticación, entre los
valores que la componen, valid es un entero. Cómo podemos observar de los
comentarios anexos, si posee un 0 el usuario no existe (lo contrario, existe y
se le permite hacer login):
Tal y como comenta el
reporte original, si el usuario no es válido la función vuelve (línea 100 de la
primera captura) y el servidor enviaría un mensaje al cliente,
SSH2_MSG_USERAUTH_FAILURE, indicando este error. Sin embargo, y siempre que la
petición ssh de autenticación posea un formato erróneo, si el usuario existe,
procede a verificar la petición y al no ser correcta falla en la función sshpkt_get_u8,
con lo que se ejecutaría la función fatal y el servidor cerraría la conexión
con el cliente de inmediato.
Es decir, siempre y cuando el usuario sea
válido y la petición tenga un formato no válido, sabremos por el cierre de la
conexión que el usuario existe en el sistema. Esto nos permite obtener un
método de prueba y error para enumerar los posibles usuarios de un sistema.
Hasta ahora, OpenSSH ha tenido otras
vulnerabilidades relacionadas con este tipo de ataques, del tipo timing, donde
se explota una diferencia en tiempo o cantidad de datos en la respuesta entre
un usuario válido u otro que no exista. Posibilitando, por lo tanto, un método
para derivar la existencia.
Por ejemplo, esta, donde si un usuario existía
en el sistema el servidor ssh respondía con dos segundos aproximados de retraso
frente a la respuesta inmediata si el usuario no existía.
La corrección de este fallo se ha traducido en
postergar la comprobación authctxt->valid que hemos visto después de
comprobar que la petición posee un formato correcto, impidiendo que existan
diferencias tanto si existe o no un usuario concreto. Observemos el cambio de
posición del bloque de código afectado:
El fallo afecta, en principio, a todas las
versiones de OpenSSH, aunque ya ha sido parcheado en la versión 7.7
No tardaremos en ver exploits y módulos de
nmap explotando este error, por lo que habrá que estar atentos a los registros
de eventos para comprobar como se comen el espacio en disco a base de
martillear los servidores ssh.
Más información:
Fuente: Hispasec