The OpenNET Project / Index page

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

PyPI приостановил регистрацию новых пользователей и проектов из-за всплеска вредоносных публикаций

29.03.2024 12:35

Репозиторий Python-пакетов PyPI (Python Package Index) временно запретил регистрацию новых пользователей и создание новых проектов из-за непрекращающейся массовой загрузки вредоносных пакетов в ходе автоматизированной атаки. Блокировка была введена после того, как 26 и 27 марта в репозиторий было загружено 566 пакетов с вредоносным кодом, стилизованных под 16 популярных Python-библиотек.

Имена пакетов сформированы с использованием тайпсквотинга, т.е. назначение похожих имён, отличающихся отдельными символами, например, temsorflow вместо tensorflow, requyests вместо requests, asyincio вместо asyncio и т.п. При проведении подобных атак злоумышленники рассчитывают на невнимательных пользователей, совершивших опечатку или не заметивших отличий в названии при поиске или переходе по ссылке из форумов и чатов, в которых злоумышленники оставляют обманные инструкции.

Вредоносные пакеты основаны на коде легитимных библиотек, в который встроены отдельные изменения, устанавливающие в систему вредоносное ПО, осуществляющее поиск и отправку конфиденциальных данных и файлов, содержащих пароли, ключи доступа, криптокошельки, токены и сессионные Cookie. Вредоносный код встраивается в файл setup.py, запускаемый во время установки пакета. Во время активации внесённое изменение осуществляет загрузку основных вредоносных компонентов с внешнего сервера.

За два дня злоумышленниками было загружено 29 вредоносных варианта пакета tensorflow, 26 - BeautifulSoup, 26 - PyGame, 15 - SimpleJson, 38 - Matplotlib, 26 - PyTorch, 67- CustomTKInter, 28 - selenium, 17 - playwright, 15 - asyncio и 67 - requirements. Дополнительно выявлены отдельные случаи подделки библиотек requests, py-cord, colorama, capmonstercloudclient, pillow и bip-utils.

Отдельно отмечается атака на сообщество Top.gg, насчитывающее 170 тысяч пользователей. В ходе атаки злоумышленник сумел скомпрометировать учётную запись в GitHub одного из разработчиков top.gg, путём кражи браузерных Cookie. Атакующий также добавил три пакета в репозиторий PyPI и зарегистрировал домены pypihosted.org и pythanhosted.org, на которых было организовано зеркало для распространения вредоносной зависимости к пакетам.

Через взломанную учётную запись в GitHub-репозиторий проекта top.gg, в котором размещалась Python-обвязка над API Top.gg, было внесено изменение, добавляющее файл requirements.txt. В файле был размещён список загружаемых зависимостей, в котором под видом загрузки зависимости с зеркала была ссылка на вредоносный клон пакета "colorama", размещённый на подставном домене pypihosted.org, с расчётом на то, что разработчики не заметят разницы с легитимным доменом pythonhosted.org, с которого обычно производится загрузка пакетов с PyPI.

  1. Главная ссылка к новости (https://checkmarx.com/blog/pyp...)
  2. OpenNews: Каталог PyPI перешёл на обязательную двухфакторную аутентификацию
  3. OpenNews: Злоумышленник захватил управление над 4 проектами в репозитории PyPI
  4. OpenNews: В репозитории PyPI выявлено около 5000 оставленных в коде секретов и 8 вредоносных обфускаторов
  5. OpenNews: Опубликован анализатор, выявивший 200 вредоносных пакетов в NPM и PyPI
  6. OpenNews: В репозитории PyPI выявлены вредоносные пакеты, нацеленные на кражу криптовалюты
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/60874-pypi
Ключевые слова: pypi, python
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (50) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.5, Аноним (5), 13:25, 29/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    На самом деле, утомительно по 10 раз перепроверять, что вон тот васянопакет на самом деле настояший васянопакет, и вовсе не соседний, поддельный с малварью. И Snyk тут не всегда поможет (да и сам он выглядит, как скам).
     
     
  • 2.20, Аноним (20), 16:00, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Хоть как-то у себя поддерживать базу доверительных публичных ключей: https://packages.gentoo.org/categories/sec-keys и верифицмровать ключи разрабов по WOT.

    Проверять подписи пактов.

    Разрабам использовать аппаратные хранилища для своих приватных ключей:
    https://www.linux.org.ru/forum/security/17518444?cid=17519118
    https://www.linux.org.ru/forum/security/17518444?cid=17520696
    И раздавать свои публичные ключи для подписи другими.

     
     
  • 3.43, Аноним (5), 20:04, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А бэкдор в xz-utils ведь был подписан? Или нет?
     
     
  • 4.51, Аноним (51), 09:48, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Говорат был подписан: "Newer releases were signed by a potentially compromised upstream maintainer." https://packages.gentoo.org/packages/app-arch/xz-utils

    В Gentoo забанили все что подписано его ключом. И инцендент, пока, рассматривается как компроментация разработчика и воровство приватного ключа, а не умышленные действия. Да, приватные ключи разрабов необходимо аппаратно защищать:
    https://www.nitrokey.com/news/2018/nitrokey-partners-linux-foundation-equip-al
    https://www.nitrokey.com/news/2019/nitrokey-partners-gentoo-foundation-equip-d
    https://www.nitrokey.com/news/2021/nitrokey-equips-arch-linux-developers-usb-k


     

  • 1.7, Аноним (7), 13:26, 29/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Адекватные люди ставят все pure-python пакеты исключительно из исходников, бинарные - по возможности из дистра, по возможности - компилируют сами.
     
     
  • 2.8, Аноним (8), 13:36, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А как отличить правильный исходник от «немножко изменённого»? У бинарника хотя бы чексумма есть...
     
     
  • 3.31, Аноним (31), 17:36, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Вот бинарник от подправленного ты никак не отличишь - злоумышленник и сумму пересчитает, и ключом своим подпишет, и ссылку на ключ на свою заменит.

    А исходник... исходник — он живой! В него правки вносятся постоянно. Захватят контроль над репозиторием — автор обнаружит. От вредительства самим автором это никак не защитит, от этого только Чучхе с лично написанным всем софтом и лично сделанным всем железом. А то, что это нереализуемо — это не отменяет гарантий метода, нет софта - некого винить ведь!

     
  • 3.42, Аноним (5), 19:53, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Кстати, там в дистрибутивных xz-utils малварь нашли в исходниках, вот это по-актуальнее https://bugs.gentoo.org/928134 https://www.openwall.com/lists/oss-security/2024/03/29/4
     
     
  • 4.65, Аноним (65), 17:41, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В том то и дело, что нашли. В бинарнике бы её даже выискивать не стали.
     
  • 4.66, Аноним (66), 17:46, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    И подчеркну - бэкдор был именно в релизах, которые обычно никто не смотрит, потому что все разрабы работают с git. А спалили именно на работе с другими разрабами. Если бы xz был поддерживаемым - спалили бы гораздо раньше. Но он фактически не был никому интересен. Как и bitmessage, в котором тоже был явный бэкдор, RCE, вообще никак не спрятанный - публично сообщили только после начала массовой атаки. Не пользуйтесь проектами с низким числом независимых разрабов и индикаторами мутности, или читайте и аудируйте их исходники сами.
     
     
  • 5.68, Аноним (5), 19:23, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Неа, никто ничего не заметил за 2 месяца и растащили повсюду, в том числе по дистрам. Никто не использует гит/свн и т.д., понятное дело все берут релизный архив с исходниками, а он-то и заражён. То, что он соответствует реальным исходникам, никто не проверяет, как мы видим.
     
     
  • 6.70, Аноним (70), 16:13, 31/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Повторяю: недоумки берут архив с релизами. Просто потому, что для архива нужен просто curl, а для релиза - git + git-lfs + libcurl для фетча по http + настройка (которую можно сделать черрез переменные окружения), потому что гит откажется даже клонировать, пока никнейм и email не задашь.
     
     
  • 7.71, Аноним (5), 16:43, 31/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Дело в том, что это быстрее и лучше поддаётся автоматизации. И разве люди, сношающиеся с гитхабами и их ограничениями скорости, не недоумки? Самые настоящие. Проблема не в используемых инструментах, проблема в том, что пользователям получать дерево достаточно болезненно, а если ещё разные ветки с тегами выкачивать придётся, то всё.
     
  • 2.9, Аноним (5), 13:38, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Смотри, перечень пакетов со сборкой которых возникли сложности лично у меня только на той неделе. Каковы будут дальнейшие рекомендации? О, я бы сейчас с удовольствием предоставил ещё и гигабайты максимально мутных логов, но так, навскидку? И чёт почти ничего в репах и не водится. А если и есть, то протухшее и неактуальное.

    thinc, blis, pyee, tensorflow, srsly, cupy

     
     
  • 3.10, Аноним (10), 14:03, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Читай маны
     
     
  • 4.12, Аноним (5), 14:15, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Ты не понял. Тысячи пакетов я скомпилировал, включая все используемые пакеты в pypi. Кроме этих. А эти ну никак не компилируются. Дальнейшие действия? В итоге, есть только блобы в pypi и больше ничего. И игры с тулчейнами тоже ни к чему не приводят. Какой вообще смысл их компилировать разработчику? Правильно, никакого. А пользователи могут взять ровно те же общедоступные блобы, собранные в непонятных условиях.
     
     
  • 5.32, Аноним (31), 17:37, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Не из pypi надо кшмпилить, а с гитхаба.
     
  • 3.30, Аноним (30), 17:31, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >tensotflow

    Сказано:
    >по возможности

    Tensorflow я сам ставлю из бинарей. Потому что Гуглаг специально саботируют его сборку всеми, кто не может терпеть базель.

    А сам список пакетов как бы намекает, что вы ставите всё подряд. У меня и за полгода такого длинного списка с проблемами не наберётсяж

     
     
  • 4.34, Аноним (5), 17:38, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Это 1 spacy и его зависимости на самом деле.
     
     
  • 5.36, Аноним (36), 17:48, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Я себе просто отключил проверку зависимостей в pip. Доустанавливаю если что-то не работает вне зависимости от того, что записано в METADATA. И такое гигантское дерьмо приходится ставить из бинарных пакетов. Ручками. Из исходников ставлю всякую мелочь вроде colorama, setultools, pip, etc. И если учитывать зависимости, то у самого TensorFlow дофига бинарных зависимостей.
     
  • 3.41, YetAnotherOnanym (ok), 19:04, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Каковы будут дальнейшие рекомендации

    Слезть с питона, очевидно же.

     
  • 2.28, БуБука (?), 16:34, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    А какой не является? Можно список с аргументами?
     
  • 2.33, Пряник (?), 17:37, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Много ли ты видел pure-python пакетов?
     
     
  • 3.37, Аноним (36), 17:52, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Более сотни - это лишь те, что я полностью сам написал, без учёта превосходящего вклада в чужие пакеты, большая часть из которых pure python.
     
     
  • 4.38, Аноним (36), 17:56, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    под pure python имеется в виду отсутствие компиляции cext или долботни с maturin/setuptools-rust, что пакет можно установить просто распаковкой. Это не означает отсутствие зависимостей от компонентов в native-коде, таких как сам интерпретатор, shared-библиотеки, другие пакеты, jar-файлы, .Net-сборки, ONNX-файлы и т.д.
     
     
  • 5.39, Аноним (5), 18:11, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Правда, pure python _именно это_ и означает: только интерпретируемый код, без использования нативного (компилируемого) в любом виде, за исключением интерпретатора и его стандартных бинарных компонентов. И, в частности, без таких трюков как освобождение gil на время, пока нативный код исполняется. По этой же причине, такой код является третьесортным -- он просаживается в многопотоке.
     
     
  • 6.40, Аноним (40), 18:54, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >за исключением интерпретатора и его стандартных бинарных компонентов

    О, оправдания пошли! Для меня pure-python пакет - это пакет, состоящий из кода на языке Python. Он может зависеть от нативных либ и прочих вещей, но эти вещи в состав пакета не входят. Поэтому сборка пакета своидится к созданию zip-архива нужного формата, а установка - к его распаковке. И почти не зависит от версии питона, а даже если зависит - то юзеру не придётся иметь на компе тулчейн (который в запущенных случаях должен быть MSVC). Ну ещё setuptools может сгенерить бинари для console_scripts в процессе установки (да, их не pip генерит, а setuptools)

     
     
  • 7.73, Пряник (?), 10:30, 01/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Например, Paramiko не pure-python, потому что зависит от cryptography, написанном на Си. А вот Bottle является одиночным файлом без зависимостей.
     
  • 6.72, Пряник (?), 10:25, 01/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Есть модуль multiprocessing. Между разными процессами GIL не используется.
     
     
  • 7.74, Аноним (5), 10:49, 01/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Зато добавляются накладные расходы, IPC очень дорого и невозможно шарить конекшены допустим. Вообще, я сравнивал на примере requests, намного выгоднее быстрее удобнее и эффективнее взять aiohttp. Раньше приходилось обмазываться pycurl, но, среди прочих недостатков, он не работает с асинхронным кодом и его слишком легко засегфолтить.
     
     
  • 8.75, Пряник (?), 15:05, 01/04/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Ну так про GIL говорили же А GIL никак не связан с однопоточной природой Asynci... текст свёрнут, показать
     

  • 1.29, Alladin (?), 17:08, 29/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    Как можно из 16 пакетов сделать 566, кажись это очень эффективные менеджеры:)
     
  • 1.35, Пряник (?), 17:43, 29/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    И куда он отправляет пароли? Давайте уже вычислим по IP этого мамкиного шалунишку.
     
     
  • 2.45, голос из леса (?), 21:19, 29/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Тебе надо, сам и вычисляй (С). ))
     
     
  • 3.49, Аноним (49), 07:14, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, это тебе надо чтобы тут пользователь вычислил! (иначе бы комментарии не писал)
    Так что сам вычисляй!
     
     
  • 4.59, Прохожий (??), 12:30, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Рекурсия получается
     
     
  • 5.60, Прохожий (??), 12:33, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Точнее, не рекурсия, а бесконечный цикл.
     
  • 2.54, Аноним (54), 11:11, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >И куда он отправляет пароли?

    На какой-нибудь бесплатный хостинг/ВПН, естественно.

     

  • 1.48, Аноним (48), 03:25, 30/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    А нельзя сделать просто проверку на похожесть и не разрешать имена пакетов, похожие на существующие?
     
     
  • 2.57, Прохожий (??), 12:27, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >проверку на похожесть

    Во сколько символов разница должна быть, чтобы название не считать похожим?

     
     
  • 3.67, 3draven (ok), 19:12, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    С точностью до опечатки достаточно.
     

  • 1.52, Аноним (52), 10:13, 30/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    > 38 - Matplotlib

    Любые "научные" книги, в том числе по ИИ, содержащие упоминание технологий Python, приобретению, прочтению и использованию в практических целях не подлежат. Хотя мнения своего никому не навязываю. Впрочем, результат и так описан в статье.

     
     
  • 2.56, Вы забыли заполнить поле Name (?), 12:03, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Тёплое с мягким тебя где научили сравнивать? Или ты сам?
     

  • 1.55, Вы забыли заполнить поле Name (?), 12:01, 30/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Надо запрещать похожие названия, а вообще давно пора по умолчанию сделать username/package как схему именования, тогда злоумышленникам придётся имя пользователя делать похожим, но и его можно запретить.
     
     
  • 2.58, Прохожий (??), 12:28, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Во сколько символов разница должна быть, чтобы название не считать похожим?
     
     
  • 3.61, Аноним (52), 13:57, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Очевидно, коллега - специалист по сравнению

    > Тёплое с мягким

    Поэтому будет делать это

    > сам

     
  • 3.64, Вы забыли заполнить поле Name (?), 16:41, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Во сколько символов разница должна быть, чтобы название не считать похожим?

    Очевидно разница может быть равна нулю. Функция похожести будет сложнее чем просто сравнение длин.

     
  • 2.62, чатжпт (?), 14:14, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > вообще давно пора по умолчанию сделать username/package

    и будут тайпсквотить имена разрабов кроме имени пакета

     
     
  • 3.63, Вы забыли заполнить поле Name (?), 16:40, 30/03/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> вообще давно пора по умолчанию сделать username/package
    > и будут тайпсквотить имена разрабов кроме имени пакета

    Для тайпскотинга имени пакета нужна 1 учетная запись, для имени пользователя N. Это сильно усложнит вредителям жизнь. К тому же никто не мешает запретить похожесть имен пользователей, чтобы избежать проблем, описанных в новости.

     

  • 1.69, Аноним (69), 11:32, 31/03/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Ну парни, кожанные мешки не могут называться программистами, если попадаются на тайпсквотинг ловушку СЕОшников.
    Это джунгли, прежде чем выбирать библиотеку нужно чекать название из нескольких источников.
     

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



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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