Gist に他人のアカウントでログインできてしまう
投稿日:
tl;dr Gist にログインして、github に別アカウントでログインすると、 以前のアカウントのログイン状態を引き継いでしまう。 OAuth や OpenID みたいに認証の委譲してログイン状態の同期をするには、 ひと工夫必要。
ということで、タイトルは釣り気味です。先日簡単にツイート した内容を 流れてしまわないように改めてメモ。
危険性
共用の端末などで、他人のアカウントで gist にログインできてしまう。
その端末で、以前 gist にログインしていた人が github からログアウトしても、 以降使った人が、別のアカウントで github ログインすれば、先の gist アカウントで ログイン状態が維持されてしまう。
これは、github, gist のログインセッション維持に使ってるクッキーの寿命が 10 年に設定されているあたりが、危険性に拍車をかけている。 ブラウザを閉じるだけだと、ログアウトせずログイン状態が 10 年間維持されてしまう。
問題の再現方法
- アカウント A で github にログイン
- gist.github.com に行く
- github ページでログアウト
- アカウント B で github にログイン
- gist.github.com に行く
- アカウント 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 のログイン状態の同期方法を調べていたが、 その時は:
- github にログインする
- gist にリダイレクトされ、ログインセッションのクッキーをセット
- github にリダイレクトされトップページ表示
といった感じだった。
ログアウトも同様に毎度 gist にリダイレクトし、 ログインセッションのクッキーを無効化していた。
そのため、今回のような問題は発生しなかった。
# リダイレクトを止めたらどうなってたんだろう。。。
まとめ
- Gist にログインして、github に別アカウントでログインすると、 以前のアカウントのログイン状態を引き継いでしまう。
- OAuth や OpenID みたいに認証の委譲するときは、ログイン状態の同期にはひと工夫必要。