NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

Útočník ovláda URL adresu, ktorú aplikácia načítava, DNS mena v tejto URL (TTL 0, striedajúce sa odpovede) a HTTP server na verejnej adrese (akýkoľvek stav, Location a telo). Chráneným aktívom je všetko, čo je dostupné z hostiteľa aplikácie a útočník sa k tomu nedostane: loopback služby, privátna sieť, cloudové metadáta, samotná aplikácia.

ÚtokObrana
Privátna alebo metadátová adresa priamo v URL (http://169.254.169.254/, [fd00:ec2::254])Tabuľka blokovaných sietí.
Alternatívne zápisy IPv4 (2130706433, 0x7f.1, 0177.0.0.1, 127.1)Kanonizácia ich odmietne, nikdy ich nenormalizuje.
IPv4 vnútri IPv6 ([::ffff:127.0.0.1], NAT64, 6to4, Teredo)Pravidlá vnorenia; 2001::/23 (vrátane Teredo) blokované celé.
Meno so súkromnou odpoveďou, alebo jednou súkromnou z viacerýchPreloží sa raz, posúdi sa každá adresa; jedna súkromná odpoveď meno zablokuje.
DNS rebindingKaždá overená adresa pripnutá do curl (CURLOPT_RESOLVE); curl meno nikdy neprekladá sám.
Proxy z prostredia si meno preloží samaproxy: '' pri každom kroku; proxy nastavenú volajúcim ochrana odmietne.
Zdieľané spojenie otvorené na inú adresuHandler vlastnený ochranou, CURLOPT_FRESH_CONNECT, CURLOPT_FORBID_REUSE.
Handler bez curl ignoruje pripnutieOchrana vynúti vlastný curl handler a potom skontroluje primary_ip.
Kód za ochranou presmeruje požiadavku alebo zruší pripnutieHandler pred spojením znovu skontroluje URL, hlavičku Host a voľby pripnutia; CURLOPT_PREREQFUNCTION preruší spojenie mimo overených adries pred odoslaním prvého bajtu.
Voľba curl od volajúceho, ktorá obíde pripnutie (CURLOPT_UNIX_SOCKET_PATH, CURLOPT_CONNECT_TO, CURLOPT_PRE_PROXY …)Voľby curl od volajúceho prechádzajú zoznamom povolených.
Presmerovanie na privátnu adresu, na http alebo do slučkyPresmerovania sú predvolene vypnuté; po zapnutí sa každý krok overí a pripne, prechod na http a prekročenie limitu sa odmietnu.
Prihlasovacie údaje poslané pri presmerovaní na iný originauth, Authorization a curl HTTPAUTH / USERPWD sa na inom origine zahodia (CVE-2022-31090); hlavičky len na prvý origin, plus výslovný zoznam preposielaných.
Neobmedzená odpoveďmaxResponseBytes v pravidlách (oreže); maxBytes vo fetch() (too_large).
Rozdiely medzi parsermi (a.com\@127.0.0.1, #@, zone id, %)Striktný parser; požiadavka ide na prestavanú URL.
Self-SSRF (vlastný hostiteľ aplikácie za verejným load balancerom)Mená hostiteľov aplikácie sa odmietnu podľa mena.
Text chyby zmapuje internú sieťPevné správy podľa dôvodu, nikdy URL ani adresa; blocked a unresolved majú jednu spoločnú správu.
Dôveryhodné privátne meno odpovie metadátovou adresouPrivátny hostiteľ nikdy nevyníma cloudovú metadátovú adresu; to dokáže len povolený rozsah.
Balík zdedí uvoľnenia hostiteľa pre URL adresy svojich používateľovwithoutHostAllowlist(), withoutPrivateHosts(), withoutAllowedRanges() ich zahodia a bloky zostanú; allowHosts([]) vyhodí výnimku.
Obídenie „len týchto hostiteľov“ adresou priamo v URLStriktný zoznam povolených hostiteľov odmietne každú adresu zapísanú priamo.

Čo zaručené nie je

  • Žiadna ochrana, keď ochrana nie je v ceste — obyčajné Http::get() chránené nie je.
  • Ak aplikácia po makre presmeruje handler Http::safe() (->setHandler()), odstráni handler ochrany aj jeho opätovnú kontrolu; kontrola pred odoslaním stále ide s voľbami curl daného kroku (ak je tým handlerom curl) a kontrola primary_ip zachytí akýkoľvek iný handler až po odoslaní požiadavky. Nahradenie klienta cez setClient() po makre ochranu odstráni úplne (klient nastavený pred makrom sa odmietne).
  • Iný balík, ktorý zaregistruje makro safe po tomto, ho potichu nahradí — bezpečnostne kritický kód volá SafeFetch::guard() alebo SafeFetch::http().
  • Preklad DNS sa v PHP nedá časovo obmedziť; timeout požiadavky pokrýva len prenos.
  • Záznamy AAAA prichádzajú z DNS, nie z /etc/hosts — PHP nemá API pre IPv6 záznam zo súboru hosts.
  • Povolenému rozsahu alebo privátnemu hostiteľovi sa dôveruje úplne na základe vašej konfigurácie — okrem toho, že privátny hostiteľ sa nikdy nedostane k cloudovej metadátovej adrese.
  • precheck() a SafeUrl::withoutLookup() meno neprekladajú: meno, ktoré prejde, sa môže preložiť na privátnu adresu. Ochrana ho posúdi v plnom rozsahu pri načítaní.
  • reason(), retryable() a blockedBy() rozlišujú „privátne“ od „neexistuje“ — tento rozdiel držte mimo dosahu toho, kto URL odoslal.
  • Aplikácia dostupná cez verejné meno, ktoré nie je medzi jej hostiteľmi (iné DNS meno pre tú istú IP), sa nerozpozná — ďalšie mená uveďte v app_hosts.extra.
  • retry() Laravelu opakuje pri každej výnimke, ak callback when nepovie inak, preto filtrujte SafeFetchException, aby ste skončili pri prvom odmietnutí.
  • Nové spojenie pri každej požiadavke: medzi chránenými požiadavkami nie je keep-alive — to je cena za žiadne zdieľanie spojení.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.