Skip to content

Fix GH-21682: Add NOT_SERIALIZABLE to ZipArchive#21708

Open
iliaal wants to merge 2 commits intophp:masterfrom
iliaal:fix/gh-21682-ziparchive-not-serializable-zip
Open

Fix GH-21682: Add NOT_SERIALIZABLE to ZipArchive#21708
iliaal wants to merge 2 commits intophp:masterfrom
iliaal:fix/gh-21682-ziparchive-not-serializable-zip

Conversation

@iliaal
Copy link
Copy Markdown
Contributor

@iliaal iliaal commented Apr 10, 2026

Part of #21682, split from #21694 after review feedback.

ZipArchive wraps a libzip archive handle that can't survive serialization. serialize() produces a string, but unserializing it returns an object where numFiles reports 0 and the archive contents are gone.

Adds @not-serializable so serialize() throws instead of producing a broken object.

The UAF exploit test bug72434.phpt instantiated ZipArchive via unserialize(). With NOT_SERIALIZABLE, unserialize() rejects the class and closes the UAF vector. The test also moves to ext/zip/tests/ since it exercises ZipArchive.

Per the discussion on #21694, ZipArchive::closeString() (in flight as #21497) gives subclasses a way to capture archive state, so this decision is worth revisiting once that lands.

iliaal added 2 commits April 10, 2026 06:46
ZipArchive allowed serialization, producing a string that unserializes
into an empty object with no open file handle. Add the
@not-serializable annotation so serialize() throws an exception.

Closes phpGH-21682
bug72434.phpt tested a UAF via unserialize() of ZipArchive. With
NOT_SERIALIZABLE, unserialize() rejects the class entirely, preventing
the UAF by construction. Update the test to verify the rejection and
move it to ext/zip/tests since it requires the zip extension.
Copy link
Copy Markdown
Member

@DanielEScherzer DanielEScherzer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Marking as "request changes" so that this doesn't merge until we can evaluate the impact of #21497

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants