
Cloud Vulnerability DB
A community-led vulnerabilities database
CVE-2026-49463 is a missing per-user authorization vulnerability in the NL Portal backend libraries (nl-portal-backend-libraries) affecting two GraphQL API components: nl.nl-portal:documenten-api (all versions through 3.0.0, back to 0.2.2.RELEASE published 2023-08-31) and nl.nl-portal:besluiten (versions 1.5.0 through 3.0.0). The flaw allows any authenticated portal user to access documents and decision records belonging to other users. It was discovered during a penetration testing engagement in May 2026, first published on June 3, 2026, and formally added to the GitHub Advisory Database on July 8, 2026. The CVSS v3.1 base score is 6.5 (Medium) (GitHub Advisory, NL Portal Advisory).
The root cause is improper authorization (CWE-285) and exposure of sensitive information to unauthorized actors (CWE-200). Both vulnerable GraphQL resolvers — DocumentContentQuery.getDocumentContent() and BesluitenQuery — were declared without a CommonGroundAuthentication parameter on their method signatures, meaning the Spring framework never bound the authenticated principal into the resolver's call path. As a result, no per-user ownership check was ever performed: getDocumentContent accepted any document UUID and returned its raw content, while the six BesluitenQuery operations (getBesluiten, getBesluit, getBesluitAuditTrails, getBesluitAuditTrail, getBesluitDocumenten, getBesluitDocument) accepted filter arguments such as besluitType, identificatie, and zaak without scoping results to the calling user. The two endpoints chain naturally — an attacker can enumerate other users' document IDs via the decisions API and then exfiltrate document content via the document endpoint (GitHub Advisory).
Successful exploitation results in a high-confidentiality breach with no integrity or availability impact. Any authenticated portal user can enumerate decision records (including audit trails and attached documents) across the entire user base and download the raw content of any document by its UUID. Decisions in NL Portal frequently contain sensitive personal data such as benefit decisions, permits, and objections, making this a significant privacy risk for all portal users. The chained attack path — enumerate via getBesluiten, exfiltrate via getDocumentContent — enables systematic bulk data harvesting of other users' personal records (GitHub Advisory, NL Portal Advisory).
There is no public proof-of-concept exploit and no evidence of in-the-wild exploitation at this time (Feedly). Exploitation requires only a valid authenticated session on the portal (low privileges required), no user interaction, and is reachable over the network with low attack complexity, making it straightforward for any registered portal user to attempt. No threat actor attribution, CISA KEV listing, or exploit kit involvement has been reported. The EPSS score is not yet published.
getBesluiten endpoint with optional filter arguments (e.g., besluitType, identificatie, verantwoordelijkeOrganisatie, zaak, pageNumber) to list decision records across all users without any ownership restriction.query {
getBesluiten(pageNumber: 1) {
content {
id
identificatie
besluittype
zaak
documenten { id }
}
}
}getBesluitDocumenten or the embedded document references.getDocumentContent GraphQL query with each harvested document UUID to download the raw content of documents owned by other users.query {
getDocumentContent(id: "<victim-document-uuid>") {
content
bestandsnaam
}
}getBesluiten, getBesluit, getBesluitAuditTrails, getBesluitAuditTrail, getBesluitDocumenten, getBesluitDocument, or getDocumentContent.getBesluiten queries with varying filter parameters (besluitType, identificatie, zaak, pageNumber) in rapid succession; getDocumentContent queries referencing document UUIDs not associated with the authenticated user's own records.pageNumber values in getBesluiten queries (GitHub Advisory).Upgrade both affected packages to version 3.0.1 or later: nl.nl-portal:documenten-api (fix commit 32e0ebdf — adds CommonGroundAuthentication parameter to the resolver) and nl.nl-portal:besluiten (fix commit f592af1b — removes the entire BesluitenQuery module). Consumers relying on besluiten functionality must implement a replacement at the application layer with explicit per-user authorization before upgrading. For deployments that cannot upgrade immediately, block the following GraphQL operations at the API gateway: getDocumentContent, getBesluiten, getBesluit, getBesluitAuditTrails, getBesluitAuditTrail, getBesluitDocumenten, and getBesluitDocument. Additionally, review access logs to identify any unauthorized document or decision access that may have already occurred (GitHub Advisory, NL Portal Advisory).
Source: This report was generated using AI
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."