Используйте наш набор библиотек eBPF
Главная » Сеть блоггеров по безопасности » Используйте наш набор библиотек eBPF
By Artem Dinaburg
Компания Trail of Bits разработала набор библиотек с открытым исходным кодом, предназначенных для оптимизации создания и развертывания приложений eBPF. Эти библиотеки облегчают эффективный мониторинг процессов и сетевых событий, трассировку функций, анализ символов отладки ядра и генерацию кода eBPF.
Ранее развертывание переносимых приложений eBPF без зависимостей создавало серьезные проблемы из-за различий в версиях ядра Linux и необходимости во внешних инструментах для трансляции байт-кода C-to-eBPF. Мы решили эти проблемы с помощью наших инновационных библиотек, которые используют новейшие функции eBPF и ядра Linux для уменьшения внешних зависимостей. Эти инструменты, идеально подходящие для создания локальных агентов и обеспечения возможности облачного мониторинга, активно поддерживаются и совместимы с различными дистрибутивами Linux и версиями ядра. Некоторые из них даже являются неотъемлемой частью функциональности osquery, известной инфраструктуры видимости конечных точек.
Библиотеки в этом пакете — linuxevents, ebpfpub, btfparse и ebpf-common. Вместе они могут быть использованы для разработки оптимизированного мониторинга событий с высокой степенью точности и эффективности. Их приложения варьируются от мониторинга сетевых событий, трассировки функций и анализа символов отладки ядра до помощи в создании и использовании кода eBPF.
Библиотека linuxevents демонстрирует, как eBPF может отслеживать события.не требуя точных заголовков ядра или других внешних зависимостей . Больше никаких заголовков ядра, нескольких копий предварительно скомпилированного байт-кода eBPF или зависимостей от BCC! Библиотека linuxevents поддерживает генерацию кода во время выполнения для создания пользовательских зондов во время выполнения, а не только во время сборки. Это также намного быстрее, чем традиционное перехват на основе системных вызовов, что является важной функцией при мониторинге событий из нескольких контейнеров на одной машине. Как linuxevents это делает?
Во-первых, linuxevents использует данные отладки BTF ядра Linux (через нашу библиотеку btfparse) для точной идентификации прототипов функций и структур данных ядра. Это позволяет linuxevents автоматически адаптироваться к различиям в структуре данных и перехватывать произвольные закрытые символы таким образом, что значительно упрощает отслеживание.
Этот подход быстрее, чем традиционное перехват на основе системных вызовов, не только потому, что он должен перехватывать меньше вещей (sched_process_exec вместо execve, execveat и т. д.), но и потому, что он позволяет избежать дорогостоящих корреляций. Например, чтобы отследить, какая программа на диске выполняется с помощью execve, обычно приходится сопоставлять дескриптор файла, передаваемый execve, с вызовом open и несколькими вызовами chdir, чтобы получить полный путь к программе. Корреляция требует больших вычислительных затрат, особенно на машине с несколькими активными контейнерами. Библиотека linuxevents использует точное представление структуры данных ядра, чтобы подключить только одну функцию и просто извлечь путь из уровня vfs ядра.
Запись использования библиотеки linuxevents как части примера execsnoop, поставляемого с библиотекой.
Библиотека linuxevents по-прежнему является доказательством концепции; он используется osquery как переключаемый эксперимент. В библиотеке также есть канонический пример отслеживания выполняемых процессов с межконтейнерной видимостью.
Библиотека ebpfpub позволяет отслеживать системные вызовы в нескольких версиях ядра Linux, полагаясь при этом на минимальные внешние зависимости во время выполнения. В ebpfpub зонды eBPF автоматически генерируются на основе прототипов функций, определенных с помощью простого пользовательского языка, который можно создать из дескрипторов точек трассировки. Этот подход требовал правильных заголовков для работающего ядра и сопровождался снижением производительности, например необходимостью сопоставлять дескрипторы файлов с системными вызовами.
В зависимости от желаемого целевого события ebpfpub может использовать либо точки трассировки ядра, либо kprobes, либо uprobes в качестве основного механизма трассировки. В библиотеку входят следующие примеры:
Библиотека ebpfpub в настоящее время используется osquery для захвата событий процессов и сокетов путем отслеживания выполненных системных вызовов. Хотя ebpfpub по-прежнему поддерживается и полезен в определенных обстоятельствах (например, при необходимости поддерживать старые ядра и использовать генерацию кода во время выполнения), в новых проектах вместо этого следует использовать подход linuxevents.