Estoy ejecutando un demonio de software que requiere que ciertas acciones ingresen una frase de contraseña para desbloquear algunas características que se ven así, por ejemplo:
$ darkcoind masternode start <mypassphrase>
Ahora tengo algunas preocupaciones de seguridad en mi servidor Debian sin cabeza.
Cada vez que busco en mi historial de bash, por ejemplo Ctrl+R
, puedo ver esta contraseña súper segura. Ahora imagino que mi servidor está comprometido y algún intruso tiene acceso a shell y simplemente puede Ctrl+R
encontrar mi frase de contraseña en el historial.
¿Hay una manera de introducir la contraseña sin que se muestre en la historia bash, ps
, /proc
o en otro sitio?
Actualización 1 : Pasar ninguna contraseña al demonio arroja un error. Esta no es una opción.
Actualización 2 : No me digas que elimine el software u otras sugerencias útiles como colgar a los desarrolladores. Sé que este no es un ejemplo de mejores prácticas, pero este software está basado en bitcoin y todos los clientes basados en bitcoin son algún tipo de servidor json rpc que escucha estos comandos y es un problema de seguridad conocido que aún se está discutiendo ( a , b , c ) .
Actualización 3 : el demonio ya está iniciado y ejecutándose con el comando
$ darkcoind -daemon
Hacer ps
muestra solo el comando de inicio.
$ ps aux | grep darkcoin
user 12337 0.0 0.0 10916 1084 pts/4 S+ 09:19 0:00 grep darkcoin
user 21626 0.6 0.3 1849716 130292 ? SLl May02 6:48 darkcoind -daemon
Por lo que pasa a los comandos con la frase de contraseña no aparece en ps
o /proc
en absoluto.
$ darkcoind masternode start <mypassphrase>
$ ps aux | grep darkcoin
user 12929 0.0 0.0 10916 1088 pts/4 S+ 09:23 0:00 grep darkcoin
user 21626 0.6 0.3 1849716 130292 ? SLl May02 6:49 darkcoind -daemon
Esto deja la pregunta ¿dónde aparece la historia? Sólo .bash_history
?
fuente
Respuestas:
Realmente, esto debería solucionarse en la aplicación misma. Y tales aplicaciones deben ser de código abierto, por lo que solucionar el problema en la aplicación en sí debería ser una opción. Una aplicación relacionada con la seguridad que comete este tipo de error también podría cometer otros errores, por lo que no confiaría en ella.
Intercalador simple
Pero pedías una forma diferente, así que aquí hay una:
Compila esto con
luego ejecuta tu proceso con
La biblioteca de interposición ejecutará este código antes de que se ejecute la
main
función de su aplicación. Reemplazará el último argumento de la línea de comando por la contraseña real en la llamada a main. Sin embargo, la línea de comando impresa/proc/*/cmdline
(y, por lo tanto, vista por herramientas comops
) todavía contendrá el argumento falso. Obviamente, tendría que hacer que el código fuente y la biblioteca que compila de él sean legibles solo para usted, por lo que es mejor operar en unchmod 0700
directorio. Y dado que la contraseña no es parte de la invocación del comando, su historial de bash también está seguro.Intercalador más avanzado
Si desea hacer algo más elaborado, debe tener en cuenta que
__libc_start_main
se ejecuta antes de que la biblioteca de tiempo de ejecución se haya inicializado correctamente. Por lo tanto, sugeriría evitar cualquier llamada a funciones a menos que sean absolutamente esenciales. Si desea poder llamar funciones al contenido de su corazón, asegúrese de hacerlo justo antes de quemain
se invoque, después de que se haya realizado toda la inicialización. Para el siguiente ejemplo, tengo que agradecer a Grubermensch que señaló cómo ocultar una contraseña pasada como argumento de línea de comando quegetpass
me llamó la atención.Esto solicita la contraseña, por lo que ya no tendrá que mantener en secreto la biblioteca de interposición. El argumento del marcador de posición se reutiliza como solicitud de contraseña, así que invoque esto como
Otra alternativa sería leer la contraseña de un descriptor de archivo (como, por ejemplo,
gpg --passphrase-fd
does), o dex11-ssh-askpass
, o lo que sea.fuente
strings
vulnerabilidad. Ver SO: Ocultar entrada de contraseña en el terminal .__libc_start_main
.No es solo la historia. También se mostrará en la salida ps .
Quien escribió esa pieza de software debe ser colgado, dibujado y descuartizado. Es un NO absoluto tener que proporcionar una contraseña en la línea de comandos independientemente del software que sea.
Para un proceso de demonio es aún MÁS imperdonable ...
Además de rm -f en el software en sí, no conozco ninguna solución para esto. Honestamente: encuentre otro software para hacer el trabajo. No uses tanta basura.
fuente
rm -f
ahora.ps
. Entonces, hasta que el desarrollador pueda arreglar eso, sugiere usar otra cosa.ps
, por lo que no es mejor que larm
solución.Esto borrará la
ps
salida.Tenga mucho cuidado : esto podría romper la aplicación. Estás debidamente advertido de que aquí hay dragones.
Ahora se le notifica debidamente de estas advertencias nefastas. Esto borrará la salida que se muestra en
ps
. No borrará su historial, ni borrará el historial de trabajo bash (como ejecutar el proceso comomyprocess myargs &
). Perops
ya no mostrará los argumentos.Invoque el programa guardándolo
chmod +x
. Luego,./whatever <pidoftarget>
si esto funciona, no producirá salida. Si falla, se quejará de algo y renunciará.fuente
gdb
puede modificar la memoria de los procesos en ejecución (con mucha más precisión quirúrgica que esta podría agregar).¿Puede pasar el argumento desde un archivo, accesible solo por root o por el usuario requerido?
Es un ENORME no-no escribir contraseñas en la consola, pero el último recurso ... comience su línea con un espacio para que no aparezca en el historial.
fuente
export HISTCONTROL=ignoreboth
ignora tanto los duplicados como las líneas con un espacio inicial para ingresar al historial. Agréguelo a su .bashrc o .bash_profile.Quizás esto funciona (?):
fuente
darkcoind masternode start `head -1`
, si desea ingresar la contraseña manualmente.ps
utilidades similares..bash_history
a una contraseña de texto sin formato le permite ganarpassword.txt
¿qué, exactamente?Desafortunadamente, si su
darkcoind
comando espera la contraseña como un argumento de línea de comando, se expondrá a través de utilidades comops
. La única solución real es educar a los desarrolladores .Si bien la
ps
exposición puede ser inevitable, al menos podría evitar que la contraseña se escriba en el archivo del historial del shell.El archivo de historial solo debe registrar
xargs darkcoind masternode start
, no la contraseña.fuente
ignorespace
en$HISTCONTROL
, y luego se puede evitar que cualquier comando de entrar en la historia cáscara anteponiendo el comando con un espacio.Como han dicho otros, busque en su control de historial de shell para ocultar la información del historial.
Pero una cosa que nadie parece haber sugerido todavía es montar
/proc
con elhidepid
parámetro. Intente modificar su/proc
línea/etc/fstab
para incluirhidepid
, de esta manera:fuente
Puede mantener la contraseña fuera del historial de su shell ejecutando el comando desde un nuevo proceso de shell, que luego termina inmediatamente. Por ejemplo:
Asegúrese de que
sh
esté configurado para no guardar su historial en un archivo.Por supuesto, esto no soluciona los otros problemas, como que la contraseña esté visible en
ps
. Creo que hay formas en que eldarkcoind
programa en sí mismo puede ocultar la informaciónps
, pero eso solo acorta la ventana de vulnerabilidad.fuente
ps
utilidades similares.Para Bitcoin, la respuesta oficial del desarrollador es usar el contenedor de python proporcionado en
contrib/bitrpc/bitrpc.py
( github ):y:
Fuente: # 2318
Desbloquear billetera:
Cambiar frase de contraseña:
https://github.com/bitcoin/bitcoin/tree/master/contrib/bitrpc
Para darkcoin funciona un diálogo:
https://github.com/darkcoin/darkcoin/tree/master/contrib/bitrpc
fuente