電卓片手に

Gist に他人のアカウントでログインできてしまう

投稿日:

tl;dr Gist にログインして、github に別アカウントでログインすると、 以前のアカウントのログイン状態を引き継いでしまう。 OAuth や OpenID みたいに認証の委譲してログイン状態の同期をするには、 ひと工夫必要。

ということで、タイトルは釣り気味です。先日簡単にツイート した内容を 流れてしまわないように改めてメモ。

危険性

共用の端末などで、他人のアカウントで gist にログインできてしまう。

その端末で、以前 gist にログインしていた人が github からログアウトしても、 以降使った人が、別のアカウントで github ログインすれば、先の gist アカウントで ログイン状態が維持されてしまう。

これは、github, gist のログインセッション維持に使ってるクッキーの寿命が 10 年に設定されているあたりが、危険性に拍車をかけている。 ブラウザを閉じるだけだと、ログアウトせずログイン状態が 10 年間維持されてしまう。

問題の再現方法

  1. アカウント A で github にログイン
  2. gist.github.com に行く
  3. github ページでログアウト
  4. アカウント B で github にログイン
  5. gist.github.com に行く
  6. アカウント B でログインしたはずなのに、gist ではアカウント A でログインしてる

原因

おそらく gist の認証に github の OAuth を使っているせい。OAuth や OpenID のように認証の委譲を使っていると、gist は基本的には github の ログイン状態を知ることができない。

なので、たとえ github からログアウトしても、gist.github.com のログインセッションは 生きたままになる。

ただし、ドメイン .github.com で指定されたクッキー is_login の存在により、 gist に訪れてくれたブラウザが github.com にログインしているか否かを検出できるよう になってるらしく、3 と 4 の間で gist に行くと、gist はログアウトを 検出することができる。これで gist のログインセッションを無効化できる。

これは同時に「gist.github.com に行かずに github.com だけでアカウントを切り替えるてしまうと、gist.github.com のログインアカウントが切り替わらない」ということを示していることになる。

is_login の値を yes ではなく、ログイン都度に値が変わる「セッションIDの署名」 のような役割をさせる必要がありそう。

補足: 以前の gist のログインセッション管理

実はたまたま去年の11月にも gist と github のログイン状態の同期方法を調べていたが、 その時は:

  1. github にログインする
  2. gist にリダイレクトされ、ログインセッションのクッキーをセット
  3. github にリダイレクトされトップページ表示

といった感じだった。

ログアウトも同様に毎度 gist にリダイレクトし、 ログインセッションのクッキーを無効化していた。

そのため、今回のような問題は発生しなかった。

# リダイレクトを止めたらどうなってたんだろう。。。

まとめ