Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Deserjalizzazzjoni mhux sikura f'PHP: unserialize u sigurtà

unserialize() b'data barranija jista' fl-agħar każ iwassal għal eżekuzzjoni ta' kodiċi. Kif tissostitwuh b'JSON, tillimitawh fejn irid jibqa' u ssibu postijiet riskjużi fil-kodiċi.

Stat 5 min. qariGwidi

Fil-qosor: Fis-sigurtà ta' unserialize f'PHP tgħodd regola sempliċi: qatt ma tipproċessaw b'unserialize() data li ġejja minn barra. Uża minflok JSON. Fejn unserialize() minn kodiċi qadim irid jibqa', illimitawh b'allowed_classes => false u ivverifikaw l-awtentiċità tad-data b'firma.

X'jista' jmur ħażin b'unserialize()

PHP jista' jibdel arrays u oġġetti b'serialize() f'katina ta' karattri u jirrestawrahom b'unserialize(). Dan huwa komdu biex data tinħażen f'cookies, caches jew oqsma tad-database. Il-problema: unserialize() joħloq hekk ukoll oġġetti ta' klassijiet arbitrarji li jistgħu jitgħabbew fl-applikazzjoni.

Meta oġġett bħal dan jinħoloq, u l-aktar tard meta jinqered, PHP isejjaħ awtomatikament metodi ċerti, pereżempju __wakeup(), __unserialize() jew __destruct(). Jekk klassijiet fil-proġett jew fil-libreriji fihom metodi bħal dawn b'azzjonijiet fuq fajls, fuq database jew fuq is-sistema, attakkant jista' jabbużahom permezz ta' data manipulata. L-esperti jitkellmu dwar PHP Object Injection. Skont il-klassijiet eżistenti, l-effett jibda mit-tħassir ta' fajls individwali sal-eżekuzzjoni ta' kodiċi malizzjuż.

Miġbur għal min mhux tekniku: sejħa waħda mhux maħsuba fil-post żbaljat tista' tħalli attakkant jidħol bil-fond fl-applikazzjoni. Din id-dgħufija għalhekk għal snin tagħmel parti mit-temi tal-OWASP Top 10.

L-alternattiva sikura: JSON minflok unserialize

Għal kważi l-każijiet kollha fejn id-data ġejja minn barra jew titlaq mis-server, JSON hija l-għażla t-tajba. json_decode() joħloq biss arrays, numri, katini ta' karattri u valuri tal-verità, l-ebda oġġetti ta' klassijiet proprji.

<?php
declare(strict_types=1);

function leseEinstellungen(string $eingabe): array
{
    try {
        $daten = json_decode($eingabe, true, 16, JSON_THROW_ON_ERROR);
    } catch (JsonException $e) {
        throw new InvalidArgumentException('Ungültige Daten.');
    }

    if (!is_array($daten)) {
        throw new InvalidArgumentException('Erwartet wurde ein Objekt.');
    }

    // Ħudu biss oqsma magħrufa bit-tipi mistennija
    return [
        'sprache' => in_array($daten['sprache'] ?? '', ['de', 'en'], true) ? $daten['sprache'] : 'de',
        'seiten'  => max(1, min(100, (int) ($daten['seiten'] ?? 20))),
    ];
}

Importanti hija t-tieni parti: anke d-data JSON hija input. Ħudu biss oqsma mistennija u ivverifikaw it-tipi u l-firxiet tal-valuri qabel ma taħdmu biha.

Meta unserialize ma jistax jiġi evitat: allowed_classes u firma

F'applikazzjonijiet eqdem id-data serjalizzata spiss tinsab f'databases jew caches li ma jistgħux jinbidlu minnufih. Allura tillimitaw ir-riskju f'żewġ passi. L-ewwel, b'allowed_classes tipprevjenu li jinħolqu oġġetti. It-tieni, b'firma HMAC tiżguraw li d-data verament ġejja mill-applikazzjoni tagħkom u ma nbidlitx fit-triq.

<?php
declare(strict_types=1);

const SCHLUESSEL = 'aus-sicherer-konfiguration-laden'; // qatt fir-repository tal-kodiċi

function verpacken(array $daten): string
{
    $roh = serialize($daten);
    return hash_hmac('sha256', $roh, SCHLUESSEL) . '.' . base64_encode($roh);
}

function auspacken(string $paket): array
{
    [$signatur, $b64] = array_pad(explode('.', $paket, 2), 2, '');
    $roh = base64_decode($b64, true);

    if ($roh === false || !hash_equals(hash_hmac('sha256', $roh, SCHLUESSEL), $signatur)) {
        throw new RuntimeException('Signatur ungültig.');
    }

    $daten = unserialize($roh, ['allowed_classes' => false, 'max_depth' => 16]);
    if (!is_array($daten)) {
        throw new RuntimeException('Unerwartetes Format.');
    }
    return $daten;
}

Jekk jinħtieġu klassijiet speċifiċi, semmuhom individwalment f'allowed_classes, minflok ma tippermettuhom kollha. Iċ-ċavetta tappartjeni fil-konfigurazzjoni tas-server jew f'ħażna ta' sigrieti u trid tiġi mġedda wara inċident.

Biddlu d-data eżistenti għal JSON pass wara pass

F'applikazzjonijiet li kibru, valuri serjalizzati spiss jinsabu fid-database għal snin. Bidla f'pass wieħed hija allura riskjuża. Tranżizzjoni ppruvat ruħha: l-applikazzjoni taqra ż-żewġ formati, imma tikteb biss JSON. Meta jinqara valur qadim, jiġi mpakkjat darba b'allowed_classes => false u jinkiteb minnufih lura bħala JSON. Wara ftit żmien il-biċċa l-kbira tal-entrati jkunu nbidlu, u skript uniku jagħmel il-bqija.

Irreġistraw matul it-tranżizzjoni kemm-il darba jinqara l-format qadim, u anke meta l-firem ma jaqblux. Falliment bħal dan jista' jindika tentattivi ta' manipulazzjoni u jappartjeni fis-sorveljanza. Biss meta ma jidher aktar format qadim, neħħu kompletament il-fergħa ta' unserialize() mill-kodiċi.

Deserjalizzazzjoni moħbija: sessions, caches u mogħdijiet tal-fajls

Mhux kull deserjalizzazzjoni tidher fil-kodiċi proprju. Ivverifikaw ukoll dawn il-postijiet:

  • Sessions: PHP jissjerjalizza awtomatikament id-data tas-session. Sakemm l-attakkanti ma jistgħux jiktbu l-fajls tas-sessions, dan mhuwiex kritiku. Mogħdijiet separati tas-sessions għal kull websajt tiddeskrivi l-gwida Kif tassiguraw is-sessions f'PHP.
  • Serializer tas-session: L-avviż dwar CVE-2026-115560 jolqot konfigurazzjoni mhux tas-soltu fejn is-serialize_handler jinbidel waqt it-tħaddim permezz ta' ini_set() u l-upload progress tas-session huwa attiv. Rimedju skont php.net: session.upload_progress.enabled=0 fil-php.ini jew fil-pool FPM, wara dan restart tal-workers.
  • Caches u kjuwijiet: Redis, Memcached jew tabelli tad-database b'valuri serjalizzati huma sikuri biss daqs l-aċċess għalihom. Ma jappartjenux miftuħa fin-netwerk.
  • Funzjonijiet tal-fajls b'mogħdijiet minn inputs: Qatt ma tgħaddu lil funzjonijiet tal-fajls mogħdijiet mit-talba. Stream wrappers bħal phar:// inkella jistgħu jwasslu għal pproċessar mhux mistenni. Lista permessa għal ismijiet ta' fajls tipproteġi b'mod aktar affidabbli minn kull filtrar.
  • Dipendenzi: Libreriji b'dgħufijiet magħrufa jkabbru l-possibbiltajiet ta' attakkant. Żommuhom aġġornati, kif deskritt fil-gwida Kif tivverifikaw id-dipendenzi ta' Composer għal vulnerabbiltajiet.

Sib postijiet riskjużi fil-kodiċi

L-ewwel inventarju jirnexxi b'tiftix sempliċi. Ma jbiddel xejn fis-sistema u juri s-sejħiet kollha barra mid-direttorju vendor:

grep -rn --include='*.php' 'unserialize(' /var/www/projekt \
  | grep -v '/vendor/'

Evalwaw kull sejba b'tliet mistoqsijiet: minn fejn ġejja d-data? Utent jista' jibdilha? allowed_classes huwa ffissat? Sejbiet b'inputs minn cookies, $_GET, $_POST, $_REQUEST jew interfaces esterni għandhom prijorità. Issostitwuhom b'JSON u ttestjaw il-bidla qabel ma timplimentawha.

Indikazzjoni oħra tinsab fil-browser. Data serjalizzata ta' PHP għandha struttura tipika b'identifikaturi tat-tip u indikazzjonijiet tat-tul. Jekk issibu valuri bħal dawn f'cookies, f'oqsma moħbija tal-formoli jew f'parametri tal-websajt proprja tagħkom, l-applikazzjoni tat data serjalizzata lill-viżitatur u probabbilment tistenniha lura. Propju dawn il-postijiet iridu jiġu vverifikati.

Għall-maniġment hija biżżejjed mistoqsija sempliċi lill-iżviluppaturi jew lill-aġenzija: “L-applikazzjoni tagħna tipproċessa x'imkien data serjalizzata li ġejja minn barra, u jekk iva, kif hija protetta?” Tweġiba ċara b'postijiet misjuba hija sinjal tajjeb. Tweġiba evażiva hija raġuni biex l-applikazzjoni tiġi vverifikata.

Kif tgħin PHP SOS b'mod konkret?

  • Infittxu fil-kodiċi tagħkom għal deserjalizzazzjoni b'data barranija u nevalwaw kull sejba skont l-aċċessibbiltà u l-impatt.
  • Nipproponu bidliet konkreti għal JSON jew sejħiet assigurati u nakkumpanjaw l-iżviluppaturi tagħkom fl-implimentazzjoni.
  • Nivverifikaw id-dipendenzi għal dgħufijiet magħrufa u niddokumentaw l-istat.
  • Fuq talba nħallu l-applikazzjoni tiġi vverifikata b'mod indipendenti fil-qafas ta' awdit tas-sigurtà u test ta' penetrazzjoni.

Mistoqsijiet frekwenti

unserialize() f'PHP huwa fundamentalment mhux sikur?

Mhux għal data li tinħoloq biss mill-applikazzjoni tagħkom stess u li ħadd ma jista' jbiddel. Isir perikoluż hekk kif utenti jew terzi jistgħu jinfluwenzaw l-input, pereżempju permezz ta' cookies, oqsma tal-formoli jew interfaces esterni.

allowed_classes => false huwa biżżejjed bħala protezzjoni?

Jipprevjeni li jinħolqu oġġetti arbitrarji u hekk jagħlaq l-aktar triq importanti ta' attakk. Għal inputs minn barra JSON xorta huwa l-aħjar għażla, għax il-parser huwa aktar sempliċi u ma jerġax jibni oġġetti.

Aġġornament tal-libreriji jgħin kontra attakki ta' deserjalizzazzjoni?

Parzjalment. L-attakki spiss jużaw klassijiet minn dipendenzi li, meta oġġett jinqered jew jiġi mqajjem, jesegwixxu azzjonijiet. Pakketti attwali jagħlqu ktajjen magħrufa, imma l-kawża reali hija s-sejħa ta' unserialize b'data barranija.

PHP2Shell għandu x'jaqsam mad-deserjalizzazzjoni?

Iż-żewġ vulnerabbiltajiet prinċipali jinsabu fl-ipproċessar tat-talbiet ta' PHP. L-avviż dwar CVE-2026-115560, min-naħa l-oħra, jolqot konfigurazzjoni mhux tas-soltu tas-serjalizzazzjoni tas-session. Ir-rimedju hemmhekk huwa session.upload_progress.enabled=0.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata