Ограничение доступа к системному вызову для приложения Linux - PullRequest
4 голосов
/ 27 января 2010

Предположим, двоичный файл Linux foobar, который имеет два различных режима работы:

  • Режим A: режим с хорошим поведением, в котором используются системные вызовы a, b и c.
  • Режим B: режим с ошибками, в котором используются системные вызовы a, b, c и d.

Системные вызовы a, b и c безвредны, тогда как системный вызов d потенциально опасен и может привести к нестабильной работе машины.

Предположим далее, что какой из двух режимов запускается приложением является случайным: приложение работает в режиме A с вероятностью 95% и в режиме B с вероятностью 5%. Приложение поставляется без исходного кода, поэтому его нельзя изменить, только запустить как есть.

Я хочу убедиться, что приложение не может выполнить syscall d. При выполнении syscall d результатом должно быть либо NOOP, либо немедленное завершение приложения.

Как мне добиться этого в среде Linux?

Ответы [ 4 ]

7 голосов
/ 27 января 2010

Является ли приложение статически связанным?

Вы можете переопределить некоторые символы, например, давайте переопределим socket

int socket(int domain, int type, int protocol)
{
        write(1,"Error\n",6);
        return -1;
}

Затем создайте общую библиотеку:

gcc -fPIC -shared test.c -o libtest.so

Запустим:

nc -l -p 6000

Ok

А теперь:

$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket

Что происходит, когда вы работаете с переменной LD_PRELOAD=./libtest.so, она переопределяет символы, определенные в libtest.so, по сравнению с теми, которые определены в библиотеке.

6 голосов
/ 27 января 2010

Кажется, что systrace делает именно то, что вам нужно. Со страницы Википедии :

Приложению разрешено совершать только те системные вызовы, которые указаны как разрешенные в политике. Если приложение пытается выполнить системный вызов, который явно не разрешен, возникает аварийный сигнал.

3 голосов
/ 27 января 2010

Это одно из возможных применений песочницы (в частности, выполнение на основе правил). Одной из популярных реализаций является SELinux .

Вам придется написать политику , соответствующую тому, что вы хотите разрешить процессу.

0 голосов
/ 10 декабря 2014
...