Почему разрешено изменять 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...

Мои вопросы:

  1. Я вижу некоторые варианты использования для вышеупомянутых, например, скрытие паролей, заданных в командной строке (также плохая практика), но я вижу гораздо больше проблем / проблем, когда можно скрыть процессы и подделать cmdline, Есть ли причина, по которой это разрешено? Разве это не уязвимость системы?

  2. Как я могу предотвратить или обнаружить это? Я смотрел в /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... предотвратить или обнаружить что? Я имею в виду, что вы не можете сказать, что процесс делает из командной строки, но вы все равно не можете сказать, что он делает иначе (есть много способов заставить кусок кода сделать что-то "странное" за кулисами).

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

Другие вопросы по тегам