Mongo BSON Injection: Ruby Regexps Strike Again
http://sakurity.com/blog/2015/06/04/mongo_ruby_regexp.html
原因是一个正则表达式使用了 ^$
而不是 \A\z
,输入多行内容的时候会躲过检测。
测试是否使用有问题版本:
b=((defined?(Moped::BSON) ? Moped::BSON : BSON)::ObjectId)
raise "DoS!" if b.legal? "a"*24+"\n"
raise "Injection!" if b.legal? "a"*24+"\na"
临时补丁:
def ((defined?(Moped::BSON) ? Moped::BSON : BSON)::ObjectId).legal?(s)
/\A\h{24}\z/ === s.to_s
end
题外话:
这种直接公布漏洞的行为并不符合社区运作的规则,发现漏洞应该先联系库的维护者打补丁,然后发公告,让开发者有时间通过更新修复漏洞。这样直接公布漏洞(甚至还有利用方法)就是逼迫所有开发者跟骇客时间竞赛。
https://github.com/mongodb/bson-ruby/blob/master/CHANGELOG.md#304
bson-ruby 3.0.4 已经修复了。