pchickey opened PR #13429 from pchickey:fix_ghsa_2r75_main to bytecodealliance:main:
In
wasmtime-wasi, when a filesystem preopen is givenDirPerms::all()andFilePerms::READwithoutFilePerms::WRITE, this wasmtime-wasi enforced access control mechanism can be bypassed by using the wasip2descriptor.open-ator wasip1path_openinterfaces by opening a file withOpenFlags::TRUNCATEoflag only, for example:dir_descriptor.open_at( PathFlags::empty(), FILENAME, OpenFlags::TRUNCATE, DescriptorFlags::READ, )wasip1::path_open( dir_fd, 0, FILENAME, wasip1::OFLAGS_TRUNC, wasip1::RIGHTS_FD_READ, 0, 0 )The root cause is that the clause that considered
OpenFlags::TRUNCATEdid not setopen_mode |= OpenMode::WRITE;, used later in that function for the access control check againstFilePermsfor whether opening that file is permitted. With the bug corrected, these calls toopen-atandpath_openfail witherror-code.not-permittedandERRNO_PERMrespectively.The bug in
crates/wasi/src/filesystem.rs,Dir::open_at, lines 967–969:if oflags.contains(OpenFlags::TRUNCATE) { opts.truncate(true).write(true); }and the single line fix is:
if oflags.contains(OpenFlags::TRUNCATE) { opts.truncate(true).write(true); open_mode |= OpenMode::WRITE; }Only 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:builder.preopened_dir("readonly", "readonly", DirPerms::READ | DirPerms::MUTATE, FilePerms::READ);In particular, the Wasmtime project's
wasmtime-cli's use of wasmtime-wasi is not affected, because it always setsFilePerms::all()for all preopens.
pchickey requested wasmtime-wasi-reviewers for a review on PR #13429.
pchickey requested dicej for a review on PR #13429.
pchickey requested wasmtime-core-reviewers for a review on PR #13429.
:thumbs_up: dicej submitted PR review.
pchickey updated PR #13429.
pchickey has enabled auto merge for PR #13429.
pchickey added PR #13429 Fix wasmtime-wasi path_open(TRUNCATE) bypass of FilePerms::WRITE check to the merge queue.
:check: pchickey merged PR #13429.
pchickey removed PR #13429 Fix wasmtime-wasi path_open(TRUNCATE) bypass of FilePerms::WRITE check from the merge queue.
Last updated: Jun 01 2026 at 09:49 UTC