Skip to content

[verify] proof 由来の language が無検証で className に入る (#210 と同種の構造) #248

Description

@shinyaoguri

背景

#210 (proof の mode による XSS) の修正作業中に見つかった、同種の構造。

tabState.language は proof.json の language フィールド由来で、無検証のまま採用されている:

  • packages/verify/src/services/JsonFileProcessor.ts:47parsed.language ?? 'unknown'
  • packages/verify/src/services/ZipFileProcessor.ts:201 — 同上

これが ResultPanel

codeEl.className = `language-${language} hljs with-line-numbers`;

に到達する。

影響

XSS ではない。 innerHTML ではなく className への代入なので、マークアップ注入は起こらない。攻撃者ができるのは code 要素に任意の CSS クラス名を足すことだけで、現状 verify の CSS に汎用ユーティリティクラス (.hidden など) が無いため実害も確認されていない。

問題は構造のほうで、#210 とまったく同じ「TypeScript の型を信用して proof 由来の値をそのまま使う」パターンが残っていること。将来 verify の CSS にユーティリティクラスが入ると、表示を隠す / 崩すといった悪用が成立しうる。

修正案

mode に対して #210 で入れた normalizeProofMode と同じ方針で、language も allowlist (シンタックスハイライトが対応する言語 ID) で正規化し、未知値は 'unknown' に落とす。

packages/verify/src/services/proofMode.ts (#210 で追加) と同じ場所に置くと、「proof 由来の自己申告ラベルは正規化してから使う」という方針が 1 箇所にまとまる。

あわせて、proof 由来の値を型キャストだけで採用している箇所が他に無いか洗うとよい。

出典

2026-08-02 のプロジェクト全体レビューの follow-up (#210 の修正中に発見)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    code-review2026-07 多角レビュー由来pkg:verifypackages/verify + verify-clisecurityセキュリティ (XSS/DoS/偽造等)severity:medium中程度の問題

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions