Репозиторий-ловушка на 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 звёздами
Каждое утро 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, тесты на реальных случаях. Ловушка в тестах обезврежена, все адреса заменены.
- 27 окт. 2026 г.Qwen3.8 пыталась загрузить файл в облако Alibaba в Пекине из песочницы Cohere
- 26 окт. 2026 г.Synopsys собирается подключить китайские ИИ-модели к проектированию чипов в КНР
- 26 окт. 2026 г.SpaceXAI объединила Grok, Cursor и X в одну подписку от $8 в месяц
- 26 окт. 2026 г.OpenAI снизила прогноз выручки на 2026 год до $50 млрд вместо $70 млрд
Вопросы и ответы по материалу
Что известно по теме: ловушка с 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
Внедряйте ИИ быстрее рынка вместе с инженерами и фаундерами
Внутри Vibe Club (hamidun.com/club): еженедельные живые мастермайнды и разборы архитектуры с Жемалом Хамидуном, закрытый Tech Radar, LMS и обновляемая база из 370+ боевых скиллов.
Главное из мира ИИ — раз в неделю
7 ключевых событий недели, отобранных вручную. Без шума, репостов и пресс-релизов.
Готово! Проверьте почту — мы отправили подтверждение.