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

19

Как вы можете запустить процесс и сделать его невидимым для topкоманды? Процесс запускается обычным пользователем (не root) и не должен быть виден другим обычным пользователям.

дебаггер
источник
1
Такой вид поражает цель вершины и слишком легко злоупотреблять. Почему бы просто не переименовать процесс? this_is_not_the_process_you_are_looking_for?
я вижу, как насчет сокрытия пользователя?
5
Пожалуйста, скажите нам, что вы не пытаетесь написать руткит. Можете ли вы объяснить свой сценарий так, чтобы, возможно, мы могли предложить лучшую архитектуру безопасности вместо той, которая обычно считается "злым" поведением?
Калеб
2
Вы можете использовать grsecurity или SELinux . Оба требуют корневого вмешательства для начальной настройки.
Жиль "ТАК - перестань быть злым"

Ответы:

11

Команда topсчитывает данные из proc, которые предоставляются непосредственно из ядра. Чтобы скрыть процессы, вам нужно использовать код внутри ядра для маскировки.

Помимо использования инфраструктуры безопасности, такой как SELinux и grsecurity (упомянутой в других ответах), код в стиле руткита - это единственный оставшийся вариант. Я говорю «стиль», потому что «руткит» сам по себе неплох, это то, как он используется. Существуют совершенно законные причины скрытия процессов от других пользователей, поэтому эта возможность существует в инфраструктурах безопасности.

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

https://github.com/cormander/tpe-lkm

Код «высокого уровня» для этого находится в hijack_syscalls()методе in security.c, а магия дьявола в деталях - в hijacks.cфайле.

Скорее всего, вы найдете функции, которые вы хотите подключить, в fs/proc/каталоге исходного кода ядра Linux. Имейте в виду, что linux не обеспечивает стабильный ABI, поэтому ваш код должен будет несколько измениться, чтобы он работал в разных версиях ядра linux. Также имейте в виду, что вам нужен полный root-доступ к машине, чтобы иметь возможность вставить этот код.

ОБНОВИТЬ:

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

https://github.com/cormander/tpe-lkm/commit/899bd5d74764af343d5fee1d8058756ddc63bfe3

Вы можете сделать нечто подобное, сделав процессы определенного пользователя или группы недоступными для просмотра никем, кроме root и этого пользователя. Делать это по имени процесса немного сложнее, но возможно. Посмотрите на exe_from_mm()функцию. Обратите внимание, что это может повлиять на производительность внутри pid_getattr.

Кори Хендерсон
источник
4

Кажется, два основных варианта.

  • Selinux работает, помещая разных людей в разные домены безопасности и в некотором смысле помещая их в песочницу, чтобы они не могли видеть вещи друг друга. Это кроется в этом вопросе . Поскольку selinux быстро становится де-факто платформой безопасности в мире Linux, это, вероятно, именно то направление, которое вам следует искать.

  • Другой - это безопасность, как упомянуто Мариоошем и как задано в этом вопросе . В некоторых дистрибутивах есть альтернативные пакеты ядра с установленными патчами grsecurity. Если у вас есть это, вы можете использовать их.

Если по какой-либо причине вы хотите сделать это без добавления каркаса безопасности, такого как selinux или grsecurity, объясните, почему вы не пишете руткит.

Калеб
источник
1

Это не так просто на стандартной коробке Linux. Посмотрите на grsecurity , но это требует исправления ядра и т. Д.

marioosh
источник
2
Я думаю, что это стандартно с ядром selinux.
user606723
0

Вы можете написать эквивалентную команду, которая работает точно так же top, но не отображает процессы, соответствующие определенному имени. В качестве альтернативы вы можете получить исходный код topкоманды и изменить его соответствующим образом. Затем вы можете заменить topкоманду в /usr/sbin(или где бы она ни была) вашей версией.

LawrenceC
источник
2
Замена top не мешает пользователю делать то, что делает top.
Тим Пост
2
Нет, но был задан вопрос, как сделать процессы невидимыми для topкоманды.
LawrenceC