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, чтобы каждый новый навык проходил автоматическую проверку перед публикацией.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE