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 →

Evita XML External Entities (XXE) f'PHP

Kif l-iżviluppaturi jipproċessaw XML f'PHP b'mod sigur: imġiba awtomatika ta' libxml, għażliet riskjużi bħal LIBXML_NOENT, protezzjoni b'entity loader u LIBXML_NO_XXE u dħul moħbi tipiku ta' XML.

Stat 6 min. qariŻvilupp sigur

Fil-qosor: XXE f'PHP tevitawh billi tgħabbu XML minn sorsi barranin mingħajr l-għażliet LIBXML_NOENT, LIBXML_DTDLOAD u LIBXML_DTDVALID, tirrifjutaw dokumenti b'DTD proprja u tissettjaw entity loader li jiċħad riżorsi esterni. Minn libxml 2.9.0 PHP ma jissostitwixxix aktar entities awtomatikament, għalhekk libxml_disable_entity_loader() hija skaduta minn PHP 8.0. Minn PHP 8.4 b'libxml 2.13 hemm disponibbli wkoll LIBXML_NO_XXE.

Vulnerabbiltà qadima li ma tisparixxix

XML External Entities, fil-qosor XXE, għal ħafna żviluppaturi huma suġġett mitmum. PHP itfa t-tagħbija ta' entities esterni b'verżjonijiet moderni ta' libxml awtomatikament, u l-funzjoni qadima ta' protezzjoni ġiet immarkata bħala skaduta ma' PHP 8.0. Madankollu vulnerabbiltajiet XXE għadhom jidhru fil-verifiki.

Ir-raġuni kważi dejjem tinsab f'waħda minn tliet sitwazzjonijiet: Xi ħadd issettja għażla biex isolvi problema ta' importazzjoni u b'hekk reġa' xegħel is-sostituzzjoni ta' entities. Librerija tagħmel dan internament. Jew l-applikazzjoni taħdem fuq sistema antika li l-PHP tagħha nbena b'libxml antika ħafna.

XXE hija perikoluża għax il-parser ta' XML jgħabbi kontenut li fid-dokument huwa biss referenzjat: fajls lokali jew indirizzi fin-netwerk. Konsegwenzi possibbli huma l-qari ta' fajls ta' konfigurazzjoni, talbiet lejn sistemi interni simili għal SSRF u tagħbija żejda tas-server.

X'japplika minn libxml 2.9 u PHP 8.0

Il-manwal ta' PHP jiddeskrivi s-sitwazzjoni hekk: minn libxml 2.9.0 is-sostituzzjoni ta' entities hija diżattivata awtomatikament. Entities esterni għalhekk m'għandhomx għalfejn jiġu mitfija b'mod separat, sakemm ma jridux jiġu riżolti referenzi interni ta' entities b'ċerti għażliet. Minn dan joħroġ din il-ħarsa ġenerali:

Għażla Effett Riskju b'XML barrani
LIBXML_NOENT tissostitwixxi entities skont il-manwal tista' tiffaċilita attakki XXE
LIBXML_DTDLOAD tgħabbi s-subset estern taġixxi t-tagħbija ta' entities esterni
LIBXML_DTDVALID tivvalida kontra d-DTD tista' tiffaċilita attakki XXE
LIBXML_NONET tipprojbixxi aċċessi tan-netwerk waqt it-tagħbija għażla addizzjonali protettiva
LIBXML_NO_XXE titfi entities esterni fis-sostituzzjoni protettiva, minn PHP 8.4 u libxml 2.13.0
LIBXML_PARSEHUGE tneħħi limiti interni tal-parser tiffaċilita tagħbija żejda, biss għal data affidabbli

L-isem qarrieq ta' LIBXML_NOENT huwa nassa magħrufa: jinstema' bħal „l-ebda entities“, imma jagħmel l-oppost.

Għall-iżviluppaturi dan ifisser: riskjuż mhuwiex it-tagħbija ta' XML fiha nnifisha, imma kull post li jibdel b'mod konxju l-imġiba awtomatika. Tfittxija għal dawn il-kostanti fil-kodiċi hija għalhekk l-aktar mod mgħaġġel għal valutazzjoni inizjali, qabel kull verifika tqila.

Difiża sigura kontra XXE f'PHP: mudell għal DOMDocument

L-eżempju li ġej jikkombina diversi saffi ta' protezzjoni. Jissettja entity loader li jiċħad kull riżorsa esterna, jgħabbi mingħajr għażliet riskjużi u jirrifjuta dokumenti b'DTD proprja:

<?php
declare(strict_types=1);

function ladeFremdesXml(string $xml): DOMDocument
{
    // Dejjem ċaħad riżorsi esterni
    libxml_set_external_entity_loader(
        static fn (?string $public, string $system, array $context) => null
    );

    $optionen = LIBXML_NONET;
    if (defined('LIBXML_NO_XXE')) {
        $optionen |= LIBXML_NO_XXE;
    }

    $vorher = libxml_use_internal_errors(true);
    $dom = new DOMDocument();
    $ok = $dom->loadXML($xml, $optionen);
    libxml_use_internal_errors($vorher);

    if (!$ok) {
        throw new InvalidArgumentException('XML ungültig.');
    }
    if ($dom->doctype !== null) {
        throw new InvalidArgumentException('Dokumente mit DTD werden nicht angenommen.');
    }
    return $dom;
}

Skont il-manwal ta' PHP valur ta' ritorn null fil-loader jibblokka t-tagħbija tar-riżorsa esterna. OWASP jindika li ma jkunx biżżejjed li null jingħadda direttament lil libxml_set_external_entity_loader(); hemm bżonn funzjoni li tirritorna null. Għal SimpleXML u XMLReader japplikaw l-istess għażliet. Kull fejn possibbli, OWASP jirrakkomanda li d-DTDs jiġu rifjutati għalkollox.

Suġġeriment

Jekk tistgħu tiddeterminaw il-format tad-data intom stess, JSON għall-iskambju bejn sistemi proprji ġeneralment hija l-għażla aktar sempliċi. Għal formati barranin bħal SAML jew fajls ta' Office, XML jibqa' inevitabbli.

Sib id-dħul moħbi ta' XML

Ħafna applikazzjonijiet jipproċessaw aktar XML milli jaħsbu l-iżviluppaturi tagħhom. Għaddu minn din il-lista:

  1. Interfaces: klijenti u servers SOAP, XML-RPC, fornituri tal-ħlas u tal-konsenja b'tweġibiet XML.
  2. Login: single sign-on b'SAML huwa bbażat fuq dokumenti XML li jiġu minn barra.
  3. Importazzjonijiet: data ta' prodotti, feeds, sitemaps, formati ta' katalogi.
  4. Uploads: immaġini SVG huma XML; formati ta' Office bħal DOCX u XLSX ġewwa jikkonsistu minn fajls XML.
  5. Libreriji: pakketti Composer għal dokumenti, spreadsheets jew SAML, li jużaw libxml internament.

Fil-kodiċi jgħinu żewġ tfittxijiet:

grep -rnE "LIBXML_(NOENT|DTDLOAD|DTDVALID|PARSEHUGE)" src/ vendor/ --include="*.php"
grep -rnE "(loadXML|simplexml_load_(string|file)|XMLReader|->load\()" src/ --include="*.php"

Hits f'vendor/ mhumiex raġuni għall-paniku, imma okkażjoni biex tivverifikaw il-verżjoni u l-messaġġi ta' sigurtà tal-librerija.

Fl-uploads ta' SVG XXE hija biss riskju wieħed minn diversi, għax fajls SVG jistgħu jinkludu wkoll skripts. Jekk l-applikazzjoni tagħkom ma teħtieġx il-format neċessarjament, ma tippermettuhx għall-uploads xejn. Inkella pproċessaw SVG biss bil-mudell sigur ta' hawn fuq u ġibu l-fajls b'mod li l-browser ma jesegwixxix skripts inklużi.

Oqogħdu attenti wkoll għal messaġġi ta' żball. Jekk applikazzjoni tirritorna l-messaġġi ta' libxml lill-utenti mhux iffiltrati, fihom jistgħu jidhru partijiet mill-kontenut ipproċessat. Żbalji jappartjenu fil-log, l-utent jirċievi messaġġ ġenerali; fl-eżempju ta' hawn fuq libxml_use_internal_errors(true) jiżgura li twissijiet ma jaslux fl-output. Illimitaw ukoll id-daqs ta' dokumenti XML riċevuti, qabel ma l-parser jarahom fl-ewwel lok.

Sistemi antiki: meta tonqos il-protezzjoni awtomatika

Il-protezzjoni mill-imġiba awtomatika tiddependi mill-verżjoni ta' libxml li biha nbena PHP. Liema verżjoni taħdem juri php -r 'echo LIBXML_DOTTED_VERSION, PHP_EOL;' fuq il-linja tal-kmand jew l-output ta' phpinfo() f'ambjent protett. Ivverifikaw il-valur għal kull verżjoni ta' PHP fuq is-server, għax CLI u server tal-web jistgħu jużaw builds differenti. L-immaġini tal-containers iġibu libxml proprja; hemmhekk ivverifikaw fil-container li qed jaħdem, mhux fuq l-host.

Partikolarment affettwati huma sistemi li xorta waħda jaħdmu fuq verżjonijiet antiki ta' PHP. Għal PHP 8.1 u aktar qodma wara PHP2Shell m'hemmx aktar aġġornamenti uffiċjali mill-proġett PHP; x'tfisser dan jiddeskrivi PHP 8.1 u aktar qodma: x'japplika issa. Sistema antika b'libxml skaduta u vulnerabbiltajiet miftuħa fl-interpretatur m'għandhiex tkun sigurata biss fil-kodiċi, imma migrata. Riskji relatati fl-ipproċessar ta' data barranija jiddeskrivi Deserjalizzazzjoni mhux sigura f'PHP, talbiet lejn miri interni Evita Server-Side Request Forgery f'PHP.

Kif tgħin PHP SOS b'mod konkret?

  • Infittxu l-postijiet kollha fejn l-applikazzjoni tagħkom u l-libreriji tagħha jipproċessaw XML minn sorsi barranin.
  • Inneħħu għażliet riskjużi tal-parser u nibnu funzjoni ċentrali u sigura ta' tagħbija.
  • Nivverifikaw il-verżjonijiet ta' libxml u PHP fuq is-servers kollha u nippjanaw il-migrazzjoni għal sistemi antiki.
  • Nittestjaw il-bidliet b'dokumenti ta' verifika bla ħsara u niddokumentaw ir-riżultat.

Il-verifika tas-softwer proprju tiddeskriviha s-servizz Awditu tas-sigurtà u test ta' penetrazzjoni.

Mistoqsijiet frekwenti

Applikazzjonijiet PHP huma protetti awtomatikament minn XXE minn PHP 8?

Fil-każ standard l-aktar, għax libxml minn verżjoni 2.9.0 ma jissostitwixxix aktar entities. Il-protezzjoni tisparixxi, madankollu, malli l-kodiċi jissettja għażliet bħal LIBXML_NOENT, LIBXML_DTDLOAD jew LIBXML_DTDVALID jew PHP jinbena b'verżjoni antika ħafna ta' libxml.

Għadni għandi nsejjaħ libxml_disable_entity_loader?

Le. Il-funzjoni hija skaduta minn PHP 8.0, għax it-tagħbija ta' entities esterni hija mitfija awtomatikament. Għal protezzjoni addizzjonali l-manwal ta' PHP jirrakkomanda libxml_set_external_entity_loader u minn PHP 8.4 b'libxml adattat il-kostanti LIBXML_NO_XXE.

Fejn l-applikazzjoni tiegħi tipproċessa XML fl-ewwel lok?

Spiss f'postijiet mhux mistennija: interfaces SOAP, single sign-on b'SAML, RSS feeds, sitemaps, importazzjonijiet ta' prodotti, uploads ta' SVG u fajls ta' Office, li ġewwa jikkonsistu minn XML. Anke libreriji jistgħu jipproċessaw XML mingħajr ma jidher fil-kodiċi proprju.

X'inhu l-attakk Billion Laughs?

Dokument b'entities inkaljati, li meta jiġi riżolt jikber enormement u juża memorja u ħin ta' kalkolu. Jappartjeni għall-istess familja bħal XXE. Protezzjoni joffru l-itfi tas-sostituzzjoni ta' entities u r-rifjut ta' dokumenti b'DTD proprja.

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