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. JWTセキュリティ⼊⾨
    湯浅 潤樹
    奈良先端科学技術⼤学院⼤学 M2
    SECCON Beginners Live 2023

    View Slide

  2. 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

    View Slide

  3. 3
    本発表の対象者
    l JWTについて何も知らない⽅
    l JWTについて知っているが、脆弱性や攻撃⼿法は知らない⽅
    l JWTに関するCTF問題を解いたことがない⽅
    JWTに関するCTF問題を解いたことがある⽅には問題を⽤意したの
    でよければ解いてください🙏

    View Slide

  4. 4
    本発表で使⽤するラボ環境
    https://github.com/SECCON/2023_beginnerslive/tree/main/yuasa

    View Slide

  5. 5
    JWTチャレンジ
    ソースコードは yuasa/trial3 に格納
    問題サーバのURL
    https://2023-beginnerslive-jwt-chall.vercel.app/

    View Slide

  6. 6
    ユーザー情報を保持し、改ざん検知ができる⽂字列
    JWT(JSON Web Token)とは
    l JWTの特徴
    l 改ざんの検証が可能
    l データがJSON形式で含まれる
    l URLに含めることが可能な⽂字列のみで構成
    l JWTのユースケース
    l ログイン機能(認証)
    l アクセス許可(認可)
    l ユーザーについての情報保持
    引⽤ : https://jwt.io/

    View Slide

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

    View Slide

  8. 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

    View Slide

  9. 9
    ヘッダにはアルゴリズムなどのメタ情報が含まれる
    l ヘッダで使⽤されるクレーム
    l alg : 署名に使⽤されるアルゴリズム
    l typ : トークンのタイプ
    l kid : 鍵のID
    l など
    l algで指定可能なアルゴリズム
    l none : 署名なし
    l HS256 : 共通鍵暗号⽅式
    l RS256 : 公開鍵暗号⽅式
    l など
    JWTの仕組み : ヘッダ
    {
    “alg”: “HS256”,
    “typ”: “JWT”
    }

    View Slide

  10. 10
    ペイロードには実際に使⽤される情報が含まれる
    l 予約済みのクレームと⾃由指定のクレームが存在
    l 予約済みのクレーム
    l iss : JWT発⾏者(サーバ)の識別⼦
    l sub : JWT主体の識別⼦
    l aud : JWT利⽤者(クライアント)の識別⼦
    l exp : 有効期限の終了⽇
    l iat : 発⾏⽇時
    l jti : ⼀意な識別⼦
    JWTの仕組み : ペイロード
    {
    “sub”: “1234567890”,
    “name”: “yuasa”,
    }

    View Slide

  11. 11
    署名はJWTの改ざん検証に⽤いられる
    l 鍵とメッセージを⼊⼒としてアルゴリズムを適⽤し署名作成
    JWTの仕組み : 署名

    メッセージ 署名
    (ハッシュ)
    vTt6kB6gZVzx2_kUm0nqT45Mf
    sqw-10_aKRE17feCRs
    base64UrlEncode(header).
    base64UrlEncode(payload)
    UAN8Fkh0g0Hzy6lwJCF7lFw06P
    2rtA5v
    HS256
    アルゴ
    リズム

    View Slide

  12. 12
    ヘッダ、署名、ペイロードを検証する
    検証の流れ
    l ヘッダを検証
    l algが期待するアルゴリズムと⼀致するか など
    l 署名を検証(HS256の場合)
    l ヘッダとペイロードをドット[.]で連結しメッセージ作成
    l HS256アルゴリズムを使⽤し、メッセージと鍵からハッシュ⽣成
    l ⽣成されたハッシュと署名値が⼀致するか検証
    l ペイロードを検証
    l JWTの⽤途に応じてペイロードを検証する
    JWTの検証

    View Slide

  13. 13
    JWTの検証に使⽤可能
    JWT関連ツール : jwt.io
    https://jwt.io/
    ※ オンラインツールのため、
    機密性の⾼いJWTの使⽤に注意

    View Slide

  14. 14
    JWTの検証、偽造、改ざん、脆弱性調査に使⽤可能
    JWT関連ツール : jwt_tool
    $ python3 jwt_tool.py
    https://github.com/ticarpi/jwt_tool
    $ python3 jwt_tool.py –t -rh
    “Authorization: ”-X a –I –pc
    username –pv admin
    検証 脆弱性調査

    View Slide

  15. 15
    実装上の脆弱性を悪⽤する様々な攻撃が存在
    l アルゴリズムを none に変更
    l アルゴリズムをRS256からHS256に変更
    l ブルートフォースによるHMAC秘密鍵の特定
    l など
    JWTにおける攻撃

    View Slide

  16. 16
    アクセス制御にJWTを使⽤するケースを想定
    想定するJWTの使⽤ケース
    guest
    APIサーバ
    JWT(user = [guest or admin])付与
    JWT(user = [guest or admin])で
    アクセス
    ログイン
    ✅ user=adminの場合、flagを返す
    ❌ user=guestの場合、エラーを返す
    admin
    adminのみflagを取得できるようアクセス制御

    View Slide

  17. 17
    攻撃の流れ
    l ヘッダのアルゴリズムを none に変更
    l 署名⽂字列を削除
    l ペイロードを書き換える
    l 改ざんしたJWTを送信
    アルゴリズムを none に変更し、署名検証を無効化
    JWTにおける攻撃 : アルゴリズムを none に変更
    {
    “alg”: “HS256”,
    “typ”: “JWT”
    }
    {
    “alg”: “none”,
    “typ”: “JWT”
    }
    ヘッダを変更

    View Slide

  18. 18
    アルゴリズムを none に変更し、署名検証を無効化
    JWTにおける攻撃 : アルゴリズムを none に変更
    攻撃者 APIサーバ
    JWT(alg = HS256, user = guest)付与
    JWT(alg = none, user = admin)で
    アクセス
    ログイン
    署名検証がなされず、
    攻撃者は他のユーザになりすまし可能

    View Slide

  19. 19
    JWT検証時にアルゴリズムを指定することで防ぐ
    JWTにおける攻撃 : アルゴリズムを none に変更(対策)
    l 脆弱性の発⽣原因
    l サーバ側で検証時のアルゴリズムを未指定
    l 検証時のアルゴリズムとして none を許可
    l 対策
    l サーバ側でアルゴリズムを指定
    l 送信されるJWTのアルゴリズムと⼀致するかを検証

    View Slide

  20. 20
    公開鍵を共通鍵として使⽤し、署名検証を無効化
    JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更
    攻撃の流れ
    l アルゴリズムがRS256(公開鍵暗号⽅式)
    l 秘密鍵に対応する公開鍵を取得
    l アルゴリズムをRS256からHS256に変更
    l ペイロードを書き換える
    l 取得した公開鍵を⽤いて署名を作成
    l 改ざんしたJWTを送信
    {
    “alg”: “RS256”,
    “typ”: “JWT”
    }
    {
    “alg”: “HS256”,
    “typ”: “JWT”
    }
    ヘッダを変更

    View Slide

  21. 21
    公開鍵を共通鍵として使⽤し、署名検証を無効化
    JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更
    攻撃者 APIサーバ
    JWT(alg = RS256, user = attacker)
    付与
    JWT(alg = HS256, user = admin)で
    アクセス
    ログイン
    署名検証を無効化し、
    攻撃者はadminになりすまし可能
    公開鍵で検証
    公開鍵で署名

    View Slide

  22. 22
    JWT検証時にアルゴリズムを指定することで防ぐ
    JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更(対策)
    l 脆弱性の発⽣原因
    l サーバ側で検証時のアルゴリズムを未指定
    l 検証時のアルゴリズムとして HS256 を許可
    l 対策
    l サーバ側でアルゴリズムを RS256 に指定
    l 送信されるJWTのアルゴリズムと⼀致するかを検証

    View Slide

  23. 23
    署名作成時に使⽤したHMAC鍵を総当たりで特定
    JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定
    攻撃の流れ
    l アルゴリズムがHS256(共通鍵暗号⽅式)
    l 総当たりで署名時に使⽤された鍵を特定
    l ペイロードを書き換える
    l 特定した鍵を⽤いて署名を作成
    l 改ざんしたJWTを送信

    View Slide

  24. 24
    署名作成時に使⽤したHMAC鍵を総当たりで特定
    JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定
    攻撃者 APIサーバ
    JWT(alg = HS256, user = attacker)
    付与
    JWT(alg = HS256, user = admin)で
    アクセス
    ログイン
    署名検証を無効化し、
    攻撃者はadminになりすまし可能
    攻撃者が総当たりで鍵を特定

    View Slide

  25. 25
    鍵の⻑さを⻑くすることで防ぐ
    JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定(対策)
    l 脆弱性の発⽣原因
    l HMAC鍵の⻑さが短い
    l 直接的な対策
    l HMAC鍵の⻑さを256ビット(32⽂字)以上にする
    l その他の対策
    l より堅牢なアルゴリズムを使⽤する
    panda UAN8Fkh0g0Hzy6lwJCF7lFw06P2rtA5v

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

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

    View Slide