Heap hardening
Open
Nobody has claimed this yet.
Feature
Status: Needs Triage
- Dominant language
- C
- Stars
- 40.4k
- Forks
- 8.1k
- Avg merge
- 2d 13h
- Merged PRs (30d)
- 96
Description
Description
Currently, PHP's heap implementation is ~trivial to exploit:
- BlackAlps 2022: Generic Remote Exploit Techniques For The PHP Allocator, And 0days by Charles Fol
- SSD Advisory – PHP SplDoublyLinkedList UAF Sandbox Escape
- Gollum: Modular and Greybox Exploit Generation for Heap Overflows in Interpreters
- In the land of PHP you will always be (use-after-)free and Solution to Adepts of 0xCC Challenge 01
- mm0r1's exploits
There are several hardening techniques that could/should be implemented, listed here in order of difficulty:
- prevent unlink abuses:
- #13943
- #14339
- prevent freelist-corruption via shadow-pointer à la XNU/linux/partitionAlloc/suhosin/…: #14054
Disable ZEND_MM_CUSTOM by default: #14570- Make some parts of _zend_mm_heap read-only at runtime: #14570
- surround large allocations with guard-pages, as done in partitionAlloc, scudo, …
- Freelist randomisation, see Linux'
SLAB_FREELIST_RANDOM - isolate types in different heaps to make type confusion/use after free more difficult, as in kalloc_type. An additional benefit of type isolation + freelist bitmap is that we wouldn't need the object_store anymore to enumerate objects. A less invasive approach would be to simply isolate by size as done in partitionAlloc and Webkit's libpas
- once this is done, heaps need to be pinned by size/type, to prevent an attacker from re-using the memory space of a destructed heap with one of different type/size.
- a low-hanging fruit would be to allocate GET/POST/COOKIES into a separated heap, to reduce the reach of heap feng-shui: #14304
allocate strings and array buckets in GigaCages so that a corrupt length doesn't allow to access anything else than other strings/array buckets. This will significantly increase the virtual-memory usage though.this isn't doable since those structures have a maximum size ofSIZE_MAX
cc @arnaud-lb @cfreal @therealcoiffeur
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The issue is a broad PHP heap-hardening plan rather than a single file or test change. Start by reviewing the unchecked techniques and the referenced issues and allocator designs, then choose a specific scope with the maintainers. Done would require an agreed hardening technique to be implemented and validated in the relevant PHP allocator tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, php
- Domain
- security
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100