Skip to content
Heist/ feed
Back to feed
Critical

DB-GPT 0.8.0 Path Traversal Arbitrary File Write via Skill Upload Filename

Type: advisorySources: OSV

DB-GPT builds the destination path for an uploaded skill from the multipart filename without constraining it to the upload directory. skill_upload in packages/dbgpt-app/src/dbgpt_app/openapi/api_v1/agentic_data_api.py takes file.filename as given and writes the request body to upload_dir / filename. A path composed with that operator discards the left operand when the right one is absolute and follows parent references otherwise, so a filename such as ../../../tmp/x or /tmp/x resolves outside the intended directory; nothing canonicalises the result, checks that it remains under the upload root, or prevents a .py suffix. The route's only dependency is get_user_from_headers in dbgpt_serve/utils/auth.py, which returns a request carrying the admin role whether or not a user_id header is supplied, so the endpoint is reachable without credentials. A remote attacker holding no account can therefore write attacker-controlled bytes to any path the server process can write, place a new Python module inside the application package or replace one the application already imports, and obtain code execution in the server process when that module is next imported.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-80104
Confirmed fixed CVEs
Not specified
Updated in this feed
4 Nov 2026, 19:32 UTC · Revision 1

Source evidence

DB-GPT 0.8.0 Path Traversal Arbitrary File Write via Skill Upload Filename

core-osv · Original source

Published 25 Aug 2026, 20:18 UTC

DB-GPT builds the destination path for an uploaded skill from the multipart filename without constraining it to the upload directory. skill_upload in packages/dbgpt-app/src/dbgpt_app/openapi/api_v1/agentic_data_api.py takes file.filename as given and writes the request body to upload_dir / filename. A path composed with that operator discards the left operand when the right one is absolute and follows parent references otherwise, so a filename such as ../../../tmp/x or /tmp/x resolves outside the intended directory; nothing canonicalises the result, checks that it remains under the upload root, or prevents a .py suffix. The route's only dependency is get_user_from_headers in dbgpt_serve/utils/auth.py, which returns a request carrying the admin role whether or not a user_id header is supplied, so the endpoint is reachable without credentials. A remote attacker holding no account can therefore write attacker-controlled bytes to any path the server process can write, place a new Python module inside the application package or replace one the application already imports, and obtain code execution in the server process when that module is next imported.

osv:CVE-2026-80104
Complete source record
{
  "id": "d956e7d1a81b5707281da960c16ff8bd7ac23d791a1b56d57e1370e663471a73",
  "url": "https://osv.dev/vulnerability/CVE-2026-80104",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "DB-GPT 0.8.0 Path Traversal Arbitrary File Write via Skill Upload Filename",
    "summary": "DB-GPT builds the destination path for an uploaded skill from the multipart filename without constraining it to the upload directory. skill_upload in packages/dbgpt-app/src/dbgpt_app/openapi/api_v1/agentic_data_api.py takes file.filename as given and writes the request body to upload_dir / filename. A path composed with that operator discards the left operand when the right one is absolute and follows parent references otherwise, so a filename such as ../../../tmp/x or /tmp/x resolves outside the intended directory; nothing canonicalises the result, checks that it remains under the upload root, or prevents a .py suffix. The route's only dependency is get_user_from_headers in dbgpt_serve/utils/auth.py, which returns a request carrying the admin role whether or not a user_id header is supplied, so the endpoint is reachable without credentials. A remote attacker holding no account can therefore write attacker-controlled bytes to any path the server process can write, place a new Python module inside the application package or replace one the application already imports, and obtain code execution in the server process when that module is next imported.",
    "evidence": "osv:CVE-2026-80104",
    "products": [],
    "severity": "critical",
    "structured": {
      "id": "CVE-2026-80104",
      "aliases": [
        "CVE-2026-80104"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/eosphoros-ai/db-gpt",
              "type": "GIT",
              "events": [
                {
                  "introduced": "a3f21350a97aa713e6223b052984dd5d939233f2"
                },
                {
                  "fixed": "177bfc84f77e7f7760c055a748b0e4bb82d9fa47"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0.8.0"
                      },
                      {
                        "fixed": "0.8.1"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                  },
                  {
                    "range": [
                      {
                        "fixed": "177bfc84f77e7f7760c055a748b0e4bb82d9fa47"
                      }
                    ],
                    "source": "REFERENCES_TAG",
                    "original_tag": "v0.8.1"
                  }
                ]
              }
            }
          ],
          "versions": [
            "v0.8.0"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-80104.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:38.832936124Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/80xxx/CVE-2026-80104.json",
        "https://github.com/eosphoros-ai/DB-GPT/releases/tag/v0.8.1",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-80104",
        "https://www.vulncheck.com/advisories/db-gpt-0.8.0-path-traversal-arbitrary-file-write-via-skill-upload-filename",
        "https://github.com/eosphoros-ai/DB-GPT",
        "https://pypi.org/project/dbgpt-app/",
        "https://github.com/eosphoros-ai/DB-GPT/blob/v0.8.0/packages/dbgpt-app/src/dbgpt_app/openapi/api_v1/agentic_data_api.py"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-22"
        ],
        "cna_assigner": "VulnCheck",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/80xxx/CVE-2026-80104.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-80104",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 506213,
  "published_at": "2026-08-25T20:18:35.843+00:00"
}