LINUX.ORG.RU

Скрыть опции запуска из top

 ,


0

1

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

Сам скрипт отрабатывает быстро, а вот демоны висят и любой может посмотреть в top опции с которыми они были запущены, среди которых будут и сами ключи. Как эту дыру закрыть?

★★★★★

Да не переживай, просто ты упоролся

zolden ★★★★★
()

может у этих демонов есть какой-то более умный способ настройки, чем передавать секретные ключи в командной строке?

stevejobs ★★★★☆
()

из операционки это никак, надо патчить демона, в коде после парсинга аргументов из ARGV, подчистить «чуствительное» или вытереть нафиг.

bl ★★★
()

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

alozovskoy ★★★★★
()
Ответ на: комментарий от bl

в коде после парсинга аргументов из ARGV, подчистить «чуствительное» или вытереть нафиг

Было бы интересно, если бы Вы написали, как это сделать (для C/C++/Bash). Сам никогда не задумывался об этом. А теперь стало интересно.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Сделал так что-бы не вводить эти ключи каждый раз.

Неправильно сделал. В параметрах пароли никто не задает. Если просто один раз запрашивает пароль, то сделай echo с паролем и перенаправь это в stdin демона, который запрашивает пароль. Если что-то более сложное - man expect. А вообще обычно есть соотв. настройки у таких программ для таких случаев.

Kroz ★★★★★
()
Ответ на: комментарий от peregrine

когда стал такой вопрос чтобы rlwrap не палил пароль как опцию утилитки, то

diff -C3 -P main.c main.c.orig
*** main.c      2014-04-11 20:44:32.935856686 +0300
--- main.c.orig 2010-05-03 13:29:27.000000000 +0300
***************
*** 161,172 ****
    install_signal_handlers();
    block_all_signals();
    fork_child(command_name, argv);
+     // hide command line arguments
+     if (argc > 1) {
+         char *arg_end;
+         arg_end = argv[argc-1] + strlen (argv[argc-1]);
+         *arg_end = ' ';
+     }
    if (filter_command)
      spawn_filter(filter_command);

--- 161,166 ----
***************

bl ★★★
()

Это не дыра. Вот возможность скрыть от системы параметры запуска, вот это дыра.

Есть один скрипт, запускается с опцией в в виде пароля

Задай пароль переменной внутри скрипта или пусть читает пароль из файла.

Dron ★★★★★
()

Пароль на то и пароль, что бы его человек писал. Держать пароли в памяти - моветон.

nanoolinux ★★★★
()

передавай сообщение подписанное твоим приватным ключом

anonymous
()

Есть один скрипт, запускается с опцией в в виде пароля
Как эту дыру закрыть?

Не передавать пароль опцией, очевидно же.

mix_mix ★★★★★
()

Есть один скрипт, запускается с опцией в в виде пароля, паролем расшифровываются секретные ключ

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

Если ты хочешь сделать ключ для автоматической подписи/шифрования, то просто сделай ключ без пароля. Конечно, залгиненый юзер его сможет легко использовать, но он также легко прочитает пароль в твоём скрипте, как-бы ты его не передавал.

Скрипт должен иметь доступ к паролю, а следовательно и юзер, запускающий скрипт тоже будет иметь доступ. Какой смысл в твоём пароле?

А вообще-то, если ты хочешь ответ, то знай: массив const char* argv[] доступен для записи (хотя это и говнокодерство), а значит ты можешь использовать каст в НЕconst, и записать туда всё что угодно. Тогда даже root будет думать, что демон работает с паролем «*****». Но это не нужный говнокод.

emulek
()
Ответ на: комментарий от bl

+ arg_end = argv[argc-1] + strlen (argv[argc-1]);

+ *arg_end = ' ';

с таким фиксом разве пароль не будет виден? Если я правильно понял твой говнокод, то тут ты просто стираешь завершающий ноль, и вместо --password='123', получится --password='123 <много мусора>', разве нет?

И кто сказал, что password будет последним аргументом? Лучше что-то типа:

for(j=0; j<argc; j++)
{
  for(k=0; k<strlen(argv[j]); k++)
  {
    ((char*)(argv[j]))[k]='*';
  }
}

ну или типа того.

emulek
()
Ответ на: комментарий от emulek

вместо --password='123', получится --password='123 <много мусора>', разве нет?

разве нет.

Несложно проверить:

int main(int argc, char** argv) {
    if (argc>1) *(argv[argc-1]+strlen(argv[argc-1]))=' ';
    getchar();
    return 0;
}
./a.out par1 par2 par3& ps t

bormant ★★★★★
()

Есть один скрипт, запускается с опцией в в виде пароля,

Тут не паранойя нужна в тегах, а идиотизм.
И тут не пароли в команде надо ныкать, а gpg-agent запустить. Вот у меня например, при логине в систему ключи копируются с носителя, который я ношу с собой, и выдаётся окошко pinentry на ввод пассфразы. Ключи грузятся в gpg-agent и дальше, когда придёт очередь запустить, скажем, firefoxpalemoon, зашифрованная база паролей браузера с жёсткого диска расшифруется в tmpfs, а в хоумдире на её месте появится симлинк.

deterenkelt
()
Ответ на: комментарий от emulek

вроде оно вытирает всё кроме первого слова.
я этот способ нашёл на стековервлоу, и если загуглить «arg_end = argv[argc-1] + strlen (argv[argc-1]);» то можно увидеть что много есть много софта где именно так поступают, и именно с целью скрыть чувствительные аргументы утилиты.

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

bl ★★★
()
Ответ на: комментарий от bormant

Несложно проверить

это может багофича ps.

А если другим способом прочитать?

emulek
()
Ответ на: комментарий от bl

я этот способ нашёл на стековервлоу, и если загуглить «arg_end = argv[argc-1] + strlen (argv[argc-1]);» то можно увидеть что много есть много софта где именно так поступают, и именно с целью скрыть чувствительные аргументы утилиты.

это вы мне доказываете, что среди разработчиков СПО 95% идиотов?

Ещё раз, для тех кто в танке: передавать пароль утилите не имеет смысла. НИКАК. Потом у и вопрос «как скрыть переданный пароль» тоже смысла не имеет. Всё это помогает от полных идиотов, но зачем защищаться от полных идиотов, которым вы сами же дали права для входа в свою систему?

я лично считаю что получение пароля в качестве аргумента запуска программы нормальным явлением, то что её спаливает список процессов - особенностью операционной системы

это просто руки из жопы. Ну и сказкабыль про дурака и хрустальный член.

Если уж программе требуется читать какой-то пароль или ещё что-то приватное, она должна читать это из файла, причём сама, без костылей на expect'е. В конце концов, у вас ведь этот пароль в файле записан, да? Дык зачем плодить сущности, и пихать его в переменные окружения программы? Пусть программа сама читает, зачем вам делать чужую работу, читать файл с паролем, а потом пихать его в ${3} bash'а? А ключ --passwd=«123» удобен для тестов. В продакшене конечно не через опцию передаётся, и не 123.

бороться внутри исходного кода программы. открытый код это позволяет сделать просто и как угодно. закрытый - требует исправлений от вендора или использовать костылики. вива ла опенсорс

действительно: в СПО можно самому себе создать сложности, а потом героически их разрешить, пропатчив программу, так, что-бы она работала даже с такими упорытыми хотелками. Можно и патч к калькулятору написать, что-бы на ноль делил. А вот калькулятор от мысы не научить, увы.

emulek
()

передавать параметры не через командную строку. ещё у procfs есть параметры монтирования hidepid= gid=

anonymous
()
Ответ на: комментарий от bl

в коде после парсинга аргументов из ARGV, подчистить

это как закрыть глаза, чтобы спрятаться (с)
все равно будет промежуток времени, когда приложение уже запустилось, а аргументы еще не почищены

anonymous
()
Ответ на: комментарий от emulek

Скрипт должен иметь доступ к паролю, а следовательно и юзер, запускающий скрипт тоже будет иметь доступ. Какой смысл в твоём пароле?

Я это исправил, опцией теперь вообще ничего не передается. Скрипт и пароль к которому он имеет доступ существуют только в момент выполнения, до и после это просто мусор. И юзер без рут-прав ничего не прочитает.

KillTheCat ★★★★★
() автор топика
Ответ на: комментарий от emulek

Если уж программе требуется читать какой-то пароль или ещё что-то приватное, она должна читать это из файла

Ну да, это же опенсорс - возьми и перепиши.

Кстати, винда скрывает команды запуска от непривилегированных пользователей.

KillTheCat ★★★★★
() автор топика
Ответ на: комментарий от KillTheCat

Я это исправил, опцией теперь вообще ничего не передается.

дело твоё, мне тоже насрать на твою безопасность.

Ну да, это же опенсорс - возьми и перепиши.

зачем? Всё уже переписано, вот что пишет man 1 mysql:

Specifying a password on the command line should be considered insecure. See Section 5.3.2.2, “End-User Guidelines for Password Security”. You can use an option file to avoid giving the password on the command line.

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

Кстати, винда скрывает команды запуска от непривилегированных пользователей.

в диспетчере задач? А если как-то иначе поковырять? Ты гарантируешь, что параметры точно _затираются_, а не как у тебя, затирается только один символ(и тот, не несёт никакой информации), что только ps считает, что «здесь плана нет!». Ты точно уверен, что завтра ты не увидишь «черепашка плана не брала!»? Ведь пароль не изменяется от твоего фикса.

emulek
()
Ответ на: комментарий от anonymous

интересно, на винфак или вдоль?

одно другому не мешает.

1. KillTheCat выкладывает здесь пароль

2. регится на FinFAQ

3. делает вдоль

4. ??????????

5. профит всему ЛОРу (а может и винфаку).

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.