GHSA-JR45-52CW-69H5

Vulnerability from github – Published: 2026-06-18 17:20 – Updated: 2026-06-18 17:20
VLAI
Summary
NL Portal Backend Libraries: Document contents remained downloadable by any logged-in user (incomplete fix of CVE-2026-49463)
Details

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

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "Maven",
        "name": "nl.nl-portal:documenten-api"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "3.0.3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-54683"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-285",
      "CWE-639"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-06-18T17:20:14Z",
    "nvd_published_at": null,
    "severity": "MODERATE"
  },
  "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\u0027s contents could be fetched in two ways, and neither verified the caller\u0027s 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 \u2014 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/\u003canother-users-document-id\u003e/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\u0027s identifier. Document identifiers are random and hard to guess, which limits \u2014 but does not prevent \u2014 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)",
  "id": "GHSA-jr45-52cw-69h5",
  "modified": "2026-06-18T17:20:14Z",
  "published": "2026-06-18T17:20:14Z",
  "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"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ],
  "summary": "NL Portal Backend Libraries: Document contents remained downloadable by any logged-in user (incomplete fix of CVE-2026-49463)"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…