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_handlerjinbidel waqt it-tħaddim permezz ta'ini_set()u l-upload progress tas-session huwa attiv. Rimedju skont php.net:session.upload_progress.enabled=0fil-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.