Skip to content

[deps] serde_yaml 0.9(メンテナンス終了)から保守されている YAML crate へ移行する #530

Closed

Description

@Kewton

背景

未保守の 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.toml
  • Cargo.lock
  • deny.toml
  • tests/issue530_yaml_migration.rs
  • tests/corpus/apps/issue530-yaml-migration/expectations.toml
  • tests/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 を実行する。

参照

根拠

  • 依存の入口: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。

関連

Activity

  1. added 2 commits that reference this issue on Oct 12, 2026
  2. Kewton commented on Oct 12, 2026

    @Kewton
    OwnerAuthor

    PR #664 で develop に merge しました(6b264fab、CI・acceptance success)。RUSTSEC-2024-0449 の一時除外も外れています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions