Case · DiggingBeagle record

WASI hard links let guests write files declared read-only across preopens

Wasmtime WASI allowed an authorized hard-link operation to bypass a read-only file preopen through a writable alias to the same inode.

Scope

Wasmtime WASI Preview 1, 2 and 3 in affected embedding configurations granting directory mutation with source-file read-only access. Fixed in supported branches 24.0.11, 36.0.12, 45.0.3 and 46.0.1. No arbitrary host escape established.

Assessment profile

Assessment method
Setting
research demonstration
Exploitation
demonstrated
Impact
Band 2 of 4
Evidence
Grade B
Remediation
fixed reported
AI role
AGAINST AI
Basis and provenance

GHSA-4ch3-9j33-3pmj documents the concrete wasip1/2/3 permission-interaction bypass and patch releases 24.0.11, 36.0.12, 45.0.3 and 46.0.1. The impact requires an embedding to expose mixed preopen rights, so this is not an unqualified generic Wasmtime escape.

Impact basis: Under a specific combination of writable directory preopens and read-only source files, the guest could hard-link and overwrite the original inode despite file-level permissions. No access outside all preopens or host code execution is shown.

Assessed Oct 19, 2026 using diggingbeagle.assessment/1.

At a glance

Claims & evidence

Implications

This defect is relevant to agent isolation when Wasmtime is used as an execution boundary. The advisory does not demonstrate reading outside all preopened directories, a host escape or generic remote code execution.

Controls and mitigations

  • Validate hard-link effects against both source and destination permissions and deny write aliases to read-only underlying objects.

Unknowns and contradictions

  • The fixed families include 24.0.11, 36.0.12, 45.0.3 and 46.0.1, depending on supported branch. Exact embedding permissions must be checked.

Sources and citation

Material revision history

  1. Oct 19, 2026 · Published version · first publication · revision 174
  2. Oct 19, 2026 · Canonical change recorded · material revision · revision 175Public fields changed: assessment_profile