What changed
After v0.0.53, a bug showed one entry point skipping budgets that the others enforced. This release audited the whole family for the same pattern and for anything else hostile input could reach. Four findings were rated High and twenty-two Medium. Each fix landed with a test that failed before it, and a table now checks every limit on every entry point.
Fixed
- Every loader enforces every limit. The borrowed API, the CST,
read_with_config, the multi-document readers and values a typed target skips now charge the same budgets asfrom_str. A 540-byte billion-laughs document that the borrowed API used to expand is refused at once. - Aliases cannot build values deeper than
max_depth. A chain of anchors could build a value 10,000 levels deep from 22 KB and abort the process when it was dropped. - Long lines parse in linear time. One long line of flow entries used to cost quadratic time before any budget could stop it.
- Edits are depth-checked. A deeply nested fragment passed to the CST editors no longer overflows the stack.
- Output reads back as written. Flow strings holding
,or brackets, comments with line breaks,<<keys and verbatim tags now round-trip, and formatting hints can no longer be injected through tag names. - Schema validation is bounded. Patterns use a linear-time engine, violations are capped, and external
$refs are refused. - The satellites are hardened. The MCP server checks
HostandOriginon its SSE transport, walks paths from a root handle, and keeps file permissions on writes. The CLI creates its temporary files exclusively. The wasm module refuses cyclic or very deep values instead of trapping, and the LSP server survives malformed frames.
Security advisories
The fixes are published as GitHub security advisories against the affected crates, all fixed in 0.0.55. The core's eight are listed on the noyalib advisories page.
Upgrading
Bump every noyalib crate you use to 0.0.55. Some input accepted before is now refused:
- A verbatim tag
!<x>names exactly the tagx, as YAML 1.2.2 defines it. - An implicit key holding a flow collection longer than 1024 characters is an error.
- A CST stream over a stream-wide budget is refused.
- Schemas with lookaround or backreferences need
CompiledSchemaBuilder::backtracking_patternsto compile. - Rust users of
noya-cli:NoyavalidateCli::fileis nowfiles: Vec<PathBuf>. The command line is unchanged.