2016-11-17 6 views
2

코드에 대해 보안 감사를 실시했으며 코드가 외부 엔터티 (XXE) 공격에 취약하다는 점을 언급했습니다.XXE 공격을 방지하는 방법

설명 - XML 외부 개체 공격은 처리시 문서를 동적으로 작성하는 XML 기능의 이점을 누립니다. XML 엔티티를 사용하면 주어진 자원에서 동적으로 데이터를 포함 할 수 있습니다. 외부 엔티티는 XML 문서가 외부 URI의 데이터 을 포함 할 수있게합니다. 그렇지 않으면 외부 엔티티는 XML 파서가 URI (예 : 로컬 시스템 또는 원격 시스템의 파일)로 지정된 리소스에 액세스하도록합니다. 이 동작은 응용 프로그램을 XML로 노출시킵니다. External 로컬 시스템의 서비스 거부를 수행하고 로컬 컴퓨터의 파일에 무단으로 액세스하고 원격 컴퓨터를 검색하며 서비스 거부를 수행하는 데 사용할 수있는 엔터티 (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/임의 파일의 내용과 실체를 대체하려고 시도합니다.

Recommendation- 외부 XML을 수신 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); 

그리고 작성된 코드가 결선도 공격을 발견하는 곳 바로 아래입니다 -

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의 보안 처리 기능을 켜는 것이 좋습니다. 당신이 당신을 만들 필요가

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

모두가이 작업을 자동으로 사용하려면 : 그것은 당신이 DocumentBuilderFactory과 같은 방법을 사용할 수 있습니다

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

고마워요 카야 만! 그것의 잘 작동하지만 DocumentBuilderFactory 개념으로 TransformerFactory 개념을 대체하는 데 도움이 될 수 있습니다. 정말 감사 할 것입니다. – SANNO

0

(등 DOS 공격)을 발생하는 특정 악의적 인 일을 제한합니다 자체 구현 (현재 사용하고있는 것을 확장하여 디버거를 사용하여 찾아보십시오). 생성자에서 기능을 설정하십시오.

그런 다음 새 팩토리를 시스템 등록 정보 javax.xml.parsers.DocumentBuilderFactory에서 사용할 Java VM에 전달하면 모든 사람이이를 사용하게됩니다.