XMLコメントによるSAML認証の回避

SAMLの署名検証とユーザー識別でXMLコメントの解釈を一致させる

説明

XMLコメントでテキストが分割され、SAMLアプリケーションがNameIDなどの値の一部だけを読むと、署名で検証した値とログイン先のアカウントが異なる場合があります。コメントを除外する正規化では、コメント追加後も署名が有効なことがあります。コメントだけで署名のないアサーションを信頼できるようになる、という意味ではありません。

想定される影響

  • 識別子の取得処理に不備がある場合の、別アカウントでのログイン
  • 誤って選択したアカウントのデータや機能へのアクセス

対処方法

  1. サポート対象のSAMLライブラリーを使い、コメントを含む識別子の読み取り方を確認してください。署名を検証したアサーションから完全な識別子を取得します。
  2. 実際のSAML処理で使うXMLパーサーを、コメントを無視する設定にしてください。setIgnoreComments(true)は補助設定であり、認証検証全体の代わりにはなりません。
  3. 信頼するIdPの鍵で署名を検証し、発行者、対象サービス、受信者、有効時間と、そのフローで必要なリクエストとの対応を確認してください。

例

従来のOpenSAML 2系のorg.opensaml.xml.parse.BasicParserPoolを設定する抜粋です。初期化と実際のSAML処理への組み込みは省略しています。使用する版のAPIとセキュリティ構成に合わせて適用してください。

変更前

java
import org.opensaml.xml.parse.BasicParserPool;

public class InsecureSAMLConfig {
    public void configureParser() {
        BasicParserPool parserPool = new BasicParserPool();
        parserPool.setIgnoreComments(false); // XMLコメントを保持
    }
}

変更後

java
import org.opensaml.xml.parse.BasicParserPool;

public class SecureSAMLConfig {
    public void configureParser() {
        BasicParserPool parserPool = new BasicParserPool();
        parserPool.setIgnoreComments(true); // XMLコメントを無視する。SAMLの検証は別途必要
    }
}

変更前はコメントを保持し、変更後は解析時に無視します。この設定だけですべてのSAML認証回避を防げるわけではありません。

参考資料