Skip to main content

XML injection (XXE) - Unmarshaller

Description

The XML unmarshaller is not configured securely. It allows to read a source of XML data and bind its values to a new instance of an object.

Impact

  • Escalate attack to compromise the underlying server or other back-end infrastructure.
  • Allow an attacker to view files on the application server filesystem.
  • Interact with any back-end or external systems that the application itself can access.
  • Disclosure of confidential data.

Recommendation

The XML unmarshaller should be configured securely so that it does not allow external entities as part of an incoming XML attack.

Threat

Anonymous attacker from the Internet.

Expected Remediation Time

โŒš 120 minutes.

Score

Default score using CVSS 3.1. It may change depending on the context of the vulnerability.

Base

  • Attack vector: N
  • Attack complexity: L
  • Privileges required: N
  • User interaction: N
  • Scope: U
  • Confidentiality: L
  • Integrity: L
  • Availability: N

Temporal

  • Exploit code madurity: P
  • Remediation level: O
  • Report confidence: X

Result

  • Vector string: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N/E:P/RL:O/RC:X
  • Score:
    • Base: 6.5
    • Temporal: 5.9
  • Severity:
    • Base: Medium
    • Temporal: Medium

Code Examples

Compliant code

The XML unmarshaller is securely configured to avoid displaying sensitive information

public class XmlToObject {
public static void main(String[] args) {
try {
File file = new File("user.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
User que= (User) jaxbUnmarshaller.unmarshal(file);
//Do credential treatment in a secure way, not allowing external entries
}catch{
....
}
}
}

Non compliant code

The XML unmarshaller displays sensitive information without validating credentials

public class XmlToObject {
public static void main(String[] args) {
try {
File file = new File(userInput);
JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
User que= (User) jaxbUnmarshaller.unmarshal(file);
//Printing credentials without validating external entries
System.out.println(que.getId()+" "+que.getUsername());
System.out.println("Credentials:");
List<Credential> list=que.getCredentials();
for(Credential ans:list)
System.out.println(ans.getId()+" "+ans.getCredentialname()+" "+ans.getPostedby());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}

Requirements