ush.it - a beautiful place

Jetty 6.x and 7.x Multiple Vulnerabilities

October 25, 2009 at 5:00 am - Filed under Hacks, Language EN - 2607 words, reading time ~8 minutes - Permalink - Comments

Jetty is a pure Java application server used by big players like Google (Google AppEngine, Google Web Toolkit) and many projects and products like Eclipse, Alfresco Developers, Bea WebLogic Business Connect and WebLogic Event Server, Cisco Subscriber Edge Services Manager, Sybase EAServer, Apache Geronimo, HP OpenView Interconnect Tools and HP Openview Self-Healing, JFox, Zimbra Desktop and others (here a more complete list http://docs.codehaus.org/display/JETTY/Jetty+Powered). Finding a bug in such a wildspread component is something definitely interesting as the exploitation scenarios are many. We were procrastinating a little too much on this advisory but a CORE advisory burned some of our research and this month we found the time to contact the vendor and follow our disclosure procedure. As always enjoy the reading!

Jetty 6.x and 7.x Multiple Vulnerabilities

 Name              Multiple Vulnerabilities in Jetty
 Systems Affected  Jetty 7.0.0 and earlier versions
 Severity          Medium
 Impact (CVSSv2)   Medium 5/10, vector: (AV:N/AC:L/Au:N/C:P/I:N/A:N)
 Vendor            http://www.mortbay.org/jetty/
 Advisory          http://www_ush_it/team/ush/hack-jetty6x7x/jetty-adv.txt
 Authors           Francesco "ascii" Ongaro (ascii AT ush DOT it)
                   Giovanni "evilaliv3" Pellerano (evilaliv3 AT ush DOT it)
                   Antonio "s4tan" Parata (s4tan AT ush DOT it)
 Date              20091024

I. BACKGROUND

Jetty is an open-source project providing a HTTP server, HTTP client and
javax.servlet container. These 100% java components are full-featured,
standards based, small foot print, embeddable, asynchronous and
enterprise scalable. Jetty is dual licensed under the Apache Licence
2.0 and/or the Eclipse Public License 1.0. Jetty is free for commercial use and distribution under the terms of either of those licenses. Jetty is used in a wide variety of projects and products: embedded in phones, in tools like the the eclipse IDE, in frameworks like GWT, in application servers like Apache Geronimo and in huge clusters like Yahoo's Hadoop cluster. The latest version at the time of writing can be obtained from: http://dist.codehaus.org/jetty/jetty-7.0.0/jetty-hightide-7.0.0.v2009100 5.tar.gz Running Jetty 7.0.x is very easy, from the documentation page at: http://docs.codehaus.org/display/JETTY/Running+Jetty-7.0.x - From an unpacked release directory of jetty-7, the server can be started with the command: java -jar start.jar - This will start a HTTP server on port 8080 and deploy the test web application at: http://localhost:8080/test II. DESCRIPTION Multiple Vulnerabilities exist in Jetty software. III. ANALYSIS Summary: A) "Dump Servlet" information leak (Affected versions: Any) B) "FORM Authentication demo" information leak (Affected versions: Any) C) "JSP Dump" reflected XSS (Affected versions: Any) D) "Session Dump Servlet" stored XSS (Affected versions: Any) E) "Cookie Dump Servlet" escape sequence injection (Affected versions: Any) F) Http Content-Length header escape sequence injection (Affected versions: Any) G) "Cookie Dump Servlet" stored XSS (Affected versions: =<6.1.20) H) WebApp JSP Snoop page XSS (Affected versions: =<6.1.21) A) "Dump Servlet" information leak (Affected versions: Any) By requesting the demo "Dump Servlet" at an URL like "/test/dump/" it's possible to obtain a number of details about the remote Jetty instance. Variables: getMethod, getContentLength, getContentType, getRequestURI, getRequestURL, getContextPath, getServletPath, getPathInfo, getPathTranslated, getQueryString, getProtocol, getScheme, getServerName, getServerPort, getLocalName, getLocalAddr, getLocalPort, getRemoteUser, getRemoteAddr, getRemoteHost, getRemotePort, getRequestedSessionId, isSecure(), isUserInRole(admin), getLocale, getLocales, getLocales Plus a dump of all the HTTP request headers, the request parameters and much more. Five forms can be used to perform a series of functionality tests including: - Form to generate GET content - Form to generate POST content - Form to generate UPLOAD content - Form to set Cookie - Form to get Resource While this is a feature we think that demo utilities should be disabled by default. Many live deployments of Jetty exhibit demo pages that leak important information and expose several vulnerabilites. B) "FORM Authentication demo" information leak (Affected versions: Any) An example application often erroneously deployed is the "FORM Authentication demo" (logon.html and logonError.html pages) that uses the standard "j_security_check" component. By requesting the "/test/logon.html" page it's possible to detect the presence of a Jetty installation. As noted before we think that demo utilities should be disabled by default. C) "JSP Dump" reflected XSS (Affected versions: Any) It has been found that the demo "JSP Dump" feature is vulnerable to reflected Cross Site Scripting attacks. This can be replicated by issuing a GET request to the "/test/jsp/dump.jsp" page: "/test/jsp/dump.jsp?%3Cscript%3Ealert(%22hello%20world%22)%3C/script%3E" Any GET key and value that reach the remote is reflected unencoded. The problem resides in the "jsp/dump.jsp" file from the "webapps/test.war" archive. --8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-- <html><head> <%@ page import="java.util.Enumeration" %> </head><body> <h1>JSP Dump</h1> <table border="1"> <tr><th>Request URI:</th><td><%= request.getRequestURI() %></td></tr> <tr><th>ServletPath:</th><td><%= request.getServletPath() %></td></tr> <tr><th>PathInfo:</th><td><%= request.getPathInfo() %></td></tr> <% Enumeration e =request.getParameterNames(); while(e.hasMoreElements()) { String name = (String)e.nextElement(); %> <tr> <th>getParameter("<%= name %>")</th> <td><%= request.getParameter(name) %></td></tr> <% } %> </table> </body></html> --8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-- As shown no encoding is applied to user inputs. D) "Session Dump Servlet" stored XSS (Affected versions: Any) It has been found that the "Session Dump Servlet" feature is affected by a stored Cross Site Scripting vulnerability. The servlet, mapped in "/session/", normally uses HTTP POST parameters but also accepts values by HTTP GET granting easier exploitation. The issue can be verified by requesting an URL like the following: "/test/session/?R=0&Name=%3Cscript%3Ealert(%27name%27)%3C/script%3E&Valu e=%3Cscript%3Ealert(%27value%27)%3C/script%3E&Action=Set" Any consecutive request to "/test/session/" without parameters will include the previously inserted payloads. Session keys and values are reflected unencoded both on the first and successive requests. E) "Cookie Dump Servlet" escape sequence injection (Affected versions: Any) Making a POST request to the form at "/test/cookie/" with the "Age" parameter set to a string throws a "java.lang.NumberFormatException" exception. The backtrace output is not sanitized from escape sequences, this vulnerability is similiar to CVE-2003-0020 [1] and CVE-2003-0083 [2]. While the backtrace is protected from Cross Site Scripting attacks it still reflects as-is many binary characters including ESC. These special characters are used in control sequences to instruct the terminal to perform special operations like executing commands [3, 4] or dumping the buffer to a file [5, 6]. This issue can be demonstrated with the following Proof of Concept using a non-dangerous escape sequence that will change the Xterm title. In the first terminal: $ echo -en "\x1b]2;safe?\x07\x0a"; java -jar start.jar etc/jetty.xml; In the second terminal: $ curl -kis "http://localhost:8080/cookie/" -d "Action=Set&Name=aa&Value =bb&Age=%1b%5d%32%3b%6f%77%6e%65%64%07%0a" Logs can be found in logs/[date].stderrout.log or are printed directly to the terminal. A user that views (cat, tail -f) these logs or runs Jetty in his tty/pty may get influenced in a negative way by a malicious control sequence. The code involved in this vulnerability is in the Java class found at "test-jetty-webapp/src/main/java/com/acme/CookieDump.java". --8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-- protected void handleForm(HttpServletRequest request, HttpServletResponse response) { String action = request.getParameter("Action"); String name = request.getParameter("Name"); String value = request.getParameter("Value"); String age = request.getParameter("Age"); if (name!=null && name.length()>0) { Cookie cookie = new Cookie(name,value); if (age!=null && age.length()>0) cookie.setMaxAge(Integer.parseInt(age)); response.addCookie(cookie); } } --8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<--8<-- The problem also exists for other demo pages, see for example the "/test/jsp/expr.jsp" page (eg: "/test/jsp/expr.jsp?A=LetteralString"). This issue is generic to all the Java applications that use the standard error handling mechanism. Consider this an advisory also for Java JVM. F) HTTP Content-Length header escape sequence injection (Affected versions: Any) The same attack vector presented in point "E" can be exploited by requesting a page using an HTTP request "Content-Length" header set to a letteral string. This raises a type mismatch exception as previously shown. See the following PoC: $ curl 127.0.0.1:8080 -H "Content-Length: abcde" The difference between this possibility and the one exposed in "E" is that this works not only on Jetty default demo applications but on every application that Jetty will serve. G) "Cookie Dump Servlet" stored XSS (Affected versions: =<6.1.20) On Tue, 06 Oct 2009 the CORE-2009-0922 advisory killed part of our research. The advisory titled "Jetty Persistent XSS in Sample Cookies Application" is about this specific point. Out initial writing is presented anyway: The "Cookie Dump Servlet" works in a similar way as the previous "Session Dump Servlet", accepting GET parameters. The difference is that two requests are needed (as it was a stored POST XSS) since the first will trigger the Set-Cookie and the second request will echo it. This issue can be replicated with the following request: "/cookie?R=1&Name=<token1>&Value=<token2>&Age=60&Action=Set" Input values are stored and presented unescaped. H) WebApp JSP Snoop page XSS (Affected versions: =<6.1.21) All the Jetty 6.1.X versions are affected by a reflected XSS in the JSP Snoop page. This does not work on the 7.X branch. When called by it's deploy the "WebApp JSP Snoop page" (/jspsnoop) is vulnerable to XSS: "/jspsnoop/ERROR/%3Cscript%3Ealert(123)%3C/script%3E" "/jspsnoop/IOException/%3Cscript%3Ealert(123)%3C/script%3E" "/jspsnoop/%3Cscript%3Ealert(123)%3C/script%3E" "Path translated" and "Path info" are not encoded. This in not exploitable when the page is implicitly called, for example to handle a 404 page as the "Path translated" is always "/ERROR/404". The same happens when requiring the page by its filesystem location (/snoop.jsp). IV. DETECTION Jetty 7.0.0 and possibly earlier versions are vulnerable. Jetty can be identified using the following examples or by directly requesting files and locations marked as "information leak" in this advisory. Some examples: - intitle:"Powered By Jetty" - intitle:"JSP snoop page" "WebApp JSP Snoop page" - inurl:"snoop.jsp - "Welcome to Jetty 7" V. WORKAROUND The vendor decided not to modify the release schedule in order to publish a version to address the presented issues. We have been sayd that the next release (available in 1 to 3 weeks) will resolve all the issues in the demo applications and the command sequence injection vulnerability. The ESC insertion problems will be resolved by: - Handling the particular exceptions you found (NumberFormateException). - Updating the stderrlogger so that all user supplied output is stripped of non whitespace ISO control characters. - Stripping ISO control characters from generated error pages. In the meantime the vendor provides the following workaround recommendations: - The test webappplications must not be deployed on production sites. An administrator can remove the "webapps/test.war" file and/or the "webapps/test directory", plus the contexts/test.xml file. To be clear again: DON'T DEPLOY THE TEST WEBAPP ON PRODUCTION. - Do not run Jetty as the root user. Instead run as a limited user and redirect port 80 to the port that jetty is using. See http://docs.codehaus.org/display/JETTY/port80. - Do not run production jetty instances from a console. Instead start in the background using an /etc/init.rc/jetty.sh script or similar. - Redirect stderr to a file. This can be done with the jetty-logging.xml file as follows: java -jar start.jar etc/jetty.xml etc/jetty-logging.xml - Process log files with cat -v if you wish to display them on a console without using an editor. VI. VENDOR RESPONSE Vendor will not release a new version to address these issues but is working on them in the SNAPSHOT versions. http://svn.codehaus.org/jetty/jetty/branches/jetty-6.1/VERSION.txt We had no precise response about remediation status and plans but we were told that it was okay to release this advisory. It elapsed about a week from the last email sent to the vendor, since we got no reply we assume that it's okay to release. VII. CVE INFORMATION No CVE at this time. VIII. DISCLOSURE TIMELINE 20090616 Bug discovered 20091006 CORE-2009-0922 reveals an XSS issue (point G) 20091006 Jetty branch 7 kills the "jspsnoop" issue (point H) 20091011 Internal version of this advisory finalized 20091013 First vendor contact 20091014 Vendor Response, "We are working on XSS on demo apps" 20091015 Asking for release timeline 20091015 Vendor Response, Suggests a remediation, "Okay to release" 20091015 Remediation doesn't fix the Escape Sequence issue 20091015 Vendor Response, ACK, "Wait until next week" 20091016 Vendor Response, "We are not going to rush out a release to fix the escape injection problem" 20091024 Advisory release IX. REFERENCES [1] Apache does not filter terminal escape sequences from error logs http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-0020 [2] Apache does not filter terminal escape sequences from access logs http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-0083 [3] Debian GNU/Linux XTERM (DECRQSS/comments) Weakness Vulnerability http://www.milw0rm.com/exploits/7681 [4] Terminal Emulator Security Issues http://marc.info/?l=bugtraq&m=104612710031920&w=2 [5] Eterm Screen Dump Escape Sequence Local File Corruption Vulnerability http://www.securityfocus.com/bid/6936/discuss [6] RXVT Screen Dump Escape Sequence Local File Corruption Vulnerability http://www.securityfocus.com/bid/6938/discuss X. CREDIT Francesco "ascii" Ongaro, Giovanni "evilaliv3" Pellerano and Antonio "s4tan" Parata are credited with the discovery of this vulnerability. Francesco "ascii" Ongaro web site: http://www_ush_it/ mail: ascii AT ush DOT it Giovanni "evilaliv3" Pellerano web site: http://www_ush_it/, http://www.evilaliv3.org/ mail: evilaliv3 AT ush DOT it Antonio "s4tan" Parata web site: http://www_ush_it/ mail: s4tan AT ush DOT it X. LEGAL NOTICES Copyright (c) 2009 Francesco "ascii" Ongaro Permission is granted for the redistribution of this alert electronically. It may not be edited in any way without mine express written consent. If you wish to reprint the whole or any part of this alert in any other medium other than electronically, please email me for permission. Disclaimer: The information in the advisory is believed to be accurate at the time of publishing based on currently available information. Use of the information constitutes acceptance for use in an AS IS condition. There are no warranties with regard to this information. Neither the author nor the publisher accepts any liability for any direct, indirect, or consequential loss or damage arising from use of, or reliance on, this information.
THP USH Wisec DigitalBullets