Se ha publicado la versión OpenSSH 9.2, la implementación de código abierto del cliente y servidor para trabajar con los protocolos SSH 2.0 y SFTP. En esta nueva versión se ha corregido una vulnerabilidad que lleva a una doble liberación de memoria durante la etapa previa a la autenticación. Solo la versión OpenSSH 9.1 es susceptible a esta vulnerabilidad; en versiones anteriores, el problema no se manifiesta.
Para crear las condiciones que manifiestan la vulnerabilidad, es suficiente cambiar el banner del cliente SSH a «SSH-2.0-FuTTYSH_9.1p1» para activar las banderas «SSH_BUG_CURVE25519PAD» y «SSH_OLD_DHGEX», que dependen de la versión del cliente SSH. Tras establecer estas banderas, la memoria para el búfer «options.kex_algorithms» se libera dos veces: al ejecutar la función do_ssh2_kex(), que invoca compat_kex_proposal(), y al ejecutar la función do_authentication2(), que llama en cadena a input_userauth_request(), mm_getpwnamallow(), copy_set_server_options(), assemble_algorithms() y kex_assemble_names().
Se considera poco probable la creación de un exploit funcional para la vulnerabilidad, ya que el proceso de explotación es demasiado complicado: las bibliotecas modernas de gestión de memoria ofrecen protección contra la doble liberación de memoria, y el proceso de pre-autenticación, donde está presente el error, se ejecuta con privilegios reducidos en un entorno sandbox aislado.
Además de la vulnerabilidad mencionada, la nueva versión también ha corregido otros dos problemas de seguridad:
- Un error en el manejo de la configuración «PermitRemoteOpen», que lleva a ignorar el primer argumento si es diferente de los valores «any» y «none». Este problema se manifiesta en versiones posteriores a OpenSSH 8.7 y provoca que se omita la verificación al especificar solo un poder.
- Un atacante que controle el servidor DNS utilizado para la resolución de nombres puede lograr la inserción de caracteres especiales (por ejemplo, «*») en los archivos known_hosts, si la configuración habilita las opciones CanonicalizeHostname y CanonicalizePermittedCNAMEs, y el resolutor del sistema no verifica la validez de las respuestas del servidor DNS. Se considera poco probable llevar a cabo un ataque de este tipo, ya que los nombres devueltos deben cumplir con las condiciones establecidas a través de CanonicalizePermittedCNAMEs.
Otros cambios:
- En ssh_config para ssh se añadió la configuración EnableEscapeCommandline, que controla la habilitación del procesamiento en el lado del cliente de la secuencia de escape «~C», proporcionando una línea de comandos. Por defecto, el procesamiento de «~C» ahora está desactivado para una aislamiento sandbox más estricto, lo que puede potencialmente interrumpir el funcionamiento de sistemas donde «~C» se utiliza para redirigir puertos durante la operación.
- En sshd_config para sshd se añadió la directiva ChannelTimeout para establecer un tiempo de espera de inactividad del canal (los canales que no registren tráfico en el tiempo especificado en la directiva se cerrarán automáticamente). Se pueden establecer diferentes tiempos de espera para las sesiones, X11, agentes y redirección de tráfico.
- En sshd_config para sshd se añadió la directiva UnusedConnectionTimeout, que permite establecer un tiempo de espera para finalizar conexiones de cliente que estén inactivas durante un tiempo determinado sin canales activos.
- En sshd se añadió la opción «-V» para mostrar la versión de manera similar a una opción parecida en el cliente ssh.
- En la salida de «ssh -G» se añadió la línea «Host», que refleja el valor del argumento con el nombre del host.
- En scp y sftp se añadió la opción «-X» para gestionar parámetros del protocolo SFTP, como el tamaño del búfer de copia y el número de solicitudes que esperan ser completadas.
- En ssh-keyscan se permite el escaneo de rangos de direcciones CIDR completos, por ejemplo, «ssh-keyscan 192.168.0.0/24».
Fuente: opennet.ru
