Towards better serialization

Kłeczek, Michał michal at kleczek.org
Thu Jun 13 16:24:52 UTC 2019



On 13/06/2019 15:37:34, "Brian Goetz" <brian.goetz at oracle.com> wrote:

>Having read through all of what you’ve written in this thread, let me summarize it more succinctly:
>
>“There are users of serialization who have never used serialization in more than the most trivial manner, who have never been on the wrong side of a serialization vulnerability, and who really like the illusion of magic serialization dust that it provides.  Please don’t take that away from us.”
>
>And, I get it; this is the siren song that led us to the serialization framework we have, with all its complexity and security pain.  But I think we should learn from history.  You’re arguing “serialization is good enough”, or that small add-ons would solve the problem.  Having been on the wrong side of too many serialization security issues, I disagree.
>
>As a public service announcement, let me point out how a rhetorical trick might be tripping you up: you use the word “simply” everywhere, as in:
>
>>  Why don't we simply make it easier
>
>(and others.)  But there’s nothing simple about it; adding “simply” serves only to make it sound simpler than it is — and therein lies the danger.
>
The whole premise of the proposal we are discussing is that convenience 
is the root of all evil.
But this convenience is actually the root of such a wide use of existing 
serialization. And yes - we mere mortals need this convenience.
Taking it away will only cause popping up ad-hoc solutions that will be 
even worse. XStream anyone?
Heck - I have even seen passing Spring XML via the network and 
recreating application context based on that!
As you are surely aware of: _most_ serialization security 
vulnerabilities equally well apply to other serialization frameworks.
The reason is that it is not serialization as such that is a security 
problem - and I was trying to point out that even the example from the 
discussed paper illustrates it.

This deserialization gadget:

class Gadget {
   final Delegate delegate;
   @Deserializer
   Gadget(String cl, String method, Object[] arguments) throws Throwable 
{
     this.delegate = (Delegate) Class.forName(cl).getMethod(method, 
getArgTypes(arguments)).invoke(null, arguments);
   }
}

is no less evil than the one that uses reflection in readObject() - even 
more so as it gives false sense of security by meeting some invariants.

Summing it up:
A "better" serialization framework needs to be:
- at least as convenient
- at least as flexible
- more secure

What we've got is:
- less convenient
- less flexible
- no more secure

PS:
I am far from rhetorical tricks - English is not my native language and 
what might sound like a trick is just poor language usage from my side 
:)

--
Michal



More information about the amber-dev mailing list