¿Cómo sabe ps para ocultar contraseñas?

22

Testigo:

$ ps f
  PID TTY      STAT   TIME COMMAND
31509 pts/3    Ss     0:01 -bash
27266 pts/3    S+     0:00  \_ mysql -uroot -p
25210 pts/10   Ss+    0:00 /bin/bash
24444 pts/4    Ss     0:00 -bash
29111 pts/4    S+     0:00  \_ tmux attach
 4833 pts/5    Ss+    0:00 -bash
 9046 pts/6    Ss     0:00 -bash
17749 pts/6    R+     0:00  \_ ps f
 4748 pts/0    Ss     0:00 -bash
14635 pts/0    T      0:02  \_ mysql -uroot -px xxxxxxxxxxxxxxxx
16210 pts/0    S+     0:01  \_ mysql -uroot -px xxxxxxxxxxxxxxxx

¿Cómo supo ps para ocultar las mysqlcontraseñas? ¿Puedo incorporar esto en mis propios scripts para ocultar atributos particulares de CLI?

dotancohen
fuente
66
Probablemente sea al revés y mysqlno hace la magia ps: "Los clientes MySQL suelen sobrescribir el argumento de la contraseña de la línea de comandos con ceros durante su secuencia de inicialización". - Pautas para el usuario final para la seguridad de la contraseña
manatwork
Gracias, ese es un documento informativo. Veré cómo podría sobrescribir los argumentos cli en mis propios scripts.
dotancohen
1
@manatwork Lo pondría como respuesta, porque eso es exactamente lo que está sucediendo, y es un enlace útil para problemas de seguridad con respecto a mysql. :)
Drav Sloan
Tenga en cuenta que, si bien los argumentos de la línea de comandos se pueden examinar, las variables de entorno son seguras .
Gilles 'SO- deja de ser malvado'
Para obtener más información sobre esto, consulte unix.stackexchange.com/q/385339/135943
Comodín el

Respuestas:

23

psno oculta la contraseña Las aplicaciones como mysql sobrescriben la lista de argumentos que obtuvieron. Tenga en cuenta que hay un pequeño período de tiempo (posiblemente ampliable por una alta carga del sistema), donde los argumentos son visibles para otras aplicaciones hasta que se sobrescriben. Ocultar el proceso a otros usuarios podría ayudar. En general, es mucho mejor pasar contraseñas a través de archivos que por línea de comando.

En este artículo se describe para C, cómo hacer esto. El siguiente ejemplo oculta / elimina todos los argumentos de la línea de comandos:

#include <string.h>

int main(int argc, char **argv)
{
    // process command line arguments....

    // hide command line arguments
    if (argc > 1) {
        char *arg_end;    
        arg_end = argv[argc-1] + strlen (argv[argc-1]);
        *arg_end = ' ';
    }

    // ...
}

Mire también en /programming/724582/hide-arguments-from-ps y /programming/3830823/hiding-secret-from-command-line-parameter-on-unix .

jofel
fuente
Muy bien, gracias. No me di cuenta de que los argumentos son mutables como tales.
dotancohen
También tenga en cuenta que no todos los programas harán esto con contraseñas.
ceniza
El enlace a este artículo está roto. ¿Alguien que me explique el código? (¿Por qué funciona el código, solo se establece \0en el espacio?) ¿Algún enlace setproctitle()?
schemacs
¿O la respuesta está aquí ?
schemacs
7

El MySQL programa reemplaza la contraseña desde la línea de comandos con xen esta línea de código :

while (*argument) *argument++= 'x';     // Destroy argument
esquemas
fuente
3
Desafortunadamente, eso no es tan seguro como podría ser. Puedes saber cuánto dura la contraseña. Es mejor reemplazarlo \0para que necesite información adicional para encontrar la longitud de la contraseña (sin UB / SEGFAULT).
wizzwizz4