Overview
The House of Tangerine is a modern heap exploitation technique that serves as the successor to House of Orange for glibc 2.26+. Like its predecessor, it exploits the top chunk (wilderness) without calling free() directly, but uses tcache poisoning instead of FILE structure exploitation to achieve arbitrary allocation.This technique was inspired by the PicoCTF 2024 challenge “High Frequency Troubles” and represents the modern evolution of top chunk exploitation.
Glibc Version Compatibility
No patches exist for this technique - it remains viable on all modern glibc versions.
What This Technique Achieves
The House of Tangerine enables:- Arbitrary allocation without free(): Force malloc to return any malloc-aligned pointer
- Heap corruption via malloc only: Exploit using only malloc() calls
- Tcache control: Inject arbitrary addresses into tcache freelist
- Modern compatibility: Works on latest glibc with safe linking
Prerequisites and Constraints
How It Works
1
Corrupt first top chunk
Overflow to corrupt the top chunk size to be page-aligned but smaller than a large allocation.
2
Trigger sysmalloc and _int_free
Allocate a large chunk to force sysmalloc to free the old top chunk.
3
Corrupt second top chunk
Use overflow again to corrupt the new top chunk size.
4
Trigger second _int_free
Allocate another large chunk to free the second corrupted top chunk.
5
Poison tcache with target address
Corrupt the tcache fd pointer to point to target (with safe linking).
6
Retrieve poisoned tcache entries
Make two allocations to get the target address.
Complete Source Code
Technical Deep Dive
The _int_free in sysmalloc
The key to House of Tangerine is this code path in sysmalloc:- We corrupt top chunk size to be smaller than allocation
- malloc calls sysmalloc to get more memory
- New memory is mmapped at a different location
- Old top chunk can’t merge with new memory
- _int_free is called on old top chunk
Size Calculation Strategy
The technique requires precise size calculations:Page Alignment Bypass
Why keep page alignment bits?- Avoid triggering size validation checks
- Make the corrupted size look “reasonable”
- Still control the lower bits for precise freed size
Safe Linking Bypass
For glibc 2.32+, tcache uses safe linking:current_fd_address, then XOR with target.
Double Top Chunk Free
Why free the top chunk twice?- First free: Gets a freed chunk of size CHUNK_SIZE_1 into tcache
- Second free: Creates another freed chunk whose fd pointer we can corrupt
CTF Challenge
PicoCTF 2024 - High Frequency Troubles
PicoCTF 2024 - High Frequency Troubles
Challenge: Signal processing application with controlled heap allocationsVulnerability:
- Could trigger allocations of controlled sizes
- Had out-of-bounds write to corrupt heap metadata
- No direct free() function available
- Leaked heap address via observation of allocation patterns
- Corrupted top chunk size to force sysmalloc
- Triggered large allocation to free old top chunk
- Repeated process to get second freed top chunk
- Corrupted tcache fd pointer with safe linking bypass
- Got arbitrary allocation near target data structure
- Overwrote flag verification logic
Common Pitfalls
Advantages Over House of Orange
Exploitation Strategy
Phase 1: Information Gathering
- Leak heap address (required for safe linking on 2.32+)
- Determine target address and ensure malloc alignment
- Calculate initial top chunk size (or probe it)
Phase 2: First Top Chunk Free
- Allocate chunk of size_2 (precisely calculated)
- Overflow to corrupt top chunk size (keep page bits)
- Allocate large chunk to trigger sysmalloc and _int_free
- First top chunk is now in tcache
Phase 3: Second Top Chunk Free
- Overflow to corrupt new top chunk size
- Calculate location of freed tcache entry
- Allocate large chunk to trigger second _int_free
- Second top chunk is now in tcache
Phase 4: Tcache Poisoning
- Corrupt second freed chunk’s fd pointer
- Apply safe linking:
target ^ (fd_addr >> 12) - Allocate once to get corrupted tcache entry
- Allocate again to get target address
Related Techniques
House of Orange
Predecessor technique for glibc < 2.26
Tcache Poisoning
Core technique used for arbitrary allocation
House of Force
Alternative top chunk exploitation (patched in 2.29)
See Also
- Top Chunk Management
- Tcache Mechanism
- Safe Linking
- [sysmalloc Internals/techniques/advanced/sysmalloc-int-free)
