session fixation attack対策について

33 views
Skip to first unread message

Taro Matsuzawa

unread,
Mar 3, 2010, 3:42:16 AM3/3/10
to jpmo...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

こんにちは、btmと申します。

session fixation attack対策をjpmobileを使った
アプリケーションでしていて、
Rails 2.3.x系で問題があり、小川さんにjpmobile側でも
対応をしてもらいながら作業をしていました。
いちおう対応方法がまとまったので情報共有のためご連絡します。


・問題点
Rails 2.3.x系にてjpmobileでsession_idをURLに付加している場合に
reset_sessionを行うと以下の問題が発生する。

1. session_idの生成がRack側で行われるためjpmobileで
新しいsession_idが認識できない。
# action_controller/session/abstract_store.rbのcallを参照
2. session_idが渡されない状態で遷移してしまうため、
redirect_toをしたときに http://smellman.org/?session_id= という
アドレスに redirect されてしまう。


・対処方法
- - 1. の問題
この問題に関してはjpmobile側ではなくてアプリケーション側で対処しました。
まずはapplication_controller.rbなどに以下のようにしてreset_sessionを
上書きします。

def reset_session_with_mobile
reset_session_without_mobile
request.session_options[:id] = ActiveSupport::SecureRandom.hex(16)
end
alias_method_chain :reset_session, :mobile

session_storeをactive_record_storeに設定している場合は、
以下のパッチを用意します。

require "active_record/session_store"
module ActiveRecord #:nodoc:
class SessionStore #:nodoc:
private
def set_session(env, sid, session_data)
Base.silence do
record = get_session_model(env, sid, session_data)
record.data = session_data
return false unless record.save

session_data = record.data
if session_data && session_data.respond_to?(:each_value)
session_data.each_value do |obj|
obj.clear_association_cache if
obj.respond_to?(:clear_association_cache)
end
end
end

return true
end

def get_session_model(env, sid, session_data = {})
if env[ENV_SESSION_OPTIONS_KEY][:id].nil? ||
!session_data.is_a?(SessionHash)
env[SESSION_RECORD_KEY] = find_session(sid)
else
env[SESSION_RECORD_KEY] ||= find_session(sid)
end
end
end
end

これでjpmobile上でcookieを使わずにsession_idを渡していても
正常にsession_idを生成する事ができます。
うちの方で対処したものはこちらのログから
確認できます(余計なコードも入っていますが)。

http://sourceforge.jp/projects/elecoma/svn/view?view=rev&root=elecoma&revision=57

- - 2. の問題
こちらは小川さんが素早く対処をしてくれました(感謝多謝!)。

http://github.com/darashi/jpmobile/commit/256897e357eb48f3be61bdb207ca4eccb2c0d007

jpmobile側でsession_idが取れなかった時は付加をしないようになります。


現状、これらの方法で対処ができています。
しかしながら、少し強引な対処でもあります。
# ActiveSupport::SecureRandom.hex(16) とか...
もし、ベストな対処方がありましたら教えていただけると助かります。

ではでは。
- --
<------------------------------------------->
Taro Matsuzawa AKA btm
mail : b...@tech.email.ne.jp
web page : http://d.hatena.ne.jp/smellman/
skype : smellman
gtalk : btm.sm...@gmail.com
msn : b...@fh.freeserve.ne.jp
proj: http://sourceforge.jp/projects/elecoma/
<------------------------------------------->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBCAAGBQJLjiDnAAoJEOo/LIEG6blW/34P/1pzs3Alejsdb7UOINvi8V42
yNnCps9BURcLpyQFeKF+eO0MxtikqmLwxcthpaUOKL0Yg4onhWbswC+UF18XMn/V
Ht04gEfCd6qgp+KOvIrz6jC7qel5qI20AdPsYKXNT4Mdh+WWKAPsST6W6R1Dd5LA
ALo+8Eb9y+hoQ8rGS+6SJn1jhqzMKPqJOsxjIaiFxXarXTc0khqze11aB0/+99up
k/wGLdD6Gu9wJebDeDMIl8Pk6zwgj28yQIgC3XDmAG9lZy3uxN31eo49SGjpjuma
m1x/+HgWFizGbnI9x9Ehi7F0ESzQdgnsJ27mnvmXoAlPvOQW5ZiPeWDcdJPwZGPK
uukjIgNo8B9JZL3fthH68+RiwXYr/w2RMlfz/o/3Oo6tBihGrgdRyxYqsV90pFOV
KalgPASFrKjzIJzLUkVYrR/QtyLF9UsO0gcK6+j+TvJToaoZ5t2f4oGO5kbLSnqo
+Yu75s/bCMlK/X7ZFOdGEBPyNw3j2PyDI7k6+cfoz558PW9FLgv3Zs+04DHmmzMr
LjVJlFdKlRfVk4n/Z6tOX+0R/7ol6Me3Cdj14zoIFgnC8WZu7ciT9+MKveLYF37C
zNJWD1OHfdotxCyfiCQ92SVwccWur1n4DcFYC/1JJKTxvTOrOPs65/wTR1gkOr9+
1SvqO2WzvZfrKabnUCT7
=eYB2
-----END PGP SIGNATURE-----

Reply all
Reply to author
Forward
0 new messages