Repository navigation
[deps] serde_yaml 0.9(メンテナンス終了)から保守されている YAML crate へ移行する #530
Description
背景
未保守の YAML parser を、保守されている依存へ移行する。2026-10 に RUSTSEC-2024-0449 が依存監査で検出された。旧 serde_yaml 0.9 経由の unsafe-libyaml 0.2.11 が原因で、PR #663 では #530 の移行まで advisory を一時除外している。移行 PR でこの除外を解除する。
H-24 の着手前調査(2026-10-13、develop cffbcaa の export)で、現在の参照は src 内 16 ファイル・140 行・149 token と確認した。単位テスト用 source も含む。tests の Rust source に直接参照はない。調査の export は 2026-09-30 時点の develop なので、実装は最新の develop で参照の一覧を取り直す(rename で src を変えない方針は同じ)。
移行先と理由
yaml_serde 0.10.7 を採用する。 YAML 組織が保守する fork で、依存名を serde_yaml のまま維持できる。既存の Value / Mapping / Tagged / Number と Serde visitor、Error の行・列 API を保持するため、既存 source の機械置換や検証層の書き換えが不要。
3 候補について exact version / default feature の依存の木と、advisory 除外なしの依存監査を比較した。いずれも候補単体・本体依存グラフで advisory / bans / licenses / sources を通過し、ライセンス許可の追加は不要だった。
| 候補 | parser 依存と結果 | 判断 |
|---|---|---|
| yaml_serde 0.10.7 | libyaml-rs 0.3.0。unsafe-libyaml なし。現行 API と診断に互換。MSRV 1.82 | 採用 |
| serde-saphyr 1.3.0 | granit-parser 1.3.0。libyaml 系なし。汎用 Value / Mapping がなく、本体の MSRV 1.88 に対し 1.89 を要求 | 現行の任意 key / tag 契約の設計変更が大きい |
| noyalib 0.0.57 | native safe Rust parser。libyaml 系なし。Mapping の文字列キー化、tagged key のタグ消失、既定の重複キー受理、診断位置の差 | strict 設定だけでは現行契約を満たさない |
yaml_serde が使う libyaml-rs は archived unsafe-libyaml を YAML 組織が引き継いだ unsafe Rust の fork。pure safe Rust の parser に置換する変更ではない。今回の目的である未保守の依存の除去、既知 advisory の解消、現行の厳格性・秘匿契約の維持に適合する。serde_yaml_ng 0.10 は unsafe-libyaml に依存するため採用しない。
対処の方向
- YAML dependency を
serde_yaml = { package = "yaml_serde", version = "0.10.7" }とし、既存の依存名を維持する。解決版を lock で固定する。調査は exact 0.10.7 で測定した。 - legacy package と unsafe-libyaml を依存グラフから除去し、一時 advisory 除外を解除する。旧版を dev-dependency として残さない。
- 既存の strict visitor、拡張構文の拒否、サイズ・深さ・配列上限、schema 検証、verify-policy、秘匿処理を維持する。
- 今回の旧版測定を期待値として corpus fixture と新規統合テストに保存する。公開 API を用い、妥当/不正 pack・plan、workflow version、診断位置、タグ・複合 key・scrub 後の key collision を確認する。
- 成長上限ファイルを変更せず、baseline を引き上げない。イベント、runtime state、既存の検証・受入・証跡・リリース gate の契約を変えない。
対象ファイル
Cargo.tomlCargo.lockdeny.tomltests/issue530_yaml_migration.rstests/corpus/apps/issue530-yaml-migration/expectations.tomltests/corpus/apps/issue530-yaml-migration/fixtures/compatibility.json
受け入れ条件
- 解決した依存に旧 serde_yaml、unsafe-libyaml、その他の既知 unmaintained / unsound advisory を持つ crate が残っていない。
- RUSTSEC-2024-0449 の一時除外とその説明を解除した状態で
cargo deny checkが成功する。他の監査 gate やライセンス許可を緩めない。 - 既存 YAML fixture と新規互換 corpus を検証し、現在受理する入力を維持し、現在拒否する入力を受理に変えていない。negative fixture の parser 受理と業務 schema の受理を混同しない。
- duplicate、unknown field、tag、anchor/alias、merge、多文書、非文字列 key、サイズ・深さ・配列上限の検証が同等以上で、構文/型/契約エラーの理由と行・列が保持される。
- タグ/複合 mapping key/数値 secret の型と scrub 契約を維持し、key collision による既存値の消失や秘密文字列の残留がない。
- 成長上限 baseline とイベント/runtime state の schema を変えず、既存の検証・受入・証跡・リリース gate を緩めていない。
-
cargo fmt --all -- --check、cargo clippy --all-targets -- -D warnings、cargo test、既存 CI / corpus の gate が成功する。公開 MSRV の整合を確認し、実装検証を H-24 の局所試験で代替しない。
調査結果
133 入力(tracked YAML 90、既存 inline YAML 9、境界/異常入力 34)で、旧版と yaml_serde の受理/拒否、型・値・タグ・任意 key、直列化結果、エラー文言・行・列の差は 0。既存の pack 53、plan validation 3、workflow schema 7、秘匿処理 64、計 127 件の局所テストが成功した。追加の小さい互換試験は 2 件成功。
本体の lock 差は serde_yaml / unsafe-libyaml の削除と yaml_serde / libyaml-rs の追加だけだった。測定は Rust 1.94.0 / cargo-deny 0.20.2。全 suite、fmt、clippy、GUI feature と実 Rust 1.88 のビルドはこの調査では未実施であり、実装時に通常の gate を実行する。
参照
- H-24 報告:workspace/tmp/1007/wave1/results/H-24/report.md
- RUSTSEC-2024-0449 原文
- yaml_serde 0.10.7 API、manifest、libyaml-rs の保守と由来
- serde-saphyr 1.3.0 API / MSRV / parser
- noyalib 0.0.57 API、Mapping、strict 設定
- 一時除外 PR #663
根拠
- 依存の入口:Cargo.toml:43。現行 allow list:deny.toml:20–30。
- 拡張拒否・strict visitor・上限:src/planner/pack/strict_yaml.rs:17,27,28,32,34,49,58,131,145,148,156,169,173。
- 既存の duplicate / unknown / extension / 多文書 / 非文字列 key テスト:src/planner/pack/tests.rs:74,221。
- 診断位置の取得:src/planner/plan/validation.rs:111,143,201,254。位置の既存テスト:src/planner/plan/validation.rs:348,360。
- 任意 key と tag の秘匿契約:src/sensitive_data/redaction.rs:339,349,362,381,423。回帰テスト:src/sensitive_data/tests.rs:1164,1176,1188。
- version の数値 Value:src/workflow/schema.rs:50,52,53,60。
- 成長上限の src/planner/runner.rs、src/minimal_loop/loop_run.rs、src/minimal_loop/loop_run/runtime_bash_effects.rs に直接参照なし。隣のテストのみ src/minimal_loop/loop_run/issue440_tests.rs:84 に参照があるが、rename により変更不要。
- corpus case と fixture の自動 discovery:tests/corpus_regression.rs:85,267。runner の追加変更は不要。
- 方針:AGENTS.md と docs/dev/dev-guardrails.md。
関連
- [deps] 依存関係の既知脆弱性とメンテナンス終了の対応(rustls、next/sharp、crossbeam-epoch、anyhow、pytest、serde_yaml) #520:依存関係の既知脆弱性への対応。
- [audit] 2026-09-27 品質監査の指摘一覧(トラッキング) #525:品質監査トラッキング。
- PR [deps] Temporarily ignore RUSTSEC-2024-0449 (unsafe-libyaml) until #530 #663:[deps] serde_yaml 0.9(メンテナンス終了)から保守されている YAML crate へ移行する #530 までの一時除外。この Issue の移行 PR で解除する。
Activity
Merge pull request #663 from Kewton/chore/deny-ignore-unsafe-libyaml
Merge pull request #664 from Kewton/feature/issue-530-deps-serde-yaml…
Kewton commentedon Oct 12, 2026
PR #664 で develop に merge しました(6b264fab、CI・acceptance success)。RUSTSEC-2024-0449 の一時除外も外れています。