Sniff-пароль, введенный при чтении и переданный в качестве аргумента командной строки

Хотя я не совсем вижу, как стандартный поток вывода и поток ошибок могут смешиваться друг с другом между двумя или более не -параллельными командами, вы можете заставить сценарий перенаправлять два потока вывода. туда же одной командой в начале скрипта:

exec 2>&1

Или вы можете запустить скрипт с перенаправлением:

./myscript.sh 2>&1

Лично я бы выбрал второй из этих вариантов, так как он позволит вам легче включать и выключать эту «функцию».

0
23.01.2020, 20:03
1 ответ

Что небезопасно, так этоread(2)(не системный вызов для чтения данных из файла ). Это даже неread(1)(встроенная оболочка для чтения строки со стандартного ввода ). Что небезопасно, так это передача пароля в командной строке.

Когда пользователь вводит что-то, что оболочка читает с помощью read, эта вещь видна терминалу и оболочке. Он не виден другим пользователям. С read -sон не виден плечевым серферам.

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

$ echo 2D7074686973206973207665727920736563726574 | xxd -r -p; echo
-pthis is very secret
$ perl -l -e 'print pack "H*", @ARGV' 2D7074686973206973207665727920736563726574
-pthis is very secret

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

Основная причина, по которой вам не следует передавать секрет в командной строке, заключается в том, что в большинстве систем командная строка также видна другим пользователям. (В некоторых защищенных системах это не так, но обычно это не так по умолчанию. )Любой, кто запустит ps, top, cat /proc/*/cmdlineили любую подобную утилиту в нужное время, сможет увидеть пароль. Программа 7z перезаписывает пароль вскоре после запуска (, как только ей удается сделать внутреннюю копию ), но это только уменьшает окно опасности, но не устраняет уязвимость.

Передача секрета в переменной окружения безопасна. Среда не видна другим пользователям. Но я не думаю, что 7z поддерживает это. Чтобы передать пароль, не делая его видимым через командную строку, вам нужно передать его как ввод, а 7z читает из терминала, а не из стандартного ввода. Вы можете использоватьexpectдля этого (или pexpect , если вы предпочитаете Python TCL, или Expect.pm в Perl, илиexpectв Ruby и т. д. ). Не проверено:

read -s -p "Enter password: " pass
pass=$pass expect \
    -c 'spawn 7z a -p test_file.zip test_file' \
    -c 'expect "assword:" {send $::env(pass)}' \
    -c 'expect eof' -c 'catch wait result'
unset pass
1
03.05.2020, 20:28

Теги

Похожие вопросы