fix(repair): restrict unserialize() in RemoveBrokenProperties#59979
Open
elicpeter wants to merge 2 commits intonextcloud:masterfrom
Open
fix(repair): restrict unserialize() in RemoveBrokenProperties#59979elicpeter wants to merge 2 commits intonextcloud:masterfrom
elicpeter wants to merge 2 commits intonextcloud:masterfrom
Conversation
RemoveBrokenProperties::run() calls unserialize() on the property value column without restricting allowed_classes. The result is only compared against false to identify broken rows, so no class instantiation is needed. As written though, magic methods (__wakeup/__destruct) on any class referenced by the serialized payload still execute. The runtime decoder for the same column already restricts deserialization. See apps/dav/lib/DAV/CustomPropertiesBackend.php:675-678, which passes ['allowed_classes' => self::ALLOWED_SERIALIZED_CLASSES]. This change applies the same hardening to the repair step. It uses ['allowed_classes' => false] since the unserialized value is never used, only its truthiness is checked. No behavior change for valid or broken rows. Signed-off-by: Eli Peter <54954007+elicpeter@users.noreply.github.com>
Altahrim
approved these changes
Apr 29, 2026
Collaborator
Altahrim
left a comment
There was a problem hiding this comment.
Looks good, thank you!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
RemoveBrokenProperties::run()callsunserialize()on thepropertyvaluecolumn without restrictingallowed_classes. The result is only compared againstfalseto identify broken rows, so no class instantiation is needed. As written though, magic methods (__wakeup/__destruct) on any class referenced by the serialized payload still execute.The runtime decoder for the same column already restricts deserialization. See
apps/dav/lib/DAV/CustomPropertiesBackend.php:675-678, which passes['allowed_classes' => self::ALLOWED_SERIALIZED_CLASSES]. This change applies the same hardening to the repair step. It uses['allowed_classes' => false]since the unserialized value is never used, only its truthiness is checked.No behavior change for valid or broken rows.
Found while testing an in-development static analysis tool I'm building against open-source PHP codebases.
TODO
Checklist
3. to review, feature component)stable32)AI (if applicable)