security: restrict allowed_classes in ClosureJob::run() to prevent PHP Object Injection#41568
Open
XananasX7 wants to merge 1 commit into
Open
Conversation
…P Object Injection ClosureJob::run() calls unserialize($serializedCallable) without an allowed_classes restriction. The serialized closure is stored in the database job queue (oc_jobs / oc_clndr_appt_queue etc.); an attacker who can write to those tables could inject a gadget chain. AsyncBus::push() always serializes closures as Laravel\SerializableClosure objects (see AsyncBus.php line 115). Restricting to [SerializableClosure::class] prevents instantiation of arbitrary gadget classes during deserialization without changing behaviour for legitimate jobs.
|
Thanks for opening this pull request! The maintainers of this repository would appreciate it if you would create a changelog item based on your changes. |
|
|
Author
|
I have read the CLA Document and I hereby sign the CLA |
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
ClosureJob::run()calls\unserialize($serializedCallable)without anallowed_classesrestriction. The serialized job payload is stored in the database; an attacker who can write to the job table (e.g. via SQL injection or a compromised admin account) can inject a PHP Object Injection payload that triggers a gadget chain during deserialization, potentially leading to Remote Code Execution.Root Cause
AsyncBus::push()always wraps closures in aLaravel\SerializableClosure\SerializableClosure(line 115 ofAsyncBus.php). The class that should appear after deserialization is alwaysSerializableClosure— no other class is legitimate here.Fix
This prevents instantiation of arbitrary gadget classes during deserialization without changing behaviour for any legitimate job payload.
Impact
unserialize()→ gadget chain → RCENo Behaviour Change
All legitimate
ClosureJobentries are serializedSerializableClosureobjects; restricting to exactly that class does not affect them.