2016-11-17 7 views
2

У нас был аудит безопасности нашего кода, и они упоминали, что наш код уязвим для атаки внешнего сустава (XXE).Как предотвратить атаку XXE

Пояснения- Атаки с внешних объектов XML используют функцию XML для динамического создания документов во время обработки. Объект XML позволяет динамически включать данные из заданного ресурса. Внешние объекты позволяют документу XML включать данные из внешнего URI. Если это не сделано иначе, внешние сущности вынуждают синтаксический анализатор XML обращаться к ресурсу, указанному , посредством URI, например, файла на локальном компьютере или в удаленной системе. Такое поведение предоставляет приложение для внешних внешних атак типа Entity (XXE), которые могут использоваться для отказа в обслуживании локальной системы, получения несанкционированного доступа к файлам на локальном компьютере , сканирования удаленных компьютеров и выполнения отказа в обслуживании удаленных систем. В следующем XML-документе показан пример атаки XXE.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo [ 
<!ELEMENT foo ANY > 
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo> 

Этот пример может обрушить сервер (в системе UNIX), если XML-парсер пытается заменить объект с содержимым /DEV/случайный файл.

Рекомендация- XML-маркер не должен быть настроен безопасно, чтобы он не позволял внешним объектам как часть входящего документа XML . Чтобы избежать инъекции XXE, не используйте методы, которые обрабатывают XML-источник напрямую, как java.io.File, java.io.Reader или java.io.InputStream. Разобрать документ с надежно сконфигурированного анализатором и использовать распаковать метод, который принимает безопасный

анализатор в качестве источника XML, как показано в следующем примере:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setExpandEntityReferences(false); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document document = db.parse(<XML Source>); 
Model model = (Model) u.unmarshal(document); 

И написанный код ниже, где нашел нападение XXE -

Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
System.out.println("outputing to : " + outputLocation); 
File outputFile = new File(outputLocation); 
StreamResult result = new StreamResult(outputFile); 
DOMSource source = new DOMSource(doc); 
transformer.transform(source, result); 

Пожалуйста, помогите, как я могу реализовать вышеприведенную рекомендацию в своем коде.

Может ли кто-нибудь помочь, где я не хватает предметов? Любая помощь приветствуется!

ответ

1

Вы хотите включить функцию защищенной обработки на TransformerFactory. Это будет ограничивать определенные возможности злобные вещи от случаться (DOS атаки и т.д.)

TransformerFactory tf = TransformerFactory.newInstance(); 
tf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
Transformer transformer = tf.newTransformer(); 
+0

Спасибо за ответ, да, но мне нужно реализовать DocumentBuilderFactory в существующей логике .... btw я использовал ваше задание, но получаю ошибку «Метод setFeature (String, boolean) не определен для типа Transformer». – SANNO

+0

Эх, извините, вам нужно установить его в TransformerFactory. – Kayaman

+0

Спасибо, Kayaman! его рабочий тон, но вы можете помочь заменить концепцию TransformerFactory концепцией DocumentBuilderFactory. На самом деле это будет заметно. – SANNO

0

Вы можете использовать тот же подход с DocumentBuilderFactory:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
... 

Для того, чтобы все использовать это автоматически, вам нужно создать собственная реализация (путем расширения той, которую вы используете в настоящее время, используйте отладчик, чтобы узнать). Задайте функцию в конструкторе.

Затем вы можете передать новый завод для использования в Системном свойстве javax.xml.parsers.DocumentBuilderFactory на виртуальную машину Java, и все будут использовать его.