Kwetsbaarheid in de netwerkbibliotheken van Rust and Go-talen waardoor u IP-adresverificatie kunt omzeilen

In de standaardbibliotheken van de Rust- en Go-talen zijn kwetsbaarheden geïdentificeerd die verband houden met de onjuiste verwerking van IP-adressen met octale cijfers in adresparseringsfuncties. De kwetsbaarheden maken het mogelijk om controles op geldige adressen in applicaties te omzeilen, bijvoorbeeld om de toegang tot loopback-interfaceadressen (127.xxx) of intranetsubnetten te organiseren bij het uitvoeren van SSRF-aanvallen (Server-side request forgery). De kwetsbaarheden zetten de cyclus voort van problemen die eerder zijn geïdentificeerd in de knooppunt-netmaskers van de bibliotheken (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipadres (Python, CVE- 2021-29921), Data::Validate::IP (Perl, CVE-2021-29662) en Net::Netmask (Perl, CVE-2021-29424).

Volgens de specificatie moeten IP-adresreekswaarden die met een nul beginnen, worden geïnterpreteerd als octale getallen, maar veel bibliotheken houden hier geen rekening mee en negeren de nul eenvoudigweg, waarbij de waarde als een decimaal getal wordt behandeld. Het getal 0177 in octaal is bijvoorbeeld gelijk aan 127 in decimalen. Een aanvaller kan een bron opvragen door de waarde "0177.0.0.1" op te geven, wat in decimale notatie overeenkomt met "127.0.0.1". Als de problematische bibliotheek wordt gebruikt, zal de applicatie niet detecteren dat het adres 0177.0.0.1 zich in het subnet 127.0.0.1/8 bevindt, maar in feite kan het bij het verzenden van een verzoek toegang krijgen tot het adres “0177.0.0.1”, dat de netwerkfuncties worden verwerkt als 127.0.0.1. Op een vergelijkbare manier kunt u de toegangscontrole tot intranetadressen bedriegen door waarden als “012.0.0.1” op te geven (equivalent aan “10.0.0.1”).

In Rust was er een probleem met de standaardbibliotheek "std::net" (CVE-2021-29922). De IP-adresparser van deze bibliotheek heeft een nul vóór de waarden in het adres weggegooid, maar alleen als er niet meer dan drie cijfers zijn opgegeven. '0177.0.0.1' zou bijvoorbeeld als een ongeldige waarde worden gezien en een onjuist resultaat zou worden geretourneerd als reactie op 010.8.8.8 en 127.0.026.1 . Toepassingen die std::net::IpAddr gebruiken bij het parseren van door de gebruiker opgegeven adressen zijn mogelijk vatbaar voor SSRF-aanvallen (Server-side request forgery), RFI-aanvallen (Remote File Inclusion) en LFI-aanvallen (Local File Inclusion). De kwetsbaarheid is opgelost in de Rust 1.53.0 branch.

Kwetsbaarheid in de netwerkbibliotheken van Rust and Go-talen waardoor u IP-adresverificatie kunt omzeilen

In Go wordt de standaardbibliotheek "net" beïnvloed (CVE-2021-29923). De ingebouwde functie net.ParseCIDR slaat voorloopnullen vóór octale getallen over in plaats van ze te verwerken. Een aanvaller kan bijvoorbeeld de waarde 00000177.0.0.1 doorgeven, die, wanneer aangevinkt in de functie net.ParseCIDR(00000177.0.0.1/24), zal worden geparseerd als 177.0.0.1/24, en niet als 127.0.0.1/24. Het probleem manifesteert zich ook in het Kubernetes-platform. De kwetsbaarheid is opgelost in Go-release 1.16.3 en bèta 1.17.

Kwetsbaarheid in de netwerkbibliotheken van Rust and Go-talen waardoor u IP-adresverificatie kunt omzeilen


Bron: opennet.ru

Voeg een reactie