10 шокирующих фактов о вредоносных навыках в репозиториях: как защитить свой проект от ClawBot‑угроз
4 февраля 2026 г.Вступление
В последние годы открытый код стал основной движущей силой развития программного обеспечения. Платформы вроде GitHub позволяют каждому загрузить свой проект, а сообществу – быстро проверять и улучшать его. Однако эта открытость несёт в себе скрытую опасность: любой может добавить в репозиторий «навык», который выглядит безобидным, но на деле содержит вредоносный код. Случай с ClawBot – яркое подтверждение того, что даже автор проекта может не знать о присутствии в своём репозитории опасных компонентов.
Проблема актуальна не только для небольших hobby‑проектов, но и для крупных корпоративных решений, где одна уязвимость может стоить миллионы долларов. Поэтому важно понять, как такие «злонамеренные навыки» попадают в репозитории, какие риски они несут и какие меры можно предпринять, чтобы их не допустить.
И в завершение вступления – небольшое японское хокку, которое, как ни странно, отлично описывает ситуацию с скрытым вредоносным кодом:
暗闇のコード
リポジトリに潜む
光は届かず
Пересказ оригинального Reddit‑поста
На Reddit пользователь опубликовал сообщение, в котором сообщил, что создатель проекта ClawBot осведомлён о наличии в его репозитории вредоносных «навыков», но не знает, как с этим бороться. В посте была ссылка на статью на сайте opensourcemalware.com, где подробно описывается, как эти навыки могут похитить криптовалюту пользователей.
Суть сообщения проста: «У меня есть репозиторий, в нём находятся вредоносные компоненты, я их вижу, но не понимаю, как их удалить и как предотвратить их появление в будущем». Автор поста явно расстроен тем, что даже создатель проекта оказался в безвыходном положении, когда дело касается безопасности собственного кода.
Суть проблемы, хакерский подход и основные тенденции
Что такое «навыки» в контексте ClawBot?
В рамках ClawBot «навыки» – это небольшие скрипты или плагины, которые расширяют функциональность бота. Они могут выполнять любые действия: от простого вывода сообщения в чат до сложных операций с сетью, включая взаимодействие с криптовалютными кошельками.
Как хакеры используют навыки?
- Внедряют в навыки скрытый код, который активируется при определённых условиях (например, при вводе определённой команды).
- Эксплуатируют доверие пользователей к открытым репозиториям: многие скачивают навыки без проверки, полагаясь на репутацию автора.
- Используют техники обфускации, чтобы скрыть вредоносные части от статического анализа.
Тенденции 2023‑2024 годов
- Рост популярности «бот‑платформ», где пользователи могут добавлять сторонние плагины.
- Увеличение количества атак, направленных на кражу криптовалютных средств через компрометированные плагины.
- Появление сервисов, предлагающих автоматическую проверку кода, но их покрытие всё ещё ограничено.
Детальный разбор проблемы с разных сторон
Техническая сторона
Вредоносный навык может выглядеть как обычный Python‑скрипт, но внутри него скрыт вызов системных команд, работа с сетью или манипуляции с файлами. Часто используется импорт subprocess, os или сторонних библиотек, которые позволяют выполнять произвольный код.
Организационная сторона
Многие проекты полагаются на «само‑регулирование» сообщества: если кто‑то заметит проблему, он сообщит об этом. Однако в реальности большинство репозиториев не имеют формального процесса ревью кода, особенно если проект поддерживается одним человеком.
Юридическая сторона
В некоторых юрисдикциях распространение вредоносного кода может рассматриваться как киберпреступление. Но если автор проекта не знал о наличии вредоносного кода, его ответственность может быть ограничена.
Практические примеры и кейсы
Кейс 1: Кража криптовалюты через навык
В статье opensourcemalware.com описан случай, когда пользователь установил навык, который тайно считывал приватные ключи из файла wallet.dat и отправлял их на сервер злоумышленника. Пользователь заметил исчезновение средств только спустя несколько дней.
Кейс 2: Обфусцированный код в плагине
Другой пример – плагин, который использует базовую64‑обфускацию для скрытия вызова requests.post к C2‑серверу. Статический анализатор, настроенный только на поиск известных сигнатур, не смог обнаружить угрозу.
Экспертные мнения из комментариев
«Probably vibe coded malware too lmao»
— dishstan20
Автор указывает, что даже известные разработчики могут непреднамеренно включать вредоносный код.
«This may be a nice learning experience for a lot of people. If you trust random shit that is not reviewed by anyone including yourself, bad things might happen.»
— fletku_mato
Здесь подчёркнута важность ревью кода и личной ответственности за то, что мы устанавливаем.
«Maybe someone should write a skill that reviews skills»
— psytone
Идея о «сканере навыков» – автоматический инструмент, проверяющий плагины перед их публикацией.
«"Vibe coders will take our jobs" type of shit»
— rimyi
Скепсис относительно автоматизации и её влияния на рынок труда.
«Easier to break things than create..»
— IamNotMike25
Отмечается, что разрушать проще, чем создавать безопасные решения.
Возможные решения и рекомендации
1. Автоматический сканер навыков
Разработать утилиту, которая будет проверять каждый новый навык на наличие подозрительных импортов, вызовов системных команд и обфускации.
2. Политика ревью кода
Ввести обязательный процесс проверки кода хотя бы двумя независимыми разработчиками перед слиянием в основную ветку.
3. Подпись пакетов
Использовать криптографическую подпись для каждого навыка, чтобы пользователи могли убедиться в подлинности кода.
4. Обучение сообщества
Проводить вебинары и публиковать гайды о том, как распознавать вредоносные паттерны в Python‑скриптах.
5. Платформенные ограничения
Ограничить возможности навыков: запретить доступ к файловой системе, сети и системным вызовам без явного одобрения.
Заключение и прогноз развития
С ростом популярности открытых платформ для создания ботов и плагинов проблема внедрения вредоносных навыков будет только усиливаться. Ожидается, что к 2026‑му году появятся специализированные сервисы, предлагающие «сканирование в реальном времени» и «автоматическую подпись» для каждого загружаемого плагина. Однако без культуры ревью кода и ответственности со стороны разработчиков такие меры будут лишь частичным решением.
Если сообщество начнёт воспринимать безопасность как неотъемлемую часть разработки, а не как «дополнительный бонус», то риск попадания вредоносных навыков в репозитории существенно снизится.
Практический пример кода: сканер навыков
import ast
import os
import hashlib
# Список подозрительных импортов и функций
SUSPICIOUS_IMPORTS = {'subprocess', 'os', 'sys', 'socket', 'requests'}
SUSPICIOUS_CALLS = {'system', 'popen', 'exec', 'eval', 'compile'}
def get_file_hash(path):
"""Вычисляет SHA256‑хеш файла."""
with open(path, 'rb') as f:
return hashlib.sha256(f.read()).hexdigest()
def is_obfuscated(code):
"""Простейшая проверка на обфускацию: наличие длинных строк base64."""
return any(len(line) > 200 for line in code.splitlines())
def analyze_skill(file_path):
"""Анализирует один навык на предмет вредоносных конструкций.
Возвращает словарь с результатами анализа.
"""
with open(file_path, 'r', encoding='utf-8') as f:
source = f.read()
# Проверка на обфускацию
obfuscation = is_obfuscated(source)
# Парсим AST для поиска импортов и вызовов
tree = ast.parse(source, filename=file_path)
imports = set()
calls = set()
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
imports.add(alias.name.split('.')[0])
elif isinstance(node, ast.ImportFrom):
if node.module:
imports.add(node.module.split('.')[0])
elif isinstance(node, ast.Call):
if isinstance(node.func, ast.Name):
calls.add(node.func.id)
elif isinstance(node.func, ast.Attribute):
calls.add(node.func.attr)
suspicious_imports = imports.intersection(SUSPICIOUS_IMPORTS)
suspicious_calls = calls.intersection(SUSPICIOUS_CALLS)
# Хеш файла для последующего сравнения с базой известных вредоносных хешей
file_hash = get_file_hash(file_path)
return {
'path': file_path,
'hash': file_hash,
'obfuscation': obfuscation,
'suspicious_imports': list(suspicious_imports),
'suspicious_calls': list(suspicious_calls),
'is_malicious': obfuscation or bool(suspicious_imports) or bool(suspicious_calls)
}
def scan_directory(directory):
"""Сканирует все .py файлы в директории и выводит отчёт."""
report = []
for root, _, files in os.walk(directory):
for name in files:
if name.endswith('.py'):
path = os.path.join(root, name)
result = analyze_skill(path)
report.append(result)
return report
# Пример использования сканера
if __name__ == '__main__':
skills_dir = 'skills' # Папка с навыками
results = scan_directory(skills_dir)
for r in results:
status = 'Вредоносный' if r['is_malicious'] else 'Чистый'
print(f"{r['path']}: {status}")
if r['suspicious_imports']:
print(f" Подозрительные импорты: {r['suspicious_imports']}")
if r['suspicious_calls']:
print(f" Подозрительные вызовы: {r['suspicious_calls']}")
if r['obfuscation']:
print(" Обфускация кода обнаружена")
Данный скрипт проходит по всем Python‑файлам в указанной директории, ищет подозрительные импорты и вызовы, проверяет наличие обфускации и выводит простой отчёт. Его можно интегрировать в CI‑pipeline, чтобы каждый новый навык проходил автоматическую проверку перед публикацией.
Оригинал