Хук ядра Linux, который знает процесс назначения сокета - PullRequest
0 голосов
/ 06 декабря 2018

Я ищу определенное место, чтобы добавить какой-нибудь хук к ядру Linux, который позволит мне сделать следующее:

  • Определить только случай TCP-соединения, которое будет зациклено(127.0.0.1)
  • Определить, совпадает ли исходный процесс пакета с процессом назначения
  • Если это так, разрешить соединение, запретить любое другое соединение с обратной связью (один процессв другой процесс)

Я смотрел на крючки сетевого фильтра, но они, кажется, не соответствуют потребности.Фильтры bpf смотрят только на сам пакет.

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

1 Ответ

0 голосов
/ 22 декабря 2018

Простым подходом может быть использование сетевых пространств имен Linux.

Сетевые пространства имен Linux

Как следует из названия, сетевые пространства имен разделяют использованиесети - устройства, адреса, порты, маршруты, правила брандмауэра и т. д. - в отдельные блоки, по существу, виртуализируя сеть в одном работающем экземпляре ядра.Сетевые пространства имен вошли в ядро ​​в 2.6.24, ...

см. https://lwn.net/Articles/580893/

Unshare

unshare () позволяет процессу (или потоку) разъединять части своего контекста выполнения, которые в настоящее время используются совместно с другими процессами (или потоками).

см. http://man7.org/linux/man-pages/man2/unshare.2.html

Testcase

Поскольку программа должна иметь возможность общаться с самим собой, нам нужна программа, которая взаимодействует сама с собойчерез носки.Есть крутой ответ SO, который показывает простую Java-программу, которая передает текст «Hello World!»через сокет к себе, см. здесь https://stackoverflow.com/a/8119708.

/usr/bin/java SendReceive

работает как положено и выдает «Hello World!»

С помощью опции -n можно отменить пространство имен сети.

unshare -n -- sh -c '/usr/bin/java SendReceive'

дает SocketException: сеть недоступна , потому что нет доступа к устройству обратной связи.

unshare -n -- sh -c 'ip link set dev lo up; /usr/bin/java SendReceive'

наконец передает «Hello World!»снова через петлевой интерфейс.Кстати, это частное петлевое устройство.Вы не можете получить доступ к открытым портам на стандартном устройстве обратной связи.

См. Также этот крутой ответ Unix Stackexchange: https://unix.stackexchange.com/a/83348: Блокировать сетевой доступ процесса?

Снимок экрана

Вот скриншот упомянутого выше тестового примера, выполненного в Ubuntu 18.10:

screenshot

...