From: Dave B. <bla...@us...> - 2012-03-10 22:55:33
|
Update of /cvsroot/sblim/jsr48-client/src/org/sblim/cimclient/internal/cimxml/sax In directory vz-cvs-3.sog:/tmp/cvs-serv3730/src/org/sblim/cimclient/internal/cimxml/sax Modified Files: Tag: Experimental NodeFactory.java Log Message: 3498482 - Red Hat: Possible XML Hash DoS in sblim Index: NodeFactory.java =================================================================== RCS file: /cvsroot/sblim/jsr48-client/src/org/sblim/cimclient/internal/cimxml/sax/NodeFactory.java,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -d -r1.1.2.5 -r1.1.2.6 --- NodeFactory.java 2 Sep 2009 20:25:52 -0000 1.1.2.5 +++ NodeFactory.java 10 Mar 2012 22:55:30 -0000 1.1.2.6 @@ -1,5 +1,5 @@ /** - * (C) Copyright IBM Corp. 2006, 2009 + * (C) Copyright IBM Corp. 2006, 2012 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE @@ -15,13 +15,15 @@ * 1720707 2007-05-17 ebak Conventional Node factory for CIM-XML SAX parser * 2003590 2008-06-30 blaschke-oss Change licensing from CPL to EPL * 2524131 2009-01-21 raman_arora Upgrade client to JDK 1.5 (Phase 1) - * 2531371 2009-02-10 raman_arora Upgrade client to JDK 1.5 (Phase 2) + * 2531371 2009-02-10 raman_arora Upgrade client to JDK 1.5 (Phase 2) * 2845211 2009-08-27 raman_arora Pull Enumeration Feature (SAX Parser) + * 3498482 2012-03-09 blaschke-oss Red Hat: Possible XML Hash DoS in sblim */ package org.sblim.cimclient.internal.cimxml.sax; import java.util.HashMap; +import java.util.Random; import org.sblim.cimclient.internal.cimxml.sax.node.*; @@ -54,7 +56,7 @@ * equals comparisons (==). */ public static String getEnum(String pNodeName) { - return NODENAME_HASH.get(pNodeName); + return NODENAME_HASH.get(pNodeName + iRandomString); } private static HashMap<String, FactoryEntry> cParserMap; @@ -440,9 +442,25 @@ private static final HashMap<String, String> NODENAME_HASH = new HashMap<String, String>(); + private static String iRandomString; + private static void initNodeNameHash(String[] pEnumA) { + // Append 8-byte randomly-generated string to keys in HashMap to avert + // hash DoS + Random generator = new Random(System.currentTimeMillis()); + byte randomByte[] = new byte[1]; + StringBuilder randomString = new StringBuilder(); + while (randomString.length() < 8) { + generator.nextBytes(randomByte); + if (randomByte[0] > 0) { + char ch = (char) randomByte[0]; + if (!Character.isISOControl(ch)) randomString.append(ch); + } + } + iRandomString = randomString.toString(); + for (int i = 0; i < pEnumA.length; i++) - NODENAME_HASH.put(pEnumA[i], pEnumA[i]); + NODENAME_HASH.put(pEnumA[i] + iRandomString, pEnumA[i]); } static { |