This article explains, step by step, how to implement and operate WSO2 API Manager’s gateway-level “advanced threat protection” to mitigate injection-class attacks and malformed payload abuse using Regular Expression Threat Protection and JSON/XML Threat Protection, including practical implementation details, tuning, and testing guidance to reduce false positives and keep performance predictable.[1][2]
Why gateway threat protection matters
Even with OAuth2 at the gateway, malicious or malformed requests can still reach backends if payloads, headers, and query strings aren’t inspected and constrained; WSO2 APIM’s gateway can block these at ingress by scanning request components with curated patterns and enforcing structural limits before routing.[2][1]
What WSO2 provides
- Regular Expression Threat Protection:
- Scans JSON/XML payloads, query parameters, URI paths, and headers against configurable malicious patterns to prevent SQL injection and other code-injection vectors; requests are blocked if any match occurs.[1]
- JSON Threat Protection:
- Enforces limits such as max properties, max key length, max string length, max array elements, and overall JSON size to stop oversize or deeply nested payload abuse.[1]
- XML Threat Protection:
- Enforces limits like max depth, element and attribute counts, attribute value length, entity expansion limits, and DTD enable/disable to mitigate XXE, entity expansion, and parser abuse.[1]
WSO2 positions these as “advanced threat protection”; effectiveness depends on rule quality, realistic limits, and continuous tuning based on real attack traffic.[2][1]
Where and how to attach protections
WSO2 supports attaching protections at the API’s ingress using policies or sequences, with operational policies preferred in newer versions; historically, protections were attached as “in-sequence” mediation for each API and republishing was required to apply changes.[3][4][5]
- APIM 4.1.0+:
- Use the Policies view to apply gateway threat protectors at the operation/API level via operational policies rather than legacy runtime sequences.[4][3]
- Legacy/sequence-based deployments:
- Upload the mediation sequence (in-sequence) with the protector configuration, select it under Message Mediation for the API, and republish; verify it is deployed under synapse-configs/default/sequences with the correct API-direction naming.[5]
Implementing Regular Expression Threat Protection
1) Decide inspection surface
- Include URI path segments, query parameters, headers, and body (JSON/XML); protectors can scan “candidate values” across these components.[1]
2) Start with a curated pattern set
- Include case-insensitive SQLi probes and meta-characters typical of naïve injection attempts:
- Common SQL keywords and control characters: select, union, update, delete, insert, drop, alter, create, exec, ‘, --, /*, */
- Time-based and boolean probes: sleep, benchmark, or/and with tautologies
- Script/HTML fragments that indicate XSS/script injection:
- XPath/SSI patterns if relevant to backends: ancestor, descendant, #include, #exec
- WSO2 examples and community regex show blocking of SQL and HTML/script tokens in the same pattern chain; adjust for your payloads to avoid blocking legitimate content.[3][1]
3) Configure the policy/sequence
- Add the Regular Expression Threat Protection mediator/policy and supply the combined pattern string; ensure it runs early in the in-sequence so malicious requests are rejected before other processing.[3][1]
4) Fail fast behavior
- Configure the mediator to immediately block on first match and return an error response from the gateway, preventing backend contact; this is the default posture described for the feature.[1]
5) Tuning to reduce false positives
- Narrow patterns using word boundaries or tokenization for SQL keywords to avoid matching innocent words.
- Use case-insensitive flags rather than listing multiple case variants.
- Provide allowlists for specific parameters/paths known to legitimately contain special characters; split inspection by context where possible.
- Iterate based on real traffic and attack simulations; WSO2 emphasizes ongoing refinement of rules for effectiveness.[2][1]
6) Validate deployment
- Apply the policy, republish the API, and confirm the deployed artifact in synapse sequences (for sequence-based setups); use test requests to confirm matches block correctly and innocuous traffic passes.[5]
Implementing JSON Threat Protection
1) Identify realistic limits per API
- Derive limits from production payloads and OpenAPI schemas: max object properties, key length, string length, array size, and total JSON size; WSO2 warns that limits introduce some overhead, so set them realistically.[1]
2) Configure the JSON Threat Protection mediator/policy
- Set per-field thresholds:
- maxProperties
- maxKeyLength
- maxStringLength
- maxArrayElements
- maxJsonSize
- Attach as an in-sequence/operational policy and republish; the gateway will reject payloads exceeding thresholds before the backend parses them.[5][1]
3) Test and tune
- Send boundary and beyond-boundary payloads to validate rejects and measure latency impact; incrementally raise limits if legitimate traffic is blocked, or lower when abuse bypass persists.[1]
Implementing XML Threat Protection
1) Map XML risks and parser behavior
- Address entity expansion (billion laughs), external entities (XXE), deep nesting, and excessive attributes/children; the protector exposes explicit controls for each.[1]
2) Configure limits
- maxDepth
- maxElementCount
- maxAttributeCount
- maxAttributeLength
- entityExpansionLimit
- childrenPerElementLimit
- DTD enable/disable (disable where possible to remove XXE attack surface)
- Attach the policy in the in-sequence/operation and republish.[5][1]
3) Test with malicious XML
- Validate rejects for XXE, large entity expansions, and deep nesting; measure performance and adjust limits to match real documents.[1]
Operational best practices
- Prefer operational policies (APIM 4.1+) to attach protectors per operation with better lifecycle and scope control, replacing older sequence-first workflows.[4][3]
- Combine protectors:
- Use regex scanning plus JSON/XML structural limits on APIs that accept bodies; regex covers code-injection probes while structural limits stop parser abuse and resource exhaustion.[1]
- Version and stage rules:
- Keep dev/stage/prod rule sets versioned; promote only after soak tests with attack traffic to reduce production false positives and latency spikes.[2][1]
- Monitor and iterate:
- Log protector blocks with sufficient context (API, operation, parameter) for forensics; update patterns as probes evolve—WSO2 stresses continuous improvement for real effectiveness.[2][1]
Testing and validation strategy
- Baseline with normal traffic replays to detect false positives before enabling in prod; ensure business-critical strings pass (e.g., product names containing “select”).
- Attack simulations:
- SQLi payloads in query params and JSON fields (boolean/time-based, stacked queries where applicable).
- XSS/script markers in text fields.
- JSON abuse: huge arrays, long strings, oversized payloads.
- XML abuse: deeply nested elements, large attribute counts, entity expansion, and XXE.
- Acceptance criteria:
- Injection probes blocked at gateway, backends untouched.
- Legitimate peak requests remain under latency SLOs; adjust limits or placement if not.
Performance considerations
- Regex scanning and structural checks add overhead; constrain inspection scope to relevant fields when feasible and set limits aligned to real payload sizes to control CPU and memory impact.[1]
- Test at concurrency to understand tail latency; consider placing heavy inspections on write endpoints where risk is higher.[1]
Putting it together: a practical rollout plan
- Phase 1 (visibility): Enable JSON/XML protectors with generous limits to build a baseline and identify normal payload shapes, and deploy regex protector in report-only mode if supported (or on non-prod) to collect matches without blocking.[4][5][1]
- Phase 2 (enforcement): Tighten JSON/XML thresholds to production norms; enable regex blocking on agreed pattern sets after QA with attack suites.[2][1]
- Phase 3 (refinement): Monitor block logs, tune patterns to reduce false positives, and update allowlists for context-specific fields; repeat quarterly or after major API changes.[2][1]
These gateway controls are strongest when combined with backend defenses (parameterized queries, ORM, server-side validation) but provide essential front-line protection that blocks common probes and malformed payloads before they ever reach application code.[2][1]
[1] https://wso2.com/library/articles/2018/12/enhancing-security-using-threat-protection-and-mutual-ssl-in-wso2-api-manager-gateway/
[2] https://wso2.com/api-management/api-security/
[3] https://stackoverflow.com/questions/79134689/how-to-prevent-xml-and-html-injection-in-wso2-apim-using-regex-or-other-ways
[4] https://github.com/wso2/docs-apim/issues/5875
[5] https://stackoverflow.com/questions/63884406/json-and-xml-threat-protection-in-wso2-api-manager-is-not-working
[6] https://wso2.com/library/articles/2018/12/enhancing-secur
[7] https://wso2.com/library/articles/2017/07/an-introduction-to-wso2-iot-architecture/
[8] https://openaccess.uoc.edu/server/api/core/bitstreams/f52446db-7ff0-42fc-9946-8385956f256d/content
Top comments (0)