「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>OAuth#h47e1abd]] * 目次 [#p291d1f4] #contents *概要 [#jb3d7ad1] -認可コード横取り攻撃 (authorization code interception attack) への対策 -(Authorization Codeグラント種別により発行された)~ 認可コードをクライアントアプリケーションが受け取る際、~ 悪意のあるアプリケーションがその認可コードを横取りする攻撃に対抗する仕様。 **課題 [#d588d1d4] -ネイティブアプリが、外部ブラウザを使用してOAuth 2.0認証要求を発行する場合、~ >「[[Implicit Flow>OAuth#m5c2d510]]ではなく、[[Authorization Code Flow>OAuth#yfeb403d]]を使用し、~ redirect_uriにカスタムURIスキームを使用してcodeを取得する。」~ >という方式があるが(下図を参照)、 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ | End Device (e.g., Smartphone) | | | | +-------------+ +----------+ | (6) Access Token +----------+ | |Legitimate | | Malicious|<--------------------| | | |OAuth 2.0 App| | App |-------------------->| | | +-------------+ +----------+ | (5) Authorization | | | | ^ ^ | Grant | | | | \ | | | | | | \ (4) | | | | | (1) | \ Authz| | | | | Authz| \ Code | | | Authz | | Request| \ | | | Server | | | \ | | | | | | \ | | | | | v \ | | | | | +----------------------------+ | | | | | | | (3) Authz Code | | | | Operating System/ |<--------------------| | | | Browser |-------------------->| | | | | | (2) Authz Request | | | +----------------------------+ | +----------+ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ --カスタムURIスキームの上書き攻撃によって、このcodeが傍受されることがある。 --また、client_idや、client_secretも漏洩してしまう可能性がある。 **対策 [#j94e6ae3] -コード交換のための証明鍵(PKCE、 "pixy"と発音)を使用して脅威を軽減する。 -プロビジョニングされたアプリケーションのバイナリ・ファイル中のclient_secretについては、~ 機密性が考慮されていないため、client_secretを必要としない方式になっている。 *仕様 [#gb8fc333] **仕様の概要 [#obb75901] ***Abstract Protocol Flow [#s6dce5ed] +-------------------+ | Authz Server | +--------+ | +---------------+ | | |--(A)- Authorization Request ---->| | | | | + t(code_verifier), t_m | | Authorization | | | | | | Endpoint | | | |<-(B)---- Authorization Code -----| | | | | | +---------------+ | | Client | | | | | | +---------------+ | | |--(C)-- Access Token Request ---->| | | | | + code_verifier | | Token | | | | | | Endpoint | | | |<-(D)------ Access Token ---------| | | +--------+ | +---------------+ | +-------------------+ ***[[各エンドポイント>OAuth#h4dcb0c7]]で受け取るパラメタ [#rf81fec1] -認可エンドポイント |#|パラメタ|要否|説明|h |1|code_challenge|必須|Code Verifier を元に計算された Code Challenge の値| |2|code_challenge_method|任意|Code Challenge の計算に用いるメソッド。plain (デフォルト) もしくは S256。| -Tokenエンドポイント |#|パラメタ|要否|説明|h |1|code_verifier|必須| Code Challenge の元となった Code Verifier の値| **仕様の詳細 [#sb35c097] *参考 [#ca1689ad] **仕様 [#g417e99c] -RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients~ https://tools.ietf.org/html/rfc7636 **その他 [#q48125ac] -RFC7636として発行されたOAuth PKCEとは - r-weblife~ http://d.hatena.ne.jp/ritou/20151018/1445181974 -PKCE: 認可コード横取り攻撃対策のために OAuth サーバーとクライアントが実装すべきこと - Qiita~ https://qiita.com/TakahikoKawasaki/items/00f333c72ed96c4da659 -OAuth for Native Apps | GREE Engineers' Blog~ http://labs.gree.jp/blog/2015/12/14831/ --解決策1-2: OAuth PKCE 拡張を利用する ---- Tags: [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]