Share
Embed
Transcript
28 slides
-
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 -
6 ユーザー情報を保持し、改ざん検知ができる⽂字列 JWT(JSON Web Token)とは l JWTの特徴 l 改ざんの検証が可能 l
データがJSON形式で含まれる l URLに含めることが可能な⽂字列のみで構成 l JWTのユースケース l ログイン機能(認証) l アクセス許可(認可) l ユーザーについての情報保持 引⽤ : https://jwt.io/ -
7 ヘッダ、ペイロード、署名から構成される⽂字列 JWTの仕組み ヘッダ ペイロード 署名 JWT { “alg”: “HS256”,
“typ”: “JWT” } { “sub”: “1234567890”, “name”: “yuasa”, } vTt6kB6gZVzx2_kUm0nqT45Mf sqw-10_aKRE17feCRs eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6In l1YXNhIn0.vTt6kB6gZVzx2_kUm0nqT45Mfsqw -10_aKRE17feCRs -
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 -
9 ヘッダにはアルゴリズムなどのメタ情報が含まれる l ヘッダで使⽤されるクレーム l alg : 署名に使⽤されるアルゴリズム l typ
: トークンのタイプ l kid : 鍵のID l など l algで指定可能なアルゴリズム l none : 署名なし l HS256 : 共通鍵暗号⽅式 l RS256 : 公開鍵暗号⽅式 l など JWTの仕組み : ヘッダ { “alg”: “HS256”, “typ”: “JWT” } -
10 ペイロードには実際に使⽤される情報が含まれる l 予約済みのクレームと⾃由指定のクレームが存在 l 予約済みのクレーム l iss : JWT発⾏者(サーバ)の識別⼦
l sub : JWT主体の識別⼦ l aud : JWT利⽤者(クライアント)の識別⼦ l exp : 有効期限の終了⽇ l iat : 発⾏⽇時 l jti : ⼀意な識別⼦ JWTの仕組み : ペイロード { “sub”: “1234567890”, “name”: “yuasa”, } -
11 署名はJWTの改ざん検証に⽤いられる l 鍵とメッセージを⼊⼒としてアルゴリズムを適⽤し署名作成 JWTの仕組み : 署名 鍵 メッセージ 署名
(ハッシュ) vTt6kB6gZVzx2_kUm0nqT45Mf sqw-10_aKRE17feCRs base64UrlEncode(header). base64UrlEncode(payload) UAN8Fkh0g0Hzy6lwJCF7lFw06P 2rtA5v HS256 アルゴ リズム -
12 ヘッダ、署名、ペイロードを検証する 検証の流れ l ヘッダを検証 l algが期待するアルゴリズムと⼀致するか など l 署名を検証(HS256の場合)
l ヘッダとペイロードをドット[.]で連結しメッセージ作成 l HS256アルゴリズムを使⽤し、メッセージと鍵からハッシュ⽣成 l ⽣成されたハッシュと署名値が⼀致するか検証 l ペイロードを検証 l JWTの⽤途に応じてペイロードを検証する JWTの検証 -
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 検証 脆弱性調査 -
16 アクセス制御にJWTを使⽤するケースを想定 想定するJWTの使⽤ケース guest APIサーバ JWT(user = [guest or admin])付与
JWT(user = [guest or admin])で アクセス ログイン ✅ user=adminの場合、flagを返す ❌ user=guestの場合、エラーを返す admin adminのみflagを取得できるようアクセス制御 -
17 攻撃の流れ l ヘッダのアルゴリズムを none に変更 l 署名⽂字列を削除 l ペイロードを書き換える
l 改ざんしたJWTを送信 アルゴリズムを none に変更し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムを none に変更 { “alg”: “HS256”, “typ”: “JWT” } { “alg”: “none”, “typ”: “JWT” } ヘッダを変更 -
18 アルゴリズムを none に変更し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムを none に変更 攻撃者
APIサーバ JWT(alg = HS256, user = guest)付与 JWT(alg = none, user = admin)で アクセス ログイン 署名検証がなされず、 攻撃者は他のユーザになりすまし可能 -
19 JWT検証時にアルゴリズムを指定することで防ぐ JWTにおける攻撃 : アルゴリズムを none に変更(対策) l 脆弱性の発⽣原因 l
サーバ側で検証時のアルゴリズムを未指定 l 検証時のアルゴリズムとして none を許可 l 対策 l サーバ側でアルゴリズムを指定 l 送信されるJWTのアルゴリズムと⼀致するかを検証 -
20 公開鍵を共通鍵として使⽤し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更 攻撃の流れ l アルゴリズムがRS256(公開鍵暗号⽅式) l 秘密鍵に対応する公開鍵を取得
l アルゴリズムをRS256からHS256に変更 l ペイロードを書き換える l 取得した公開鍵を⽤いて署名を作成 l 改ざんしたJWTを送信 { “alg”: “RS256”, “typ”: “JWT” } { “alg”: “HS256”, “typ”: “JWT” } ヘッダを変更 -
21 公開鍵を共通鍵として使⽤し、署名検証を無効化 JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更 攻撃者 APIサーバ JWT(alg = RS256,
user = attacker) 付与 JWT(alg = HS256, user = admin)で アクセス ログイン 署名検証を無効化し、 攻撃者はadminになりすまし可能 公開鍵で検証 公開鍵で署名 -
22 JWT検証時にアルゴリズムを指定することで防ぐ JWTにおける攻撃 : アルゴリズムをRS256からHS256に変更(対策) l 脆弱性の発⽣原因 l サーバ側で検証時のアルゴリズムを未指定 l
検証時のアルゴリズムとして HS256 を許可 l 対策 l サーバ側でアルゴリズムを RS256 に指定 l 送信されるJWTのアルゴリズムと⼀致するかを検証 -
23 署名作成時に使⽤したHMAC鍵を総当たりで特定 JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定 攻撃の流れ l アルゴリズムがHS256(共通鍵暗号⽅式) l 総当たりで署名時に使⽤された鍵を特定
l ペイロードを書き換える l 特定した鍵を⽤いて署名を作成 l 改ざんしたJWTを送信 -
24 署名作成時に使⽤したHMAC鍵を総当たりで特定 JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定 攻撃者 APIサーバ JWT(alg = HS256,
user = attacker) 付与 JWT(alg = HS256, user = admin)で アクセス ログイン 署名検証を無効化し、 攻撃者はadminになりすまし可能 攻撃者が総当たりで鍵を特定 -
25 鍵の⻑さを⻑くすることで防ぐ JWTにおける攻撃 : ブルートフォースによるHMAC鍵の特定(対策) l 脆弱性の発⽣原因 l HMAC鍵の⻑さが短い l
直接的な対策 l HMAC鍵の⻑さを256ビット(32⽂字)以上にする l その他の対策 l より堅牢なアルゴリズムを使⽤する panda UAN8Fkh0g0Hzy6lwJCF7lFw06P2rtA5v -
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 -
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 -
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 参考資料