Защита паролем сценария командной строки параметров командной строки - PullRequest
6 голосов
/ 07 июля 2011

Если я использую пароль в качестве параметра командной строки, он общедоступен в системе с помощью ps.

Но если я использую скрипт оболочки bash и выполняю что-то вроде:

...
{ somecommand -p mypassword }
...

это все еще будет отображаться в списке процессов?Или это безопасно?

  • Как насчет подпроцессов: (...)?Небезопасно, верно?
  • копроцесс?

Ответы [ 4 ]

6 голосов
/ 07 июля 2011

Командные строки всегда будут видны (если только через /proc).

Так что единственное реальное решение: не надо.Вы можете поставить его на стандартный ввод или на специальный fd:

./my_secured_process some parameters 3<<< "b@dP2ssword"

с помощью сценария, подобного (сначала простота)

#!/bin/bash
cat 0<&3

(в этом примере будет просто выведен неверный пароль на стандартный вывод)

Теперь все, что вам нужно, это:

  • MITM (поддельные скрипты, которые перебрасывают пароль, например, путем подрыва PATH)
  • история bash, сохраняяпароль в командной строке (смотрите HISTIGNORE для bash, например)
  • безопасность скрипта, содержащего перенаправление пароля
  • безопасность используемого tty;кейлоггеры;... как вы можете видеть, мы опустились до «общих принципов безопасности»
3 голосов
/ 07 июля 2011

Как насчет использования подхода дескриптора файла:

env -i bash --norc   # clean up environment
set +o history
read -s -p "Enter your password: " passwd
exec 3<<<"$passwd"
mycommand <&3  # cat /dev/stdin in mycommand

См .:

Скрытие секрета от параметра командной строки в Unix

3 голосов
/ 07 июля 2011

Вызываемая программа может изменить свою командную строку, просто переписав argv следующим образом:

#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {
    int arglen = argv[argc-1]+strlen(argv[argc-1])+1 - argv[0];
    memset(argv[0], arglen, 0);
    strncpy(argv[0], "secret-program", arglen-1);
    sleep(100);
}

Тестирование:

$ ./a.out mySuperPassword & 
$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
me       20398 18872  0 11:26 pts/3    00:00:00 bash
me       20633 20398  0 11:34 pts/3    00:00:00 secret-program
me       20645 20398  0 11:34 pts/3    00:00:00 ps -f
$

UPD: я знаю, это не совсем безопаснои может вызвать состояние гонки, но многие программы, которые принимают пароль из командной строки, делают этот трюк.

0 голосов
/ 07 июля 2011

Единственный способ избежать отображения в списке процессов - это переопределить всю функциональность программы, которую вы хотите вызвать, в чистых функциях Bash.Вызовы функций не являются отдельными процессами.Обычно это, однако, неосуществимо.

...