CVE-2016-0762
Description
The Realm implementations in Apache Tomcat versions 9.0.0.M1 to 9.0.0.M9, 8.5.0 to 8.5.4, 8.0.0.RC1 to 8.0.36, 7.0.0 to 7.0.70 and 6.0.0 to 6.0.45 did not process the supplied password if the supplied user name did not exist. This made a timing attack possible to determine valid user names. Note that the default configuration includes the LockOutRealm which makes exploitation of this vulnerability harder.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
org.apache.tomcat:tomcatMaven | >= 9.0.0M1, < 9.0.0.M10 | 9.0.0.M10 |
org.apache.tomcat:tomcatMaven | >= 8.5.0, < 8.5.5 | 8.5.5 |
org.apache.tomcat:tomcatMaven | >= 8.0.0.RC1, < 8.0.37 | 8.0.37 |
org.apache.tomcat:tomcatMaven | >= 7.0.0, < 7.0.72 | 7.0.72 |
org.apache.tomcat:tomcatMaven | >= 6.0.0, < 6.0.46 | 6.0.46 |
Affected products
1- Apache Software Foundation/Apache Tomcatv5Range: 9.0.0.M1 to 9.0.0.M9
Patches
4970e615c7adeMake timing attacks against the Realm implementations harder. (schultz)
5 files changed · +91 −78
java/org/apache/catalina/realm/DataSourceRealm.java+23 −21 modified@@ -5,9 +5,9 @@ * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -271,13 +271,13 @@ public String getInfo() { */ @Override public Principal authenticate(String username, String credentials) { - + // No user or no credentials // Can't possibly authenticate, don't bother the database then if (username == null || credentials == null) { return null; } - + Connection dbConnection = null; // Ensure that we have an open database connection @@ -286,7 +286,7 @@ public Principal authenticate(String username, String credentials) { // If the db connection open fails, return "not authenticated" return null; } - + try { // Acquire a Principal object for this user @@ -331,6 +331,8 @@ protected Principal authenticate(Connection dbConnection, if(dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + compareCredentials(credentials, getClass().getName()); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("dataSourceRealm.authenticateFailure", @@ -374,7 +376,7 @@ protected void close(Connection dbConnection) { try { if (!dbConnection.getAutoCommit()) { dbConnection.commit(); - } + } } catch (SQLException e) { containerLog.error("Exception committing connection before closing:", e); } @@ -408,7 +410,7 @@ protected Connection open() { } catch (Exception e) { // Log the problem for posterity containerLog.error(sm.getString("dataSourceRealm.exception"), e); - } + } return null; } @@ -437,18 +439,18 @@ protected String getPassword(String username) { } try { - return getPassword(dbConnection, username); + return getPassword(dbConnection, username); } finally { close(dbConnection); } } - + /** * Return the password associated with the given principal's user name. * @param dbConnection The database connection to be used * @param username Username for which password should be retrieved */ - protected String getPassword(Connection dbConnection, + protected String getPassword(Connection dbConnection, String username) { ResultSet rs = null; @@ -463,7 +465,7 @@ protected String getPassword(Connection dbConnection, } return (dbCredentials != null) ? dbCredentials.trim() : null; - + } catch(SQLException e) { containerLog.error( sm.getString("dataSourceRealm.getPassword.exception", @@ -480,10 +482,10 @@ protected String getPassword(Connection dbConnection, containerLog.error( sm.getString("dataSourceRealm.getPassword.exception", username), e); - + } } - + return null; } @@ -527,15 +529,15 @@ protected ArrayList<String> getRoles(String username) { close(dbConnection); } } - + /** * Return the roles associated with the given user name * @param dbConnection The database connection to be used * @param username Username for which roles should be retrieved */ protected ArrayList<String> getRoles(Connection dbConnection, String username) { - + if (allRolesMode != AllRolesMode.STRICT_MODE && !isRoleStoreDefined()) { // Using an authentication only configuration and no role store has // been defined so don't spend cycles looking @@ -545,12 +547,12 @@ protected ArrayList<String> getRoles(Connection dbConnection, ResultSet rs = null; PreparedStatement stmt = null; ArrayList<String> list = null; - + try { stmt = roles(dbConnection, username); rs = stmt.executeQuery(); list = new ArrayList<String>(); - + while (rs.next()) { String role = rs.getString(1); if (role != null) { @@ -576,7 +578,7 @@ protected ArrayList<String> getRoles(Connection dbConnection, username), e); } } - + return null; } @@ -600,7 +602,7 @@ private PreparedStatement credentials(Connection dbConnection, return (credentials); } - + /** * Return a PreparedStatement configured to perform the SELECT required * to retrieve user roles for the specified username. @@ -613,7 +615,7 @@ private PreparedStatement credentials(Connection dbConnection, private PreparedStatement roles(Connection dbConnection, String username) throws SQLException { - PreparedStatement roles = + PreparedStatement roles = dbConnection.prepareStatement(preparedRoles); roles.setString(1, username); @@ -659,7 +661,7 @@ protected void startInternal() throws LifecycleException { temp.append(userNameCol); temp.append(" = ?"); preparedCredentials = temp.toString(); - + super.startInternal(); } }
java/org/apache/catalina/realm/JDBCRealm.java+2 −0 modified@@ -409,6 +409,8 @@ public synchronized Principal authenticate(Connection dbConnection, if (dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + compareCredentials(credentials, getClass().getName()); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("jdbcRealm.authenticateFailure",
java/org/apache/catalina/realm/MemoryRealm.java+6 −2 modified@@ -5,9 +5,9 @@ * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -150,6 +150,10 @@ public Principal authenticate(String username, String credentials) { GenericPrincipal principal = principals.get(username); if (principal == null || principal.getPassword() == null) { + // User was not found in the database or the password was null + // Waste a bit of time as not to reveal that the user does not exist. + compareCredentials(credentials, getClass().getName()); + if (log.isDebugEnabled()) log.debug(sm.getString("memoryRealm.authenticateFailure", username)); return null;
java/org/apache/catalina/realm/RealmBase.java+57 −55 modified@@ -5,9 +5,9 @@ * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -161,15 +161,15 @@ public abstract class RealmBase extends LifecycleMBeanBase implements Realm { * The all role mode. */ protected AllRolesMode allRolesMode = AllRolesMode.STRICT_MODE; - + /** * When processing users authenticated via the GSS-API, should any * "@..." be stripped from the end of the user name? */ protected boolean stripRealmForGss = true; - + private int transportGuaranteeRedirectStatus = HttpServletResponse.SC_FOUND; @@ -416,6 +416,8 @@ public Principal authenticate(String username, String credentials) { if (serverCredentials == null) { // User was not found + // Waste a bit of time as not to reveal that the user does not exist. + compareCredentials(credentials, getClass().getName()); if (containerLog.isTraceEnabled()) { containerLog.trace(sm.getString("realmBase.authenticateFailure", @@ -489,13 +491,13 @@ public Principal authenticate(String username, String clientDigest, } if (log.isDebugEnabled()) { - log.debug("Digest : " + clientDigest + " Username:" + username - + " ClientSigest:" + clientDigest + " nonce:" + nonce - + " nc:" + nc + " cnonce:" + cnonce + " qop:" + qop - + " realm:" + realm + "md5a2:" + md5a2 + log.debug("Digest : " + clientDigest + " Username:" + username + + " ClientSigest:" + clientDigest + " nonce:" + nonce + + " nc:" + nc + " cnonce:" + cnonce + " qop:" + qop + + " realm:" + realm + "md5a2:" + md5a2 + " Server digest:" + serverDigest); } - + if (serverDigest.equals(clientDigest)) { return getPrincipal(username); } @@ -540,7 +542,7 @@ public Principal authenticate(X509Certificate certs[]) { } - + /** * {@inheritDoc} */ @@ -553,10 +555,10 @@ public Principal authenticate(GSSContext gssContext, boolean storeCred) { } catch (GSSException e) { log.warn(sm.getString("realmBase.gssNameFail"), e); } - + if (gssName!= null) { String name = gssName.toString(); - + if (isStripRealmForGss()) { int i = name.indexOf('@'); if (i > 0) { @@ -579,12 +581,12 @@ public Principal authenticate(GSSContext gssContext, boolean storeCred) { return getPrincipal(name, gssCredential); } } - + // Fail in all other cases return null; } - + protected boolean compareCredentials(String userCredentials, String serverCredentials) { @@ -689,13 +691,13 @@ public void backgroundProcess() { if (uri == null) { uri = "/"; } - + String method = request.getMethod(); int i; boolean found = false; for (i = 0; i < constraints.length; i++) { SecurityCollection [] collection = constraints[i].findCollections(); - + // If collection is null, continue to avoid an NPE // See Bugzilla 30624 if ( collection == null) { @@ -710,7 +712,7 @@ public void backgroundProcess() { for(int j=0; j < collection.length; j++){ String [] patterns = collection[j].findPatterns(); - + // If patterns is null, continue to avoid an NPE // See Bugzilla 30624 if ( patterns == null) { @@ -739,7 +741,7 @@ public void backgroundProcess() { for (i = 0; i < constraints.length; i++) { SecurityCollection [] collection = constraints[i].findCollections(); - + // If collection is null, continue to avoid an NPE // See Bugzilla 30624 if ( collection == null) { @@ -765,9 +767,9 @@ public void backgroundProcess() { int length = -1; for(int k=0; k < patterns.length; k++) { String pattern = patterns[k]; - if(pattern.startsWith("/") && pattern.endsWith("/*") && + if(pattern.startsWith("/") && pattern.endsWith("/*") && pattern.length() >= longest) { - + if(pattern.length() == 2) { matched = true; length = pattern.length(); @@ -812,7 +814,7 @@ public void backgroundProcess() { if ( collection == null) { continue; } - + if (log.isDebugEnabled()) { log.debug(" Checking constraint '" + constraints[i] + "' against " + method + " " + uri + " --> " + @@ -863,7 +865,7 @@ public void backgroundProcess() { for (i = 0; i < constraints.length; i++) { SecurityCollection [] collection = constraints[i].findCollections(); - + // If collection is null, continue to avoid an NPE // See Bugzilla 30624 if ( collection == null) { @@ -895,7 +897,7 @@ public void backgroundProcess() { if(matched) { if(results == null) { results = new ArrayList<SecurityConstraint>(); - } + } results.add(constraints[i]); } } @@ -908,7 +910,7 @@ public void backgroundProcess() { } return resultsToArray(results); } - + /** * Convert an ArrayList to a SecurityContraint []. */ @@ -922,7 +924,7 @@ public void backgroundProcess() { return array; } - + /** * Perform access control based on the specified authorization constraint. * Return <code>true</code> if this constraint is satisfied and processing @@ -974,7 +976,7 @@ public boolean hasResourcePermission(Request request, denyfromall = true; break; } - + if(log.isDebugEnabled()) log.debug("Passing all access"); status = true; @@ -1012,7 +1014,7 @@ else if( log.isDebugEnabled() ) status = true; break; } - + // For AllRolesMode.STRICT_AUTH_ONLY_MODE there must be zero roles roles = request.getContext().findSecurityRoles(); if (roles.length == 0 && allRolesMode == AllRolesMode.STRICT_AUTH_ONLY_MODE) { @@ -1025,7 +1027,7 @@ else if( log.isDebugEnabled() ) } } } - + // Return a "Forbidden" message denying access to this resource if(!status) { response.sendError @@ -1035,8 +1037,8 @@ else if( log.isDebugEnabled() ) return status; } - - + + /** * Return <code>true</code> if the specified Principal has the specified * security role, within the context of this Realm; otherwise return @@ -1075,7 +1077,7 @@ public boolean hasRole(Wrapper wrapper, Principal principal, String role) { } - + /** * Enforce any user data constraint required by the security constraint * guarding this request URI. Return <code>true</code> if this constraint @@ -1166,8 +1168,8 @@ public boolean hasUserDataPermission(Request request, return (false); } - - + + /** * Remove a property change listener from this component. * @@ -1193,7 +1195,7 @@ protected void initInternal() throws LifecycleException { x509UsernameRetriever = createUsernameRetriever(x509UsernameRetrieverClassName); } - + /** * Prepare for the beginning of active use of the public methods of this * component and implement the requirements of @@ -1231,12 +1233,12 @@ protected void startInternal() throws LifecycleException { protected void stopInternal() throws LifecycleException { setState(LifecycleState.STOPPING); - + // Clean up allocated resources md = null; } - - + + /** * Return a String representation of this component. */ @@ -1247,8 +1249,8 @@ public String toString() { sb.append(']'); return sb.toString(); } - - + + // ------------------------------------------------------ Protected Methods @@ -1270,7 +1272,7 @@ protected String digest(String credentials) { synchronized (this) { try { md.reset(); - + byte[] bytes = null; try { bytes = credentials.getBytes(getDigestCharset()); @@ -1310,7 +1312,7 @@ protected String getDigest(String username, String realmName) { // Use pre-generated digest return getPassword(username); } - + String digestValue = username + ":" + realmName + ":" + getPassword(username); @@ -1356,7 +1358,7 @@ protected Principal getPrincipal(X509Certificate usercert) { return(getPrincipal(username)); } - + /** * Return the Principal associated with the given user name. @@ -1367,11 +1369,11 @@ protected Principal getPrincipal(X509Certificate usercert) { protected Principal getPrincipal(String username, GSSCredential gssCredential) { Principal p = getPrincipal(username); - + if (p instanceof GenericPrincipal) { ((GenericPrincipal) p).setGssCredential(gssCredential); } - + return p; } @@ -1398,7 +1400,7 @@ protected Server getServer() { return null; } - + // --------------------------------------------------------- Static Methods @@ -1425,7 +1427,7 @@ public static final String Digest(String credentials, String algorithm, if (encoding == null) { md.update(credentials.getBytes()); } else { - md.update(credentials.getBytes(encoding)); + md.update(credentials.getBytes(encoding)); } // Digest the credentials and return as hexadecimal @@ -1447,12 +1449,12 @@ public static void main(String args[]) { String encoding = null; int firstCredentialArg = 2; - + if (args.length > 4 && args[2].equalsIgnoreCase("-e")) { encoding = args[3]; firstCredentialArg = 4; } - + if(args.length > firstCredentialArg && args[0].equalsIgnoreCase("-a")) { for(int i=firstCredentialArg; i < args.length ; i++){ System.out.print(args[i]+":"); @@ -1470,7 +1472,7 @@ public static void main(String args[]) { @Override public String getObjectNameKeyProperties() { - + StringBuilder keyProperties = new StringBuilder("type=Realm"); keyProperties.append(getRealmSuffix()); keyProperties.append(MBeanUtils.getContainerKeyProperties(container)); @@ -1488,7 +1490,7 @@ public String getDomainInternal() { public String getRealmPath() { return realmPath; } - + public void setRealmPath(String theRealmPath) { realmPath = theRealmPath; } @@ -1499,10 +1501,10 @@ protected String getRealmSuffix() { protected static class AllRolesMode { - + private String name; /** Use the strict servlet spec interpretation which requires that the user - * have one of the web-app/security-role/role-name + * have one of the web-app/security-role/role-name */ public static final AllRolesMode STRICT_MODE = new AllRolesMode("strict"); /** Allow any authenticated user @@ -1511,7 +1513,7 @@ protected static class AllRolesMode { /** Allow any authenticated user only if there are no web-app/security-roles */ public static final AllRolesMode STRICT_AUTH_ONLY_MODE = new AllRolesMode("strictAuthOnly"); - + static AllRolesMode toMode(String name) { AllRolesMode mode; @@ -1525,12 +1527,12 @@ else if( name.equalsIgnoreCase(STRICT_AUTH_ONLY_MODE.name) ) throw new IllegalStateException("Unknown mode, must be one of: strict, authOnly, strictAuthOnly"); return mode; } - + private AllRolesMode(String name) { this.name = name; } - + @Override public boolean equals(Object o) {
webapps/docs/changelog.xml+3 −0 modified@@ -173,6 +173,9 @@ <bug>59904</bug>: Add a limit (default 200) for the number of cookies allowed per request. Based on a patch by gehui. (markt) </fix> + <fix> + Make timing attacks against the Realm implementations harder. (schultz) + </fix> </changelog> </subsection> <subsection name="Jasper">
dc4c3317452fMake timing attacks against the Realm implementations harder. (schultz)
5 files changed · +12 −1
java/org/apache/catalina/realm/DataSourceRealm.java+2 −0 modified@@ -303,6 +303,8 @@ protected Principal authenticate(Connection dbConnection, if(dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("dataSourceRealm.authenticateFailure",
java/org/apache/catalina/realm/JDBCRealm.java+2 −0 modified@@ -384,6 +384,8 @@ public synchronized Principal authenticate(Connection dbConnection, if (dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("jdbcRealm.authenticateFailure",
java/org/apache/catalina/realm/MemoryRealm.java+3 −1 modified@@ -125,7 +125,9 @@ public Principal authenticate(String username, String credentials) { GenericPrincipal principal = principals.get(username); if(principal == null || principal.getPassword() == null) { - // User was not found in the database of the password was null + // User was not found in the database or the password was null + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (log.isDebugEnabled()) log.debug(sm.getString("memoryRealm.authenticateFailure", username));
java/org/apache/catalina/realm/RealmBase.java+2 −0 modified@@ -488,6 +488,8 @@ public Principal authenticate(String username, String credentials) { if (serverCredentials == null) { // User was not found + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) { containerLog.trace(sm.getString("realmBase.authenticateFailure",
webapps/docs/changelog.xml+3 −0 modified@@ -200,6 +200,9 @@ of the web.xml file where specified or UTF-8 where no explicit encoding is specified. (markt) </fix> + <fix> + Make timing attacks against the Realm implementations harder. (schultz) + </fix> </changelog> </subsection> <subsection name="Coyote">
d79c63d424feMake timing attacks against the Realm implementations harder. (schultz)
5 files changed · +12 −1
java/org/apache/catalina/realm/DataSourceRealm.java+2 −0 modified@@ -303,6 +303,8 @@ protected Principal authenticate(Connection dbConnection, if(dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("dataSourceRealm.authenticateFailure",
java/org/apache/catalina/realm/JDBCRealm.java+2 −0 modified@@ -384,6 +384,8 @@ public synchronized Principal authenticate(Connection dbConnection, if (dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("jdbcRealm.authenticateFailure",
java/org/apache/catalina/realm/MemoryRealm.java+3 −1 modified@@ -125,7 +125,9 @@ public Principal authenticate(String username, String credentials) { GenericPrincipal principal = principals.get(username); if(principal == null || principal.getPassword() == null) { - // User was not found in the database of the password was null + // User was not found in the database or the password was null + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (log.isDebugEnabled()) log.debug(sm.getString("memoryRealm.authenticateFailure", username));
java/org/apache/catalina/realm/RealmBase.java+2 −0 modified@@ -344,6 +344,8 @@ public Principal authenticate(String username, String credentials) { if (serverCredentials == null) { // User was not found + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) { containerLog.trace(sm.getString("realmBase.authenticateFailure",
webapps/docs/changelog.xml+3 −0 modified@@ -183,6 +183,9 @@ of the web.xml file where specified or UTF-8 where no explicit encoding is specified. (markt) </fix> + <fix> + Make timing attacks against the Realm implementations harder. (schultz) + </fix> </changelog> </subsection> <subsection name="Coyote">
86b2e436099cMake timing attacks against the Realm implementations harder. (schultz)
5 files changed · +12 −1
java/org/apache/catalina/realm/DataSourceRealm.java+2 −0 modified@@ -303,6 +303,8 @@ protected Principal authenticate(Connection dbConnection, if(dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("dataSourceRealm.authenticateFailure",
java/org/apache/catalina/realm/JDBCRealm.java+2 −0 modified@@ -384,6 +384,8 @@ public synchronized Principal authenticate(Connection dbConnection, if (dbCredentials == null) { // User was not found in the database. + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) containerLog.trace(sm.getString("jdbcRealm.authenticateFailure",
java/org/apache/catalina/realm/MemoryRealm.java+3 −1 modified@@ -125,7 +125,9 @@ public Principal authenticate(String username, String credentials) { GenericPrincipal principal = principals.get(username); if(principal == null || principal.getPassword() == null) { - // User was not found in the database of the password was null + // User was not found in the database or the password was null + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (log.isDebugEnabled()) log.debug(sm.getString("memoryRealm.authenticateFailure", username));
java/org/apache/catalina/realm/RealmBase.java+2 −0 modified@@ -344,6 +344,8 @@ public Principal authenticate(String username, String credentials) { if (serverCredentials == null) { // User was not found + // Waste a bit of time as not to reveal that the user does not exist. + getCredentialHandler().mutate(credentials); if (containerLog.isTraceEnabled()) { containerLog.trace(sm.getString("realmBase.authenticateFailure",
webapps/docs/changelog.xml+3 −0 modified@@ -183,6 +183,9 @@ of the web.xml file where specified or UTF-8 where no explicit encoding is specified. (markt) </fix> + <fix> + Make timing attacks against the Realm implementations harder. (schultz) + </fix> </changelog> </subsection> <subsection name="Coyote">
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
45- www.oracle.com//security-alerts/cpujul2021.htmlnvdPatchThird Party AdvisoryWEB
- www.oracle.com/security-alerts/cpuoct2021.htmlnvdPatchThird Party AdvisoryWEB
- rhn.redhat.com/errata/RHSA-2017-0457.htmlnvdThird Party AdvisoryWEB
- www.debian.org/security/2016/dsa-3720nvdThird Party AdvisoryWEB
- access.redhat.com/errata/RHSA-2017:0455nvdThird Party AdvisoryWEB
- access.redhat.com/errata/RHSA-2017:0456nvdThird Party AdvisoryWEB
- access.redhat.com/errata/RHSA-2017:2247nvdThird Party AdvisoryWEB
- github.com/advisories/GHSA-wxcp-f2c8-x6xvghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2016-0762ghsaADVISORY
- security.netapp.com/advisory/ntap-20180605-0001/nvdThird Party Advisory
- usn.ubuntu.com/4557-1/nvdThird Party Advisory
- www.securityfocus.com/bid/93939nvdBroken LinkWEB
- www.securitytracker.com/id/1037144nvdBroken LinkWEB
- github.com/apache/tomcat/commit/86b2e436099cb48f30dad950175c5beeeb763756ghsaWEB
- github.com/apache/tomcat/commit/970e615c7ade6ec6c341470bbc76aa1256353737ghsaWEB
- github.com/apache/tomcat/commit/d79c63d424fe6b225678416343b9ce106dec947cghsaWEB
- github.com/apache/tomcat80/commit/dc4c3317452f0bc2c5e1f6a08d3bd9f22488b450ghsaWEB
- lists.apache.org/thread.html/1872f96bad43647832bdd84a408794cd06d9cbb557af63085ca10009%40%3Cannounce.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/1872f96bad43647832bdd84a408794cd06d9cbb557af63085ca10009@%3Cannounce.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/343558d982879bf88ec20dbf707f8c11255f8e219e81d45c4f8d0551%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/343558d982879bf88ec20dbf707f8c11255f8e219e81d45c4f8d0551@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/37220405a377c0182d2afdbc36461c4783b2930fbeae3a17f1333113%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/37220405a377c0182d2afdbc36461c4783b2930fbeae3a17f1333113@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/388a323769f1dff84c9ec905455aa73fbcb20338e3c7eb131457f708%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/388a323769f1dff84c9ec905455aa73fbcb20338e3c7eb131457f708@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/39ae1f0bd5867c15755a6f959b271ade1aea04ccdc3b2e639dcd903b%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/39ae1f0bd5867c15755a6f959b271ade1aea04ccdc3b2e639dcd903b@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/3d19773b4cf0377db62d1e9328bf9160bf1819f04f988315086931d7%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/3d19773b4cf0377db62d1e9328bf9160bf1819f04f988315086931d7@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/845312a10aabbe2c499fca94003881d2c79fc993d85f34c1f5c77424%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/845312a10aabbe2c499fca94003881d2c79fc993d85f34c1f5c77424@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/b5e3f51d28cd5d9b1809f56594f2cf63dcd6a90429e16ea9f83bbedc%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/b5e3f51d28cd5d9b1809f56594f2cf63dcd6a90429e16ea9f83bbedc@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/b84ad1258a89de5c9c853c7f2d3ad77e5b8b2930be9e132d5cef6b95%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/b84ad1258a89de5c9c853c7f2d3ad77e5b8b2930be9e132d5cef6b95@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/b8a1bf18155b552dcf9a928ba808cbadad84c236d85eab3033662cfb%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/b8a1bf18155b552dcf9a928ba808cbadad84c236d85eab3033662cfb@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/r03c597a64de790ba42c167efacfa23300c3d6c9fe589ab87fe02859c%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/r03c597a64de790ba42c167efacfa23300c3d6c9fe589ab87fe02859c@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/r587e50b86c1a96ee301f751d50294072d142fd6dc08a8987ae9f3a9b%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/r587e50b86c1a96ee301f751d50294072d142fd6dc08a8987ae9f3a9b@%3Cdev.tomcat.apache.org%3EghsaWEB
- lists.apache.org/thread.html/r9136ff5b13e4f1941360b5a309efee2c114a14855578c3a2cbe5d19c%40%3Cdev.tomcat.apache.org%3EnvdWEB
- lists.apache.org/thread.html/r9136ff5b13e4f1941360b5a309efee2c114a14855578c3a2cbe5d19c@%3Cdev.tomcat.apache.org%3EghsaWEB
- security.netapp.com/advisory/ntap-20180605-0001ghsaWEB
- usn.ubuntu.com/4557-1ghsaWEB
News mentions
0No linked articles in our index yet.