Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² cdnjs, позволившая Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° сСрвСрах Cloudflare

Π’ прСдоставляСмой ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Cloudflare сСти доставки ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° cdnjs, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для ускорСния доставки JavaScript-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, выявлСна критичСская ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° сСрвСрах CDN. ΠžΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ усугубляСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ JavaScript-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ сСрвисом ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΊΠΎΠ»ΠΎ 12.7% всСх сайтов Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΈ компромСтация инфраструктуры позволяСт ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΡ‚Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· этих сайтов.

БСрвис cdnjs осущСствляСт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΠ· Git ΠΈΠ»ΠΈ рСпозитория NPM, послС Ρ‡Π΅Π³ΠΎ Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»ΡŽΠ±ΠΎΠΌΡƒ сайту бСсплатно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ΅Ρ‚ΡŒΡŽ доставки ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Cloudflare для ускорСния Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ JavaScript-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² cdnjs, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° GitHub, Π±Ρ‹Π»ΠΎ выявлСно, Ρ‡Ρ‚ΠΎ для распаковки NPM-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² Π°Ρ€Ρ…ΠΈΠ²Π°Ρ… tgz ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ archive/tar Π½Π° языкС Go, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ список Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ, Π±Π΅Π· Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚Π΅ΠΉ. Π’ случаС, ΠΊΠΎΠ³Π΄Π° скрипт распаковываСт содСрТимоС Π½Π° основании Π²Ρ‹Π΄Π°Π½Π½ΠΎΠ³ΠΎ списка, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² Π°Ρ€Ρ…ΠΈΠ²Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π²ΠΈΠ΄Π° «../../../../../../../tmp/test» ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ пСрСзаписи ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² систСмС, насколько это ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€Π°Π²Π° доступа.

Π‘Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π°Ρ‚ΡŒ заявку Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ свСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² cdnjs ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ NPM ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ², содСрТащий Ρ„Π°ΠΉΠ»Ρ‹ с символами «../» Π² ΠΏΡƒΡ‚ΠΈ. На сСрвСрах cdnjs пСриодичСски выполняСтся опСрация «autoupdate», Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ вСрсии ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ распаковываСт содСрТимоС. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² c путями «../» Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ пСрСзаписи Ρ„Π°ΠΉΠ»ΠΎΠ² со скриптами сСрвиса ΠΈ выполнСния своСго ΠΊΠΎΠ΄Π° Π½Π° сСрвСрС Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ распаковка.

Π’ случаС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ ΠΈΠ· Git Π±Ρ‹Π»ΠΎ выяснСно, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠΉ обновлСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π» символичСскиС ссылки ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· Git. Данная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ позволяла ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π»ΡŽΠ±Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² с сСрвСра Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Git символичСских ссылок.

ЭкспСримСнты с дСмонстрациСй Π²Π·Π»ΠΎΠΌΠ° cdnjs для получСния ΠΏΡ€Π΅ΠΌΠΈΠΈ Π½Π° HackerOne Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ чтСния Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΎΡ‚Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· CDN JavaScript-Π±ΠΈΠ±Π»ΠΈΡ‚Π΅ΠΊΠΈ Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° символичСская ссылка test.js, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½Π° Ρ„Π°ΠΉΠ» /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. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ свСдСниями Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠ³ внСсти измСнСния Π² cdnjs ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ инфраструктуру.

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