Як 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?


6
Це, ймовірно , інший шлях , і mysqlце чарівництво, а НЕ ps: «MySQL клієнти зазвичай перезаписує командного рядка пароля аргумент з нулями під час їх ініціалізації.» - Керівництво для кінцевого користувача Паролювання
manatwork

Дякую, це інформаційний документ. Я побачу, як я можу перезаписати аргументи cli у власних сценаріях.
dotancohen

1
@manatwork Я б поставив це як відповідь, тому що саме так і відбувається - і це корисна посилання для проблем безпеки щодо mysql. :)
Drav Sloan

Зауважте, що хоча аргументи командного рядка можна відкладати, змінні середовища є безпечними .
Жил "ТАК - перестань бути злим"

Докладніше про це дивіться на 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 .


Дуже приємно, дякую. Я не усвідомлював, що аргументи як такі змінні.
dotancohen

Також зауважте, що не всі програми будуть робити це за допомогою паролів.
попіл

Посилання на цю статтю порушено. Хто-небудь пояснити код для мене? (Чому код працює, просто встановлений \0пробіл?) Будь-яке посилання на setproctitle()?
схеми

Або відповідь лежить тут ?
схеми

7

Програма mysql замінює пароль з командного рядка xна цей рядок коду :

while (*argument) *argument++= 'x';     // Destroy argument

3
На жаль, це не так безпечно, як могло б бути. Ви можете сказати, як довго триває пароль. Краще замінити його \0таким чином, щоб вам була потрібна додаткова інформація, щоб знайти довжину пароля (без UB / SEGFAULT).
wizzwizz4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.