Я написал модуль ядра, который отправляет общие многоадресные рассылки Netlink, и написал пользовательского клиента, использующего libmnl, который их получает.
Все это работает нормально, но мой клиент работает, даже если он не является пользователем root, и я хочу предотвратить это.
человек 7 нетлинк говорит:
Only processes with an effective UID of 0 or the CAP_NET_ADMIN capability
may send or listen to a netlink multicast group.
Очевидно, что слушающая часть этого не соответствует действительности. Я пробовал CentOS 5 (2.6.18), CentOS 6 (2.6.32) и Ubuntu 14.04 (3.13).
Я знаю, что с помощью флага GENL_ADMIN_PERM можно ограничить получение общих команд netlink, входящих в ядро, только от root, но можно ли отправлять многоадресные рассылки из ядра, которые могут быть получены только root?
РЕДАКТИРОВАТЬ: я поделился некоторым кодом для модуля ядра, который отправляет многоадресные рассылки по сети, и клиента, который их получает, по адресу https://github.com/craig65535/mcast-exmpl. Инструкции по сборке находятся в README.md, но я вставлю их сюда.
В одном терминале:
$ make
$ sudo insmod mcast-exmpl.ko
$ cd client
$ make
$ ./client
genl ctrl msg
Family ID: 26
Mcast group ID: 4
(идентификаторы могут отличаться)
В другом терминале запустите команду, которая установит TCP-соединение. Перехватчики mcast-exmpl подключаются через jprobe, поэтому это приведет к отправке многоадресной рассылки netlink.
$ nc yahoo.com 80
^C
$
В первом терминале вы увидите, что многоадресная рассылка netlink была получена, даже если вы не запускали клиент с правами root:
mcast-exmpl msg
SEND_NUM 55555
Я хотел бы изменить это, чтобы многоадресные рассылки принимались только тогда, когда client
работает от имени пользователя root, или, в противном случае, подтверждение того, что я нашел ошибку либо в документации Linux, либо в самой Linux.