session 默认是存在 cookie 里的,一般项目会选择存 DB 或缓存吗...
啥叫if they only use rails managed seesions
...
timing attack 是通过时间 profile 来破解 cookie secret 的... 但是要网速超快才有效果吧...
devise 代码里也有 secure_compare 之类的,也是为了把计算固定到常数时间
#14 楼 @iBachue (下面指的是 CVE-2013-0263)
如果代码用了 Rack::Session::Cookie (例如一些 padrino 的程序...), 就有利用这个漏洞伪造 session 的可能。只要能伪造 session, 攻击者就可以把自己的 user id 设成其他人或者管理员,就能随便看/改别人的资料或者登录后台了。
首先我们看看 Rack::Session::Cookie 是怎么处理 session 的:
user_id
, csrf_token
之类的内容Base64.encode64(Marshal.dump(..))
的方式序列化成一个字符串存在 cookie 中。这里能出什么问题呢?就是签名验证是要做字符串比较的,然后字符串比较的耗时是和第几个字符出现不同相关的... 如果签名的第一个字符就不对,比较的速度就很快; 第一个字符一致,但第二个字符不对,比较的速度就慢一些; 前两个字符一致,但第三个字符不对,就更慢一些...
攻击者可以用同一段伪造的 cookie 去请求一个 url, 然后穷举签名的第一个字符,选取能使服务器响应时间最慢的那个,那么 digest 的第一个字符应该就猜对了,然后依此类推穷举第二,第三个字符 ... 最后猜出摘要中所有字符,就能成功伪造了 session 了。
其实攻击的条件挺苛刻的... 首先是请求的时间要能测得很准,基本只能在云服务器上做攻击,而且请求的响应速度要快,请求中 Ruby GC 一下什么的测出来的时间就不准了。其次是要做很多次请求才能猜出 secret, 服务器只要随便有点监控就发现了,配置 http_limit 的服务器,猜摘要的时间间隔也很长,摘要长一点就不 viable 了。再其次是现在字符串比较算法各种利用 CPU 特殊指令,比较时间不一定和第一个不匹配的字符成线性关系...
跑题:网上有很多很多网站有各种更明显的漏洞,像 v2ex 的 cookie 都没设置成 http only, 也没人利用来盗取站长的 session... 这种较难利用的漏洞,攻击的收益成本比不大,应该没几个人会用吧...
#15 楼 @luikore 如果用 Passenger 或 Unicorn 开启OOBGC 客户端遇到 Ruby GC 的概率会很低的。会更利于这种 timing attrack 攻击。
其实 Rails 的 session 是没有加密的(前面那串就是简单的序列化),只做了防串改/伪造。而防伪造的唯一工具就是那个 secret_token,但是大多数开源项目是直接把这个东西放到源码库里的。所以,大部分 Rails 开源项目的 session 是很容易伪造的。不过 devise 使用 warden 这样的 gem 做法好像有些不同,没只细看。像 Ruby China 的 session 前半部分反序列化回来是这样的:
"session_id"=>"b8d724a***7f5c27494a51906",
"_csrf_token"=>"oWVFfkGLJ***MelmIzFnQ+GpFkE7wtn2IM2Wn0=",
"warden.user.user.key"=>["User", [8], "$2a$****W9LTJb2zsX2y."]}
Rails4 貌似在引入防 cookie 篡改/伪造的机制,和 session 原理一样。
跑题:http://python-china.org/member/hooopo 这个漏洞还没修,怎么才能拿到站长 session。。。
Rack::Session::Cookie 以前是可以伪造的:https://github.com/rack/rack/commit/054bc0203012c0e3ad6e1385cebe9e5d3d072b11
#3 楼 @keating 因为 Rails 在三年前已经 fix 了这个问题:https://github.com/rails/rails/commit/5e6dab8b34152bc48c89032d20e5bda1511e28fb
#1 楼 @bhuztez 大部分 Rails 项目是在 cookie 里存 session 的,因为那是默认设置。
写了一篇博客解释一下:http://hooopo.herokuapp.com/posts/1
#20 楼 @luikore 看commit message是说 1.6+ 会默认用 JSON,现在使用的 rack 还都是 1.5 的。还加了一个 okjson,不知道是不是速度快一些?
RoR 里通常把 session 数据存在服务器端,只在 cookie 里存 session_id。使得这样猜测 session secret 的攻击更难。如果每次系统维护的时候更改 session secret,攻击就更难了。