Как одна уязвимость может разрушить экосистему JavaScript
В мире разработки программного обеспечения мы часто считаем само собой разумеющимся безопасность и надежность инструментов и платформ, на которые мы полагаемся ежедневно. Мы предполагаем, что пакеты, которые мы загружаем, и реестры, которые мы используем, безопасны и заслуживают доверия. Однако мы недавно обнаружили атаку с отравлением кеша в реестре npm, одном из крупнейших реестров пакетов для JavaScript, что потенциально раскрывает хрупкость наших цепочек поставок программного обеспечения и возможность широкомасштабных сбоев.
Реестр npm — важнейший компонент экосистемы JavaScript, служащий центральным репозиторием для более чем 2,1 миллиона пакетов, на который полагаются более 17 миллионов разработчиков по всему миру. Он стал незаменимым ресурсом, позволяющим легко обмениваться зависимостями, повторно использовать их и управлять ими в своих проектах. Реестр npm, который загружают миллионы раз в день, является основой бесчисленных приложений и веб-сайтов.
В этой статье мы обсудим детали атаки по отравлению кэша на npm и изучим ее потенциальное влияние на более широкую экосистему программного обеспечения. Публично раскрывая эту уязвимость, мы стремимся показать важность безопасности и доступности в наших цепочках поставок программного обеспечения.
Атака с отравлением кэша: использование уязвимости
CPDoS — это метод веб-атаки, описанный в исследовании PortSwigger. Он предполагает использование уязвимостей в системах веб-кэширования для доставки вредоносного контента пользователям. Атака работает путем манипулирования тем, как веб-кэши хранят и обслуживают контент, эффективно отравляя кеш вредоносными данными. Когда пользователи запрашивают затронутые ресурсы, зараженный контент предоставляется вместо законного контента, что потенциально может привести к отказу в обслуживании или другим вредоносным последствиям. Этот метод использует тонкие недостатки в механизмах кэширования и их взаимодействии с различными веб-протоколами и заголовками.
Учитывая это, мы подумали, что было бы интересно, если бы злоумышленник мог отравить страницу, чтобы перенаправить содержимое .tar.gz
файла на вредоносный файл или полностью запретить пакет. Мы разработали модуль для выполнения этого действия и при первом запуске у нас было совпадение:
registry.npmjs.org уязвим
Очевидно, мы думали, что это ложное срабатывание и что уязвимость на самом деле не сработала при первом запуске, однако позже нам удалось подтвердить, что у нас действительно есть полный CPDoS в реестре npmjs!
Атака основывалась на ряде различных заголовков, которые, как выяснилось, вызывали ошибку в серверных системах. Отправив специально созданный запрос, содержащий эти заголовки, злоумышленник может манипулировать системой кэширования реестра, чтобы сохранить ответ «Не найден» для целевого пакета.
Примечание. Мы не предоставляем точную серию заголовков, которые могут вызвать эту проблему, поскольку на момент написания статьи ее все еще можно было использовать.
Вот пример вредоносного запроса, в котором мы установили параметр очистки кэша, чтобы избежать DoS-атак реальных пользователей:
GET /safe-regex/-/safe-regex-1.1.0.tgz?lupin_E7A812DE-E09A-4906-A9E3-530E54AAEB41=cpdos_test HTTP/1.1
Host: registry.npmjs.org
User-Agent: lupin_test_cpdos
lupin: E7A812DE-E09A-4906-A9E3-530E54
Выполнив последующий запрос без заголовка и того же ключа кэша, злоумышленник может затем получить кэшированный ответ «Не найден», что фактически делает пакет недоступным для других пользователей.
GET /safe-regex/-/safe-regex-1.1.0.tgz?lupin_E7A812DE-E09A-4906-A9E3-530E54AAEB41=cpdos_test HTTP/1.1
Host: registry.npmjs.org
User-Agent: lupin_test_cpdos
Второй запрос приведет к следующему ответу:
HTTP/1.1 404 Not Found
Date: Tue, 21 May 2024 08:40:06 GMT
Content-Type: application/json
Content-Length: 21
Connection: keep-alive
CF-Ray: 8873427f1e301222-MRS
Access-Control-Allow-Origin: *
Vary: Accept-Encoding
Server: cloudflare
{
"error": "Not found"
}
Мы обнаружили, что кэшированный ответ был временным (несколько минут), что требовало от злоумышленника время от времени постоянно отправлять запросы для поддержания CPDoS. Мы также заметили, что в реестре используется несколько внутренних серверов, что требует повторения атаки, чтобы отравить кэш на разных серверах.
Хотя эта атака была протестирована непосредственно из Burp Suite, мы создали фиктивный пакет, чтобы проверить, можем ли мы отравить ее с помощью команды установки npm. Мы проксировали npm, чтобы посмотреть, что происходит, а затем очистили кеш текущей системы. После запуска атаки в цикле в течение нескольких секунд нам удалось подтвердить, что мы можем CPDoS использовать пакет в производстве после его загрузки:
Красным: перед атакой.
Зеленый: во время атаки.
Последствия этой атаки по отравлению кэша значительны. Злоумышленник может атаковать популярные пакеты, такие как «express», который загружают более 30 миллионов раз в неделю, и фактически сделать их недоступными для разработчиков. Это может привести к массовым сбоям в конвейерах разработки программного обеспечения, что приведет к сбоям в сборке и поломке приложений.
Мы также провели тщательное тестирование атаки с использованием различных IP-адресов и клиентов, подтвердив, что отравление затронуло не только злоумышленника, но и других пользователей, пытающихся получить доступ к целевому пакету. Это подчеркивает возможность масштабного воздействия, если уязвимость будет использована злонамеренно.
Успешно воспользовавшись этой уязвимостью, злоумышленник может вызвать отказ в обслуживании реестра npm, что сделает его недоступным для пользователей, нарушая процессы разработки программного обеспечения в бесчисленных организациях по всему миру. Атака может быть особенно разрушительной, если она нацелена на широко используемые пакеты, поскольку она может вызвать волновой эффект по всей цепочке поставок программного обеспечения.
Однако мы также обнаружили несоответствие в том, какой внутренний сервер будет отравлен, и что, если кеш уже зарегистрирован, злоумышленник не сможет использовать команду PURGE, чтобы снова отравить его. Изучая такое поведение, мы также обнаружили, что злоумышленник может начать отравление до того, как будет зарегистрирована новая версия популярного пакета, чтобы отравить установки в момент существования версии или при обновлении кеша пакета.
Волновой эффект: последствия для цепочки поставок программного обеспечения
Атака с отравлением кеша реестра npm имеет далеко идущие последствия, выходящие за рамки немедленной доступности одного пакета. Когда критический компонент, такой как реестр npm, скомпрометирован, это может иметь эффект домино для всей цепочки поставок программного обеспечения.
Рассмотрим сценарий, в котором злоумышленник стал жертвой широко используемого пакета, такого как Express. Последняя версия этого пакета загружается более 12 миллионов раз в неделю. Этот пакет является фундаментальным строительным блоком для бесчисленного количества веб-приложений.
Если пакет становится недоступным из-за атаки по отравлению кэша, это может оказать каскадное воздействие на все зависящие от него проекты и службы. Волновой эффект можно почувствовать во многих организациях.
Ответ Github на эту уязвимость
GitHub, владелец npm, провел расследование после получения отчета Bug Bounty об этой уязвимости. Оценив результаты, GitHub определил, что проблема не представляет значительной угрозы безопасности, и закрыл отчет как информативный, но не устранил проблему.
GitHub признал сложность и ограниченную надежность последовательного воспроизведения атаки по отравлению кэша. Они также отметили, что атака основывалась на проблемном заголовке, который уже был известен их команде. Кроме того, GitHub подчеркнул, что выполнение описанной атаки потребует DDoS или объемной атаки (мы собираемся обсудить это), которая подпадает под категорию злоупотреблений и не входит в сферу их программы вознаграждения за ошибки.
Теперь нас беспокоит их следующее утверждение:
Для дальнейшего выполнения этой атаки, как вы описали в своем последнем комментарии, необходима DDoS-атака или объемная атака, в которой возникает проблема злоупотребления. Мы серьезно относимся к злоупотреблениям и спаму, и у нас есть специальная команда, которая отслеживает пользователей, рассылающих спам. Также обратите внимание, что заявки на объемные DoS-атаки не входят в сферу нашей программы вознаграждений.
Но, как мы показали в отчете и в этой статье, нам удалось скомпрометировать производственный комплекс всего из одной машины. У атаки было только две проблемы, влияющие на ее надежность:
- Мы не можем предсказать, какой сервер будет затронут.
- Нам приходится отправлять запрос каждые пару минут, чтобы поддерживать отравление.
По нашим тестам четверть запросов оказалась отравленной, а это уже немало. Мы только упомянули, что если злоумышленник отправит больше запросов, атака может быть более надежной. Но ресурсы, необходимые для этого, и близко не будут соответствовать DDoS-атаким.
На момент написания этой статьи эта уязвимость все еще доступна для использования в реестре npmjs.
Заключение
Атака с отравлением кеша реестра npm, обнаруженная исследовательской группой по безопасности в Lupine & Holmes, позволяет нам задуматься над вопросом о хрупкости наших цепочек поставок программного обеспечения.
Потенциальное воздействие таких уязвимостей нельзя недооценивать. Скомпрометированный реестр может иметь огромные последствия, затрагивающие разработчиков, организации и конечных пользователей. Волновой эффект недоступности одного пакета может нарушить конвейеры разработки, вызвать простой приложения и привести к финансовым потерям.
Однако эта уязвимость открывает возможности для роста и улучшения. Это подчеркивает необходимость для таких организаций, как GitHub и npm, постоянно оценивать и совершенствовать свои методы обеспечения безопасности.
Более того, атака с отравлением кэша подчеркивает важность сотрудничества и совместной ответственности в цепочке поставок программного обеспечения. Разработчики, поставщики реестров и более широкое сообщество должны работать вместе, чтобы обеспечить безопасность, целостность и доступность пакетов, на которые мы полагаемся.