
Audit CVE-2026-109618 / CVE-2026-109619 : empoisonnement de session menant à l'exécution de commandes reproduit ; précondition OOM de BGCTX reproduite ; UAF de tableau de progression allégué non reproduit sur les builds standard.
Audit des affirmations « php2shell », plus un PoC local fonctionnel.
中文 · PHP 8.5.4 · laboratoire uniquement
MITRE :
CVE_RECORD_DNE· NVD : aucun enregistrement · php.net : pré-annonce uniquement. Ce dépôt audite les affirmations techniques ; il ne confirme pas les identifiants.
| Question | Réponse |
|---|---|
| Peut-il donner un shell ? | ✅ localement — avec un sink unserialize() + un gadget __destruct |
| Est-ce la CVE elle-même ? | ⚠️ probablement pas — la CVE ressemble aux orphelins de contexte BG (note 08) |
| Est-ce pré-authentification ? | ❌ le chemin pré-auth s'arrête à ARM / crash dans nos tests |
| Le bundle divulgué est-il correct ? | ❌ l'UAF post_bytes_processed ne se reproduit pas |
multipart POST ──► php_hash_environment() ← avant RINIT
│
├─ serialize encode ──► OOM ──► BG(serialize) orphelin (64 B)
└─ unserialize decode ──► OOM ──► BG(unserialize) orphelin (8208 B)
│
▼
SAPI survit ? ── oui ──► la requête suivante réutilise le contexte libéré
│ │
non ├─ Bug S : crash / fuite
▼ └─ Bug U : classe RCE
DoS uniquement
Bug distinct utilisé par notre PoC :
var_destroy() ──► libère les chunks de back-ref ──► parcours dtor (sans serialize_lock)
└─ __destruct ──► unserialize interne ──► R:N lit le chunk libéré
└─ fausse closure ──► zif_system(cmd)
php exploit/var_destroy_uaf_rce.php "id > /tmp/proof"
cat /tmp/proof # uid=... gid=...
Nécessite : PHP vulnérable (8.5.4 vérifié) · unserialize() sur des données attaquant · une
classe __destruct · Linux /proc/self/mem · des offsets par build issus de nm.
| Affirmation | Résultat |
|---|---|
Bundle divulgué : UAF post_bytes_processed | ❌ non reproduit (Z_TRY_ADDREF) |
Bug S — orphelin BG(serialize) | ⚠️ UAF 3/3 sous ASAN · arm reproduit · pas de RCE |
Bug U — orphelin BG(unserialize) | ⚠️ arm reproduit · kill / system non reproduits |
| var_destroy UAF → RCE | ✅ fonctionne, 10/10, auto-localisant |
Empoisonnement de session → include | ✅ reproduit (technique préexistante) |
Incohérence de handler → __destruct | ✅ reproduit (nécessite une classe gadget) |
| Offsets du binaire de démo | ✅ correspondent à 8.5.4-0ubuntu1.3 (delta 0xbe3f0) |
| Chemin | Contenu |
|---|---|
exploit/var_destroy_uaf_rce.php | PoC UAF → RCE auto-localisant |
analysis/01-05 | durée de vie · ablation · versions · bundle divulgué · atteignabilité |
analysis/06 | chemin BG(serialize) + reçu ASAN |
analysis/07 | empoisonnement de session → exécution de commande |
analysis/08 | orphelins de contexte BG (paquet re-up) |
analysis/09 | var_destroy UAF → RCE (offsets, auto-localisant) |
evidence/ | traces ASAN · journaux OOM · offsets binaires · exécutions |
lab/ | scripts de build · déclencheurs · matrice · ablation |
PROVENANCE.md | URLs des artefacts · dates · hashes |
Builds locaux, laboratoires locaux Apache / php-fpm / Docker, et le paquet Ubuntu nommé. Le PoC s'exécute en tant qu'utilisateur du processus PHP ; la précondition du gadget est réelle.