{"id":"GHSA-2r75-cxrj-cmph","revision":"2eb12311a9564de0bd7c2fd49f3584c4","records":[{"revision":"2eb12311a9564de0bd7c2fd49f3584c4","observedAt":"2026-10-24T13:19:54.901+00:00","statement":{"source":"osv","id":"GHSA-2r75-cxrj-cmph","aliases":["CVE-2026-47261","RUSTSEC-2026-0149"],"title":"wasmtime-wasi: WASI path_open(TRUNCATE) bypasses `FilePerms::WRITE` host restriction","description":"## Summary\n\nIn `wasmtime-wasi`, when a filesystem preopen is given `DirPerms::all()` and `FilePerms::READ` without `FilePerms::WRITE`,  this wasmtime-wasi enforced access control mechanism can be bypassed by using the wasip2 `descriptor.open-at` or wasip1 `path_open` interfaces by opening a file with `OpenFlags::TRUNCATE` oflag only, for example:\n\n```rust\ndir_descriptor.open_at(\n   PathFlags::empty(),\n   FILENAME,\n   OpenFlags::TRUNCATE,\n   DescriptorFlags::READ,\n)\n```\n\n```rust\nwasip1::path_open(\n    dir_fd,\n    0,\n    FILENAME,\n    wasip1::OFLAGS_TRUNC,\n    wasip1::RIGHTS_FD_READ,\n    0,\n    0\n)\n```\n\nThe root cause is that the clause that considered `OpenFlags::TRUNCATE` did not set `open_mode |= OpenMode::WRITE;`, used later in that function for the access control check against `FilePerms` for whether opening that file is permitted. With the bug corrected, these calls to `open-at` and `path_open` fail with `error-code.not-permitted` and `ERRNO_PERM` respectively.\n\nThe bug in `crates/wasi/src/filesystem.rs`, `Dir::open_at`, lines 967–969:\n\n```rust\nif oflags.contains(OpenFlags::TRUNCATE) {\n    opts.truncate(true).write(true);\n}\n```\nand the single line fix is:\n```rust\nif oflags.contains(OpenFlags::TRUNCATE) {\n    opts.truncate(true).write(true);\n    open_mode |= OpenMode::WRITE;\n}\n```\n\nOnly wasmtime-wasi embeddings that use a combination of DirPerms::MUTATE with FilePerms::READ are affected by this bug, e.g. those that use in the `WasiCtxBuilder`:\n```rust\nbuilder.preopened_dir(\"readonly\", \"readonly\", DirPerms::READ | DirPerms::MUTATE, FilePerms::READ);\n```\n\nIn particular, the Wasmtime project's `wasmtime-cli`'s use of wasmtime-wasi is not affected, because it always sets `FilePerms::all()` for all preopens.","state":0,"publishedAt":"2026-06-05T15:47:02+00:00","modifiedAt":"2026-09-10T03:51:07.5202257+00:00","affected":[{"ecosystem":"crates.io","name":"wasmtime-wasi","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"37.0.0"},{"kind":"fixed","version":"44.0.2"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"crates.io","name":"wasmtime-wasi","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"25.0.0"},{"kind":"fixed","version":"36.0.10"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"crates.io","name":"wasmtime-wasi","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"24.0.9"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-2r75-cxrj-cmph","https://nvd.nist.gov/vuln/detail/CVE-2026-47261","https://github.com/bytecodealliance/wasmtime","https://github.com/bytecodealliance/wasmtime/releases/tag/v24.0.9","https://github.com/bytecodealliance/wasmtime/releases/tag/v36.0.10","https://github.com/bytecodealliance/wasmtime/releases/tag/v44.0.2","https://github.com/bytecodealliance/wasmtime/releases/tag/v45.0.0","https://rustsec.org/advisories/RUSTSEC-2026-0149.html"],"sourceUrl":"https://github.com/advisories/GHSA-2r75-cxrj-cmph","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-2r75-cxrj-cmph","identifiers":["GHSA-2r75-cxrj-cmph","CVE-2026-47261","RUSTSEC-2026-0149"]},"retained":false,"historicalAffected":[]}],"coverage":[]}