Решение проблемы доступа к атрибутам
Ранее в Linux 7.1 была внедрена поддержка расширенных атрибутов (xattr) для сокетов, что стало важным шагом для GNOME и systemd, использующих Varlink IPC. Однако существовало критическое ограничение: BPF-программы не имели эффективного способа читать эти пользовательские метки обратно. Разработчик Christian Brauner устранил этот пробел, добавив в Linux 7.3 новую явную функцию bpf_sock_read_xattr().
Технические детали реализации
Новая функция позволяет BPF-программам, работающим в контексте LSM (Linux Security Modules), считывать атрибуты с префиксом user.* из inode сокетов sockfs полностью без блокировок (locklessly). Это достигается за счет использования RCU-защищенного поиска в хеш-таблице (rhashtable), что исключает необходимость захвата блокировки inode или атрибутов.
- Безопасность и производительность: Операция чтения никогда не переходит в спящее состояние (sleep) и не требует блокировок.
- Ограничения: Функция зарегистрирована как
KF_RCUи доступна только для BPF-программ LSM. Она работает только с сокетами, гарантированно живущими вsockfs(например, исключены устройства tun/tap, доступные только через трассировку). - Применимость: Подходит как для спящих, так и для неспящих хуков LSM.
Практическое применение для systemd
Ключевым бенефициаром обновления становится systemd. Функция позволяет неуправляемым менеджерам пользователей (например, systemd --user) маркировать сокеты из пространства пользователя, а затем BPF-программам обнаруживать их или реализовывать политики безопасности во время вызовов bind() и connect().
Основные сценарии использования включают:
- Реализацию ограничения скорости (rate limiting) для сокетов.
- Тегирование сокетов для создания реестра Varlink.
- Применение политик безопасности на основе меток, установленных пользователем.
Статус интеграции
Поддержка bpf_sock_read_xattr() уже объединена в основную ветку разработки и войдет в релиз Linux 7.3. Это закрывает longstanding issue для разработчиков системных утилит и специалистов по безопасности, работающих с eBPF.
Источник: Phoronix ↗
