The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Применение тайпсквоттинга для распространения вредоносных модулей NPM, PyPI и Gems

09.06.2016 21:39

Опубликованы результаты эксперимента по использованию методов тайпсквоттинга для распространения вредоносного ПО в репозиториях модулей для языков программирования Python, Node.JS и Ruby. Метод основан на том, что популярные репозитории модулей для разработчиков позволяют любому желающему разместить свою библиотеку, не проверяя при этом её содержимое и допуская выполнение произвольного кода в момент установки. В том числе репозитории допускают загрузку библиотек, имена которых почти полностью совпадает с названием других популярных библиотек. Расчёт делается на то, что пользователь допустит опечатку при наборе имени или не заметит различий выбирая модуль из списка. Забегая вперёд можно сказать, что метод позволил получить контроль над более чем 17 тысячами хостов и на 8 тысячах систем выполнить код с правами администратора.

Для оценки эффективности метода в репозиториях PyPI (Python), Npmjs.com (Node.js) и rubygems.org (Ruby) было размещено 214 подставных пакетов, имена для которых были выбраны в соответствии с тремя основными критериями: опечатки в названии (например, coffe-script вместо coffee-script), незарегистрированные варианты имён из стандартной библиотеки (например, urllib2) и имена, вычисленные алгоритмами оценки схожести имён (например, req7est вместо request). В качестве полезной нагрузки в фиктивные модули был добавлен код, отправляющий запрос на сервер сбора статистики. Модули добавлялись в репозитории постепенно в течение нескольких месяцев, чтобы не вызвать подозрений со стороны администраторов.

Результат превзошёл все ожидания - на сервере было зафиксировано 45334 запросов от 17289 уникальных хостов. Т.е. если бы метод был применён для организации атаки, то удалось бы захватить управление над более чем 17 тысячами компьютеров, чего более чем достаточно для развёртывания ботнета. Более того, в 43.6% случаев (на 8552 хостах) код был выполнен с правами администратора (!), позволяющими полностью контролировать операционную систему. 15221 хоста были поражены через пакеты PyPi, 1631 через rubygems и 525 через NPM. 8614 захваченных хостов работают под управлением Linux, 6174 - Windows и 4758 - OS X. Наиболее популярным фиктивным пакетом стал urllib2, который за две недели оказался установленным на 3929 системах.

В качестве мер по противостоянию подобным атакам предлагается:

  • Запретить в пакетных менеджерах выполнение встроенных в пакет обработчиков различных стадий установки, которые позволяют запустить произвольный код на системе пользователя в момент установки модуля;
  • Подготовить список типовых опечаток и проверять схожесть названий с использованием метода Дамерау — Левенштейна для наиболее популярных пакетов;
  • Анализировать логи на наличие 404-ошибки (файл не найден) и блокировать фигурирующие в них неверные названия пакетов.


  1. Главная ссылка к новости (http://incolumitas.com/2016/06...)
  2. OpenNews: Незащищённость NPM к атакам по внедрению вредоносных модулей-червей
  3. OpenNews: Инцидент с захватом прав на NPM-модуль привёл к сбою в работе проектов, использующих NPM
  4. OpenNews: Rubygems.org подвергся взлому
  5. OpenNews: В RubyGems устранена уязвимость, позволявшая подменять файлы в репозитории
Лицензия: CC-BY
Тип: Интересно / Проблемы безопасности
Короткая ссылка: https://opennet.ru/44576-malware
Ключевые слова: malware, node.js, python, npm, pypi, ruby, gems
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (61) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, rob pike (?), 21:46, 09/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Теперь в npm встроят искуственный интеллект с десятком нейросетей, который будет проверять опечатки.

    С "поколением Javascript" одно плохо - сколько попкорна не бери, все равно не хватает.

     
     
  • 2.6, Crazy Alex (ok), 22:45, 09/06/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Ну, жертв джаваскрипта меньше всего... Но суть от этого не меняется.
     
     
  • 3.8, rob pike (?), 23:15, 09/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Жертв джаваскрипта меньше всего - что?
     
     
  • 4.15, Crazy Alex (ok), 01:37, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    "15221 хоста были поражены через пакеты PyPi, 1631 через rubygems и 525 через NPM"

    Основная масса жертв - питонисты

     
     
  • 5.26, Нанобот (ok), 09:26, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    возможно, это просто значит, что юзеров pypi в семь раз больше, чем юзеров rubygems и npm, вместе взятых
     
     
  • 6.34, Crazy Alex (ok), 10:06, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Вполне возможно. С другой стороны - серверного JS сейчас на вид не меньше, чем питона.
     
  • 2.32, омномномнимус (?), 09:55, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +3 +/
    новые времена - новые проблемы. С поколеним старперов тоже все плохо - раньше было лучше ;-)
     
     
  • 3.39, rob pike (?), 11:03, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Огласите список "новых" проблем.
     
     
  • 4.42, омномномнимус (?), 11:42, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    тайпсквоттинг
     
     
  • 5.59, rob pike (?), 17:57, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Раздолбайство - проблема не новая.
     
     
  • 6.61, Michael Shigorin (ok), 18:38, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Раздолбайство - проблема не новая.

    И не всегда проблема: http://img-fotki.yandex.ru/get/3104/yurasikgor.3/0_1af70_405badb7_L

     
  • 6.62, омномномнимус (?), 20:13, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    ну, с таким подходом все можно подвести под "раздолбайство"
     

  • 1.2, Sabakwaka (ok), 22:24, 09/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Проблема в безграмотности владельцев/админов, а не в Javascript?
     
     
  • 2.7, Аноним (-), 22:52, 09/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Это очень даже связанные вещи. Достойные плоды низкого порога вхождения и привычки к "хреняк, хреняк и в продакшен".
     
     
  • 3.38, Аноним (-), 10:36, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Когда злоумышленники регистрируют какой-нибудь vkontalke.ru, надеясь получить пароли от невнимательных пользователей, виноваты злоумышленники. Если тот же подход используется с NPM, виноват JavaScript, лол.

    NPM не следит за пакетами и ничего не трогает - это плохо.
    NPM следит за пакетами и по своей инициативе восстанавливает left-pad - снова плохо.

    Веб-хейтеркам угодить тяжело :)

     
     
  • 4.40, Аноним (-), 11:19, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    А вот и вебмакака подтянулась со своей попоболью.

    "Репозиторий" в который кто угодно пихает что угодно и концов не найти. Макаки, тянущие оттуда не глядя, не пойми чего, хрен пойми зачем. Все хорошо веб-девелопмент кипит.

     
     
  • 5.47, synweap (ok), 12:48, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Может лучше вообще интернет запретим? А то по запросу "скачать винрар" открывается туева хуча сайтов сомнительного происхождения. Про "макак, тянущих оттуда не глядя", ты видимо из одного всем известного места высосал, потому как этот образ не является ничем, кроме как плодом твоей фантазии. Я, например, перепроверяю. (Но тебя-то это не волнует: реальному человеку, внимательно глядящему на вводимые в терминал символы, ты предпочтешь воображаемое чучело, которое критиковать легче всего.)

    В любом проекте, использующем npm, 99% пакетов скачиваются по зависимостям, прописанных в package.json, так что ошибиться сложно. Как только администрация npm начнет удалять "фишинговые" пакеты, ты первым побежишь кричать об ущемлении швабодки шлова и "неувожении к розроботчикам", как это уже было в случае с left-pad. Я же говорю - веб-хейтерки найдут повод повозмущаться в любом случае.

     
     
  • 6.53, Аноним (-), 16:15, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Просто объясните как на 17289-х уникальных хостах оказались левые пакеты.
     
     
  • 7.56, synweap (ok), 17:34, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Я откуда знаю. Мой npm-пакет с очень редким специфичным применением кто-то тоже однажды массово скачал > 10 000 раз, хотя он от силы пригодится одному человеку в год. Возможно какие-нибудь сервисы вроде супер-поиск-по-npm-с-сортировкой-по-звездочкам.io.
     
     
  • 8.58, Аноним (-), 17:50, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Угу Сервисы, сервисы, 17289 одних сервисов ... текст свёрнут, показать
     
     
  • 9.60, synweap (ok), 18:27, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Новость не читай Камменты оставляй Ненавидь веб всею душою своею... текст свёрнут, показать
     
     
  • 10.68, Аноним (-), 16:59, 11/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Как я и думал, по делу вам сказать нечего ... текст свёрнут, показать
     
  • 2.27, Нанобот (ok), 09:28, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Проблема в безграмотности владельцев/админов, а не в Javascript?

    та вроде никто и не говорил, что проблема в javascript

     

  • 1.3, Аноним (-), 22:36, 09/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +8 +/
    Обязательную pgp-подпись пакетов да ручное добавление ключей в доверенные
     
     
  • 2.13, Аноним (-), 00:43, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Обязательную pgp-подпись пакетов да ручное добавление ключей в доверенные

    В чем разница с обязательным подписанием RSA-ключами и ручным добавлением ключей в доверенные в PKI?

     
     
  • 3.33, Аноним (-), 09:59, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Очевидно тем что PGP ключ не обязательно RSA.
     
  • 2.24, Нанобот (ok), 09:01, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >Обязательную pgp-подпись пакетов да ручное добавление ключей в доверенные

    верный способ отпугнуть 95% пользователей и привести всю систему в негодность

    для большей эффективности рекомендую включить двух-, нет, лучше трёхфакторную авторизацию перед установкой каждого модуля!

     
     
  • 3.29, Andrey Mitrofanov (?), 09:32, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >>Обязательную pgp-подпись пакетов да ручное добавление ключей в доверенные

    Не, велосипеды _должны_ быть разнообразны и неожиданны. "Просто работать" оно должно только в redhat-е (правда, я пока не разобрал -- в yum-е или dnf-е, или у них "плановое устаревание" в разгаре, поэтому я и путаюсь).

    > верный способ отпугнуть 95% пользователей и привести всю систему в негодность

    Оттуда, где гоняются за %-ами пользователей надо бежат, не оглядываясь. Там же наверху написано.

    Вы лично где "службу несёте". Мне надо -- чтоб не вляпатьсся.

    > перед установкой каждого модуля!

     

  • 1.4, Аноним (-), 22:36, 09/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > код был выполнен с правами администратора (!)

    Может, это какие-нибудь докеры и прочие контейнеры, в которых это норма?

     
     
  • 2.21, Аноним (-), 06:29, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Я знаю только за ноду В npm лежат не только модули к ноде, но, иногда, попадают... большой текст свёрнут, показать
     
     
  • 3.30, Moomintroll (ok), 09:38, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > один такой крупный проект может накрутить всю статистику с установкой модулей под рутом

    Вы невнимательно читаете:

    "... было зафиксировано 45334 запросов от 17289 уникальных хостов"

     
     
  • 4.37, Crazy Alex (ok), 10:20, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Уикальных IP, скорее всего. Если IPv6 у кого-то поднят - то запросто.
     

  • 1.5, AS (??), 22:40, 09/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    так то это совсем капец.
    ведь чтоб гарантировано защититься от этого -
    никаких мощностей/человекоресурсов не хватит.
    ну почему я в дворники не пошел ?
    сидел бы шас бухал - горя не знал ..
    но придется похоже разрабов идти пинать завтра -
    уже по zabbиксу вижу, похоже цапнули с npm ом эту дрянь !
     
     
  • 2.10, Аноним (-), 00:03, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +4 +/
    >так то это совсем капец.
    >ведь чтоб гарантировано защититься от этого -
    >никаких мощностей/человекоресурсов не хватит.
    >ну почему я в дворники не пошел ?
    >сидел бы шас бухал - горя не знал ..
    >но придется похоже разрабов идти пинать завтра -
    >уже по zabbиксу вижу, похоже цапнули с npm ом эту дрянь !

    Бухать меньше надо, тогда бред мерещаться по zabbix-у не будет и мания величия пропадёт.

     

  • 1.9, IZh. (?), 23:45, 09/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    А я сижу и жду, пока это болото не перебодит. Когда есть 100500 модулей, и сотня разных CSS-препроцессоров, фреймворком, менеджеров зависимостей и ещё много чего другого, то это как-то неправильно. Надеюсь, со временем останется не более десятой части от того, что есть.

    Это многообразие плохо ещё и тем, что усилия разработчиков размазываются по миллиону проектов, вместо того, чтобы выпустить десяток-сотню, но супер.

     
     
  • 2.14, Аноним (-), 00:43, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > А я сижу и жду, пока это болото не перебодит. Когда есть
    > 100500 модулей, и сотня разных CSS-препроцессоров, фреймворком, менеджеров зависимостей
    > и ещё много чего другого, то это как-то неправильно. Надеюсь, со
    > временем останется не более десятой части от того, что есть.
    > Это многообразие плохо ещё и тем, что усилия разработчиков размазываются по миллиону
    > проектов, вместо того, чтобы выпустить десяток-сотню, но супер.

    Ну? Логическую цепочку продолжай? Зачем нам 2048 дистров пингвина? Лучше десяток, но супер?

     
     
  • 3.17, Crazy Alex (ok), 01:41, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Разница в том, что у дистров пингвина очень крутая кривая распределения популярности. После первой десятки остаются какие-то жалкие следы. А если о промышленном использовании говорить - так и после пяти, пожалуй.

    А там - весь зоопарк более-менее активно используется во вполне заметных масштабах.

     
     
  • 4.20, rob pike (?), 04:50, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Там кривая более пологая, может быть, но в целом похоже на пингвинов. Но с одной важной оговоркой - в произвольно взятый, но конкретный момент времени.

    Там мода меняется быстрей, и издержки на смену одного на другого меньше, поэтому среди long tail никем не используемых модулей, у большой части был когда-то период популярности, хотя бы относительной. Звездочки в гитхабах остались, и модуль в репозитории. А внутри уже давно труха и заброшенный термитник.

     
     
  • 5.36, Crazy Alex (ok), 10:13, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ну так, считай, при любом сравнении популярности надёте гауссиану - конечно похоже. Я бы различие проводил скорее в том, что линуксовый самопал всё же крайне редко тянут в коммерческую эксплуатацию.
     
  • 3.18, . (?), 01:42, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Ну? Логическую цепочку продолжай? Зачем нам десяток дистров пингвина? Лучше один, но чтоб правил всеми? И продать .... 8-)

    Хрен вам! ОСС - тем и силён что тут всего овердомного :) И у проприетарщиков шансов с каждым днём убавляется :)


     
     
  • 4.22, Michael Shigorin (ok), 07:16, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > И у проприетарщиков шансов с каждым днём убавляется :)

    Эк Вы жёстко ихнего добровольного (?) обслуживателя-то (это судя по типовым стираемым комментариям с того же адреса)...

     
  • 4.28, Аноним (-), 09:30, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Угу, по десктопу особенно видна смла этого подхода.
     
  • 2.51, hatersgonnahate (?), 15:56, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    зачем столько комментариев - по одному на каждого зарегистрированного
    зачем столько новостей - по одной в день
    зачем столько сайтов - один, но крутой
    один коммент, одна новость, один сайт! хейль!
     

  • 1.19, Онаним (?), 04:49, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Дожили...
     
  • 1.23, Аноним (-), 08:52, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Хипстерские подходы, увы... Почему-то эти ребята считают, что всю безопасность кто-то должен сделать за них.
     
  • 1.25, Нанобот (ok), 09:23, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    просто разрабы расслабились, т.к. целевые атаки против них - большая редкость (и мне бы хотелось, чтоб так было и дальше)
     
  • 1.31, пучапучс (?), 09:53, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Вспоминается старая байка времен DOS.
    Клиент vs саппорт.
    ...
    -надо набирать install.exe
    -но меня n не нажимается и я её на m заменяю.
     
  • 1.35, Аноним (-), 10:13, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > 8614 захваченных хостов работают под управлением Linux, 6174 - Windows и 4758 - OS X.
    > 45334 запросов от 17289 уникальных хостов.

    8614+6174+4758=19546

    шутка о ста сорока шести процентах...

     
     
  • 2.41, Аноним (-), 11:22, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Уникальный IP != уникальный хост.

    Искренне ваш, К.О.

     
     
  • 3.48, Шапкоед (?), 12:57, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Все еще хуже. Это виртуальные машины или virtualenv у питона. %-)
     
  • 3.57, анином (?), 17:38, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Будте любезны, поясните - VPS это уникальный хост или просто уникальное IP?

     
     
  • 4.66, Аноним (-), 00:21, 11/06/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Будте любезны, поясните - VPS это уникальный хост или просто уникальное IP?

    Да.

     

  • 1.43, анон (?), 11:46, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    что-что? кто-то еще не использует йомена и свои сценарии разворачивания окружения к нему? кто-то не пользуется package.json? есть не осилившие requirements.txt ?

    не вижу особой проблемы. тем кто не пользуется этими вещами, не заходит на страницы с оригинальными пакетами на гитхаб, а пишет по памяти - ссзб.

    ну а если есть дятлы которые ставят все подряд пакеты нода с флагом -g, то тут уже ничего не поможет. даже грант отказывается запускаться если он установлен не локально. по питону также - есть virtualenv, pip и ~.

     
  • 1.44, Аноним (-), 11:48, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Есть репы с deb-пакетами. Всё остальное от лукавого.
     
     
  • 2.49, Andrey Mitrofanov (?), 13:12, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Есть репы с deb-пакетами. Всё остальное

    Есть репы с р-п-м-ами, gpgcheck=0 и вперёд[I]![/I]

    > от лукавого.

     

  • 1.50, arisu (ok), 14:52, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > В качестве мер по противостоянию подобным атакам предлагается

    …душить скрипт‐киддисов пока они ещё маленькие.

     
     
  • 2.54, Аноним (-), 16:18, 10/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Похоже что уже поздно. Вон их сколько уже понабежало.
     
     
  • 3.70, Нониус (?), 13:14, 14/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Два раза "уже" это пунктик
     

  • 1.63, тОпор (?), 22:29, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Система рейтингов для пакетов + право заверять пакеты тем, кому мы доверяем (10-20 коре разработчиков).

     
  • 1.64, spotify.space (?), 23:18, 10/06/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Проблема высосана из пальца. Единственное, что надо запретить отъем названия пакета из лицензионных соображений, и то, только с согласия владельца пакета.
    Плюс нужно предусмотреть фиксацию версий пакетов, чтобы сохранять обратную совместимость с существующимми приложениями.
     
     
  • 2.67, Никто (??), 15:02, 11/06/2016 [^] [^^] [^^^] [ответить]  
  • +/
    - На сервере было зафиксировано 45334 запросов от 17289 уникальных хостов. В 43.6% случаев код был выполнен с правами администратора, позволяющими полностью контролировать операционную систему. Что Вы по этому думаете, господин эксперт?
    - Проблема высосана из пальца.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру