背景
God file 分割(v3レビュー P1)完了: tools/brownfield_orchestrator.py 485行 → tools/brownfield/ パッケージ5モジュール + thin shim(commit 9578e6c・push 済)。振る舞い保存(baseline 前後比較 PASS)で後方互換維持。
本リファクタは「純粋構造リファクタ(A案)」であり、旧コード由来のセキュリティ指摘・バグは C案 として明示的に scope-out。本Issueに集約する。
詳細spec: docs/superpowers/specs/2026-07-01-brownfield-orchestrator-split-design.md
セキュリティ指摘(すべて旧コード由来・ロジット不改で転記)
HIGH
- path traversal / 認可不足:
tools/brownfield/ui.py _kick_orchestrator(out_root_dir, ...) が detect_latest_snapshot(out_root_dir) を呼ぶ際、out_root_dir が DEFAULT_OUT 配下にあることを検証していない
- 修正方向:
Path(out_root_dir).resolve().is_relative_to(DEFAULT_OUT.resolve()) チェック追加
- path traversal via symlink:
_sync_picker(selection) が選択パスを resolve するが PICKER_ROOT 配下の検証なし
- 修正方向: resolve 後に PICKER_ROOT 配下か検証
- Missing Auth / B104:
build_ui → auto_launch_with_increment が server_name='0.0.0.0'(share時)に bind。Gradio 認証なし
- 修正方向:
launch(auth=...) or localhost 制限・ネットワーク保護(B104 は debug 用・切替機構化)
MEDIUM
- TOCTOU:
_sync_picker で resolve したパスを _run_snapshot→run_brownfield_stream で使用。間に symlink 操作可能性
- 入力検証不足:
_kick_orchestrator の branch/qg/policy_override が無検証で runner に渡る
- 修正方向:
re.match(r'^[a-zA-Z0-9_\-/]+$', branch_final) 等
- B602:
utils.py stream_run が cmd 文字列時に shell=True(docs/security/phase1/REPORT.md で要精査判定)
- 修正方向: cmd 出所の trust boundary 確認・引数リスト形式への統一
既知バグ(振る舞い保存のため保持)
_do_phase フェーズ未実行: core.py run_brownfield_stream 内で _do_phase(...) が yield from _do_phase(...) でなく未消費呼出。structure/snapshot 等のフェーズ処理が一切走らない(generator が生成されるだけ)。baseline 4イベントはこのバグ挙動を含む
- 修正方向:
yield from _do_phase(...) に修正後、baseline 再取得
テスト拡充
- 現状: smoke + baseline 比較(13テスト)のみ。各モジュールの単体テスト薄い
- 拡充: utils/core の純粋関数・streaming契約・エッジケース
関連
- v3レビュー P1(本リファクタ): 完了
- 監査ベースライン:
docs/security/baseline/REPORT.md・docs/security/phase1/REPORT.md
背景
God file 分割(v3レビュー P1)完了:
tools/brownfield_orchestrator.py485行 →tools/brownfield/パッケージ5モジュール + thin shim(commit 9578e6c・push 済)。振る舞い保存(baseline 前後比較 PASS)で後方互換維持。本リファクタは「純粋構造リファクタ(A案)」であり、旧コード由来のセキュリティ指摘・バグは C案 として明示的に scope-out。本Issueに集約する。
詳細spec:
docs/superpowers/specs/2026-07-01-brownfield-orchestrator-split-design.mdセキュリティ指摘(すべて旧コード由来・ロジット不改で転記)
HIGH
tools/brownfield/ui.py_kick_orchestrator(out_root_dir, ...)がdetect_latest_snapshot(out_root_dir)を呼ぶ際、out_root_dirがDEFAULT_OUT配下にあることを検証していないPath(out_root_dir).resolve().is_relative_to(DEFAULT_OUT.resolve())チェック追加_sync_picker(selection)が選択パスを resolve するが PICKER_ROOT 配下の検証なしbuild_ui→auto_launch_with_incrementがserver_name='0.0.0.0'(share時)に bind。Gradio 認証なしlaunch(auth=...)or localhost 制限・ネットワーク保護(B104 は debug 用・切替機構化)MEDIUM
_sync_pickerで resolve したパスを_run_snapshot→run_brownfield_streamで使用。間に symlink 操作可能性_kick_orchestratorの branch/qg/policy_override が無検証で runner に渡るre.match(r'^[a-zA-Z0-9_\-/]+$', branch_final)等utils.pystream_runが cmd 文字列時にshell=True(docs/security/phase1/REPORT.md で要精査判定)既知バグ(振る舞い保存のため保持)
_do_phaseフェーズ未実行:core.pyrun_brownfield_stream内で_do_phase(...)がyield from _do_phase(...)でなく未消費呼出。structure/snapshot 等のフェーズ処理が一切走らない(generator が生成されるだけ)。baseline 4イベントはこのバグ挙動を含むyield from _do_phase(...)に修正後、baseline 再取得テスト拡充
関連
docs/security/baseline/REPORT.md・docs/security/phase1/REPORT.md