01 / 08Mirage lauka ziņojums – 005
PHP2Shell dzīvē: pirmās 48 stundas honeypot tīklā
Internetam atvērts PHP (mod_php, PHP-FPM, php-cgi)
PHP2Shell (CVE-2026-109618 un CVE-2026-109619) ir neautentificēta attālināta koda izpilde PHP izpildvidē, kas nopludināja pirms ielāpa 2026. gada 21. oktobrī. OffSeq Mirage honeypot tīkls fiksēja pirmās četrdesmit astoņas ekspluatācijas stundas: deviņas avota adreses, divas uzbrukuma formas un rīku, kas pats sevi nosauc savā HTTP robežā.
CVE-2026-1096188 min lasīšanai
Saturs
- 01Kopsavilkums
- 02Ievainojamības
- 03Ko slodzes dara, un kāpēc nav shellcode
- 04Kas sasniedza tīklu
- 05Sesijas augšupielādes progresa mēģinājumi
- 06Izmēra pārmeklēšana
- 07Varianti un rīki
- 08Atmiņas spiediena grupa
- 09Atklāšana
- 10Indikatori
- 11Novēršana
- 12Metode un ierobežojumi
- 13Iepriekšējā izpēte
- 14Novērojumu hronoloģija
§ 01. Kopsavilkums
PHP2Shell ir divas kritiskas PHP izpildvides ievainojamības, atklātas 2026. gada 21. oktobrī pēc priekšlaicīgas noplūdes. CVE-2026-109618 ir attālināta koda izpilde caur atmiņas izsmelšanas bojājumu; CVE-2026-109619 ir use-after-free no novecojuša globālā stāvokļa. Abas ir neautentificētas, sasniedz tīmekļa procesu pirms lietojumprogrammas koda un novērtētas ar CVSS 9.2. Skartas PHP versijas no 5.4.0 līdz 8.5.11; labojumi izlaisti 8.2.35, 8.3.36, 8.4.27 un 8.5.12.
OffSeq Mirage tīkls fiksēja pirmās četrdesmit astoņas ekspluatācijas stundas. Deviņas avota adreses no septiņām valstīm sadalās divās grupās: piecas nosūtīja sesijas augšupielādes progresa metodi, uz kuras balstās abas ievainojamības, un četras nosūtīja pārmērīga izmēra atmiņas spiediena ķermeņus, kas atbilst dokumentētajai atmiņas izsmelšanas stratēģijai. Galvenā adrese 94.154.43.7 nosūtīja 269 pieprasījumus divu minūšu izmēra pārmeklēšanā.
§ 02. Ievainojamības
Abas ievainojamības izmanto vienu neautentificētu ieejas punktu: PHP funkciju session.upload_progress, kas pēc noklusējuma ir ieslēgta un neprasa session_start() izsaukumu. Kad daudzdaļu POST satur lauku ar nosaukumu PHP_SESSION_UPLOAD_PROGRESS, PHP ieraksta progresu sesijā ievades parsēšanas laikā, pirms lietojumprogrammas koda.
CVE-2026-109618 (OOM bojājums). PHP izmanto longjmp(), lai pārtrauktu pieprasījumu atmiņas trūkuma kļūdā. Pieprasījuma atmiņa ir īslaicīgi sasniedzama pirms pilnīgas inicializācijas, tāpēc piešķiršanas kļūme šajā brīdī atstāj to nederīgā stāvoklī, ko izslēgšanas procedūra pēc tam nolasa. Apache mod_php ir visvairāk pakļauts, jo tas izslēgšanu palaiž bez nosacījumiem, pat ja palaišana neizdevās. Brīdinājums uzskaita veidus, kā daudzdaļu pieprasījums izraisa OOM stāvokli: ķermenis bez izmantojama Content-Length (apejot post_max_size pārbaudi), daļa ar neierobežotu galveņu skaitu, tukši failu lauki, kas apiet max_file_uploads, un ligzdoti lauku nosaukumi, kas pavairo ģenerēto masīva darbu.
CVE-2026-109619 (novecojis globālais stāvoklis). PHP procesā saglabā katram pieprasījumam specifisku stāvokli (kļūda, sesija, objekts), kas jāatiestata pirms pieprasījuma atmiņas atbrīvošanas. Pirmais pieprasījums var atstāt šo stāvokli, un otrais pieprasījums tajā pašā procesā to nolasa pirms inicializācijas atiestates, radot use-after-free. Apstiprinātie aktivizētāji ietver fatālas kļūdas, OOM un sesijas augšupielādes progresu, kas sasniedz sesijas apstrādi pirms normālas inicializācijas. PHP 8.5 fatal_error_backtraces ceļš ir spēcīgākais demonstrētais gadījums. error_reporting iestatīšana, @ lietošana vai display_errors atspējošana to nemazina.
§ 03. Ko slodzes dara, un kāpēc nav shellcode
PHP2Shell nav bufera pārpilde, un AAAA… un ligzdotie masīvi nenes kodu. CWE klases ir use-after-free un neinicializēta rādītāja piekļuve, nevis ārpus robežām rakstīšana. Uzbrucēja baiti veic vienu uzdevumu: manipulē ar PHP atmiņas piešķīrēju.
- Izsmelt atmiņu. 1 MB viens lauks un ligzdotie lauku nosaukumi virza pieprasījumu pret
memory_limit. Ligzdotie nosaukumi to dara efektīvi, jo to attēlojums atmiņā ir daudz lielāks par vadu baitiem, pavairojot piešķiršanas darbu, paliekot zempost_max_size. - Izraisīt kļūmi. Tas liek iekšējai PHP piešķiršanai neizdoties precīzā brīdī, kad pieprasījuma atmiņa ir daļēji inicializēta (109618), vai atstāj sesijas stāvokli dzīvu pēc tā atmiņas atbrīvošanas (109619).
- Bojāt un pārņemt. PHP pēc tam nolasa vai atzarojas uz šīs atmiņas izslēgšanas laikā. Kontrolējot piešķīrumu izmēru, skaitu un laiku, uzbrucējs sakārto heap tā, ka atbrīvotais vai neinicializētais slots tiek aizņemts ar datiem, kas novirza funkcijas rādītāju, dodot koda izpildi.
Uzbrucējs kontrolē heap izkārtojumu, nevis baitus, kas rakstīti mērķa adresē, tāpēc nav atgriešanas adreses pārrakstīšanas, nav shellcode un nav komandas pieprasījumā. Bojājuma pārvēršana par čaulu prasa heap sakārtošanu un turpmākos pieprasījumus, ko zemas mijiedarbības māneklis nepabeidz; tīkls redz aktivizētāju, nevis pārņemšanu.
§ 04. Kas sasniedza tīklu
| Grupa | Avota IP | Metode | Pirmreizēji (UTC) |
|---|---|---|---|
| Sesijas augšupielādes progress | 5 | PHP_SESSION_UPLOAD_PROGRESS + ligzdoti masīvi / serializēti dati | 2026-10-21 16:21 |
| Atmiņas spiediena ķermeņi | 4 | 1–2 MB viena lauka vai pakešu ķermeņi (OOM stratēģija) | 2026-10-20 21:57 |
§ 05. Sesijas augšupielādes progresa mēģinājumi
Galvenā metode ir daudzdaļu POST, kas apvieno trīs elementus: PHP_SESSION_UPLOAD_PROGRESS aktivizētāju, PHPSESSID vērtību un formas laukus, kuru nosaukumi ir dziļi ligzdoti masīvi. Ligzdotie nosaukumi ir viena no brīdinājuma nosauktajām OOM stratēģijām; galvenais dalībnieks sūta arī Transfer-Encoding: chunked bez izmantojama Content-Length, otru dokumentēto stratēģiju.
POST / HTTP/1.1
Host: <mērķis>
Content-Type: multipart/form-data; boundary=----p2shell<24-hex>
Transfer-Encoding: chunked
------p2shell<24-hex>
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
x
------p2shell<24-hex>
Content-Disposition: form-data; name="PHPSESSID"
<26-rakstzīmju sesijas id>
------p2shell<24-hex>
Content-Disposition: form-data; name="f0[k0][k1][k2]...[k59]"; filename=""
Content-Type: application/octet-stream
------p2shell<24-hex>
Content-Disposition: form-data; name="f1[k0][k1][k2]...[k59]"; filename=""
...f0…f9 katrs nes aptuveni sešdesmit ligzdotas masīva atslēgas ar tukšām vērtībām. Aktivizētāja lauks piespiež sesijas apstrādi parsēšanas vidū; ligzdotie masīvi un chunked kodējums izraisa atmiņas trūkuma stāvokli.§ 06. Izmēra pārmeklēšana
Savā 16:21 UTC palaišanā 94.154.43.7 sūtīja to pašu struktūru augošos izmēros: no mazāk par vienu kilobaitu līdz vairāk par sešpadsmit, ar ligzdotiem laukiem no diviem līdz desmit un masīva dziļumu no aptuveni 120 līdz 590 iekavu pāriem. Katrs izmērs ir atsevišķs pieprasījums, radot vairāk nekā divus simtus unikālu ķermeņu divās minūtēs. Veiksmīgs OOM bojājums ir atkarīgs no atmiņas sliekšņa, kas katram mērķim atšķiras, tāpēc pieaugums ir eksploits, kas to meklē.
| Laiks (UTC) | Ports | Ķermeņa baiti | Ligzdoti lauki | Masīva dziļums |
|---|---|---|---|---|
16:21:09 | 80 | 992 | 2 | 123 |
16:21:09 | 80 | 1,448 | 3 | 210 |
16:21:09 | 80 | 2,896 | 7 | 396 |
16:21:09 | 80 | 6,092 | 9 | 491 |
16:21:09 | 80 | 11,584 | 10 | 562 |
16:21:09 | 80 | 16,384+ | 10 | 581 |
§ 07. Varianti un rīki
Piecas adreses sūtīja augšupielādes progresa metodi piecos atpazīstamos dialektos.
| Dalībnieks | Valsts | Dialekts |
|---|---|---|
94.154.43.7 | GB | Ligzdotu masīvu OOM pārmeklēšana; robeža ----p2shell<hex>; chunked; bez UA |
38.180.45.91 | EE | Serializēts fragments |x|i:1; progresa laukā, UA B8RAT/1.0 |
80.66.66.66 | FI | Progresa vērtība atkārtota kā augšupielādes faila nosaukums (uga67qBl6ky1 → .txt) |
217.60.242.76 | IR | Viens minimāls zondējums, progresa vērtība X78b5ae69c545d49e, fails x.txt |
87.192.237.19 | IE | Manuāls curl/8.20.0, robeža CHKBND, progress test, fails t.txt |
Mazākie pieprasījumi ir pilnībā fiksēti. Katrs satur tikai aktivizētāja lauku un viena baita fiktīvu augšupielādi (Z), apstiprinot, ka pieprasījumā nav komandas:
------b8p2s7Qx9
Content-Disposition: form-data; name="PHPSESSID"
96fb6c1c8cdf6f2b9bf28d616557383a
------b8p2s7Qx9
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
|x|i:1;
------b8p2s7Qx9
Content-Disposition: form-data; name="f"; filename="a.txt"
Z
------b8p2s7Qx9--|x|i:1; ir PHP serializēts fragments, kas iespiests caur progresa atslēgu, CVE-2026-109619 sesijas ceļš, kas atšķiras no galvenā dalībnieka OOM pieejas.§ 08. Atmiņas spiediena grupa
Trīs Google Cloud resursi (34.19.34.88, 34.76.232.95, 34.76.218.47), izmantojot fasthttp klientu, sūtīja 1 MB daudzdaļu ķermeņus, vienu lauku wafjunk, piepildītu ar burtu A. Viens pārmērīga izmēra lauks ir vienkāršākais veids, kā virzīt procesu pret memory_limit, OOM bojājuma priekšnoteikumu; lauka nosaukums liek domāt, ka pildījums arī aizpilda WAF. 34.19.34.88 raidīja 2026-10-20 21:57 UTC, atbilstot ekspluatācijai pirms atklāšanas, par ko ziņoja Amazon un Cloudflare. Ceturtais resurss (194.42.196.44) sūtīja 2 MB WordPress REST pakešu ķermeni 18. oktobrī. Šai grupai trūkst augšupielādes progresa aktivizētāja, tāpēc tā ir atribūcēta PHP2Shell tikai pēc formas.
§ 09. Atklāšana
PHP2Shell dzīvo pieprasījuma ķermenī un Content-Type; atšifrēšana ārpus tā, ko serveris jau parsē, nav vajadzīga. PHP daudzdaļu parsētājs ir iecietīgs (salocītas galvenes, trūkstoši koli, atkritumi aiz pēdiņām), tāpēc saskaņojiet pēc vairākiem signāliem, nevis viena.
- Robeža. Apakšvirkne
p2shellContent-Typegalvenē. Neviena leģitīma plūsma to nesatur. - Aktivizētāja lauks. Lauka nosaukums
PHP_SESSION_UPLOAD_PROGRESSdaudzdaļu ķermenī. Nosaukums ir konfigurējams, tāpēc uzskatiet to par spēcīgu, bet ne vienīgo indikatoru. - Ligzdoti masīva nosaukumi. Formas lauku nosaukumi ar dziļi ligzdotām masīva atslēgām, piemēram,
f0[k0][k1][k2]…. - Izmēra pārmeklēšana. Augšupielādes progresa POST pārrāvumi no viena avota, kuru ķermeņa izmēri monotoni aug.
- Pārmērīga izmēra viens lauks. Daudzdaļu ķermeņi virs dažiem simtiem kilobaitu ar vienu atkārtotu baitu lauku.
- Resursa pusē. Tīmekļa process (
php-fpm,apache2,httpd), kas palaiž čaulu vai lejupielādētāju, unmemory_limitkļūdas vai procesu avārijas, kas korelē ar daudzdaļu POST.
§ 10. Indikatori
| Indikators | Tips | Konteksts |
|---|---|---|
94.154.43.7 | IP | Galvenais dalībnieks (Storm Industries LLC, AS219502, GB); OOM izmēra pārmeklēšana |
38.180.45.91 | IP | Serializētu datu variants (WAVECOM-AS, AS34702, EE); UA B8RAT/1.0 |
80.66.66.66 | IP | Failu ierakstīšanas variants (SOLDATOV-AS, AS209702, FI) |
217.60.242.76 | IP | Minimāls zondējums (PLYM-AS, AS197974, IR) |
87.192.237.19 | IP | Manuāla curl pārbaude (BRM-AS, AS8193, IE) |
34.19.34.88 | IP | Atmiņas spiediena 1 MB ķermenis (Google Cloud, US); agrākais, ~16 h pirms ielāpa |
34.76.232.95 | IP | Atmiņas spiediena 1 MB ķermenis (Google Cloud, BE) |
34.76.218.47 | IP | Atmiņas spiediena 1 MB ķermenis (Google Cloud, BE) |
194.42.196.44 | IP | 2 MB WP REST pakešu atmiņas ķermenis (Virtual Systems LLC, US) |
p2shell | string | Literāla apakšvirkne galvenā rīka daudzdaļu robežā |
B8RAT/1.0 | string | Serializētu datu varianta User-Agent |
PHP_SESSION_UPLOAD_PROGRESS | string | Daudzdaļu lauka nosaukums; metodes aktivizētājs |
po10nn060000_efc8bc7e3e52_000000000000 | ja4h | Galvenā dalībnieka HTTP pirkstu nospiedums |
po10nn150000_94b423c72d17_000000000000 | ja4h | fasthttp kopas HTTP pirkstu nospiedums |
§ 11. Novēršana
Ielāpojiet PHP izpildvidi: 8.5.12, 8.4.27, 8.3.36 vai 8.2.35, ar pirmkoda atpakaļpārnesumiem 7.4, 8.0 un 8.1. Koda, spraudņu un CMS atjauninājumi nenovērš interpretatora ievainojamību. Pagaidām, pēc PHP komandas: iestatiet session.upload_progress.enabled=0 un pārstartējiet procesus; versijā 8.5 iestatiet fatal_error_backtraces=0; iestatiet memory_limit=-1 caur nepārrakstāmu konfigurāciju, piemēram, php_admin_value, pazeminiet post_max_size un ieviesiet konteinera vai cgroup atmiņas robežu. Kļūdu slēpšanas iestatījumi nepalīdz.
§ 12. Metode un ierobežojumi
Secinājumi ir no OffSeq Mirage tīkla 2026. gada 20.–22. oktobrī. Pieprasījumi tiek saskaņoti pēc satura: aktivizētāja lauka nosaukuma, ligzdotām masīva atslēgām, p2shell robežas un pārmērīga izmēra viena lauka ķermeņiem. Slodzes tika atšifrētas no fiksētajiem pieprasījuma datiem; priekšskatījumi ir ierobežoti (4 KB indeksā, 16–64 KB jēlā), tāpēc lielākie ķermeņi bija lielāki, nekā parādīts, kamēr pilnīgie mazākie pieprasījumi nes izšķirošos pierādījumus. Atmiņas spiediena grupa atbilst OOM stratēģijai, bet tai trūkst augšupielādes progresa aktivizētāja, tāpēc tās atribūcija ir tikai pēc formas. Mānekļi ir zemas mijiedarbības un nevar tikt ekspluatēti, tāpēc tas raksturo rīkus un secību, nevis ekspluatācijas veiksmi.
§ 13. Iepriekšējā izpēte
PHP2Shell atrada Ryan Austin no Calif un neatkarīgi Wiz, abi izmantojot AI atbalstītu auditu, un atklāja 2026. gada 21. oktobrī. PHP divi brīdinājumi (GHSA-w8hw-w9fx-j79w, GHSA-6wmf-4rv5-p3rp) dokumentē augstāk izmantotos mehānismus. Amazon MadPot ziņoja par agrāko zināmo ekspluatāciju 17. oktobrī; Cloudflare novēroja ekspluatāciju pirms laidiena un ieviesa WAF noteikumus; Huntress un Imperva publicēja mehānisma skaidrojumus un resursa puses meklēšanas norādes. Šie aptver ievainojamību un upuru puses skenēšanu. Šis ziņojums pievieno uzbrucēja puses skatu no neatkarīga sensoru tīkla: uzskaitīto infrastruktūru, katra dalībnieka dialektus, reāllaika izmēra pārmeklēšanu un pašidentificējošo p2shell robežu.
§ 14. Novērojumu hronoloģija
- 2026-10-17Amazon MadPot fiksē agrāko zināmo PHP2Shell ekspluatācijas mēģinājumu, četras dienas pirms atklāšanas
- 2026-10-2021:57 UTC – agrākais atmiņas spiediena ķermenis tīklā (1 MB viens lauks) no Google Cloud resursa
- 2026-10-2114:00 UTC – PHP izlaiž 8.5.12, 8.4.27, 8.3.36, 8.2.35; brīdinājumi publiskoti
- 2026-10-2116:21 UTC – pirmie sesijas augšupielādes progresa mēģinājumi; galvenais dalībnieks palaiž divu minūšu izmēra pārmeklēšanu
- 2026-10-2118:16–21:55 UTC – vēl trīs dalībnieki, katrs ar atšķirīgu slodzes dialektu; viens marķē sevi kā B8RAT/1.0
- 2026-10-2202:30 UTC – galvenais dalībnieks atkārto pārmeklēšanu; 10:06 UTC seko manuāla curl pārbaude