코드에 대해 보안 감사를 실시했으며 코드가 외부 엔터티 (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);
위의 권장 사항을 코드에 어떻게 구현할 수 있습니까?
내가 누락 된 부분을 도와 줄 수있는 사람이 있습니까? 누구나 도움을 주실 수 있습니다!
응답 주셔서 감사합니다. 예,하지만 기존 로직에서 DocumentBuilderFactory를 구현해야합니다 .... btw 주어진 제안을 사용했지만 오류가 발생합니다. "setFeature (String, boolean) 메서드는 Transformer 형식에 대해 정의되지 않았습니다." – SANNO
죄송합니다. TransformerFactory에서 설정해야합니다. – Kayaman
고마워요 카야 만! 그것의 잘 작동하지만 DocumentBuilderFactory 개념으로 TransformerFactory 개념을 대체하는 데 도움이 될 수 있습니다. 정말 감사 할 것입니다. – SANNO