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