Explicit Serialization API and Security
Brian Goetz
brian.goetz at oracle.com
Mon Dec 29 19:08:44 UTC 2014
So, if I understand this correctly, the way this would get used is:
class BaseFoo implements Serializable {
private final int x;
public BaseFoo(ReadSerial rs) {
this(rs.getInt("x"));
}
public BaseFoo(int x) {
this.x = x;
}
}
Right?
What happens with subclasses? I think then I need an extra RS arg in my
constructors:
class SubFoo extends BaseFoo {
private final int y;
public SubFoo(ReadSerial rs) {
this(rs.getInt("y"));
}
public BaseFoo(ReadSerial rs, int y) {
super(rs);
this.y = y;
}
}
Is this what you envision?
On 12/27/2014 8:03 PM, Peter Firmstone wrote:
> Is there any interest in developing an explicit API for Serialization?:
>
> 1. Use a public constructor signature with a single argument,
> ReadSerialParameters (read only, writable only by the
> serialization framework) to recreate objects, subclasses (when
> permitted) call this first from their own constructor, they have
> an identical constructor signature. ReadSerialParameters that are
> null may contain a circular reference and will be available after
> construction, see #3 below.
> 2. Use a factory method (defined by an interface) with one parameter,
> WriteSerialParameters (write only, readable only by the
> serialization framework), this method can be overridden by
> subclasses (when permitted)
> 3. For circular links, a public method (defined by an interface) that
> accepts one argument, ReadSerialParameters, this method is called
> after the constructor completes, subclasses overriding this should
> call the superclass method. If this method is not called, an
> implementation, if known to possibly contain circular links,
> should check it has been fully initialized in each object method
> called.
> 4. Retains compatibility with current serialization stream format.
> 5. Each serial field has a name, calling class and object reference,
> similar to explicitly declaring "private static final
> ObjectStreamField[] serialPersistentFields ".
>
> Benefits:
>
> 1. An object's internal form is not publicised.
> 2. Each class in an object's heirarchy can use a static method to
> check invarients and throw an exception, prior to
> java.lang.Object's constructor being called, preventing
> construction and avoiding finalizer attacks.
> 3. Final field friendly.
> 4. Compatible with existing serial form.
> 5. Flexible serial form evolution.
> 6. All methods are public and explicitly defined.
> 7. All class ProtectionDomain's exist in the current execution
> context, allowing an object to throw a SecurityException before
> construction.
> 8. Less susceptible to deserialization attacks.
>
> Problems:
>
> 1. Implementations cannot be package private or private. Implicit
> serialization publicises internal form, any thoughts?
>
> Recommendations:
>
> 1. Create a security check in the serialization framework for
> implicit serialization, allowing administrators to reduce their
> deserialization attack surface.
> 2. For improved security, disallow classes implementing explicit
> serialization from having static state and static initializer
> blocks, only allow static methods, this would require complier and
> verifier changes.
> 3. Alternative to #2, allow final static fields, but don't allow
> static initializer blocks or mutable static fields, similar to
> interfaces.
>
> Penny for your thoughts?
>
> Regards,
>
> Peter Firmstone.
More information about the core-libs-dev
mailing list