Project

General

Profile

Backport(バックポート) #3705

OAuth のアクセストークンを取得していくる際にシークレットキーを用いた署名を検証できない

Added by isao sano almost 5 years ago. Updated over 2 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Assignee:
Target version:
Start date:
2012-10-16
Due date:
% Done:

100%


Description

概要

OAuth のアクセストークンを取得していくる際にシークレットキーを用いた署名を検証できない.
クライアントは通常アクセストークンを取得してくる際に,事前に生成されているリクエストトークンとリクエストトークンのシークレットを用いて署名を行なう.しかし,クライアント側で正しいシークレットを用いた署名の実装を行なっていても,署名の検証に失敗してアクセストークンが取得できない.

原因

サーバ側では下記コード部のように,リクエストトークンを取得してくる際にシークレット部分を空文字列としており,このトークンオブジェクトを用いて署名を検証してしまう.
そのため,おそらくシークレットが空文字列であるトークンオブジェクトとして署名の検証を行なってしまうとおもわれるため,クライアントの実装がシークレットを空にするようになっている場合には成功するものと思われる.
(コードは 3.6.6 のもの)

lib/action/opOAuthTokenAction.class.php 86 行目

 75   public function executeAccessToken(sfWebRequest $request)
 76   {
 77     require_once 'OAuth.php';
 78 
 79     $authRequest = OAuthRequest::from_request();
 80     $requestToken = $authRequest->get_parameter('oauth_token');
 81     $this->information = $this->getTokenTable()->findByKeyString($requestToken);
 82     $this->forward404Unless($this->information);
 83     $this->forward404Unless($this->information->getIsActive());
 84     $this->forward404Unless($this->information->getVerifier() === $authRequest->get_parameter('oauth_verifier'));
 85 
 86     $token = $this->getServer()->fetch_access_token($authRequest);
 87 
 88     $this->information->delete();
 89 
 90     $this->getResponse()->setContent((string)$token);
 91 
 92     return sfView::NONE;
 93   }

lib/vendor/OAuth/OAuth.php 470 行目

460   /**
461    * process an access_token request
462    * returns the access token on success
463    */
464   public function fetch_access_token(&$request) {
465     $this->get_version($request);
466 
467     $consumer = $this->get_consumer($request);
468 
469     // requires authorized request token
470     $token = $this->get_token($request, $consumer, "request");
471 
472 
473     $this->check_signature($request, $consumer, $token);
474 
475     $new_token = $this->data_store->new_access_token($token, $consumer);
476 
477     return $new_token;
478   }

lib/vendor/OAuth/OAuth.php 548 行目

543   /**
544    * try to find the token for the provided request's token key
545    */
546   private function get_token(&$request, $consumer, $token_type="access") {
547     $token_field = @$request->get_parameter('oauth_token');
548     $token = $this->data_store->lookup_token(
549       $consumer, $token_type, $token_field
550     );
551     if (!$token) {
552       throw new OAuthException("Invalid $token_type token: $token_field");
553     }
554     return $token;
555   }

lib/util/opOAuthDataStore.class.php 110 行目

105   public function lookup_token($consumer, $token_type, $token)
106   {
107     $tokenRecord = $this->getTokenTable()->findByKeyString($token, $token_type, $this->queryTemplate);
108     if ($tokenRecord)
109     {
110       $token = new OAuthToken($tokenRecord->getKeyString(), '');
111       if ('request' !== $token_type)
112       {
113         $token->secret = $tokenRecord->getSecret();
114       }
115       return $token;
116     }
117 
118     return null;
119   }

修正案

lib/util/opOAuthDataStore.class.php 110 行目の空文字列のシークレットではないものを返す.
ただし,そのまま修正してしまうと既存の OpenPNE OAuth クライアントに影響が出るため,シークレットがある場合とない場合での署名の検証を行い,メジャーバージョンアップ時にシークレットがない場合の検証を取り除くという対応が考えられる.
この対応を行う場合にはメジャーバージョンアップ時に確認できるチケットを作成しておく必要が有る.


Related issues

Copied from OpenPNE 3 - Bug(バグ) #3232: OAuth のアクセストークンを取得していくる際にシークレットキーを用いた署名を検証できない Won't fix(対応せず) 2012-10-16

Associated revisions

Revision 173bb17d (diff)
Added by isao sano almost 3 years ago

(fixes #3705, BP from #3232) fixed to get secret key when request token was looked up in datastore

Revision 5cd26ee6
Added by kaoru n over 2 years ago

Merge pull request #200 from isaosano/t-3705

(fixes #3705, BP from #3232) fixed to get secret key when request token ...

History

#1 Updated by isao sano almost 5 years ago

  • Copied from Bug(バグ) #3232: OAuth のアクセストークンを取得していくる際にシークレットキーを用いた署名を検証できない added

#2 Updated by isao sano almost 5 years ago

  • Status changed from Pending Review(レビュー待ち) to New(新規)
  • % Done changed from 50 to 0

#3 Updated by isao sano almost 5 years ago

  • Assignee deleted (Yuya Watanabe)

#4 Updated by isao sano almost 5 years ago

  • Status changed from New(新規) to Accepted(着手)

#5 Updated by isao sano almost 5 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

https://github.com/openpne/OpenPNE3/pull/200
にてプルリクエストしました。

#6 Updated by isao sano almost 5 years ago

  • Assignee set to isao sano

#7 Updated by isao sano almost 5 years ago

  • Target version changed from OpenPNE 3.6.17 to OpenPNE 3.6.x

#8 Updated by kaoru n almost 4 years ago

  • Target version changed from OpenPNE 3.6.x to OpenPNE 3.6.21

#9 Updated by kaoru n almost 4 years ago

  • Target version changed from OpenPNE 3.6.21 to OpenPNE 3.6.x

#10 Updated by kaoru n almost 4 years ago

  • Target version changed from OpenPNE 3.6.x to OpenPNE 3.6.22

#11 Updated by kaoru n over 3 years ago

  • Target version changed from OpenPNE 3.6.22 to OpenPNE 3.6.x

#12 Updated by kaoru n about 3 years ago

  • Target version changed from OpenPNE 3.6.x to OpenPNE 3.6.24

#13 Updated by Youichi Kimura about 3 years ago

  • Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)

コミットメッセージに (fixes #3707, ...) と誤ったチケット番号が記載されているため修正をお願いします。
(修正する際は、既にある Pull Request を閉じなくても t-3705 ブランチを再度作成し直した上で git push isaosano t-3705 --force を実行すれば更新は反映されます)

#14 Updated by kaoru n about 3 years ago

  • Target version changed from OpenPNE 3.6.24 to OpenPNE 3.6.x

#15 Updated by isao sano almost 3 years ago

  • Status changed from Rejected(差し戻し) to Accepted(着手)
  • % Done changed from 50 to 0

#16 Updated by isao sano almost 3 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

コミットメッセージを修正しました。
https://github.com/openpne/OpenPNE3/pull/200

#17 Updated by isao sano almost 3 years ago

  • Target version changed from OpenPNE 3.6.x to OpenPNE 3.6.25

#18 Updated by Youichi Kimura almost 3 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

レビューOKです

#19 Updated by isao sano almost 3 years ago

  • Target version changed from OpenPNE 3.6.25 to OpenPNE 3.6.x

#20 Updated by kaoru n over 2 years ago

  • Target version changed from OpenPNE 3.6.x to OpenPNE 3.6.26

#21 Updated by isao sano over 2 years ago

  • Status changed from Pending Testing(テスト待ち) to Pending Merge(マージ待ち)
  • % Done changed from 70 to 80

試験完了しました。
問題ありません。

#22 Updated by kaoru n over 2 years ago

  • Status changed from Pending Merge(マージ待ち) to Fixed(完了)
  • % Done changed from 80 to 100

マージしました

Also available in: Atom PDF