Исследователи из Стендфордского университета, Калифорнийского университета в Сан-Диего и Техасского университета в Остине инструментарий , который может применяться как дополнительный уровень изоляции для блокирования уязвимостей в библиотеках функций. RLBox нацелен на решение проблемы с безопасностью незаслуживающих доверия сторонних библиотек, которые не подконтрольны разработчикам, но уязвимости в которых могут скомпрометировать основной проект.
Компания Mozilla задействовать RLBox в Linux-сборках Firefox 74 и macOS-сборках Firefox 75 для изоляции выполнения библиотеки , отвечающей за отрисовку шрифтов. При этом RLBox не специфичен для Firefox и может применяться для изоляции любых библиотек в произвольных проектах. RLBox под лицензией MIT. В настоящее время RLBox поддерживает работу на платформах Linux и macOS, поддержка Windows ожидается позднее.
работы RLBox сводится к компиляции C/C++ кода изолируемой библиотеки в низкоуровневый промежуточный код WebAssembly, который затем оформляется в виде WebAssembly-модуля, полномочия которого задаются в привязке только к этому модулю (например, библиотека для обработки строк не сможет открыть сетевой сокет или файл). Преобразование кода C/C++ в WebAssembly осуществляется при помощи .
Для непосредственного выполнения WebAssembly-модуль компилируется в машинный код при помощи компилятора и выполняется в отдельном «нанопроцессе», изолированном от остальной памяти приложения. Компилятор Lucet основан на том же коде, что и JIT-движок , применяемый в Firefox для выполнения WebAssembly.
Собранный модуль работает в отдельной области памяти и не имеет доступа к остальному адресному пространству. В случае эксплуатации уязвимости в библиотеке атакующий будет ограничен и не сможет обратиться к областям памяти основного процесса или передать управление вне изолированного окружения.
Для разработчиков предоставлен высокоуровневый , который позволяет вызывать функции библиотеки в режиме изоляции. WebAssembly-обработчики почти не требуют дополнительных ресурсов и взаимодействие с ними не сильно медленнее вызова обычных функций (функции библиотеки выполняется в форме нативного кода, а накладные расходы возникают лишь при копировании и проверке данных в процессе взаимодействия с изолированным окружением). Функции изолированной библиотеки не могут быть вызваны напрямую и для обращения к ним необходимо применять
прослойку invoke_sandbox_function().
В свою очередь, если из библиотеки необходимо вызвать внешние функции, данные функции должны быть явно определены при помощи метода register_callback (по умолчанию RLBox предоставляет доступ к функциям ). Для обеспечения безопасной работы с памятью (memory safety) изоляции выполнения кода недостаточно и требуется также обеспечить проверку возвращаемых потоков данных.
Сформированные в изолированном окружении значения помечаются как незаслуживающие доверия, ограничиваются при помощи и для «очистки» требуют и копирования в память приложения.
Без очистки, попытка использования tainted-данных в контексте, требующем обычных данных (и наоборот) приводит к генерации ошибок на этапе компиляции. Небольшие аргументы функций, возвращаемые значения и структуры передаются через копирование между памятью процесса и памятью изолированного окружения. Для больших наборов данных память выделяется в изолированном окружении, а основному процессу возвращается прямой указатель «sandbox-reference».
Աղբյուր: opennet.ru
