Repository navigation
Conversation
jvoisin
force-pushed
the
noreuse
branch
2 times, most recently
from
October 21, 2026 10:15
39c1d54 to
6ebb4ce
Compare
Contributor
Author
|
cc @arnaud-lb |
Enable with ZEND_MM_NO_REUSE=1 before engine startup. Clear and retain freed small allocations, page runs, and huge mappings until heap shutdown. Move reallocations to fresh storage and prevent allocator GC from reclaiming retired ranges. Keep retained mappings charged against memory_limit and reject incompatible allocator overrides rather than silently allowing reuse. This mitigates UAF exploitation through allocation reclamation like CVE-2026-109618 and CVE-2026-109619, at the cost of memory usage approaching cumulative allocation volume per request. Add tests for address non-overlap, clearing, reallocations, shutdown, accounting, and configuration errors. Document usage and limitations. This provides a nice alternative to php#14304.
Member
|
I measured a 4x memory usage increase on Symfony demo, and +50% wall time. The overhead is huge, but not as much as I anticipated. This makes sense as an opt-in protection, but I fear that it falls behind in maintenance as it will rarely be used. |
Contributor
Author
|
The implementation is pretty simple/self-contained, and I added a bunch of tests. But I agree that it's a valid concern. I think™ it might/will be use nonetheless either by the paranoid folks around, or as an emergency mitigation for when the next RCE/UAF drops. |
Use MADV_DONTNEED for complete OS pages in retired large runs and huge mappings. This releases resident memory while keeping virtual addresses reserved, preserving the no-reuse guarantee and memory-limit accounting. Continue clearing partial pages and fall back to memset() when madvise() is unavailable or fails. On Linux/aarch64 with 16 KiB pages, 40 alternating benchmark runs showed: - 256 x 1 MiB allocations: RSS fell from 275,200 KiB to 17,120 KiB (-94%); median time changed from 31.156 ms to 30.262 ms. - 32 x 8 MiB allocations: RSS fell from 271,632 KiB to 8,944 KiB (-97%); median time changed from 30.997 ms to 29.545 ms. - 1,000,000 x 64-byte allocations were unaffected: RSS remained about 104 MiB and median time changed from 49.878 ms to 49.973 ms. Reserved memory reported by memory_get_usage(true) remained unchanged.
Contributor
Author
|
I added another commit using |
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.
Enable with ZEND_MM_NO_REUSE=1 before engine startup.
Clear and retain freed small allocations, page runs, and huge mappings until heap shutdown. Move reallocations to fresh storage and prevent allocator GC from reclaiming retired ranges.
Keep retained mappings charged against memory_limit and reject incompatible allocator overrides rather than silently allowing reuse.
This mitigates UAF exploitation through allocation reclamation like CVE-2026-109618 and CVE-2026-109619, at the cost of memory usage approaching cumulative allocation volume per request.
Add tests for address non-overlap, clearing, reallocations, shutdown, accounting, and configuration errors. Document usage and limitations.
This provides a nice alternative to #14304.