Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JWTセキュリティ入門

yuasa
September 03, 2023

 JWTセキュリティ入門

SECCON Beginners Live 2023「JWTセキュリティ入門」の発表資料です。

yuasa

September 03, 2023
Tweet

More Decks by yuasa

Other Decks in Programming

Transcript

  1. 2 湯浅 潤樹(Junki Yuasa) ⾃⼰紹介 l 奈良先端科学技術⼤学院⼤学 M2 l Webの認証・認可に関する研究

    l OAuth、OpenID Connect l SECCON Beginners CTF 2023 Web担当 l 【Web】double check l 【Web】oooauth @melonattacker
  2. 6 ユーザー情報を保持し、改ざん検知ができる⽂字列 JWT(JSON Web Token)とは l JWTの特徴 l 改ざんの検証が可能 l

    データがJSON形式で含まれる l URLに含めることが可能な⽂字列のみで構成 l JWTのユースケース l ログイン機能(認証) l アクセス許可(認可) l ユーザーについての情報保持 引⽤ : https://jwt.io/
  3. 7 ヘッダ、ペイロード、署名から構成される⽂字列 JWTの仕組み ヘッダ ペイロード 署名 JWT { “alg”: “HS256”,

    “typ”: “JWT” } { “sub”: “1234567890”, “name”: “yuasa”, } vTt6kB6gZVzx2_kUm0nqT45Mf sqw-10_aKRE17feCRs eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6In l1YXNhIn0.vTt6kB6gZVzx2_kUm0nqT45Mfsqw -10_aKRE17feCRs
  4. 8 ヘッダ、ペイロード、署名から構成される⽂字列 JWTの仕組み ヘッダ ペイロード 署名 JWT { “alg”: “HS256”,

    “typ”: “JWT” } { “sub”: “1234567890”, “name”: “yuasa”, } vTt6kB6gZVzx2_kUm0nqT45Mf sqw-10_aKRE17feCRs eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6In l1YXNhIn0.vTt6kB6gZVzx2_kUm0nqT45Mfsqw -10_aKRE17feCRs base64UrlEncode(header). base64UrlEncode(payload). signature
  5. 9 ヘッダにはアルゴリズムなどのメタ情報が含まれる l ヘッダで使⽤されるクレーム l alg : 署名に使⽤されるアルゴリズム l typ

    : トークンのタイプ l kid : 鍵のID l など l algで指定可能なアルゴリズム l none : 署名なし l HS256 : 共通鍵暗号⽅式 l RS256 : 公開鍵暗号⽅式 l など JWTの仕組み : ヘッダ { “alg”: “HS256”, “typ”: “JWT” }
  6. 10 ペイロードには実際に使⽤される情報が含まれる l 予約済みのクレームと⾃由指定のクレームが存在 l 予約済みのクレーム l iss : JWT発⾏者(サーバ)の識別⼦

    l sub : JWT主体の識別⼦ l aud : JWT利⽤者(クライアント)の識別⼦ l exp : 有効期限の終了⽇ l iat : 発⾏⽇時 l jti : ⼀意な識別⼦ JWTの仕組み : ペイロード { “sub”: “1234567890”, “name”: “yuasa”, }
  7. 11 署名はJWTの改ざん検証に⽤いられる l 鍵とメッセージを⼊⼒としてアルゴリズムを適⽤し署名作成 JWTの仕組み : 署名 鍵 メッセージ 署名

    (ハッシュ) vTt6kB6gZVzx2_kUm0nqT45Mf sqw-10_aKRE17feCRs base64UrlEncode(header). base64UrlEncode(payload) UAN8Fkh0g0Hzy6lwJCF7lFw06P 2rtA5v HS256 アルゴ リズム
  8. 12 ヘッダ、署名、ペイロードを検証する 検証の流れ l ヘッダを検証 l algが期待するアルゴリズムと⼀致するか など l 署名を検証(HS256の場合)

    l ヘッダとペイロードをドット[.]で連結しメッセージ作成 l HS256アルゴリズムを使⽤し、メッセージと鍵からハッシュ⽣成 l ⽣成されたハッシュと署名値が⼀致するか検証 l ペイロードを検証 l JWTの⽤途に応じてペイロードを検証する JWTの検証
  9. 14 JWTの検証、偽造、改ざん、脆弱性調査に使⽤可能 JWT関連ツール : jwt_tool $ python3 jwt_tool.py <JWT> https://github.com/ticarpi/jwt_tool

    $ python3 jwt_tool.py –t <URL> -rh “Authorization: <JWT>”-X a –I –pc username –pv admin 検証 脆弱性調査
  10. 16 アクセス制御にJWTを使⽤するケースを想定 想定するJWTの使⽤ケース guest APIサーバ JWT(user = [guest or admin])付与

    JWT(user = [guest or admin])で アクセス ログイン ✅ user=adminの場合、flagを返す ❌ user=guestの場合、エラーを返す admin adminのみflagを取得できるようアクセス制御
  11. 17 攻撃の流れ l ヘッダのアルゴリズムを none に変更 l 署名⽂字列を削除 l ペイロードを書き換える

    l 改ざんしたJWTを送信 アルゴリズムを none に変更し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムを none に変更 { “alg”: “HS256”, “typ”: “JWT” } { “alg”: “none”, “typ”: “JWT” } ヘッダを変更
  12. 18 アルゴリズムを none に変更し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムを none に変更 攻撃者

    APIサーバ JWT(alg = HS256, user = guest)付与 JWT(alg = none, user = admin)で アクセス ログイン 署名検証がなされず、 攻撃者は他のユーザになりすまし可能
  13. 19 JWT検証時にアルゴリズムを指定することで防ぐ JWTにおける攻撃 : アルゴリズムを none に変更(対策) l 脆弱性の発⽣原因 l

    サーバ側で検証時のアルゴリズムを未指定 l 検証時のアルゴリズムとして none を許可 l 対策 l サーバ側でアルゴリズムを指定 l 送信されるJWTのアルゴリズムと⼀致するかを検証
  14. 20 公開鍵を共通鍵として使⽤し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更 攻撃の流れ l アルゴリズムがRS256(公開鍵暗号⽅式) l 秘密鍵に対応する公開鍵を取得

    l アルゴリズムをRS256からHS256に変更 l ペイロードを書き換える l 取得した公開鍵を⽤いて署名を作成 l 改ざんしたJWTを送信 { “alg”: “RS256”, “typ”: “JWT” } { “alg”: “HS256”, “typ”: “JWT” } ヘッダを変更
  15. 21 公開鍵を共通鍵として使⽤し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更 攻撃者 APIサーバ JWT(alg = RS256,

    user = attacker) 付与 JWT(alg = HS256, user = admin)で アクセス ログイン 署名検証を無効化し、 攻撃者はadminになりすまし可能 公開鍵で検証 公開鍵で署名
  16. 22 JWT検証時にアルゴリズムを指定することで防ぐ JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更(対策) l 脆弱性の発⽣原因 l サーバ側で検証時のアルゴリズムを未指定 l

    検証時のアルゴリズムとして HS256 を許可 l 対策 l サーバ側でアルゴリズムを RS256 に指定 l 送信されるJWTのアルゴリズムと⼀致するかを検証
  17. 24 署名作成時に使⽤したHMAC鍵を総当たりで特定 JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定 攻撃者 APIサーバ JWT(alg = HS256,

    user = attacker) 付与 JWT(alg = HS256, user = admin)で アクセス ログイン 署名検証を無効化し、 攻撃者はadminになりすまし可能 攻撃者が総当たりで鍵を特定
  18. 25 鍵の⻑さを⻑くすることで防ぐ JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定(対策) l 脆弱性の発⽣原因 l HMAC鍵の⻑さが短い l

    直接的な対策 l HMAC鍵の⻑さを256ビット(32⽂字)以上にする l その他の対策 l より堅牢なアルゴリズムを使⽤する panda UAN8Fkh0g0Hzy6lwJCF7lFw06P2rtA5v
  19. 26 nOAuthはJWTの誤⽤に起因する認証実装の⽋陥 l Microsoft Azure ADは認証実装にOpenID Connectを使⽤ l OpenID ConnectはOAuthという認可プロトコルを認証にも使⽤できるよ

    う拡張したプロトコル l OpenID Connectはユーザー情報の交換にJWTを使⽤する l OpenID ConnectによってMicrosoftアカウントによる外部サービスへの ログインが可能となる → ID連携が可能に 応⽤事例 : nOAuth https://www.descope.com/blog/post/noauth Microsoft SaaS A SaaS B SaaS C
  20. 27 nOAuthはJWTの誤⽤に起因する認証実装の⽋陥 l JWTのemailクレームをユーザー識別⼦として使⽤するwebサイ トが攻撃の対象となる l Microsoft Azure ADにおいてemailクレームは変更可能かつ未検証 l

    攻撃の流れ l 攻撃者はAzure AD adminアカウントを作成 l 攻撃者は“Email”属性を被害者のメールアドレスに変更 l 攻撃者はMicrosoftアカウントで脆弱なwebサイトにログイン l 攻撃者は被害者としてログインする 応⽤事例 : nOAuth https://www.descope.com/blog/post/noauth
  21. 28 l ⽂献 l https://datatracker.ietf.org/doc/html/rfc7519 l https://scgajge12.hatenablog.com/entry/jwt_security l https://book.hacktricks.xyz/pentesting-web/hacking-jwt-json-web-tokens l

    https://www.descope.com/blog/post/noauth l ツール l https://jwt.io l https://github.com/ticarpi/jwt_tool l ラボ環境 l https://github.com/SECCON/2023_beginnerslive/tree/main/yuasa l 画像 l https://flacticon.com 参考資料