top
команда считывает данные с proc, который обеспечивается непосредственно от ядра. Для сокрытия процессов необходимо было бы использовать код в ядре, чтобы сделать маскирование.
Кроме использования концепции безопасности как SELinux и grsecurity (упомянутый в других ответах), код стиля руткита является Вашей единственной остающейся опцией. Я говорю "стиль", потому что "руткит" отдельно не плох, это - как он используется. Существуют совершенно законные причины позади сокрытия процессов от других пользователей, который является, почему эта возможность существует в концепциях безопасности.
Основной маршрут, за которым необходимо было бы следовать, чтобы заставить это работать, должен сцепиться в (или налет, в зависимости от того, как Вы смотрите на него), функция (функции) в ядре Linux, которые раздают /proc/pid/
данные. Я демонстрирую один метод сцепления в функции ядра Linux в модуле безопасности, который я записал:
https://github.com/cormander/tpe-lkm
Код "высокого уровня" для этого находится в hijack_syscalls()
метод в security.c
, и devil-in-the-details волшебство позади него находится в hijacks.c
файл.
Вы, вероятно, найдете функцию (функции), в которую Вы захотите сцепиться в fs/proc/
каталог исходного кода ядра Linux. Следует иметь в виду, что Linux не обеспечивает стабильный ABI, таким образом, Ваш код должен будет измениться несколько для получения его работающий в различных версиях ядра Linux. Кроме того, имейте в виду необходимость в полном корневом доступе к машине, чтобы смочь ввести этот код.
ОБНОВЛЕНИЕ:
Если Вы переноситесь pid_getattr
символ ядра с некоторым дополнительным кодом к он очень легок сделать это. Я недавно добавил что-то, что скрывает процессы к вышеупомянутому модулю ядра:
https://github.com/cormander/tpe-lkm/commit/899bd5d74764af343d5fee1d8058756ddc63bfe3
Вы могли сделать что-то подобное путем создания процессов определенного пользователя или группы не видимыми любым кроме корня и того пользователя. Выполнение его именем процесса немного более сложно, но возможно. Взгляните на exe_from_mm()
функция. Обратите внимание, что могут быть последствия производительности использования его в pid_getattr
.
Я не думаю, что существует способ перечислить параметры компиляции, но что-то как поддержка SELinux должно быть очевидно из библиотек, против которых связан исполняемый файл:
$ ldd /usr/bin/ssh /usr/sbin/sshd | egrep '^/|selinux'
/usr/bin/ssh:
/usr/sbin/sshd:
libselinux.so.1 => /lib/libselinux.so.1 (0x00007fbbfed5f000)
Похож sshd
имеет поддержку SELinux, но ssh
не (почему был бы он?) в моей системе.
Другая вещь, которую Вы могли проверить (например, в случае, если у Вас был статический двоичный файл) состоит в том, если там двоичные ссылки некоторый SELinux функционируют.
strings /usr/sbin/sshd |grep -i selinux
Я думаю, что Вы, возможно, должны посмотреть на упаковочную систему для своего дистрибутива и найти опции, с которыми это компилирует. Некоторые программы могут произвести свои флаги компиляции, но я не знаю о такой опции для sshd.
Если Вы устанавливаете пакеты распределения по умолчанию, и
распределением является базирующийся Debian, посмотрите на debian/rules
файл (в основном Make-файл) в источнике пакета для параметров конфигурации.
распределение является базирующимся об/мин, посмотрите на параметры компиляции, вероятно, в исходном файле спецификации об/мин.
Для пользовательских дистрибутивов как хинду, где нет никаких опций компиляций по умолчанию, это более трудно, и я говорил бы с человеком, который создал пакет, и также посмотрите на ldd
поскольку люди предложили.
Если Вы указываете свое распределение, поскольку необходимо было сделать первоначально, люди могут, по-видимому, дать Вам более определенные подсказки.