Skip to content

[tests][planner] issue458 の昇格失敗の試験が読み取り専用の権限に頼り、root(Docker の uid 0)で落ちる #676

Closed

Description

@Kewton

背景

#667 の mutants を Docker で流したとき(L-47、2026-10-14)、変異なしの baseline が次の 1 本で止まりました。
planner::auto_recovery::tests::issue458::tests::issue458_finish_terminal_observation_and_transaction_matrix

  • 結果:promotion: unexpected promotion(src/planner/auto_recovery/issue458_tests.rs:509)
  • 同じイメージで、その 1 本だけを uid 0 と uid 1000 で流すと、uid 0 では FAILED、uid 1000 では ok でした(workspace/tmp/1007/wave1/results/L-47/diag-root.txt)。

L-47 以降の Docker の run は、非特権ユーザーを作って回避しています。#673 は、signal・削除を変異させる試験を隔離環境(Docker)で流すことを求めているので、root の container で baseline が落ちると、毎回その手間がかかります。また「baseline が落ちた」という誤った判断の元にもなります。
関連:#667、#673

問題

  • P1:promotion の mode は、workspace の app.txt を読み取り専用(set_readonly(true))にして、昇格の書き込みを失敗させています。root は DAC を無視するので、書き込みは成功して昇格が起き、試験が落ちます。製品の欠陥ではなく、試験が権限に頼っていることの問題です。
  • P2:root で黙って skip すると、その mode(昇格が失敗したら control を残す)の確認がなくなります。これは検証を緩めることになるので、とりません。
  • P3:同じく権限に依存する試験がほかにもあり、扱いがそろっていません。
    • src/tools/path_guard.rs:989〜:993:権限が効かないと黙って return する。
    • tests/missing_read_paths.rs:225〜:236:「run under an unprivileged account」と言って落ちる。
    • src/planner/recovery_contract_binding.rs:275:試験で読み取り専用にしている。root で落ちるかは未確認。

根拠(develop 739c441c)

  • src/planner/auto_recovery/issue458_tests.rs:395:試験の本体。
  • src/planner/auto_recovery/issue458_tests.rs:432〜:436:promotion の mode で app.txt を読み取り専用にする。
  • src/planner/auto_recovery/issue458_tests.rs:509:昇格が失敗したことを確かめる。
  • 昇格の経路:src/planner/auto_recovery.rs:1778 → src/planner/recovery_snapshot.rs:229(promote_treatment)→ :331(sync_source_tree)→ :351(std::fs::copy)。
  • 故障注入の前例:src/tools/os_sandbox/landlock.rs:696 の test_hooks(#[cfg(test)] の AtomicBool で、失敗を強制する)。

対処の方向

  1. promotion の mode の失敗を、権限に頼らない形にする。案:src/planner/recovery_snapshot.rs に #[cfg(test)] の故障注入の hook を置き、sync_source_tree の copy を失敗させる(landlock の test_hooks と同じ形)。読み取り専用の設定は、uid 1000 で今の経路を確かめるために残してもよい。
  2. hook は試験の build だけに入れ、製品の挙動は変えない。並列の試験に漏れないよう、同じ試験の中で必ず元に戻す(Drop で戻す guard など)。
  3. P3 の 3 本の扱いを分類する。どうしても権限が要る試験は、tests/missing_read_paths.rs と同じく、理由を出して落ちる形にそろえる。黙った return(path_guard.rs:990)は、理由を出す形に直すか、権限に頼らない形にする。
  4. docs/dev/parallel-dev-harness.md の mutants・Docker の規則に、uid 1000 で流すことを書く([tests][mutants] 変異試験が防御を外したまま kill(-1) などを実行し、利用者の全プロセスを止める #673 の規則と合わせる)。

受け入れ条件

  • issue458_finish_terminal_observation_and_transaction_matrix が uid 0 と uid 1000 の両方の Docker で pass し、promotion の mode が実際に昇格の失敗の経路を通る(treatment_promotion_failed: の event が出る)
  • 二点測定:hook による失敗を外すと、uid 0 で promotion の mode が落ちる
  • 製品の build に hook が入らない(#[cfg(test)])。製品の挙動・event・schema は変わらない
  • P3 の 3 本を分類した。黙って成功扱いになる試験を残していない(残すならその理由を書いた)
  • 検証・受入・証跡のゲートを緩めていない。成長上限の baseline を上げていない

対象ファイル

  • src/planner/auto_recovery/issue458_tests.rs
  • src/planner/recovery_snapshot.rs
  • src/tools/path_guard.rs
  • tests/missing_read_paths.rs
  • src/planner/recovery_contract_binding.rs
  • docs/dev/parallel-dev-harness.md

Activity

  1. added a commit that references this issue on Oct 15, 2026
  2. Kewton commented on Oct 15, 2026

    @Kewton
    OwnerAuthor

    PR #681 で merge しました(develop cde19baea311b50d83fa19174db576be38f7a1f7)。develop の CI・acceptance・Next.js domain oracles はすべて success です。

    • issue458 の matrix は Docker の uid 0 と uid 1000 の両方で pass しました。promotion の mode は、#[cfg(test)] の故障注入の hook(thread-local、workspace のパスで絞る、Drop で戻る)によって昇格の失敗の経路を通ります。
    • 二点測定:hook を外した写しでは、uid 0 で promotion: unexpected promotion で落ちました。HEAD では pass しました。
    • release の binary に hook の記号はありません。
    • P3:path_guard の黙った return は、理由を出して落ちる assert にしました。missing_read_paths は理由の文が必ず出るようにしました。この 2 本は uid 0 では理由を出して落ちます(対処の方向 3 どおり)。recovery_contract_binding は readonly のビットだけを見ているので、uid 0 でも pass します(変更なし)。
    • harness §3a に「baseline と mutation の両方を uid 1000 で流す」を足しました。
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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions