Skip to content

[Security/Robustness] JWT 署名検証が再シリアライズ依存で brittle (ワイヤのセグメントで検証すべき) #60

Description

@somasekimoto

問題

state node の JWT 署名検証 (InfraAuthToken::signing_message()) は、パース済みの header/payload 構造体を serde_json で再シリアライズして署名対象 (header_b64.payload_b64) を再構築している。

これは発行側の JSON バイト列と bit-exact に一致した場合しか検証が通らない:

  • フィールド順が異なると壊れる (実例: test_auth_generatorjson! はアルファベット順で、発行仕様と不一致 → PR fix(test-auth-generator): canonical JWT payload field order + auth-failure logging #58 で修正)
  • 空白・エスケープ・未知フィールドの差でも壊れる
  • monas-account の発行形式が通るのは、構造体のフィールド順がたまたま(または暗黙の取り決めで)一致しているため。account 側のリファクタで silent に全トークンが無効化されるリスクがある

修正方針

from_jwt はワイヤ上の header.payload セグメントをそのまま保持し、署名検証はそのセグメントに対して行う (JWS の標準的な検証方法)。再シリアライズは検証には使わない。

参考

PR #58 の実機検証で発覚。関連: #57 (委譲 JWT 検証の発行仕様整合)

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions