Google открыл систему для создания sandbox-окружений для библиотек C/C++

Компания Google объявила от открытии проекта Sandboxed API, позволяющего автоматизировать процесс формирования sandbox-окружений для изолированного выполнения произвольных библиотек на языках C и C++. Изоляция кода библиотек позволяет защититься от потенциальных атак на предоставляемые библиотеками обработчики, создавая дополнительный барьер на случай наличия в их коде уязвимостей, которые можно эксплуатировать через манипуляции с поступающими в библиотеку внешними данными. Код открыт под лицензией Apache 2.0.

Изоляция осуществляется при помощи runtime Sandbox2, в котором применяются пространства имён, cgroups и seccomp-bpf. Вынесенный в sandbox код выполняется в отдельном процессе, для которого ограничивается доступ к системным вызовам и ресурсам, таким как файлы и сетевые соединения. Процессы получают доступ только к системным возможностям, которые непосредственно требуются для выполнения изолируемого кода.

Sandbox2 определяет компоненты для запуска процесса, применения к нему правил изоляции и сопровождения дальнейшего выполнения. Sandbox2 может использоваться отдельно от Sandboxed API для изоляции не только библиотек, но и произвольных процессов. Кроме повышения защиты, положительным моментом выноса кода в отдельные процессы является возможность отдельного регулирования лимитов на потребление библиотекой памяти и CPU, а также защита от сбоев — сбой в библиотеке не приводит к краху всего приложения.

Sandboxed API является надстройкой над Sandbox2, упрощающей портирование существующих библиотек для выполнения в изолированном режиме. Sandboxed API предоставляет промежуточный программный интерфейс, дающий возможность запустить код библиотеки в sandbox-окружении, а также организовать проброс в sandbox-окружение обращений к библиотечным вызовам и обеспечить доставку в основную программу результатов работы библиотеки. Обращение к изолированной библиотеке осуществляется через специализированный RPC, базирующийся на протоколе ProtoBuffs.

Для разработчиков библиотек предлагается набор примитивов, позволяющих из базового приложения обращаться к переменным, файловым дескрипторам, буферам и функциям изолированной библиотеки, в том числе предоставляются средства для автоматической и управляемой синхронизации памяти для совместного доступа к массивам и структурам. Дополнительно предоставляется API для мониторинга за работой изолированных процессов и их перезапуска в случае сбоев.

Для изолируемой библиотеки автоматически генерируется код с аннотациями изолируемых функций для сборочной системы Bazel и программным интерфейсом (SAPI) для взаимодействия между базовыми и изолированным процессами. Разработчик также должен сформировать заголовочный файл с правилами изоляции, который определяет все разрешённые системные вызовы и операции (чтение, запись, открытие файлов, доступ к времени, возможность установки обработчиков сигналов, поддержка выделения памяти через malloc и т.п.). Отдельно определяются файлы и каталоги к которым должна иметь доступ библиотека.

В настоящее время проект доступен только для Linux, но в будущем обещают добавить поддержку macOS и BSD-систем, а в отдалённой перспективе и Windows. Из планов также отмечается возможность изоляции библиотек на языках, отличных от C и C++, поддержка дополнительных runtime для изоляции (например, на базе аппаратной виртуализации) и возможность использования CMake и других сборочных систем (сейчас поддержка ограничена сборочной системой Bazel).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.