Como o ps sabe ocultar senhas?

22

Testemunha:

$ 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

Como o ps sabia esconder as mysqlsenhas? Posso incorporar isso em meus próprios scripts para ocultar atributos específicos da CLI?

dotancohen
fonte
6
É provavelmente o outro lado e mysqlfaz a mágica, não ps: “clientes MySQL normalmente substituir o argumento de senha de linha de comando com zeros durante a sua seqüência de inicialização.” - Diretrizes do usuário final para Senha de segurança
manatwork
Obrigado, esse é um documento informativo. Vou ver como posso sobrescrever argumentos cli em meus próprios scripts.
dotancohen 29/08
1
@manatwork Eu colocaria isso como uma resposta, porque é exatamente isso que está acontecendo - e é um link útil para questões de segurança relacionadas ao mysql. :)
Drav Sloan
Observe que, embora os argumentos da linha de comando possam ser espionados, as variáveis ​​de ambiente são seguras .
Gilles 'SO- stop be evil'
Para obter muito mais informações sobre isso, consulte unix.stackexchange.com/q/385339/135943
Wildcard

Respostas:

23

psnão oculta a senha. Aplicativos como o mysql sobrescrevem os argumentos listados. Observe que há um pequeno período de tempo (possível de ser estendido por alta carga do sistema), em que os argumentos são visíveis para outros aplicativos até serem sobrescritos. Ocultar o processo para outros usuários pode ajudar. Em geral, é muito melhor passar senhas por arquivos do que por linha de comando.

No presente artigo é descrito para C, como fazer isso. O exemplo a seguir oculta / exclui todos os argumentos da linha de comando:

#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 = ' ';
    }

    // ...
}

Consulte também /programming/724582/hide-arguments-from-ps e /programming/3830823/hiding-secret-from-command-line-parameter-on-unix .

jofel
fonte
Muito bom, obrigado. Não percebi que os argumentos são mutáveis ​​como tais.
dotancohen 29/08
Observe também que nem todos os programas farão isso com senhas.
ash
O link para este artigo está quebrado. Alguém para me explicar o código? (Por que o código funciona, basta definir o \0espaço?) Qualquer link para setproctitle()?
schemacs
Ou a resposta está aqui ?
schemacs
7

O mysql programa substitui a senha na linha de comando com xa esta linha de código :

while (*argument) *argument++= 'x';     // Destroy argument
esquemas
fonte
3
Infelizmente, isso não é tão seguro quanto poderia ser. Você pode dizer quanto tempo a senha é. É melhor substituí-lo por, \0para que você precise de informações extras para encontrar o tamanho da senha (sem UB / SEGFAULT).
Wizzwizz4