Безопасность и правоHabr AI→ оригинал

Репозиторий-ловушка на 1774 звёздах: два фильтра для детекции вредоноса и галлюцинаций

Каждое утро бот присылает автору пять трендовых репозиториев с trendshift.io с выжимкой из README. 26 сентября в ленте был проект «Microsoft Activation Scripts» с 1774 звёздами — это оказалась ловушка. Аккаунт владельца создан за 94 секунды до репозитория, а команда установки содержала замаскированный вредонос через PowerShell, где адрес скачивания был записан задом наперёд. Разобрав все 321 репозиторий, присланный ботом с 15 июля по 8 октября, автор обнаружил, что очевидные фильтры неэффективны. Проверка на установку вида «скачай и сразу запусти» отсеяла бы каждый восьмой нормальный проект. Вместо этого автор создал два независимых признака, каждого достаточно для блокировки. • **lure-check**: детектирует замаскированные команды установки (перевёрнутые строки через -join, base64, скрытый запуск через mshta/certutil/bitsadmin) и одноразовые аккаунты (созданы менее чем за 30 дней до репо, содержат менее 10 КБ кода) • **ground-check**: проверяет галлюцинации DeepSeek, отсеивая слова с заглавной буквой и числа, которых нет в источнике • Оба инструмента распространяются отдельными MIT-репозиториями, в ground-check встроены тесты на 303 реальных пересказах

AI-обработка оригинала Habr AI; редакция Hamidun News
Репозиторий-ловушка на 1774 звёздах: два фильтра для детекции вредоноса и галлюцинаций
Источник: Habr AI. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникHabr AI ↗
Главный редактор
Ground-checkпроверяет галлюцинации DeepSeek, отсеивая слова с заглавной буквой и числа, которых нет в источнике
Ключевой факт #2Оба инструмента распространяются отдельными MIT-репозиториями, в ground-check встроены тесты на 303 реальных пересказах
Ключевой факт #3Перевёрнутая строка через `-join"…"[-1..` и `iex(irm(…))` с вычисляемым адресом

Ловушка с 1774 звёздами

Каждое утро Telegram-бот присылает автору пять трендовых репозиториев GitHub с trendshift.io. Под каждым — кнопка, по нажатию на которую бот выдаёт выжимку README для быстрого разбора. Такую ленту автор читает ежедневно, иногда ставя лайки понравившимся проектам.

26 сентября в ленте появился репо «Microsoft Activation Scripts» с 1774 звёздами, аккуратным описанием и тегами. Бот оформил его как четыре соседних проекта — и это была ловушка. В репозитории один файл README, аккаунт владельца создан за 94 секунды до репо. Команда установки выглядит как `iex(irm(-join"…"[-1..-99]))` — адрес скачивания записан задом наперёд. PowerShell сначала переворачивает строку, потом скачивает скрипт и сразу его выполняет. Глазами домен не прочитать, и сканер, ищущий ссылки в тексте, его не видит. Адрес ведёт на похожий на настоящий домен. Настоящие Microsoft Activation Scripts существуют и тоже используют установку через irm | iex — на этом и расчёт.

Почему очевидные фильтры не сработали

Автор прогнал правило по 321 репозиторию, отправленному ботом с 15 июля по 8 октября (314 всё ещё живы). Первая идея — помечать установку вида «скачай и сразу запусти» с сайта не на GitHub. Но так ставятся 38 из 314 нормальных проектов: codex, opencode, а также установщики rustup и uv. Фильтр прятал бы каждый восьмой репозиторий из трендов, причём самые полезные.

Второе правило — «аккаунту владельца меньше 30 дней». Ловушка его прошла бы: в день отправки ей было уже 34 дня. Одноразовый аккаунт определяется не его возрастом при проверке, а разрывом между созданием аккаунта и созданием репозитория.

Два фильтра, которые сработали

Первый фильтр (замаскированная команда установки)

Проверяет наличие маскировки в README:

  • Перевёрнутая строка через `-join"…"[-1..` и `iex(irm(…))` с вычисляемым адресом
  • Код в формате base64, который декодируется и сразу выполняется
  • Скрытый запуск через `mshta`, `certutil`, `bitsadmin` или `-WindowStyle Hidden`

Перед проверкой текст очищается от невидимых символов и обратных кавычек PowerShell (вроде i`e`x).

Второй фильтр (одноразовый владелец и отсутствие кода)

Блокирует репозитории если:

  • Аккаунт создан менее чем за 30 дней до репо
  • В репозитории менее 10 КБ или только README и LICENSE

Если GitHub не ответил, это считается «неизвестно», а не «кода нет» — сбой сети не должен скрывать нормальный проект.

На всех 314 репозиториях каждый признак сработал ровно один раз — на поддельном активаторе. С 9 октября проверка стоит в боте. Если репозиторий похож на ловушку, бот убирает его из подборки, ставит на его место следующий по рейтингу и пишет одну строку о том, что скрыто и почему.

Вторая проблема: галлюцинации нейросети

Бот просит DeepSeek пересказать каждый репозиторий одной фразой по-русски. Проект, у которого в описании было только meat.dev, модель назвала «веб-фреймворком для Ruby». Инструмент для тестов сравнила с Cypress, которого в источнике нет. Всё звучит правдоподобно, глазами не ловится.

Автор собрал 303 настоящих пересказа и сравнил их с источниками. Правило простое: каждое слово латиницей с заглавной буквой или цифрой (Ruby, GPT-5) и каждое число из трёх и более цифр, с точкой или процентом должно встречаться в источнике. Если нет — бот показывает исходное описание с GitHub.

Первая версия отбраковала 9 из 303 пересказов. Четыре оказались разным написанием одного: Open-source и «open source», Wi-Fi и «WiFi», 2234 и «2,234». Автор добавил сравнение без дефисов и пробелов, убрал разделители тысяч. Осталось 5 отказов: три настоящие выдумки (Ruby, Cypress, Scratch) и два, где источник их не подтверждает (NVIDIA и XIX век). За четыре дня — 20 пересказов и ни одного отказа.

Где взять инструменты

lure-check: `python3 lure_check.py owner/repo` — код возврата 1 для ловушки, удобно в CI

ground-check: `python3 ground_check.py --source source.txt --text summary.txt`

Оба инструмента — один файл на Python, только стандартная библиотека, лицензия MIT, тесты на реальных случаях. Ловушка в тестах обезврежена, все адреса заменены.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: ловушка с 1774 звёздами?

Каждое утро Telegram-бот присылает автору пять трендовых репозиториев GitHub с trendshift.io. Под каждым — кнопка, по нажатию на которую бот выдаёт выжимку README для быстрого разбора. Такую ленту автор читает ежедневно, иногда ставя лайки понравившимся проектам. 26 сентября в ленте появился репо «Microsoft Activation Scripts» с 1774 звёздами, аккуратным описанием и тегами. Бот оформил его как четыре соседних проекта — и это была ловушка. В репозитории один файл README, аккаунт владельца создан за 94 секунды до репо. Команда установки выглядит как `iex(irm(-join"…"[-1..-99]

Что известно по теме: почему очевидные фильтры не сработали?

Автор прогнал правило по 321 репозиторию, отправленному ботом с 15 июля по 8 октября (314 всё ещё живы). Первая идея — помечать установку вида «скачай и сразу запусти» с сайта не на GitHub. Но так ставятся 38 из 314 нормальных проектов: codex, opencode, а также установщики rustup и uv. Фильтр прятал бы каждый восьмой репозиторий из трендов, причём самые полезные. Второе правило — «аккаунту владельца меньше 30 дней». Ловушка его прошла бы: в день отправки ей было уже 34 дня. Одноразовый аккаунт определяется не его возрастом при проверке, а разрывом между созданием аккаунта и

Что известно по теме: два фильтра, которые сработали?

Первый фильтр (замаскированная команда установки) Проверяет наличие маскировки в README: Перевёрнутая строка через `-join"…"[-1..` и `iex(irm(…))` с вычисляемым адресом Код в формате base64, который декодируется и сразу выполняется Скрытый запуск через `mshta`, `certutil`, `bitsadmin` или `-WindowStyle Hidden` Перед проверкой текст очищается от невидимых символов и обратных кавычек PowerShell (вроде i`e`x). Второй фильтр (одноразовый владелец и отсутствие кода) Блокирует репозитории если: Аккаунт создан менее чем за 30 дней до репо В репозитории менее 10 КБ или только READM

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Закрытый клуб практиков · Vibe Club

Внедряйте ИИ быстрее рынка вместе с инженерами и фаундерами

Внутри Vibe Club (hamidun.com/club): еженедельные живые мастермайнды и разборы архитектуры с Жемалом Хамидуном, закрытый Tech Radar, LMS и обновляемая база из 370+ боевых скиллов.

Вступить в Vibe Club →Тест-драйв Академии (72ч)
Что вы думаете?
Загружаем комментарии…