On Wed, Jul 23, 2014 at 10:57 AM, Julien Pauli <jpa...@php.net> wrote:
> On Wed, Jul 23, 2014 at 7:58 AM, Ferenc Kovacs <tyr...@gmail.com> wrote: > > > > > > > > On Tue, Jul 22, 2014 at 6:20 PM, Julien Pauli <jpa...@php.net> wrote: > >> > >> On Tue, Jul 22, 2014 at 2:04 PM, Ferenc Kovacs <tyr...@gmail.com> > wrote: > >> > > >> > > >> > > >> > On Tue, Jul 22, 2014 at 1:48 PM, Nikita Popov <nikita....@gmail.com> > >> > wrote: > >> >> > >> >> On Tue, Jul 22, 2014 at 12:27 PM, Ferenc Kovacs <tyr...@gmail.com> > >> >> wrote: > >> >>> > >> >>> sorry for the late reply. > >> >>> you are right and after looking into the implementation I think > >> >>> classes > >> >>> having custom object storage (eg. create_object) shouldn't assume > that > >> >>> their __construct will be called, but either do the initialization > in > >> >>> the > >> >>> create_object hook or validate in the other methods that the object > >> >>> was > >> >>> properly initialized. > >> >>> given that this lack of initialization problem is already > present(you > >> >>> can > >> >>> extend such a class and have a __construct() in the subclass which > >> >>> doesn't > >> >>> call the parent constructor), and we want to keep the unserialize > >> >>> trick > >> >>> fixed (as that exposes this problems to the remote attacker when > some > >> >>> code > >> >>> accepts arbitrary serialized data from the client) I see no reason > to > >> >>> keep > >> >>> the limitation in the > ReflectionClass::newInstanceWithoutConstructor() > >> >>> and > >> >>> allowing the instantiation of internal classes will provide a clean > >> >>> upgrade > >> >>> path to doctrine and co. > >> >>> ofc. we have to fix the internal classes misusing the constructor > for > >> >>> proper initialization one by one, but that can happen after the > >> >>> initial > >> >>> 5.6.0 release (ofc it would be wonderful if people could lend me a > >> >>> hand > >> >>> for > >> >>> fixing as much as we can before the release), but we have to fix > those > >> >>> anyways. > >> >> > >> >> > >> >> This sounds reasonable to me. newInstanceWithoutConstructor does not > >> >> have > >> >> the same remote exploitation concerns as serialize, so allowing > crashes > >> >> here > >> >> that can also be caused by other means seems okay to me (especially > if > >> >> we're > >> >> planning to fix them lateron). Only additional restriction I'd add is > >> >> to > >> >> disallow calling it on an internal + final class. For those the > >> >> __construct > >> >> argument does not apply. For them the entity-extending-internal-class > >> >> usecase doesn't apply either, so that shouldn't be a problem. > >> >> > >> >> Nikita > >> >> > >> > > >> > Thanks for the prompt reply! > >> > I was considering mentioning the final constructors, but as we > >> > previously > >> > didn't checked that and from a quick look it seems that we are mostly > >> > using > >> > it as an easy/cheap way to make sure that the object is initialized > >> > properly > >> > (which could also happen when a subclass calls parent::__construct() > >> > from > >> > it's constructor) which isn't exactly the best usecase for final. > >> > But I don't really mind having that check. > >> > >> I'm +1 also with the idea. > >> > >> Just take care to have a clone_handler defined as well, as the default > >> clone handler doesn't call create_object. > >> http://lxr.php.net/xref/PHP_5_5/Zend/zend_objects.c#218 > >> > >> Julien > > > > > > thanks, I will keep that in mind when we start moving the initialization > > from the constructors into the create_object functions. > > I've also went ahead and created a pull request for the proposed changes: > > https://github.com/php/php-src/pull/733 > > as you can see I've taken Nikita's advice and internal classes with final > > constructors are still not allowed to be instantiated. > > When should we start patching those ? > I guess asap ? > > Julien > Not sure, on one hand, I would be glad seeing these fixed, but on the other hand I'm a little bit worried about introducing destabilizing changes this close to the release, and these problems existed for years (triggerable either through instantiating via the unserialize O: trick or through a subclass) without any reports before https://bugs.php.net/bug.php?id=67072 -- Ferenc Kovács @Tyr43l - http://tyrael.hu