Исследователи Стэнфордского университета, Калифорнийский университет в Сан-Диего y la Техасский университет в Остине Они разработали набор инструментов, который они назвали "РЛБокс", что можно использовать как дополнительный уровень утепления для блокировки уязвимостей в библиотеках функций.
RLBox направлен на решение проблемы безопасности сторонних библиотек. Недоверенные, не контролируемые разработчиками, но уязвимости, в которых может быть скомпрометирован основной проект.
Mozilla планирует использовать RLBox в сборках Firefox 74 для Linux и сборники macOS в Firefox 75 изолировать выполнение библиотеки Graphite, который отвечает за представление источников.
В то же время RLBox не специфичен для Firefox и может использоваться для изоляции любой библиотеки в произвольных проектах.
О RLBox
Рабочий механизм RLBox сводится к компиляции кода C / C ++ из изолированной библиотеки в промежуточный код WebAssembly. низкоуровневый, который затем выдается как модуль WebAssembly, полномочия которого установлены для привязки только к этому модулю (например, библиотека для обработки строк не может открыть сокет или сетевой файл) Преобразование кода C / C ++ WebAssembly выполняется с помощью wasi-sdk.
Для прямого исполнения, модуль WebAssembly компилируется в машинный код с помощью компилятора Lucet и он работает в «нанопроцессе» отдельно от остальной памяти приложения. Компилятор Lucet основан на том же коде, что и JIT-движок Cranelift, используемый в Firefox для запуска WebAssembly.
Собранный модуль работает в отдельной области памяти и у него нет доступа к остальной части адресного пространства. В случае использования уязвимости в библиотеке злоумышленник будет ограничен и не сможет получить доступ к областям памяти основного процесса или передать управление за пределы песочницы.
Для разработчиков предоставляется высокоуровневый API, который позволяет вызывать функции библиотеки в изолированном режиме.
Контроллеры WebAssembly практически не требуют дополнительных ресурсов и взаимодействие с ними не намного медленнее, чем вызов обычных функций (библиотечные функции выполняются в виде нативного кода, а перегрузка возникает только при копировании и проверке данных в процессе взаимодействия с изолированной средой) .
Функции изолированной библиотеки не могут быть вызваны напрямую, и для доступа к ним вы должны использовать слой invoke_sandbox_function().
В свою очередь, если им нужно вызывать внешние функции из библиотеки, эти функции должны быть явно определены с помощью метода register_callback (по умолчанию RLBox предоставляет доступ к стандартным библиотечным функциям).
Чтобы обеспечить безопасную работу с памятью, изолировать выполнение кода недостаточно а также вам необходимо обеспечить проверку возвращаемых потоков данных.
Значения, созданные в изолированной среде, помечаются как ненадежные, ограничиваются зараженными тегами и требуют проверки и копирования в память приложения для «очистки».
Без очистки попытка использовать загрязненные данные в контексте, требующем регулярных данных (и наоборот), приводит к генерации ошибок на этапе компиляции.
Небольшие аргументы функции, возвращаемые значения и структуры передаются путем копирования между памятью процесса и памятью песочницы. Для больших наборов данных память выделяется в изолированной среде, и прямой указатель «ссылки на песочницу» возвращается основному процессу.
Разработки RLBox распространяются по лицензии MIT.. RLBox в настоящее время поддерживает Linux и macOS и ожидается, что он будет совместим с Windows позже.
Если вы хотите узнать больше об этой новой технологии, которую Mozilla планирует внедрить в Firefox, вы можете проконсультироваться по ее разработке, а также протестировать API. По следующей ссылке.