Expandir el inicio de sesión del usuario en la ruta: filtre los valores maliciosos

1

Tengo una función que toma un nombre de ruta y sustituye cada aparición de '% u' con una cadena dada. Para mi escenario, esta Cadena dada es el inicio de sesión que un usuario / atacante ingresa a través de ssh durante la autenticación. La ruta de acceso (incluido el '% u') es fija y el usuario / atacante no puede cambiarla.

Digamos que la ruta de acceso fija es:

/usr/local/etc/ssh/keystore/%u/authorized_keys

Si el usuario / atacante, por ejemplo. ahora está emitiendo el siguiente comando:

ssh [email protected]

La ruta se extenderá a:

/usr/local/etc/ssh/keystore/root/authorized_keys

Si el usuario root ahora está autorizado (será determinado por la membresía del grupo ldap) y tiene un certificado x509 válido, la clave pública del certificado x509 se escribirá en el archivo authorized_keys examinado. Si el usuario no está autorizado, el archivo authorized_keys se truncará.

Un atacante ahora puede truncar todos los archivos authorized_keys existentes en el sistema de archivos debido al hecho de que no se realiza una validación de entrada para el inicio de sesión del usuario dado.

Considere la siguiente conexión ssh:

ssh ../keystore/[email protected]

La ruta se extenderá a:

/usr/local/etc/ssh/keystore/../keystore/foo/authorized_keys

Con una probabilidad bastante alta, el usuario '../keystore/foo' no está autorizado para iniciar sesión en el sistema, lo que lleva al truncamiento del archivo authorized_keys de un posible usuario legal 'foo'.

Aunque durante la próxima conexión de foo, su archivo authorized_keys se actualiza de nuevo, quiero deshacerme de este vector de ataque.

Hasta ahora, dos posibles soluciones vinieron a mi mente:

1. Valide el inicio de sesión del usuario con una expresión regular (enfoque de lista blanca)

Por ejemplo, use el NAME_REGEX predeterminado:

^ [a-z] [- a-z0-9] * \ $

Aún si el sistema no usa la funcionalidad NAME_REGEX, los usuarios se cerrarán de ssh

2. Compruebe si la ruta expandida contiene '..' y falla si es así (enfoque de lista negra)

Esto no cerraría a los usuarios, pero aún no estoy seguro de si esto es suficiente o si existe algún otro patrón que pueda conducir al mismo comportamiento que se mencionó anteriormente

pregunta fliX 16.05.2015 - 14:04
fuente

1 respuesta

1

No hay duda de que el enfoque de lista blanca sigue siendo el mejor (de hecho, incluso agregaría una limitación de tamaño máximo a esta expresión regular, supongo que un inicio de sesión legítimo que cuente con varios cientos de caracteres no debería ser tan frecuente ...) , porque lo protegerá también contra una serie de ataques insospechados y le dará cierto nivel de confianza en que el inicio de sesión que pasa estas pruebas, ya sea válido o no, se formó correctamente y no tendrá la posibilidad de dañar el sistema.

Tener nombres de usuario para cumplir con algún patrón razonable no parece ser un requisito excesivo (¿Alguna vez probó una cuenta como " foo' or '1' ='1 " en algún lugar? ¿O afirmó que realmente necesita un soporte de caracteres unicode o no estándar para su inicio de sesión favorito?).

    
respondido por el WhiteWinterWolf 16.05.2015 - 14:54
fuente

Lea otras preguntas en las etiquetas