12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SAML認証はなぜバイパスされるのか?XML署名検証と攻撃手法を整理

12
Posted at

SAML認証はなぜ破られるのか?仕組みと代表的なバイパス手法を整理

導入

SAML認証は企業システムで広く使われているSSOの仕組みです
しかし実際の脆弱性診断では SAML認証のバイパス が見つかるケースが珍しくありません

なぜSAML認証は破られてしまうのか

この記事では勉強会の内容を元に SAML認証の仕組みと脆弱性の背景 を整理します

この記事では次のことをまとめます

  • SAML認証の基本構造
  • SAMLレスポンスと署名検証の仕組み
  • SAML認証がバイパスされる理由
  • 開発者が理解しておくべきポイント

勉強会概要

イベント
PenTestSecJP

テーマ
攻撃者のためのSAML認証101


SAML認証とは

SAMLは SSO(Single Sign-On)を実現するための認証プロトコル

主に次の2つの役割が登場する

  • Service Provider(SP)
    アプリケーション側

  • Identity Provider(IdP)
    認証を担当するシステム

認証の流れは次の通り

  1. ユーザーがSPへアクセス
  2. SPがIdPへ SAML Request を送信
  3. IdPがユーザーを認証
  4. IdPが SAML Response をSPへ返す
  5. SPがレスポンスを検証しログイン成立

SAMLレスポンスの構造

SAML認証の核心は SAML Response

これは

IdPがSPに対して送る認証結果メッセージ

レスポンスには次の要素が含まれる

  • ResponseType

    • StatusResponseType
    • ResponseType
  • Assertion

    • ユーザー情報
    • 認証結果

実際のデータは XML形式


SAML認証で重要なXML署名

SAMLレスポンスには XML署名 が付与される
これによりレスポンスの改ざんを防ぐ

署名検証は大きく次の2つ

1 SignedInfoの検証

<SignedInfo> 要素には署名対象の情報が含まれる

検証の流れ

  • XMLを 正規化(Canonicalization)
  • 正規化した値から SignedInfo を生成
  • IdPの公開鍵で署名を検証

これにより

  • SignedInfo が改ざんされていないこと

を確認できる

重要ポイント

  • <KeyInfo> に含まれる証明書を そのまま信頼してはいけない
  • 信頼済み証明書との検証が必要

2 ReferenceのDigest検証

<Reference> 要素は

  • どのXML要素が署名対象か

を示している

検証の流れ

  • <Reference URI> が指す要素を取得
  • <Transform> を順番に適用
  • 正規化
  • ハッシュ値を計算
  • Digest値と一致するか確認

SAML認証はなぜバイパスされるのか

SAML認証のバイパスは主に次の原因で発生する

1 署名検証が正しく行われていない

よくあるミス

  • 署名検証を行っていない
  • Assertionのみ検証
  • Reference検証を行っていない

2 KeyInfoをそのまま信頼してしまう

XML内にある

<KeyInfo>

の公開鍵をそのまま使う実装

これを行うと

  • 攻撃者が自分の公開鍵を埋め込む
  • 自分で署名したレスポンスを送信
  • 検証が通る

という認証バイパスが可能になる


3 XML Signature Wrapping Attack

SAML脆弱性で最も有名な攻撃

特徴

  • 署名自体は正しい
  • しかし アプリが読むデータが別

  • 署名対象のAssertionは正しい
  • 攻撃用Assertionを追加
  • アプリがそちらを読んでしまう

結果

  • 署名は正常
  • 認証はバイパス

4 XMLパーサの挙動を利用する

XMLパーサの実装差異が原因になるケース

<!-- comment -->

をAssertion内部に入れる

パーサの挙動によっては

  • コメント前のテキストだけ取得
  • XML構造が意図せず変化

結果

  • 検証と実際の処理対象がズレる

なぜSAMLは問題が起きやすいのか

理由はシンプル

仕組みが非常に複雑

複雑なポイント

  • XML
  • XML署名
  • Canonicalization
  • Transform処理
  • 複雑な仕様

実装者が

  • 仕様を完全理解するのが難しい
  • ライブラリ依存が強い

結果

  • 検証ミス
  • パーサ依存バグ

が発生しやすい


技術者視点の考察

開発者として重要なのは

SAMLを自前実装しないこと

理由

  • XML署名は非常に複雑
  • 仕様理解が難しい
  • 実装ミスが認証バイパスに直結

実際

  • 多くのSAML脆弱性は 実装ミス

また最近の認証では

  • OAuth2
  • OpenID Connect

が主流になりつつある

理由

  • JSONベース
  • 実装がシンプル
  • セキュリティモデルが理解しやすい

新規システムでは

SAMLよりOpenID Connectを検討する価値が高い


学び

今回のポイント

  • SAML認証はXML署名によって安全性を担保している
  • 署名検証の実装ミスが認証バイパスを生む
  • XML Signature Wrapping Attackは代表的な攻撃
  • XMLパーサの挙動差でも脆弱性が生まれる
  • 新規導入ならOpenID Connectの方が扱いやすい

まとめ

SAMLはSSOを実現する重要な仕組み
しかし

  • XML
  • 署名
  • 複雑な仕様

が重なり 実装ミスによる脆弱性が発生しやすい

SAMLを扱う場合は

  • 署名検証の仕組み
  • XMLパーサの挙動

を理解しておくことが重要

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?