On Wed, 24 Nov 2021 15:39:13 GMT, Roger Riggs <rri...@openjdk.org> wrote:
>> If the intent is to disable serialization entirely, then this state should >> be represented explicitly. Having things throw `NoClassDefFoundError` looks >> like a mistake and a bug that needs to be fixed. In addition, it requires >> that all code paths to deserialization use `OIF.Config` in order to provoke >> the NCDFE. This might be true today, but under maintenance a different code >> path might be introduced that happens not to use that class, allowing >> deserialization to proceed. >> >> An alternative policy might be to disallow any deserialization that would >> use the default filter. This could be accomplished by having a "fail-safe" >> or "fallback" filter that always returns REJECT. This would be at least as >> restrictive and thus no less safe than any valid filter that could be >> installed. In addition, it would allow things that don't use the global >> filter to proceed, such as, >> >> var ois = new ObjectInputStream(...); >> ois.setObjectInputFilter(new ObjectInputFilter() { ... }); >> >> or >> >> var ois = new ObjectInputStream(...); >> ois.setObjectInputFilter(ObjectInputFilter.Config.createFilter(...)); >> >> There could be a reasonable policy discussion about whether it's preferable >> to disable all deserialization or just deserialization that depends on the >> (invalidly specified) global filter. > > This is about the second line of defense; what happens when the developer > deliberately ignores the first error. > If the command line parameters are invalid it might be an option to call > `System.exit(1)` but there > is no precedent for that and it seems undesirable. > > Any and all deserialization is only possible after the command line or > security properties, if any, are successfully applied. > In the examples above, the constructors for `ObjectInputStream` do not > succeed if either the serial filter or filter factory are not valid. The > builtin filter factory applies the default filter regardless of the setting > of an `ObjectInputFilter` set on the stream. The only way to completely > control the filter combinations is to provide > a valid filter factory on the command line; but that is not the case raising > the issue here. > > The initialization of both could be re-specified and re-implemented to allow > the initialization of `Config` to > complete successfully but defer throwing an exception (or Error) until either > filter or filter factory > was requested from `Config.getSerialFilter` or > `Config.getSerialFilterFactory`. > Both of them are called from the `ObjectInputStream` constructors. > At present, it is incompletely specified and implemented to throw > `IllegalStateException` for `getSerialFilterFactory`. > > The `NCDFE` is a more reliable backstop against misuse from any source, > including reflection, than the alternative. The use of `ExceptionInInitializerError` can be completely replaced for invalid values of `jdk.serialFilter` and `jdk.serialFilterFactory` with: - If either property is supplied and is invalid; deserialization is disabled by: - `OIF.Config.getSerialFilter()` and `OIF.Config.setSerialFilter(...)` throw IllegalStateException with the exception message thrown from `Config.createFilter(pattern)` - `OIF.Config.getSerialFilterFactory()` and `OIF.Config.setSerialFilterFactory(...)` throw IllegalStateException with the exception message from the attempt to construct the filter factory. - Both `new ObjectInputStream(...)` constructors call both `OIF.Config.getSerialFilter()` and `OIF.Config.getSerialFilterFactory()` and so will throw the appropriate `IllegalStateException` for invalid values of the properties. - The static initialization of `OIF.Config` does not throw any exceptions (so no `ExceptionInInitializerError`) but hold the state so that the method above can throw `IllegalStateException` with the informative message. - The `IllegalStateException`s will be thrown just slightly later than previously, now after the `Config` class is initialized instead of during initialization. - The javadoc of the `Config` class will replace the descriptions of the previous error with descriptions of `ISE` and each of the methods mentioned above will have an added `IllegalStateException` documented referring to the property values. Its not strictly compatible with the previous behavior but occurs only in the case of badly formed parameters on the command line. ------------- PR: https://git.openjdk.java.net/jdk/pull/6508