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)
認証を担当するシステム
認証の流れは次の通り
- ユーザーがSPへアクセス
- SPがIdPへ SAML Request を送信
- IdPがユーザーを認証
- IdPが SAML Response をSPへ返す
- 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パーサの挙動
を理解しておくことが重要