Уязвимост Π² cdnjs, която позволява изпълнСниС Π½Π° ΠΊΠΎΠ΄ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ΠΈ Π½Π° Cloudflare

Π‘Π΅ΡˆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π° ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π° уязвимост Π² cdnjs ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π·Π° доставка Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ Π½Π° Cloudflare, която Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π΄Π° ускори доставката Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, позволявайки ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ изпълнСниС Π½Π° ΠΊΠΎΠ΄ Π½Π° CDN ΡΡŠΡ€Π²ΡŠΡ€ΠΈ. ΠžΠΏΠ°ΡΠ½ΠΎΡΡ‚Ρ‚Π° ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сС утСТнява ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΎΠΊΠΎΠ»ΠΎ 12.7% ΠΎΡ‚ всички сайтовС Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ услугата Π·Π° изтСглянС Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π° ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° инфраструктурата ΠΏΡ€Π°Π²ΠΈ възмоТно замяната Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅, прСдоставСни ΠΎΡ‚ някой ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ сайтовС.

Услугата cdnjs изтСгля ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΡ‚ Git ΠΈΠ»ΠΈ NPM Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π½Π° всСки сайт Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΎ ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π·Π° доставка Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ Cloudflare, Π·Π° Π΄Π° ускори Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° cdnjs ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅, ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ Π² GitHub, бСшС Ρ€Π°Π·ΠΊΡ€ΠΈΡ‚ΠΎ, Ρ‡Π΅ Π·Π° Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° NPM ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π² tgz Π°Ρ€Ρ…ΠΈΠ²ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° стандартният ΠΌΠΎΠ΄ΡƒΠ» archive/tar Π½Π° Π΅Π·ΠΈΠΊΠ° Go, ΠΊΠΎΠΉΡ‚ΠΎ създава списък с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅, Π±Π΅Π· Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡŠΡ‚ΠΈΡ‰Π°Ρ‚Π° . Π’ случай, Ρ‡Π΅ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ въз основа Π½Π° дадСния списък, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π² Π°Ρ€Ρ…ΠΈΠ²Π° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ β€ž../../../../../../../tmp/testβ€œ ΠΌΠΎΠΆΠ΅ водят Π΄ΠΎ прСзаписванС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² систСмата, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ позволяват ΠΏΡ€Π°Π²Π°Ρ‚Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° сС, Ρ‡Π΅ атакуващият ΠΌΠΎΠΆΠ΅ Π΄Π° кандидатства Π·Π° добавянС Π½Π° своята Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° към cdnjs ΠΈ Π΄Π° ΠΊΠ°Ρ‡ΠΈ спСциално ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ Π°Ρ€Ρ…ΠΈΠ², ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ със Π·Π½Π°Ρ†ΠΈ β€ž../β€œ ΠΏΠΎ ΠΏΡŠΡ‚Ρ към Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° NPM. На cdnjs ΡΡŠΡ€Π²ΡŠΡ€ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° опСрация "autoupdate", ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° която ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ изтСгля Π½ΠΎΠ²ΠΈ вСрсии Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ. Използвайки Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с ΠΏΡŠΡ‚ΠΈΡ‰Π° β€ž../β€œ, нападатСлят ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ със сСрвизни скриптовС ΠΈ Π΄Π° изпълни тСхния ΠΊΠΎΠ΄ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Π½ΠΎ Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅Ρ‚ΠΎ.

Π’ случай Π½Π° изтСглянС Π½Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‚ Git бСшС ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΎ, Ρ‡Π΅ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚, изтСглящ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΡ‚Π΅, Π½Π΅ Π΅ Π²Π·Π΅Π» ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ символнитС Π²Ρ€ΡŠΠ·ΠΊΠΈ ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ Git. Π’Π°Π·ΠΈ функция Π½Π°ΠΏΡ€Π°Π²ΠΈ възмоТно ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ Π½Π° всякакви Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π° Ρ‡Ρ€Π΅Π· добавянС Π½Π° символни Π²Ρ€ΡŠΠ·ΠΊΠΈ към Git.

Π‘Π΅ΡˆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π° сС Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ СкспСримСнти с дСмонстрация Π½Π° Ρ…Π°ΠΊΠ²Π°Π½Π΅ Π½Π° cdnjs, Π·Π° Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Π½Π°Π³Ρ€Π°Π΄Π° Π² HackerOne Ρ‡Ρ€Π΅Π· тСстванС Π½Π° Ρ…ΠΈΠΏΠΎΡ‚Π΅Π·Π°Ρ‚Π° относно Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π”ΠΎΠ±Π°Π²Π΅Π½Π° Π΅ символна Π²Ρ€ΡŠΠ·ΠΊΠ° test.js към Git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°, обслуТвана Ρ‡Ρ€Π΅Π· CDN, сочСща към Ρ„Π°ΠΉΠ»Π° /proc/self/maps. Π‘Π»Π΅Π΄ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° вСрсия Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° актуализация ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΈ Ρ‚ΠΎΠ²Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π° посочСния Ρ„Π°ΠΉΠ» Π² cdnjs (test.js бСшС създадСн ΠΊΠ°Ρ‚ΠΎ символна Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΈ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» бСшС заявСн, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° /proc/self/maps бСшС Π²ΡŠΡ€Π½Π°Ρ‚ΠΎ ).

ЗамСняйки символна Π²Ρ€ΡŠΠ·ΠΊΠ° към Ρ„Π°ΠΉΠ»Π° /proc/self/environ, Π°Π²Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° изслСдванСто забСляза, Ρ‡Π΅ Π΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ стойноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° срСдата GITHUB_REPO_API_KEY ΠΈ WORKERS_KV_API_TOKEN. ΠŸΡŠΡ€Π²Π°Ρ‚Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° API ΠΊΠ»ΡŽΡ‡Π° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π·Π° запис Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° robocdnjs Π² GitHub. Π’Ρ‚ΠΎΡ€Π°Ρ‚Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Ρ‚ΠΎΠΊΠ΅Π½Π° Π² KV Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π² cdnjs. Използвайки ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° информация, нападатСлят ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² cdnj ΠΈ напълно Π΄Π° ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€Π° инфраструктурата.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€