Почему разрешено изменять argv[0]?
Я работал над проектом, который использует PID, /proc
и анализ командной строки для проверки процессов в системе. Мой код должен был быть проверен парнями из службы безопасности, которым удалось разбить его одной строкой... неловко!
#!/usr/bin/env perl
$0="I am running wild"; # I had no clue you can do this!
system("cat /proc/$$/cmdline");
print("\n");
system("ps -ef | grep $$");
# do bad stuff here...
Мои вопросы:
Я вижу некоторые варианты использования для вышеупомянутых, например, скрытие паролей, заданных в командной строке (также плохая практика), но я вижу гораздо больше проблем / проблем, когда можно скрыть процессы и подделать
cmdline
, Есть ли причина, по которой это разрешено? Разве это не уязвимость системы?Как я могу предотвратить или обнаружить это? Я смотрел в
/proc
варианты монтирования. Я также знаю, что можно использоватьlsof
идентифицировать поддельные процессы на основе неожиданного поведения, но в моем случае это не сработает. На данный момент я использую простой метод, чтобы определить,cmdline
содержит как минимум один ноль (\0
) символ, который предполагает наличие хотя бы одного аргумента. В приведенном выше коде пробелы должны быть заменены нулями, чтобы обойти эту проверку, что я не смог найти, как реализовать в perl - пишет до первого\0
,
Спасибо
1 ответ
Чтобы ответить 1:
Это из-за того, как на самом деле работает запуск нового процесса.
Вы fork()
создать дубликат экземпляра вашего текущего процесса, а затем вы exec()
чтобы начать новую вещь - он заменяет ваш текущий процесс на "новый" процесс, и в результате - он должен переписать $0
,
Это на самом деле довольно полезно, хотя при запуске параллельного кода - я делаю это довольно часто, когда fork()
код, потому что это позволяет легко определить, какая "вещь" застревает / перегревается.
Например:
use Parallel::ForkManager;
my $manager = Parallel::ForkManager -> new ( 10 );
foreach my $server ( @list_of_servers ) {
$manager -> start and next;
$0 = "$0 child: ($server)";
#do stuff;
$manager -> finish;
}
Вы можете сразу увидеть в своем ps
список того, что происходит Такое поведение вы увидите во многих многопроцессорных сервисах, таких как httpd
,
Но это не уязвимость, если только вы не предполагаете, что это что-то не так (как вы). Во всяком случае, не более, чем возможность "mv" двоичного файла.
Во всяком случае, чтобы ответить 2... предотвратить или обнаружить что? Я имею в виду, что вы не можете сказать, что процесс делает из командной строки, но вы все равно не можете сказать, что он делает иначе (есть много способов заставить кусок кода сделать что-то "странное" за кулисами).
Ответ - доверяйте своей модели безопасности. Не запускайте ненадежный код в привилегированном контексте, и это в значительной степени не имеет значения, как они его называют. Конечно, вы можете написать грубые сообщения в списке процессов, но совершенно очевидно, кто это делает.