После PenTest группа безопасности обнаружила возможность атаки XXE при отправке формы Orbeon через HTTPS-запрос из нашего веб-приложения.
Им удалось перехватить следующий XML:
<!DOCTYPE event-request [<!ENTITY nbsp " ">]>
<xxf:event-request xmlns:xxf="http://orbeon.org/oxf/xml/xforms">
<xxf:uuid>8a89ecf50184eb16f5671301691e0d9457568667</xxf:uuid>
<xxf:sequence>16</xxf:sequence>
<xxf:action>
<xxf:event name="xxforms-blur" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control"/>
<xxf:event name="xforms-focus" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control"/>
<xxf:event name="xxforms-value" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control">Tester<</xxf:event>
<xxf:event name="xxforms-blur" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control"/>
</xxf:action>
</xxf:event-request>
И внедрить новый внешний объект <!ENTITY test "My-OwnEntity">
, манипулируя запросом. Это был XML, отправленный на сервер:
<!DOCTYPE event-request [<!ENTITY nbsp " "><!ENTITY test "My-OwnEntity">]>
<xxf:event-request xmlns:xxf="http://orbeon.org/oxf/xml/xforms">
<xxf:uuid>8a89ecf50184eb16f5671301691e0d9457568667</xxf:uuid>
<xxf:sequence>16</xxf:sequence>
<xxf:action>
<xxf:event name="xxforms-blur" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control"/>
<xxf:event name="xforms-focus" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control"/>
<xxf:event name="xxforms-value" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control">My-OwnEntity</xxf:event>
<xxf:event name="xxforms-blur" source-control-id="pd-section-per-sonalData-control≡xf-474≡pd-birthName-control"/>
</xxf:action>
</xxf:event-request>
Затем запрос обрабатывается правильно, и значение объекта появляется в ответе, возвращаемом сервером.
По их словам, предлагаются два подхода/решения: 1. Создать белый список разрешенных объектов; или 2. Запретить обработку этих внешних объектов во всех случаях.
Но я не смог найти в документации Orbeon способ реализовать какое-либо из этих решений (второе было бы более подходящим для моего конкретного случая). Кто-нибудь знает, как это сделать или сталкивался с похожей ситуацией и справился с ней по-другому?
Спасибо.