I just found a vulnerability in one of my web apps that was running
Mongrel 1.1.2 where I could go to URIs like
/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/etc/passwd and it
would serve the actual /etc/passwd file.

The issue seems to be in lib/mongrel/handlers.rb in the change from
1.0.3 to 1.0.4


       req_path = HttpRequest.unescape(path_info)
-      if @path
-        req_path = File.expand_path(File.join(@path, path_info), @path)
-      else
-        req_path = File.expand_path(req_path)
-      end
-
-      if req_path.index(@path) == 0 and File.exist? req_path
-        # it exists and it's in the right location
+      # Add the drive letter or root path
+      req_path = File.join(@path, req_path) if @path
+      req_path = File.expand_path req_path
+
+      if File.exist? req_path
+        # It exists and it's in the right location
         if File.directory? req_path

The main difference is that "req_path.index(@path) == 0" is removed,
which seems to be the cause of the vulnerability.

Adding that check back in fixes it in 1.1.2, but may cause issues on
Windows (I haven't checked)

Also, downgrading to 1.0.3 fixes it.
-- 
Posted via http://www.ruby-forum.com/.
_______________________________________________
Mongrel-users mailing list
Mongrel-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/mongrel-users

Reply via email to