{"schema":"threatline.record/2","record":{"id":"GHSA-grg2-7gc6-36m6","aliases":["GHSA-grg2-7gc6-36m6"],"summary":"gitcmd's hardened git diff wrapper still executes attacker-controlled filter.<driver>.clean via .gitattributes, a residual gap the code itself already documents","details":"## Summary\r\nReasonix Studio's `internal/gitcmd` package hardens git invocations against config-driven RCE (`core.fsmonitor=false`, `maintenance.auto=false`, `--no-ext-diff`, `--no-textconv`), but this hardening does not cover git's `filter.<driver>.clean`/`smudge` content-filter mechanism. Filter drivers are assigned per-file via `.gitattributes` and defined via `.git/config`, and are invoked independently of the diff-side flags already in place.\r\n\r\nThe desktop app's workspace-changes diff viewer (`desktop/workspace_changes.go`) runs `git diff --no-ext-diff --no-textconv` on a changed file. This still triggers the configured `clean` filter to produce the comparison blob, resulting in arbitrary command execution when a victim views the diff of a file whose repository carries a malicious `.gitattributes` + `.git/config` pair.\r\n\r\n## Impact\r\nArbitrary command execution with the privileges of the user running Reasonix, triggered by ordinary use of a default UI feature (viewing a file's diff) — no unusual action required beyond opening a poisoned project directory.\r\n\r\n## Attack Vector\r\nRequires both:\r\n\r\n1. A tracked `.gitattributes` entry assigning a filter driver to a file (survives a normal `git clone`).\r\n2. A local `.git/config` defining that driver's `clean` command (does not survive a plain clone — must arrive via archive/tarball, synced/shared folder, CI cache, or devcontainer image built with `COPY . .`).\r\n\r\n## Affected Versions\r\n\r\n- `esengine/DeepSeek-Reasonix` (Reasonix Studio): main branch commit `ea28602` and tagged pre-release `studio-v2.9.0`\r\n- npm package `reasonix` < 1.39.3\r\n\r\n## Fixed Versions\r\n2.21.0 (Reasonix Studio), 1.39.3 (npm package)\r\n\r\n## Remediation\r\nOptions include passing explicit `-c filter.<name>.clean=` / `smudge=` overrides for every driver name found in the repository's `.gitattributes` before diffing untrusted content, enforcing a fixed allowlist of trusted filter drivers, or reading blob contents via `git cat-file`/go-git to avoid invoking filters entirely for byte-level diffs.","categories":["Unclassified"],"product":"reasonix","vendor":"","ecosystem":null,"affected_ranges":[{"source":"GitHub Advisory Database","source_url":"https://github.com/esengine/DeepSeek-Reasonix/security/advisories/GHSA-grg2-7gc6-36m6","source_modified_at":"2026-09-29T05:12:30Z","fetched_at":"2026-10-26T19:10:57.178988Z","package":{"ecosystem":"npm","name":"reasonix"},"range":"< 1.39.3"},{"source":"GitHub Advisory Database","source_url":"https://github.com/esengine/DeepSeek-Reasonix/security/advisories/GHSA-grg2-7gc6-36m6","source_modified_at":"2026-09-29T05:12:30Z","fetched_at":"2026-10-26T19:10:57.178988Z","package":{"ecosystem":"other","name":"Reasonix Studio"},"range":"< 2.21.0"}],"fixed_versions":[{"source":"GitHub Advisory Database","source_url":"https://github.com/esengine/DeepSeek-Reasonix/security/advisories/GHSA-grg2-7gc6-36m6","source_modified_at":"2026-09-29T05:12:30Z","fetched_at":"2026-10-26T19:10:57.178988Z","package":{"ecosystem":"npm","name":"reasonix"},"version":"1.39.3"},{"source":"GitHub Advisory Database","source_url":"https://github.com/esengine/DeepSeek-Reasonix/security/advisories/GHSA-grg2-7gc6-36m6","source_modified_at":"2026-09-29T05:12:30Z","fetched_at":"2026-10-26T19:10:57.178988Z","package":{"ecosystem":"other","name":"Reasonix Studio"},"version":"2.21.0"}],"cvss":null,"severity":"Critical","kev":{"listed":false},"epss":{"probability":null,"percentile":null,"score_date":null},"published_at":"2026-09-29T04:02:58Z","modified_at":"2026-09-29T05:12:30Z","provenance":[{"source":"GitHub Advisory Database","url":"https://github.com/esengine/DeepSeek-Reasonix/security/advisories/GHSA-grg2-7gc6-36m6","fetched_at":"2026-10-26T19:10:57.178988Z","source_modified_at":"2026-09-29T05:12:30Z"}],"sources":["GitHub Advisory Database"],"references":[],"locations":[],"motoko_assessment":{"status":"requires_architecture_review","automatic_remediation":false},"classification":{"method":"product-first software-layer rules","rules_version":"2.1","matched_on":null,"confidence":"unknown","reviewed":false},"change_timestamp":"2026-09-29T05:12:30Z","content_hash":"450b83245f9444f9796e3048804115c84ac58591dec195e8b9bec827b910187f"}}
