Как ps узнает, как скрыть пароли?

22

Свидетель:

$ 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

Как ps узнал, как скрыть mysqlпароли? Могу ли я включить это в свои собственные сценарии, чтобы скрыть определенные атрибуты CLI?

dotancohen
источник
6
Вероятно, это другой путь, и он mysqlделает чудо, а не ps: «Клиенты MySQL обычно перезаписывают аргумент пароля командной строки нулями во время своей последовательности инициализации». - Руководство для конечного пользователя по безопасности паролей
manatwork
Спасибо, это информативный документ. Я посмотрю о том, как я могу перезаписать аргументы cli в моих собственных скриптах.
dotancohen
1
@manatwork Я бы назвал это ответом, потому что это именно то, что происходит - и это полезная ссылка для вопросов безопасности, касающихся mysql. :)
Драв Слоан
Обратите внимание, что хотя аргументы командной строки можно отслеживать, переменные среды безопасны .
Жиль "ТАК - перестать быть злым"
Для получения дополнительной информации об этом см. Unix.stackexchange.com/q/385339/135943
Wildcard

Ответы:

23

psне скрывает пароль. Приложения, такие как mysql, переписывают список аргументов, которые они получили. Обратите внимание, что существует небольшой период времени (который может быть увеличен при высокой загрузке системы), когда аргументы видны другим приложениям, пока они не будут перезаписаны. Сокрытие процесса для других пользователей может помочь. В целом, гораздо лучше передавать пароли через файлы, чем из командной строки.

В этой статье описано для C, как это сделать. В следующем примере скрываются / удаляются все аргументы командной строки:

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

    // ...
}

Посмотрите также на /programming/724582/hide-arguments-from-ps и /programming/3830823/hiding-secret-from-command-line-parameter-on-unix ,

jofel
источник
Очень мило спасибо. Я не осознавал, что аргументы изменчивы как таковые.
dotancohen
Также обратите внимание, что не все программы будут делать это с паролями.
пепел
Ссылка на эту статью не работает. Кто-нибудь может объяснить код для меня? (Почему код работает, просто установите \0пробел?) Есть какая-нибудь ссылка на setproctitle()?
schemacs
Или ответ лежит здесь ?
schemacs
7

Программа mysql заменяет пароль из командной строки xна следующую строку кода :

while (*argument) *argument++= 'x';     // Destroy argument
schemacs
источник
3
К сожалению, это не так безопасно, как могло бы быть. Вы можете сказать, как долго пароль. Лучше заменить его \0так, чтобы вам понадобилась дополнительная информация для определения длины пароля (без UB / SEGFAULT).
wizzwizz4