Cambio de contraseña en función del tiempo [cerrado]

-5

He creado este script y se ejecuta muy bien, pero quedan preguntas importantes.
¿Es esta secuencia de comandos útil y segura? ¿Tiene algún posible problema o debilidad?

root@010010:/# ls -la /root/screenshot0004.jpg 
-r-x------ 1 root root 494 Aug 14 14:08 /root/screenshot0004.jpg

root@010010:/# cat /root/screenshot0004.jpg
#! /bin/bash
# script runs via cron every 10 minutes
# the "#" stand for any possible letter or number

pw0=$(uname -r)
pw1=$(date +%d%m)
pw2=$(date +%d%m%H%M)
random=$(tr -dc [:digit:] </dev/urandom | head -c2)
random2=$(tr -dc [:alnum:] </dev/urandom | head -c$random)
path="/tmp/.$random2"
echo "user:*##*$pw1*##*" > $path
echo "root:*######*$pw2*######*" >> $path
chmod 0400 $path
# gpg for backup reason
gpg --yes --batch --symmetric --cipher-algo twofish --digest-algo sha512 --passphrase #$pw0# -o /home/user/project.png $path
chpasswd -c SHA512 -s 1000000 < $path
shred -un2 $path

exit 0
    
pregunta Nick 14.08.2015 - 16:32
fuente

1 respuesta

5

Errores en su script

Si crees que este script se ejecuta muy bien, no lo has probado lo suficiente.

Hay una vulnerabilidad clásica en su script: archivo temporal inseguro . Intentó protegerse de él, pero de una manera demasiado complicada, y se disparó en el pie.

random=$(tr -dc [:digit:] </dev/urandom | head -c2)

random se establece en dos dígitos aleatorios. Hay un 1% de probabilidad de que esto devuelva 01 , lo que hace que random2 se establezca en una cadena de longitud 1. Si ejecuta este script cada 10 minutos, esto ocurre aproximadamente una o dos veces al día. (En realidad eso es una subestimación: la vulnerabilidad sigue siendo prácticamente explotable si para 02 (~ 4k archivos) y quizás 03 (~ 240k archivos).) Un usuario local puede crear todos los archivos /tmp/.0 , /tmp/.1 , etc. Cuando el 1% de probabilidad llega, su script escribe en un archivo que es propiedad de ese usuario y luego lee de nuevo. El usuario puede modificar el archivo mientras tanto para colocar su contraseña de root preferida. Esta es una condición de carrera, por lo que un exploit podría no ser 100% confiable, pero solo debería tomar unos días de espera antes de que tenga éxito.

Otra vulnerabilidad que no requiere una condición de carrera además de la posibilidad aleatoria es que el usuario local podría crear un enlace simbólico, lo que les permite truncar un archivo de su elección (su llamada a shred trunca el contenido del archivo , luego elimina el enlace).

También hay un 3% de probabilidad de que random2 sea una cadena vacía: cuando random es 00. In that case, your script runs chmod 0400 / tmp '. Eso va a causar muchas interrupciones.

Lecciones aprendidas

Bueno, lecciones para aprender, en cualquier caso.

  • Errores de captura. Su script asume que todo sucede correctamente y sigue avanzando incluso si solo se golpeó la cabeza contra una pared. Utilice set -e para abortar la secuencia de comandos si se produce un error. (No siempre es suficiente en scripts complejos, pero aquí hubiera sido suficiente).
  • Use las herramientas estándar en lugar de las soluciones caseras. Para crear un archivo temporal, use mktemp .
  • Comprende por qué estás haciendo cosas. La creación de un archivo en /tmp con un nombre aleatorio protege contra archivos temporales inseguros. Pero hacer que la longitud del nombre sea aleatoria no tiene sentido. Es un parámetro de seguridad. Hágalo constante, o hágalo variar según la configuración o el entorno si es un compromiso entre seguridad y usabilidad o rendimiento; en este caso, puede hacer que sea lo suficientemente grande sin ninguna penalización de rendimiento.
  • La mejor manera de proteger los datos es no exponerlos. El uso de un archivo temporal no es útil aquí: podría haber canalizado los datos a chpasswd . Si canaliza los datos, nunca estará en un archivo de disco en primer lugar, por lo que no debe preocuparse por crear el archivo temporal de manera segura y no debe preocuparse por borrarlo después.

Sin ganancia de seguridad

Incluir la fecha actual en una contraseña no tiene sentido. El punto de las contraseñas es ser secreto. Todo el mundo sabe la fecha.

Cambiar una contraseña no hace que sea más difícil de descifrar. El objetivo del atacante es encontrar la contraseña actual, cualquiera que sea. Que la contraseña haya cambiado en el pasado y cambie en el futuro no importa.

Si alguien rompe tu contraseña en un momento dado y ya no funciona más tarde, verán la fecha y se darán cuenta rápidamente de lo que necesitan cambiar.

En lugar de agregar un elemento público a su contraseña, hágalo más largo, con un elemento secreto, generado aleatoriamente . Eso hará que sea más difícil de memorizar, pero solo necesita memorizarlo una vez, y no necesita cambiarlo. Los cambios de contraseña no mejoran la seguridad de una cuenta shell, donde, una vez que el atacante ha tenido acceso, pueden plantar una puerta trasera que no depende de la contraseña. XKCD # 936: Contraseña compleja corta o frase larga del diccionario ? describe un buen método para generar una contraseña segura pero memorable.

Más lecciones

No debe diseñar un sistema de seguridad hasta que mejore en la realización de evaluaciones de seguridad.

  • Intentando mejorar la seguridad agregando un valor público a una contraseña.
  • Ese problema con la longitud del nombre del archivo.
  • Llamar al script screenshot.jpg puede parecer lindo, pero en realidad no tiene ninguna ventaja de seguridad, y la única persona a la que podría perjudicar es a usted, si elimina accidentalmente esa captura de pantalla inútil.
respondido por el Gilles 14.08.2015 - 18:11
fuente

Lea otras preguntas en las etiquetas