CVE-2026-54683: NL Portal Backend Libraries Document Contents Remained Downloadable By Vulnerability

MODERATE
Advisory Identifier: GHSA-jr45-52cw-69h5
CVSS 6.5
CWE-639 CWE-285
Published
Advisory Summary

CVE-2026-54683 is a MODERATE (CVSS 6.5) document contents remained downloadable by vulnerability (CWE-639: Authorization Bypass Through User-Controlled Key) affecting NL Portal Backend Libraries libraries in the Maven ecosystem. The issue involves document contents remained downloadable by any logged-in user (incomplete fix of cve-2026-49463). Remediation is available by upgrading affected packages to version 3.0.3.

CVE-2026-54683 at a Glance

CVE Identifier CVE-2026-54683
GHSA Identifier GHSA-jr45-52cw-69h5
Severity MODERATE
CVSS v3.1 Base Score 6.5
CWE Classification CWE-639: Authorization Bypass Through User-Controlled Key
Affected Product NL Portal Backend Libraries
Package Ecosystem Maven
Published Date
Last Updated

Security Impact

CVSS: 6.5

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required Low (PR:L)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality High (C:H)
Integrity None (I:N)
Availability None (A:N)

How to Fix CVE-2026-54683

To remediate this vulnerability, upgrade all affected NL Portal Backend Libraries dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

nl.nl-portal:documenten-api fixed: 3.0.3
<dependency>
    <groupId>nl.nl-portal</groupId>
    <artifactId>documenten-api</artifactId>
    <version>3.0.3</version>
</dependency>
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

mvn dependency:tree -Dincludes=nl.nl-portal

How to Check if You Are Affected

To determine whether your Java application is affected by CVE-2026-54683, inspect your build dependencies using the Maven Dependency Plugin:

mvn dependency:tree -Dincludes=nl.nl-portal

Analyze the terminal output to locate any version of NL Portal Backend Libraries in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 3.0.3), your application is affected.

Note: The mvn dependency:tree -Dincludes=nl.nl-portal command inspects the resolved dependency graph declared in your project's POM files; it does not perform automated security scanning or inspect runtime dynamic classpaths. Always verify runtime container classpaths and shaded JARs.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-639: Authorization Bypass Through User-Controlled Key, where the system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data. In NL Portal Backend Libraries, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Summary A previous advisory (CVE-2026-49463 / GHSA-qpm9-h556-mwxm) reported that any logged-in user could download any document by its identifier, and stated this was fixed in 3.0.1. For the document-content part that fix was **incomplete**: documents remained downloadable by any authenticated user in 3.0.1 and 3.0.2, and the issue was only fully resolved in **3.0.3**. ## Relationship to CVE-2026-49463 This advisory is a follow-up to CVE-2026-49463. That advisory described the problem on the GraphQL `getDocumentContent` query and listed `nl.nl-portal:documenten-api` as fixed in 3.0.1. In practice: - The 3.0.1 change added an authentication parameter to the GraphQL query but never used it, so the query kept returning any document regardless of ownership. - The same flaw also existed on a REST endpoint that the original advisory did not cover, and that endpoint was not changed in 3.0.1 or 3.0.2. Both were removed in 3.0.3, which is the first release where the document-content issue is actually fixed. ## What was wrong A document's contents could be fetched in two ways, and neither verified the caller's relationship to the document: - a REST endpoint: `GET /api/documentapi/{documentapi}/document/{documentId}/content` - a GraphQL query: `getDocumentContent` Being logged in was required, but that was the *only* check — there was no per-document authorization. (A security rule meant to guard the REST endpoint also pointed at the wrong URL and never took effect; even if it had, it would only have required a login, not ownership.) ## Proof of concept While logged in as any portal user, request a document that belongs to someone else: ``` GET /api/documentapi/openzaak/document/<another-users-document-id>/content ``` The server returns the document contents (HTTP 200), even though the caller has no relationship to that document. The `getDocumentContent` GraphQL query behaves the same way. ## Impact A logged-in user could read the contents of documents belonging to other people. In a citizen or business portal these documents can contain sensitive personal information. To exploit this, an attacker needs a valid login and a target document's identifier. Document identifiers are random and hard to guess, which limits — but does not prevent — abuse, since identifiers can leak through other channels. ## Patches Fixed in **3.0.3**. Both the REST endpoint and the GraphQL query were removed entirely. Document contents can now only be downloaded through endpoints that first confirm the caller is allowed to see the document: - one that requires the caller to have a role on the related case (*zaak*); - one that requires the caller to own the message (*bericht*) the document is attached to. If your application relied on the removed endpoints, switch to one of these case- or message-scoped download endpoints. ## Workarounds If you cannot upgrade immediately, block the path `GET /api/documentapi/*/document/*/content` and the `getDocumentContent` GraphQL query at your gateway or reverse proxy, and remove any client code that calls them. There is no setting that adds the missing per-document check in affected versions; upgrading (or removing the endpoints) is the only complete fix. ## References - Related advisory: GHSA-qpm9-h556-mwxm (CVE-2026-49463) - Fix commits: 6e738a87 (GraphQL query removed, PR #690), e326e6db (REST endpoint removed) - Affected module: `nl.nl-portal:documenten-api` ## Credits Reported by Ray Sabee, https://whitehatsecurity.nl/ (independent security researcher). Github handle: [raysabee](https://github.com/raysabee)

CVE-2026-54683 Affected NL Portal Backend Libraries Versions

1 component(s)
Fixed Versions:
3.0.3
Product / Package Ecosystem Affected Versions Fixed Version
nl.nl-portal:documenten-api
Maven
< 3.0.3
3.0.3

References

Frequently Asked Questions

What is CVE-2026-54683?
CVE-2026-54683 is a security vulnerability in NL Portal Backend Libraries involving Document contents remained downloadable by any logged-in user (incomplete fix of CVE-2026-49463) under CWE-639: Authorization Bypass Through User-Controlled Key.
Which NL Portal Backend Libraries versions are affected?
Affected versions include releases prior to 3.0.3 across affected packages: nl.nl-portal:documenten-api.
What version fixes CVE-2026-54683?
Upgrading to 3.0.3 (or the latest patched release for your respective branch) resolves the vulnerability.
Is documenten-api affected?
Yes, nl.nl-portal:documenten-api is affected in releases prior to 3.0.3. Upgrade your dependency to 3.0.3 or later.
What is the CVSS score of CVE-2026-54683?
CVE-2026-54683 has a CVSS v3.1 base score of 6.5 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N.
What CWE is associated with CVE-2026-54683?
CVE-2026-54683 is classified under CWE-639: Authorization Bypass Through User-Controlled Key (The system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data.).
How can I check Maven dependencies for CVE-2026-54683?
Run the dependency tree command: 'mvn dependency:tree -Dincludes=nl.nl-portal'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-jr45-52cw-69h5",
  "modified" : "2026-06-18T17:20:14Z",
  "published" : "2026-06-18T17:20:14Z",
  "aliases" : [ "CVE-2026-54683" ],
  "summary" : "NL Portal Backend Libraries: Document contents remained downloadable by any logged-in user (incomplete fix of CVE-2026-49463)",
  "details" : "## Summary\n\nA previous advisory (CVE-2026-49463 / GHSA-qpm9-h556-mwxm) reported that any logged-in user could download any document by its identifier, and stated this was fixed in 3.0.1. For the document-content part that fix was **incomplete**: documents remained downloadable by any authenticated user in 3.0.1 and 3.0.2, and the issue was only fully resolved in **3.0.3**.\n\n## Relationship to CVE-2026-49463\n\nThis advisory is a follow-up to CVE-2026-49463. That advisory described the problem on the GraphQL `getDocumentContent` query and listed `nl.nl-portal:documenten-api` as fixed in 3.0.1. In practice:\n\n- The 3.0.1 change added an authentication parameter to the GraphQL query but never used it, so the query kept returning any document regardless of ownership.\n- The same flaw also existed on a REST endpoint that the original advisory did not cover, and that endpoint was not changed in 3.0.1 or 3.0.2.\n\nBoth were removed in 3.0.3, which is the first release where the document-content issue is actually fixed.\n\n## What was wrong\n\nA document's contents could be fetched in two ways, and neither verified the caller's relationship to the document:\n\n- a REST endpoint: `GET /api/documentapi/{documentapi}/document/{documentId}/content`\n- a GraphQL query: `getDocumentContent`\n\nBeing logged in was required, but that was the *only* check — there was no per-document authorization. (A security rule meant to guard the REST endpoint also pointed at the wrong URL and never took effect; even if it had, it would only have required a login, not ownership.)\n\n## Proof of concept\n\nWhile logged in as any portal user, request a document that belongs to someone else:\n\n```\nGET /api/documentapi/openzaak/document/<another-users-document-id>/content\n```\n\nThe server returns the document contents (HTTP 200), even though the caller has no relationship to that document. The `getDocumentContent` GraphQL query behaves the same way.\n\n## Impact\n\nA logged-in user could read the contents of documents belonging to other people. In a citizen or business portal these documents can contain sensitive personal information. To exploit this, an attacker needs a valid login and a target document's identifier. Document identifiers are random and hard to guess, which limits — but does not prevent — abuse, since identifiers can leak through other channels.\n\n## Patches\n\nFixed in **3.0.3**. Both the REST endpoint and the GraphQL query were removed entirely. Document contents can now only be downloaded through endpoints that first confirm the caller is allowed to see the document:\n\n- one that requires the caller to have a role on the related case (*zaak*);\n- one that requires the caller to own the message (*bericht*) the document is attached to.\n\nIf your application relied on the removed endpoints, switch to one of these case- or message-scoped download endpoints.\n\n## Workarounds\n\nIf you cannot upgrade immediately, block the path `GET /api/documentapi/*/document/*/content` and the `getDocumentContent` GraphQL query at your gateway or reverse proxy, and remove any client code that calls them. There is no setting that adds the missing per-document check in affected versions; upgrading (or removing the endpoints) is the only complete fix.\n\n## References\n\n- Related advisory: GHSA-qpm9-h556-mwxm (CVE-2026-49463)\n- Fix commits: 6e738a87 (GraphQL query removed, PR #690), e326e6db (REST endpoint removed)\n- Affected module: `nl.nl-portal:documenten-api`\n\n## Credits\n\nReported by Ray Sabee, https://whitehatsecurity.nl/ (independent security researcher). Github handle: [raysabee](https://github.com/raysabee)",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "nl.nl-portal:documenten-api"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "3.0.3"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/nl-portal/nl-portal-backend-libraries/security/advisories/GHSA-jr45-52cw-69h5"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/nl-portal/nl-portal-backend-libraries/pull/690"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/nl-portal/nl-portal-backend-libraries/commit/6e738a876ff9f581991b5b070706100b5516e183"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/nl-portal/nl-portal-backend-libraries/commit/e326e6db862f71f76dd46d3b17cbb5fa6f2fba02"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/nl-portal/nl-portal-backend-libraries"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-285", "CWE-639" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-06-18T17:20:14Z",
    "nvd_published_at" : null
  }
}