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

JWTセキュリティ入門

Avatar for yuasa yuasa
September 03, 2023

 JWTセキュリティ入門

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

Avatar for yuasa

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 参考資料