Я создаю песочницу для выполнения сценариев JEXL, чтобы злоумышленник не мог получить доступ к данным за пределами переменных, которые мы им предоставляем, а также не может выполнять атаку DOS на сервере. Я хотел бы задокументировать это, если кто-то еще это сделает, а также привлечет других людей к этому подходу.
Ниже приведен список вещей, о которых я знаю, которые необходимо решить:
- Разрешать только классы экземпляров с использованием "новых", которые находятся в белом списке.
- Не разрешать доступ к методу getClass для любого класса, потому что вы можете вызвать forName и получить доступ к любому классу.
- Ограничить доступ к таким ресурсам, как файлы.
- Разрешить выражение только определенное количество времени для выполнения, чтобы мы могли ограничить количество ресурсов, которые он потребляет.
Это не относится к JEXL, но может применяться к используемому языку сценариев:
- Не позволяйте объекту иметь настраиваемый метод finalize, потому что метод finalize вызывается из потока финализатора и будет выполняться с использованием исходного AccessControlContext вместо того, который используется для создания объекта и выполнения кода в нем.