LINUX.ORG.RU

Запрет на открытие файлов. что-то типо rootkit

 , ,


2

2

В Linux системе надо сделать перехват открытия файла. Запретить открывать определенные файлы. Желательно это сделать через модуль (SELinux не рассматривать). Попытка была сделать через перехват, функции открытия (sys_call_table[__NR_open]), все хорошо, работает, но только в консоли (если запрет на файл стоит, то открыть и прочитать из него не получиться). НО если открыть этот файл через графическое отоброжение (gedit, к примеру), то файл легко открывается. Также пробовал сделать через LD_PRELOAD, но что-то не получилось. Есть какие-нибудь идеи?

strace gedit показывает, что функция open вообще там не учавствует, а только read и write. При попытке перехвата, read, получаю fd, связываю с именем файла, и опять же в консоли все работает, но при запуске через gedit запретного файла, вся система просто ложится. Даже логи не пишутся. Код там: http://pastebin.com/psK8vX41

Открой и тут же удали. Больше никто не откроет, а пока приложение работает файл будет на месте.

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

м... Мне этот файл нужен. И в добавок не прокатит, так как open, не учавтсвует

tester123
() автор топика
[root@trap ~]# cat nofile.stp
probe syscall.open
{
        try {
            name = user_string($filename);
            if (name =~ "/tmp/123") {
                     printf("denying open of %s\n", name);
                     $filename = 0;
            }
        } catch (msg) {
        }
}

[root@trap ~]# stap -vg nofile.stp
Pass 1: parsed user script and 106 library script(s) using 152636virt/28056res/2144shr/26712data kb, in 170usr/20sys/181real ms.
Pass 2: analyzed script: 2 probe(s), 5 function(s), 44 embed(s), 0 global(s) using 180032virt/56528res/3188shr/54108data kb, in 500usr/40sys/549real ms.
Pass 3: translated to C into "/tmp/stapErqT5e/stap_9ea9b7167f9f2dfa744e7cf157cefa56_27899_src.c" using 180032virt/56844res/3504shr/54108data kb, in 10usr/0sys/9real ms.
Pass 4: compiled C into "stap_9ea9b7167f9f2dfa744e7cf157cefa56_27899.ko" in 1270usr/250sys/1744real ms.
Pass 5: starting run.
<в другой консоли>
$ echo > /tmp/123

-bash: /tmp/123: Bad address

Не блаадари.

mv ★★★★★
()

Ищи лучше. Есть там open, но не в том процессе, где ты ожидаешь его обнаружить.

anonymous
()

функция open вообще там не учавствует, а только read и write

А откуда он тогда файловый дескриптор берет?

Deleted
()

Также пробовал сделать через LD_PRELOAD, но что-то не получилось.

Сделать то не проблема, но для программ, которые не линкуются с libc, это не подойдет.

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

Больше никто не откроет

Ну да, ну да, особенно любой другой процесс, запущенный от рута или того же пользователя. Через /proc/$PID/fd/$FD.

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

А откуда он тогда файловый дескриптор берет?

да, это логично, но когда сделал перехват open, где просто в syslog писал все именна файлов, которые открываются, почему то не писалось имя при открытие через gedit.

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

У меня нет gedit'а на машине, где systemtap, и нет systemtap, где есть gedit.

ну тут все равно чем открыть, просто чтоб графическое отобржание было. сейчас на ubuntu ставлю systemtap. Проверю, но утром уже. То, что ты написал. Заранее спасибо)

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

И чё, вот прям так взял и сделал printk строки из юзерспейса?

почему из юзерспейса? это уже работа модуля. Вывод всех имен файлов, которые открываются через функцию open в каждый момент времени и системные файлы тоже

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

так же перехватывал, результат тот же

Понятно. Продолжаю фантазировать. Может у вас там есть CONFIG_IA32_EMULATION, тогда, ЕМНИП, для каждого сискола в ядре две точки входа, для 32 и для 64 бит...

А с помощью правил auditd удаётся отследить open() файла в gedit?

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

Проверил сейчас на своей машине(arch linux) там есть вызов system.open(filename). Правда модуль не тестировал. А вот на Ubuntu пока что нету возможности проверить.

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

почему из юзерспейса? это уже работа модуля. Вывод всех имен файлов, которые открываются через функцию open в каждый момент времени и системные файлы тоже

У тебя указатель из юзерспейса. Сделай open(NULL, ...) и посмотри.

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