Ang kahinaan sa mga library ng network ng Rust at Go na mga wika na nagpapahintulot sa iyo na i-bypass ang pag-verify ng IP address

Ang mga kahinaan na nauugnay sa maling pagpoproseso ng mga IP address na may mga octal na digit sa mga function ng pag-parse ng address ay natukoy sa mga karaniwang aklatan ng Rust at Go na mga wika. Ginagawang posible ng mga kahinaan na i-bypass ang mga pagsusuri para sa mga wastong address sa mga application, halimbawa, upang ayusin ang pag-access sa mga loopback interface address (127.xxx) o intranet subnet kapag nagsasagawa ng mga pag-atake ng SSRF (Server-side request forgery). Ang mga kahinaan ay nagpapatuloy sa cycle ng mga problema na dati nang natukoy sa mga library node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validate::IP (Perl, CVE-2021-29662) at Net::Netmask (Perl, CVE-2021-29424).

Ayon sa detalye, ang mga halaga ng string ng IP address na nagsisimula sa isang zero ay dapat bigyang-kahulugan bilang mga octal na numero, ngunit maraming mga aklatan ang hindi isinasaalang-alang ito at itinatapon lamang ang zero, tinatrato ang halaga bilang isang decimal na numero. Halimbawa, ang numerong 0177 sa octal ay katumbas ng 127 sa decimal. Ang isang umaatake ay maaaring humiling ng mapagkukunan sa pamamagitan ng pagtukoy sa halagang "0177.0.0.1", na sa decimal na notasyon ay tumutugma sa "127.0.0.1". Kung ginamit ang problemang library, hindi matutukoy ng application na ang address na 0177.0.0.1 ay nasa subnet 127.0.0.1/8, ngunit sa katunayan, kapag nagpapadala ng kahilingan, maa-access nito ang address na "0177.0.0.1", na kung saan ang ang mga function ng network ay ipoproseso bilang 127.0.0.1. Sa katulad na paraan, maaari mong dayain ang pagsusuri ng access sa mga intranet address sa pamamagitan ng pagtukoy ng mga halaga tulad ng β€œ012.0.0.1” (katumbas ng β€œ10.0.0.1”).

Sa Rust, ang karaniwang library na "std::net" ay naapektuhan ng isang isyu (CVE-2021-29922). Ang IP address parser ng library na ito ay nag-discard ng zero bago ang mga value sa address, ngunit kung hindi hihigit sa tatlong digit ang tinukoy, halimbawa, ang "0177.0.0.1" ay makikita bilang isang di-wastong halaga, at isang hindi tamang resulta. ay ibabalik bilang tugon sa 010.8.8.8 at 127.0.026.1 . Ang mga application na gumagamit ng std::net::IpAddr kapag nag-parse ng mga address na tinukoy ng user ay posibleng madaling kapitan ng SSRF (Server-side request forgery), RFI (Remote File Inclusion) at LFI (Local File Inclusion) na pag-atake. Ang kahinaan ay naayos sa Rust 1.53.0 branch.

Ang kahinaan sa mga library ng network ng Rust at Go na mga wika na nagpapahintulot sa iyo na i-bypass ang pag-verify ng IP address

Sa Go, ang karaniwang library na "net" ay apektado (CVE-2021-29923). Ang net.ParseCIDR built-in na function ay nilalaktawan ang mga nangungunang zero bago ang mga octal na numero sa halip na iproseso ang mga ito. Halimbawa, maaaring ipasa ng isang attacker ang value na 00000177.0.0.1, na, kapag nasuri sa net.ParseCIDR(00000177.0.0.1/24) function, ay ipapa-parse bilang 177.0.0.1/24, at hindi 127.0.0.1/24. Nagpapakita rin ang problema sa platform ng Kubernetes. Ang kahinaan ay naayos sa Go release 1.16.3 at beta 1.17.

Ang kahinaan sa mga library ng network ng Rust at Go na mga wika na nagpapahintulot sa iyo na i-bypass ang pag-verify ng IP address


Pinagmulan: opennet.ru

Magdagdag ng komento