{"id":"CVE-2026-82732","aliases":["EEF-CVE-2026-82732","EUVD-2026-68927","GHSA-f7fq-hwq6-jhvv"],"status":"published","title":"Declared argument constraints not enforced on AshTypescript typed controller routes","description":"Improper Input Validation vulnerability in ash-project ash_typescript allows a remote attacker to submit argument values outside a declared allowlist or bound on typed-controller routes.\n\nAshTypescript.TypedController.RequestHandler in lib/ash_typescript/typed_controller/request_handler.ex calls Ash.Type.cast_input/3 and treats an {:ok, cast} result as fully validated. In Ash these are separate steps: cast_input/3 only coerces the term, while every constraint declared on the argument is applied by Ash.Type.apply_constraints/3, which this path never calls. Constraints such as one_of, max_length, min and max, and match are therefore inert, so a value outside a declared allowlist is accepted and passed to the route handler. Codegen renders the same constraints into the generated TypeScript types, so an allowlist appears enforced to a TypeScript caller while any other HTTP client ignores it. Empty-string to nil normalization also lives in apply_constraints, so the allow_nil?: false check accepts \"\" for a required argument.\n\nWhere a constraint gates a role, a status, or a sort direction, this becomes a privilege or state-machine bypass.\n\nThis issue affects ash_typescript: from 0.15.0 before 0.18.0.","severity":{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.00676,"percentile":0.52744,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-20"],"published":"2026-09-01T02:09:15Z","modified":"2026-10-28T02:30:27Z","fixes":[{"ecosystem":"Hex","package":"ash_typescript","fixed_in":["0.18.0"],"sources":["osv"]}],"affected":[{"source":"osv","ecosystem":"Hex","package":"ash_typescript","ranges":[{"type":"SEMVER","events":[{"introduced":"0.15.0"},{"fixed":"0.18.0"}]}],"versions":["0.15.0","0.15.1","0.15.2","0.15.3","0.16.0","0.17.0","0.17.1","0.17.2","0.17.3"]}],"products":[{"vendor":"ash-project","product":"ash_typescript"}],"references":[{"url":"https://github.com/ash-project/ash_typescript/security/advisories/GHSA-f7fq-hwq6-jhvv","tags":["related","vendor-advisory","exploit","advisory"]},{"url":"https://cna.erlef.org/cves/CVE-2026-82732.html","tags":["related","web"]},{"url":"https://osv.dev/vulnerability/EEF-CVE-2026-82732","tags":["related","web"]},{"url":"https://github.com/ash-project/ash_typescript/commit/21ab6f1229a4dccdb56bc37ed437d9672a0c4a4e","tags":["patch","fix"]},{"url":"https://github.com","tags":["web"]},{"url":"https://repo.hex.pm","tags":["web"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/82xxx/CVE-2026-82732.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-82732","tags":["advisory"]},{"url":"https://github.com/ash-project/ash_typescript","tags":["package"]},{"url":"https://hex.pm/packages/ash_typescript","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-82732","title":"Declared argument constraints not enforced on AshTypescript typed controller routes","description":"Improper Input Validation vulnerability in ash-project ash_typescript allows a remote attacker to submit argument values outside a declared allowlist or bound on typed-controller routes.\n\nAshTypescript.TypedController.RequestHandler in lib/ash_typescript/typed_controller/request_handler.ex calls Ash.Type.cast_input/3 and treats an {:ok, cast} result as fully validated. In Ash these are separate steps: cast_input/3 only coerces the term, while every constraint declared on the argument is applied by Ash.Type.apply_constraints/3, which this path never calls. Constraints such as one_of, max_length, min and max, and match are therefore inert, so a value outside a declared allowlist is accepted and passed to the route handler. Codegen renders the same constraints into the generated TypeScript types, so an allowlist appears enforced to a TypeScript caller while any other HTTP client ignores it. Empty-string to nil normalization also lives in apply_constraints, so the allow_nil?: false check accepts \"\" for a required argument.\n\nWhere a constraint gates a role, a status, or a sort direction, this becomes a privilege or state-machine bypass.\n\nThis issue affects ash_typescript: from 0.15.0 before 0.18.0.","status":"published","published":"2026-09-01T02:09:15.07Z","modified":"2026-09-01T14:55:02.304Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N","level":"medium","assessor":"cna"}],"cwes":["CWE-20"],"updated_at":"2026-11-02T13:40:46.161838Z"}],"euvd":[{"id":"EUVD-2026-68927","description":"Improper Input Validation vulnerability in ash-project ash_typescript allows a remote attacker to submit argument values outside a declared allowlist or bound on typed-controller routes.\n\nAshTypescript.TypedController.RequestHandler in lib/ash_typescript/typed_controller/request_handler.ex calls Ash.Type.cast_input/3 and treats an {:ok, cast} result as fully validated. In Ash these are separate steps: cast_input/3 only coerces the term, while every constraint declared on the argument is applied by Ash.Type.apply_constraints/3, which this path never calls. Constraints such as one_of, max_length, min and max, and match are therefore inert, so a value outside a declared allowlist is accepted and passed to the route handler. Codegen renders the same constraints into the generated TypeScript types, so an allowlist appears enforced to a TypeScript caller while any other HTTP client ignores it. Empty-string to nil normalization also lives in apply_constraints, so the allow_nil?: false check accepts \"\" for a required argument.\n\nWhere a constraint gates a role, a status, or a sort direction, this becomes a privilege or state-machine bypass.\n\nThis issue affects ash_typescript: from 0.15.0 before 0.18.0.","status":"published","published":"2026-09-01T02:09:15Z","modified":"2026-09-01T14:55:02Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N","level":"medium"}],"updated_at":"2026-11-02T18:01:18.264709Z"}],"nvd":[{"id":"CVE-2026-82732","description":"Improper Input Validation vulnerability in ash-project ash_typescript allows a remote attacker to submit argument values outside a declared allowlist or bound on typed-controller routes.\n\nAshTypescript.TypedController.RequestHandler in lib/ash_typescript/typed_controller/request_handler.ex calls Ash.Type.cast_input/3 and treats an {:ok, cast} result as fully validated. In Ash these are separate steps: cast_input/3 only coerces the term, while every constraint declared on the argument is applied by Ash.Type.apply_constraints/3, which this path never calls. Constraints such as one_of, max_length, min and max, and match are therefore inert, so a value outside a declared allowlist is accepted and passed to the route handler. Codegen renders the same constraints into the generated TypeScript types, so an allowlist appears enforced to a TypeScript caller while any other HTTP client ignores it. Empty-string to nil normalization also lives in apply_constraints, so the allow_nil?: false check accepts \"\" for a required argument.\n\nWhere a constraint gates a role, a status, or a sort direction, this becomes a privilege or state-machine bypass.\n\nThis issue affects ash_typescript: from 0.15.0 before 0.18.0.","status":"published","published":"2026-09-01T03:16:53.193Z","modified":"2026-09-01T21:15:00.147Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"medium","assessor":"secondary"}],"cwes":["CWE-20"],"updated_at":"2026-11-02T14:12:42.691315Z"}],"osv":[{"id":"CVE-2026-82732","title":"Declared argument constraints not enforced on AshTypescript typed controller routes","description":"Improper Input Validation vulnerability in ash-project ash_typescript allows a remote attacker to submit argument values outside a declared allowlist or bound on typed-controller routes.\n\nAshTypescript.TypedController.RequestHandler in lib/ash_typescript/typed_controller/request_handler.ex calls Ash.Type.cast_input/3 and treats an {:ok, cast} result as fully validated. In Ash these are separate steps: cast_input/3 only coerces the term, while every constraint declared on the argument is applied by Ash.Type.apply_constraints/3, which this path never calls. Constraints such as one_of, max_length, min and max, and match are therefore inert, so a value outside a declared allowlist is accepted and passed to the route handler. Codegen renders the same constraints into the generated TypeScript types, so an allowlist appears enforced to a TypeScript caller while any other HTTP client ignores it. Empty-string to nil normalization also lives in apply_constraints, so the allow_nil?: false check accepts \"\" for a required argument.\n\nWhere a constraint gates a role, a status, or a sort direction, this becomes a privilege or state-machine bypass.\n\nThis issue affects ash_typescript: from 0.15.0 before 0.18.0.","status":"published","published":"2026-09-01T02:09:15.07Z","modified":"2026-10-28T02:30:27.830258499Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N","level":"medium"}],"cwes":["CWE-20"],"updated_at":"2026-11-02T15:45:18.482949Z"},{"id":"EEF-CVE-2026-82732","title":"Declared argument constraints not enforced on AshTypescript typed controller routes","description":"## Summary\n\nImproper Input Validation vulnerability in ash-project ash_typescript allows a remote attacker to submit argument values outside a declared allowlist or bound on typed-controller routes.\n\n`AshTypescript.TypedController.RequestHandler` in `lib/ash_typescript/typed_controller/request_handler.ex` calls `Ash.Type.cast_input/3` and treats an `{:ok, cast}` result as fully validated. In Ash these are separate steps: `cast_input/3` only coerces the term, while every constraint declared on the argument is applied by `Ash.Type.apply_constraints/3`, which this path never calls. Constraints such as `one_of`, `max_length`, `min` and `max`, and `match` are therefore inert, so a value outside a declared allowlist is accepted and passed to the route handler. Codegen renders the same constraints into the generated TypeScript types, so an allowlist appears enforced to a TypeScript caller while any other HTTP client ignores it. Empty-string to `nil` normalization also lives in `apply_constraints`, so the `allow_nil?: false` check accepts `\"\"` for a required argument.\n\nWhere a constraint gates a role, a status, or a sort direction, this becomes a privilege or state-machine bypass.\n\nThis issue affects ash_typescript: from 0.15.0 before 0.18.0.\n\n## Configurations\n\nThe application exposes an AshTypescript typed controller over HTTP with at least one route argument carrying a `constraints` declaration that gates application behaviour.","status":"published","published":"2026-09-01T02:09:15.07Z","modified":"2026-09-08T03:30:04.089399911Z","cvss":[{"version":"4.0","score":6.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N","level":"medium"}],"cwes":["CWE-20"],"updated_at":"2026-11-02T15:46:33.520522Z"}]}}
