有木有谁关注这件事情的?话说对 Rails,Sinatra 之类的 app 影响如何啊?
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,攻击就更难了。