Дослідники зі Стендфордського університету, Каліфорнійського університету в Сан-Дієго та Техаського університету в Остіні інструментарій , який може бути використаний як додатковий рівень ізоляції для блокування вразливостей у бібліотеках функцій. 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
