| name | Exception Handling Vulnerabilities |
| description | This skill should be used when the user asks about "XXE", "XML External Entity", "error handling", "exception disclosure", "stack trace exposure", "improper error handling", or needs to find exception-related vulnerabilities during whitebox security review. |
| version | 1.0.0 |
Exception Handling Vulnerabilities
Purpose
Provide detection patterns for vulnerabilities related to improper exception and error handling, including XXE (XML External Entity) injection, stack trace disclosure, and authentication bypass via exceptions.
OWASP Top 10 Mapping
Category: Context-dependent
Improper exception handling is not a standalone official OWASP Top 10 bucket. In practice, findings from this skill often map to:
- A05 - Security Misconfiguration
- A08 - Software and Data Integrity Failures
- A03 - Injection, when XXE or parser misuse is the concrete issue
CWEs:
- CWE-390: Detection of Error Condition Without Action
- CWE-392: Missing Report of Error Condition
- CWE-460: Improper Cleanup on Thrown Exception
- CWE-611: Improper Restriction of XML External Entity Reference (XXE)
- CWE-755: Improper Handling of Exceptional Conditions
When to Use
Activate this skill when:
- Searching for XML parsing vulnerabilities
- Reviewing error handling code
- Looking for information disclosure via exceptions
- Finding authentication/authorization bypass via exception paths
XXE (XML External Entity) Injection
Overview
XXE occurs when XML parsers process external entity references in untrusted XML input, allowing attackers to read files, perform SSRF, or cause DoS.
Detection Patterns
Java
grep -rniE "DocumentBuilderFactory|SAXParserFactory|XMLInputFactory|TransformerFactory|SchemaFactory|XMLReader" --include="*.java"
grep -rniE "setFeature.*FEATURE_SECURE_PROCESSING|setFeature.*disallow-doctype-decl|setExpandEntityReferences.*false" --include="*.java"
Vulnerable Pattern:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(userInputStream);
Secure Pattern:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Python
grep -rniE "xml\.etree\.ElementTree|xml\.dom\.minidom|xml\.sax|lxml\.etree" --include="*.py"
grep -rniE "defusedxml|defused" --include="*.py"
Vulnerable Pattern:
import xml.etree.ElementTree as ET
tree = ET.parse(user_input)
Secure Pattern:
import defusedxml.ElementTree as ET
tree = ET.parse(user_input)
PHP
grep -rniE "simplexml_load|DOMDocument|XMLReader|SimpleXMLElement" --include="*.php"
grep -rniE "libxml_disable_entity_loader|LIBXML_NOENT" --include="*.php"
Vulnerable Pattern:
$xml = simplexml_load_string($userInput);
Secure Pattern:
libxml_disable_entity_loader(true);
$xml = simplexml_load_string($userInput, 'SimpleXMLElement', LIBXML_NOENT);
Go
grep -rniE "xml\.Unmarshal|xml\.Decoder|xml\.NewDecoder" --include="*.go"
Note: Go's encoding/xml does not process external entities by default, making it safe from XXE. However, third-party libraries may be vulnerable.
TypeScript/JavaScript
grep -rniE "xml2js|fast-xml-parser|libxmljs|DOMParser|parseFromString" --include="*.ts" --include="*.js"
Vulnerable Pattern:
const parser = new DOMParser();
const doc = parser.parseFromString(userInput, "text/xml");
Stack Trace / Error Disclosure
Overview
Exposing stack traces or detailed error messages to users reveals internal paths, library versions, and application structure.
Detection Patterns
Java
grep -rniE "printStackTrace|getStackTrace|\.getMessage\(\)" --include="*.java"
grep -rniE "response\.getWriter\(\).*exception|sendError.*getMessage" --include="*.java"
Vulnerable Pattern:
catch (Exception e) {
response.getWriter().println(e.getMessage());
e.printStackTrace(response.getWriter());
}
Python
grep -rniE "traceback\.print_exc|traceback\.format_exc|sys\.exc_info" --include="*.py"
grep -rniE "DEBUG.*=.*True|app\.debug.*=.*True" --include="*.py"
Vulnerable Pattern:
except Exception as e:
return jsonify({"error": traceback.format_exc()})
PHP
grep -rniE "display_errors|error_reporting|var_dump|print_r" --include="*.php"
Vulnerable Pattern:
ini_set('display_errors', 1);
error_reporting(E_ALL);
Go
grep -rniE "debug\.PrintStack|runtime\.Stack|debug\.Stack" --include="*.go"
grep -rniE "http\.Error.*err\.Error\(\)|json\..*err\.Error\(\)" --include="*.go"
Vulnerable Pattern:
if err != nil {
http.Error(w, err.Error(), 500)
}
TypeScript
grep -rniE "\.stack|Error\(\)\.stack|console\.error" --include="*.ts"
Empty Catch Blocks
Overview
Empty catch blocks silently swallow exceptions, potentially hiding security failures or allowing bypasses.
Detection Patterns
grep -rniE "catch\s*\([^)]+\)\s*\{\s*\}" --include="*.java"
grep -rniE "except.*:\s*pass" --include="*.py"
grep -rniE "catch\s*\([^)]+\)\s*\{\s*\}" --include="*.php"
grep -rniE "catch\s*\([^)]*\)\s*\{\s*\}" --include="*.ts"
Vulnerable Pattern:
try {
authenticateUser(token);
} catch (AuthenticationException e) {
}
Exception-Based Authentication Bypass
Overview
When authentication/authorization logic is inside try blocks, exceptions may allow bypass.
Detection Patterns
grep -rniE "try.*\{[^}]*(authenticate|authorize|checkPermission|isAdmin)" --include="*.java" --include="*.py" --include="*.go" --include="*.ts" --include="*.php"
grep -rniE "catch.*\{[^}]*(continue|return true|return null)" --include="*.java"
Vulnerable Pattern:
boolean isAuthorized = false;
try {
isAuthorized = authService.checkPermission(user, resource);
} catch (Exception e) {
log.error("Auth check failed", e);
}
Resource Exhaustion via Exceptions
Overview
Repeated exception generation can exhaust resources (CPU, memory, logs).
Detection Patterns
grep -rniE "(for|while).*\{[^}]*throw new|try.*\{[^}]*(for|while)" --include="*.java" --include="*.py" --include="*.go"
grep -rniE "catch.*\{[^}]*throw|except.*raise" --include="*.java" --include="*.py"
Language-Specific Secure Patterns
Java - Safe Exception Handling
catch (Exception e) {
logger.error("Operation failed", e);
throw new ApiException("An error occurred", 500);
}
Python - Safe Exception Handling
except Exception as e:
logger.exception("Operation failed")
return jsonify({"error": "An error occurred"}), 500
Go - Safe Exception Handling
if err != nil {
log.Printf("operation failed: %v", err)
http.Error(w, "Internal server error", 500)
}
PHP - Safe Exception Handling
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_log($e->getMessage());
echo json_encode(["error" => "An error occurred"]);
TypeScript - Safe Exception Handling
catch (error) {
logger.error('Operation failed', { error });
res.status(500).json({ error: 'An error occurred' });
}
Verification Steps
- Find XML parsers → Check if external entities are disabled
- Find catch/except blocks → Check if they're empty or expose details
- Find error responses → Check if stack traces or internal errors are included
- Find auth in try blocks → Check exception handling doesn't bypass auth
- Test XXE → Send payload with external entity reference
XXE Test Payloads
<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://internal-server/admin">]>
<foo>&xxe;</foo>
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
]>
<lolz>&lol3;</lolz>
CWE References
| CWE | Name | Description |
|---|
| CWE-390 | Detection Without Action | Exception caught but not handled |
| CWE-392 | Missing Report | Exception not logged/reported |
| CWE-460 | Improper Cleanup | Resources not cleaned on exception |
| CWE-611 | XXE | XML parser processes external entities |
| CWE-755 | Improper Handling | Generic exception handling issues |