Artem Smotrakov created HTTPCLIENT-1976:
-------------------------------------------

             Summary: Unsafe deserialization in DefaultHttpCacheEntrySerializer
                 Key: HTTPCLIENT-1976
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1976
             Project: HttpComponents HttpClient
          Issue Type: Bug
            Reporter: Artem Smotrakov
         Attachments: unsafe_cache_deserialization.patch

(this bug was created after discussing it on [email protected])

Apache HttpClient contains DefaultHttpCacheEntrySerializer class which uses the 
default Java serialization mechanism to store cache entries. 
DefaultHttpCacheEntrySerializer is used by default by EhcacheHttpCacheStorage 
class. It looks like there is a way how malicious data can reach 
DefaultHttpCacheEntrySerializer which as a result can lead to arbitrary code 
execution. But fortunately there are several pre-conditions for that:
1. CacheConfiguration has to be configured to read cache from a local disk. 
Currently this feature is supported only by the enterprise version of Ehcache.
2. An attacker should have access to the local cache file. In other words, the 
attacker's process should run on the same machine, and the cache file is stored 
in a shared directory such as /tmp (which is of course not recommended). Or, 
there should be another vulnerability which allows the attacker to modify the 
cache file.

The pre-conditions above (especially #2) make it hard to exploit but 
nevertheless I am wondering if HttpClient should address it. I see the 
following ways how it may be fixed although it have not tried it out:
1. Add a filter for incoming serialization data [1]. Such filters were 
introduced in JDK 6u141, so that HttpClient won't run on previous JDK 6 
versions.
2. Use ValidatingObjectInputStream to restrict deserialization to a limited set 
of classes. This adds an additional dependency.

Both ways are based on whitelisting of trusted classes which can be stored in 
cache. I assume HttpClient is not supposed to store any objects in cache, so 
such a set of trusted classes may be built.

I am attaching a test which reproduces this issue. Let me know if you think it 
should be fixed, and I can work on a patch.

[1] [https://openjdk.java.net/jeps/290]
[2] 
[https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/serialization/ValidatingObjectInputStream.html]



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to