Skip to content

Commit

Permalink
BEANUTILS-520: mitigation for CVE-2014-0114
Browse files Browse the repository at this point in the history
  • Loading branch information
chtompki committed Jun 6, 2019
1 parent a83c1ea commit 62e82ad
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 0 deletions.
10 changes: 10 additions & 0 deletions pom.xml
Expand Up @@ -195,6 +195,12 @@
<timezone>+0</timezone>
<organization>The Apache Software Foundation</organization>
</developer>
<developer>
<id>chtompki</id>
<name>Rob Tompkins</name>
<email>chtompki@apache.org</email>
<organization>The Apache Software Foundation</organization>
</developer>
</developers>

<contributors>
Expand Down Expand Up @@ -298,6 +304,10 @@
<name>Bernhard Seebass</name>
<email />
</contributor>
<contributor>
<name>Melloware</name>
<email />
</contributor>
</contributors>

<dependencies>
Expand Down
6 changes: 6 additions & 0 deletions src/changes/changes.xml
Expand Up @@ -29,6 +29,12 @@
</properties>
<body>

<release version="1.9.4" date="2019-06-08" description="Bugfix for CVE-2014-0114">
<action issue="BEANUTILS-520" dev="chtompki" type="fix" due-to="Melloware">
BeanUtils mitigate CVE-2014-0114.
</action>
</release>

<release version="1.9.3" date="2016-09-21" description="Bug fix release, now builds with Java 8">
<action issue="BEANUTILS-433" dev="ggregory" type="update" due-to="Benedikt Ritter, Gary Gregory">
Update dependency from JUnit 3.8.1 to 4.12.
Expand Down
Expand Up @@ -188,6 +188,7 @@ public void setResolver(final Resolver resolver) {
public final void resetBeanIntrospectors() {
introspectors.clear();
introspectors.add(DefaultBeanIntrospector.INSTANCE);
introspectors.add(SuppressPropertiesBeanIntrospector.SUPPRESS_CLASS);
}

/**
Expand Down
Expand Up @@ -42,6 +42,7 @@ public class BeanIntrospectionDataTestCase extends TestCase {
*/
private static PropertyDescriptor[] fetchDescriptors() {
final PropertyUtilsBean pub = new PropertyUtilsBean();
pub.removeBeanIntrospector(SuppressPropertiesBeanIntrospector.SUPPRESS_CLASS);
pub.addBeanIntrospector(new FluentPropertyBeanIntrospector());
return pub.getPropertyDescriptors(BEAN_CLASS);
}
Expand Down
Expand Up @@ -24,6 +24,8 @@
import junit.framework.TestSuite;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.SuppressPropertiesBeanIntrospector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Expand Down Expand Up @@ -74,6 +76,9 @@ public static Test suite() {
@Override
protected void setUp() throws Exception {
super.setUp();
BeanUtilsBean custom = new BeanUtilsBean();
custom.getPropertyUtils().removeBeanIntrospector(SuppressPropertiesBeanIntrospector.SUPPRESS_CLASS);
BeanUtilsBean.setInstance(custom);
}

/**
Expand Down
@@ -0,0 +1,55 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.beanutils.bugs;

import org.apache.commons.beanutils.AlphaBean;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.SuppressPropertiesBeanIntrospector;

import junit.framework.TestCase;

/**
* Fix CVE: https://nvd.nist.gov/vuln/detail/CVE-2014-0114
*
* @see <a href="https://issues.apache.org/jira/browse/BEANUTILS-520">https://issues.apache.org/jira/browse/BEANUTILS-520</a>
*/
public class Jira520TestCase extends TestCase {
/**
* By default opt-in to security that does not allow access to "class".
*/
public void testSuppressClassPropertyByDefault() throws Exception {
final BeanUtilsBean bub = new BeanUtilsBean();
final AlphaBean bean = new AlphaBean();
try {
bub.getProperty(bean, "class");
fail("Could access class property!");
} catch (final NoSuchMethodException ex) {
// ok
}
}

/**
* Allow opt-out to make your app less secure but allow access to "class".
*/
public void testAllowAccessToClassProperty() throws Exception {
final BeanUtilsBean bub = new BeanUtilsBean();
bub.getPropertyUtils().removeBeanIntrospector(SuppressPropertiesBeanIntrospector.SUPPRESS_CLASS);
final AlphaBean bean = new AlphaBean();
String result = bub.getProperty(bean, "class");
assertEquals("Class property should have been accessed", "class org.apache.commons.beanutils.AlphaBean", result);
}
}

0 comments on commit 62e82ad

Please sign in to comment.