A client can set properties you marked with #[Ignore] on nested objects, such as an admin flag on a related object, when your app deserializes their input. Symfony's ObjectNormalizer let a key in the payload reach into nested objects without checking their metadata. The same route can also call a public method of a nested object with a value the attacker picks.

Who is affected

Apps that bind untrusted input to objects with ObjectNormalizer from symfony/serializer (also part of symfony/symfony). That includes controllers using #[MapRequestPayload] or #[MapQueryString], which use ObjectNormalizer by default. It matters when a nested class relies on #[Ignore] to protect a property.

The Symfony advisory says #[Groups] restrictions still hold: the bypass only works when no groups are passed in the context. With OBJECT_TO_POPULATE, used for partial updates, the changed field may be saved to your database.

What to do

Update to 5.4.56, 6.4.50, 7.4.23 or 8.1.11. If you're on 8.0, update to 8.1.11. The fix (5.4, 6.4) only accepts a property path when the class metadata declares an attribute with that exact name. Paths you declared on purpose keep working.

Reported by Alexandre Daubois and The PHP Foundation.