Ho Right!

Jacques

Scott Gray wrote:
We don't use tomcat's manager application.

Regards
Scott

HotWax Media
http://www.hotwaxmedia.com

On 1/12/2010, at 9:54 PM, Jacques Le Roux wrote:

Hi,

Sould we not update?

Thanks

Jacques

From: "Mark Thomas" <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

CVE-2010-4172: Apache Tomcat Manager application XSS vulnerability

Severity: Tomcat 7.0.x - Low, Tomcat 6.0.x - Moderate

Vendor: The Apache Software Foundation

Versions Affected:
- - Tomcat 7.0.0 to 7.0.4
- Not affected in default configuration.
- Affected if CSRF protection is disabled
- Additional XSS issues if web applications are untrusted
- - Tomcat 6.0.12 to 6.0.29
- Affected in default configuration
- Additional XSS issues if web applications are untrusted
- - Tomcat 5.5.x
- Not affected

Description:
The session list screen (provided by sessionList.jsp) in affected versions uses 
the orderBy and sort request parameters without
applying filtering and therefore is vulnerable to a cross-site scripting attack.
Users should be aware that Tomcat 6 does not use httpOnly for session cookies 
by default so this vulnerability could expose
session cookies from the manager application to an attacker.
A review of the Manager application by the Apache Tomcat security team 
identified additional XSS vulnerabilities if the web
applications deployed were not trusted.

Example:
GET
/manager/html/sessions?path=/&sort="><script>alert('xss')</script>order=ASC&action=injectSessions&refresh=Refresh+Sessions+list

Mitigation:
Users of affected versions should apply one of the following mitigations
- - Tomcat 7.0.0 to 7.0.4
- Remove the Manager application
- Remove the sessionList.jsp and sessionDetail.jsp files
- Ensure the CSRF protection is enabled
- Apply the patch 7.0.4 patch (see below)
- Update to 7.0.5 when released
- - Tomcat 6.0.12 to 6.0.29
- Remove the Manager application
- Remove the sessionList.jsp and sessionDetail.jsp files
- Apply the patch for 6.0.29 (see below)
- Update to 6.0.30 when released

No release date has been set for the next Tomcat 7.0.x and Tomcat 6.0.x
releases.

Credit:
The original issue was discovered by Adam Muntner of Gotham Digital Science.
Additional issues were identified by the Tomcat security team as a result of 
reviewing the original issue.

References:
http://tomcat.apache.org/security.html
http://tomcat.apache.org/security-7.html
http://tomcat.apache.org/security-6.html

Note: The patches
The Apache Tomcat Security Team


****************
Patch for 6.0.29
****************

Index: webapps/manager/WEB-INF/jsp/sessionDetail.jsp
===================================================================
- --- webapps/manager/WEB-INF/jsp/sessionDetail.jsp (revision 1037769)
+++ webapps/manager/WEB-INF/jsp/sessionDetail.jsp (working copy)
@@ -30,8 +30,10 @@
<% String path = (String) request.getAttribute("path");
  Session currentSession = (Session)request.getAttribute("currentSession");
  HttpSession currentHttpSession = currentSession.getSession();
- -   String currentSessionId = currentSession.getId();
- -   String submitUrl = 
((HttpServletRequest)pageContext.getRequest()).getRequestURL().toString();
+   String currentSessionId = JspHelper.escapeXml(currentSession.getId());
+   String submitUrl = JspHelper.escapeXml(
+           ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
+           "?path=" + path);
%>
<head>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
@@ -45,7 +47,7 @@
<title>Sessions Administration: details for <%= currentSessionId %></title>
</head>
<body>
- -<h1>Details for Session <%= JspHelper.escapeXml(currentSessionId) %></h1>
+<h1>Details for Session <%= currentSessionId %></h1>
<table style="text-align: left;" border="0">
 <tr>
@@ -54,7 +56,7 @@
 </tr>
 <tr>
   <th>Guessed Locale</th>
- -    <td><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>
+    <td><%= 
JspHelper.escapeXml(JspHelper.guessDisplayLocaleFromSession(currentSession)) %></td>
 </tr>
 <tr>
   <th>Guessed User</th>
@@ -120,7 +122,7 @@
  String attributeName = (String) attributeNamesEnumeration.nextElement();
%>
<tr>
- - <td align="center"><form action="<%= submitUrl %>"><div><input type="hidden" name="path" 
value="<%= path %>" /><input
type="hidden" name="action" value="removeSessionAttribute" /><input type="hidden" 
name="sessionId" value="<%= currentSessionId
%>" /><input type="hidden" name="attributeName" value="<%= attributeName %>" /><input 
type="submit" value="Remove"
/></div></form></td> + <td align="center"><form action="<%= submitUrl %>"><div><input 
type="hidden" name="action"
value="removeSessionAttribute" /><input type="hidden" name="sessionId" value="<%= currentSessionId 
%>" /><input type="hidden"
name="attributeName" value="<%= JspHelper.escapeXml(attributeName) %>" /><input 
type="submit" value="Remove"
/></div></form></td> <td><%= JspHelper.escapeXml(attributeName) %></td> <td><% 
Object attributeValue =
currentHttpSession.getAttribute(attributeName); %><span title="<%= attributeValue == null 
? "" :
attributeValue.getClass().toString() %>"><%= JspHelper.escapeXml(attributeValue) 
%></span></td> </tr>
Index: webapps/manager/WEB-INF/jsp/sessionsList.jsp
===================================================================
- --- webapps/manager/WEB-INF/jsp/sessionsList.jsp (revision 1037769)
+++ webapps/manager/WEB-INF/jsp/sessionsList.jsp (working copy)
@@ -26,7 +26,9 @@
<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en">
<% String path = (String) request.getAttribute("path");
- -   String submitUrl = ((HttpServletRequest)pageContext.getRequest()).getRequestURI() + 
"?path=" + path;
+   String submitUrl = JspHelper.escapeXml(
+           ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
+           "?path=" + path);
  Collection activeSessions = (Collection) 
request.getAttribute("activeSessions");
%>
<head>
@@ -38,10 +40,10 @@
<meta name="author" content="Cedrik LIME"/>
<meta name="copyright" content="copyright 2005-2010 the Apache Software 
Foundation"/>
<meta name="robots" content="noindex,nofollow,noarchive"/>
- - <title>Sessions Administration for <%= path %></title>
+ <title>Sessions Administration for <%= JspHelper.escapeXml(path) %></title>
</head>
<body>
- -<h1>Sessions Administration for <%= path %></h1>
+<h1>Sessions Administration for <%= JspHelper.escapeXml(path) %></h1>
<p>Tips:</p>
<ul>
@@ -55,13 +57,13 @@
<form action="<%= submitUrl %>" method="post" id="sessionsForm">
<fieldset><legend>Active HttpSessions informations</legend>
<input type="hidden" name="action" id="sessionsFormAction" 
value="injectSessions"/>
- - <input type="hidden" name="sort" id="sessionsFormSort" value="<%= (String) 
request.getAttribute("sort") %>"/>
+ <input type="hidden" name="sort" id="sessionsFormSort" value="<%= 
JspHelper.escapeXml(request.getAttribute("sort")) %>"/>
<% String order = (String) request.getAttribute("order");
   if (order == null || "".equals(order)) {
   order = "ASC";
   }
%>
- - <input type="hidden" name="order" id="sessionsFormSortOrder" value="<%= order 
%>"/>
+ <input type="hidden" name="order" id="sessionsFormSortOrder" value="<%= 
JspHelper.escapeXml(order) %>"/>
<input type="submit" name="refresh" id="refreshButton" value="Refresh Sessions 
list"
onclick="document.getElementById('sessionsFormAction').value='refreshSessions'; return 
true;"/> <%=
JspHelper.formatNumber(activeSessions.size()) %> active Sessions<br/> <table border="1" 
cellpadding="2" cellspacing="2"
width="100%"> @@ -95,13 +97,13 @@
<% Iterator iter = activeSessions.iterator();
  while (iter.hasNext()) {
  Session currentSession = (Session) iter.next();
- -   String currentSessionId = currentSession.getId();
+   String currentSessionId = JspHelper.escapeXml(currentSession.getId());
%>
<tr>
<td>
- -<input type="checkbox" name="sessionIds" value="<%= currentSessionId %>" /><a 
href="<%= submitUrl
%>&amp;action=sessionDetail&amp;sessionId=<%= currentSessionId %>" 
target="_blank"><%= JspHelper.escapeXml(currentSessionId)
%></a> +<input type="checkbox" name="sessionIds" value="<%= currentSessionId %>" /><a 
href="<%= submitUrl
%>&amp;action=sessionDetail&amp;sessionId=<%= currentSessionId %>" target="_blank"><%= 
currentSessionId %></a> </td> - - <td
style="text-align: center;"><%= JspHelper.guessDisplayLocaleFromSession(currentSession) 
%></td> + <td style="text-align:
center;"><%= JspHelper.escapeXml(JspHelper.guessDisplayLocaleFromSession(currentSession)) 
%></td> <td style="text-align:
center;"><%= JspHelper.guessDisplayUserFromSession(currentSession) %></td> <td 
style="text-align: center;"><%=
JspHelper.getDisplayCreationTimeForSession(currentSession) %></td> <td style="text-align: 
center;"><%=
JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %></td>



***************
Patch for 7.0.4
***************

Index: webapps/manager/WEB-INF/jsp/sessionDetail.jsp
===================================================================
- --- webapps/manager/WEB-INF/jsp/sessionDetail.jsp (revision 1037768)
+++ webapps/manager/WEB-INF/jsp/sessionDetail.jsp (working copy)
@@ -30,9 +30,10 @@
<% String path = (String) request.getAttribute("path");
  Session currentSession = (Session)request.getAttribute("currentSession");
  HttpSession currentHttpSession = currentSession.getSession();
- -   String currentSessionId = currentSession.getId();
- -   String submitUrl = response.encodeURL(((HttpServletRequest)
- -           pageContext.getRequest()).getRequestURL().toString());
+   String currentSessionId = JspHelper.escapeXml(currentSession.getId());
+   String submitUrl = JspHelper.escapeXml(response.encodeURL(
+           ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
+           "?path=" + path));
%>
<head>
   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
@@ -46,7 +47,7 @@
   <title>Sessions Administration: details for <%= currentSessionId %></title>
</head>
<body>
- -<h1>Details for Session <%= JspHelper.escapeXml(currentSessionId) %></h1>
+<h1>Details for Session <%= currentSessionId %></h1>
<table style="text-align: left;" border="0">
 <tr>
@@ -55,7 +56,7 @@
 </tr>
 <tr>
   <th>Guessed Locale</th>
- -    <td><%= JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>
+    <td><%= 
JspHelper.escapeXml(JspHelper.guessDisplayLocaleFromSession(currentSession)) %></td>
 </tr>
 <tr>
   <th>Guessed User</th>
@@ -89,7 +90,6 @@
<form method="post" action="<%= submitUrl %>">
 <div>
- -    <input type="hidden" name="path" value="<%= path %>" />
   <input type="hidden" name="sessionId" value="<%= currentSessionId %>" />
   <input type="hidden" name="action" value="sessionDetail" />
   <input type="submit" value="Refresh" />
@@ -131,10 +131,9 @@
           <td align="center">
               <form method="post" action="<%= submitUrl %>">
                   <div>
- -                        <input type="hidden" name="path" value="<%= path %>" 
/>
                       <input type="hidden" name="action" 
value="removeSessionAttribute" />
                       <input type="hidden" name="sessionId" value="<%= currentSessionId 
%>" />
- -                        <input type="hidden" name="attributeName" value="<%= 
attributeName %>" />
+                        <input type="hidden" name="attributeName" value="<%= 
JspHelper.escapeXml(attributeName) %>" />
                       <%
                         if 
("Primary".equals(request.getAttribute("sessionType"))) {
                       %>
@@ -156,7 +155,6 @@
<form method="post" action="<%=submitUrl%>">
 <p style="text-align: center;">
- -    <input type="hidden" name="path" value="<%= path %>" />
   <input type="submit" value="Return to session list" />
 </p>
</form>
Index: webapps/manager/WEB-INF/jsp/sessionsList.jsp
===================================================================
- --- webapps/manager/WEB-INF/jsp/sessionsList.jsp (revision 1037768)
+++ webapps/manager/WEB-INF/jsp/sessionsList.jsp (working copy)
@@ -28,8 +28,9 @@
<%...@page import="org.apache.catalina.manager.DummyProxySession"%><html 
xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en">
<% String path = (String) request.getAttribute("path");
- -   String submitUrl = response.encodeURL(((HttpServletRequest)
- -           pageContext.getRequest()).getRequestURI() + "?path=" + path);
+   String submitUrl = JspHelper.escapeXml(response.encodeURL(
+           ((HttpServletRequest) pageContext.getRequest()).getRequestURI() +
+           "?path=" + path));
  Collection activeSessions = (Collection) 
request.getAttribute("activeSessions");
%>
<head>
@@ -41,10 +42,10 @@
   <meta name="author" content="Cedrik LIME"/>
   <meta name="copyright" content="copyright 2005-2010 the Apache Software 
Foundation"/>
   <meta name="robots" content="noindex,nofollow,noarchive"/>
- -    <title>Sessions Administration for <%= path %></title>
+    <title>Sessions Administration for <%= JspHelper.escapeXml(path) %></title>
</head>
<body>
- -<h1>Sessions Administration for <%= path %></h1>
+<h1>Sessions Administration for <%= JspHelper.escapeXml(path) %></h1>
<p>Tips:</p>
<ul>
@@ -58,13 +59,13 @@
<form action="<%= submitUrl %>" method="post" id="sessionsForm">
   <fieldset><legend>Active HttpSessions informations</legend>
       <input type="hidden" name="action" id="sessionsFormAction" 
value="injectSessions"/>
- -        <input type="hidden" name="sort" id="sessionsFormSort" value="<%= (String) 
request.getAttribute("sort") %>"/>
+        <input type="hidden" name="sort" id="sessionsFormSort" value="<%= 
JspHelper.escapeXml(request.getAttribute("sort"))
       %>"/> <% String order = (String) request.getAttribute("order");
          if (order == null || "".equals(order)) {
              order = "ASC";
          }
       %>
- -        <input type="hidden" name="order" id="sessionsFormSortOrder" value="<%= order 
%>"/>
+        <input type="hidden" name="order" id="sessionsFormSortOrder" value="<%= 
JspHelper.escapeXml(order) %>"/>
       <input type="submit" name="refresh" id="refreshButton" value="Refresh 
Sessions list"
       onclick="document.getElementById('sessionsFormAction').value='refreshSessions'; 
return true;"/> <%=
       JspHelper.formatNumber(activeSessions.size()) %> active Sessions<br/> <table border="1" 
cellpadding="2" cellspacing="2"
width="100%"> @@ -100,7 +101,7 @@
<% Iterator iter = activeSessions.iterator();
  while (iter.hasNext()) {
      Session currentSession = (Session) iter.next();
- -       String currentSessionId = currentSession.getId();
+       String currentSessionId = JspHelper.escapeXml(currentSession.getId());
      String type;
      if (currentSession instanceof DeltaSession) {
          if (((DeltaSession) currentSession).isPrimarySession()) {
@@ -121,13 +122,13 @@
                           out.print(currentSessionId);
                       } else {
                     %>
- -                      <a href="<%= submitUrl 
%>&amp;action=sessionDetail&amp;sessionId=<%= currentSessionId
%>&amp;sessionType=<%= type %>"><%= JspHelper.escapeXml(currentSessionId) %></a> +         
             <a href="<%= submitUrl
                     %>&amp;action=sessionDetail&amp;sessionId=<%= currentSessionId 
%>&amp;sessionType=<%= type %>"><%=
                       currentSessionId %></a> <% }
                     %>
                   </td>
                   <td style="text-align: center;"><%= type %></td>
- -                    <td style="text-align: center;"><%= 
JspHelper.guessDisplayLocaleFromSession(currentSession) %></td>
+                    <td style="text-align: center;"><%=
                   JspHelper.escapeXml(JspHelper.guessDisplayLocaleFromSession(currentSession)) 
%></td> <td style="text-align:
                   center;"><%= JspHelper.guessDisplayUserFromSession(currentSession) 
%></td> <td style="text-align:
                   center;"><%= JspHelper.getDisplayCreationTimeForSession(currentSession) 
%></td> <td style="text-align:
center;"><%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) 
%></td> -----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJM6r54AAoJEBDAHFovYFnn8HEP+gLTkB76D6xNffzu6bWkFXLF
CJDKSeNJcbLeX8AGInTWPA73pndVe4c2uoW8qH31XSzrYyikR5BdQO7Fo3bZ4c1H
4nPdKtBciWxY43nkNQ8ZGXGP1ADDKS43uJioqPm/Hr9hzOYaNSkuw7063CQEB87B
a0wUcG6pIdHMJEgu+CXicMWxQKpLM8IAvnLFmuiv/rkihXsZK1131r5UMX3oApD/
2r82MHqRAetJ1S5h19gYuUKM4wwCrdW1GGUmC3tjA5+ocrUOYKA2WccHLMitDqh3
heoFQ7gLVEgqaFNSVQxYMBT1qqQN+wOxfhsghK2H49ukVdrgA7Vs71vlPz7QGmAq
7mlGQCfa219mSLTxt+G+u9fI3PpghodPwMEY8BeU3GuPDKze72U8oVIedO59rRJZ
i2a1l2ob/sg/L5olyTGqMyu1cwkmx91ZAnovnUqHBpEYxVO4Nzc5N8cicN/+lEnS
MrvsS6UzcZibLZMxmE+ILcVaoygN2wb/ERK05vXG9ou+BzyoufY+LD/aKwDvWcif
oZv00Rl9TlQAbLYwGyUV/jvNXKAwn3WMqq6j1JH/yub+gjy5foit/cryD8N0x5p7
FDXQVcELhnGI9xno6+yXuMWY/z2cmuIZEuGI8Rdg0XtICy7U1Gp3/YZoUFVnU3Qt
QLXR/d5cHVjSXgtvTGGl
=1Wya
-----END PGP SIGNATURE-----

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to