/ Модель

Характеристики

Библиотека
pytorch
Опубликована
19 июл 2026

stage2-gnn-pypi-malware

Языковая модель

Графовая модель GraphSAGE оценивает риск вредоносного ПО в исходном коде пакетов PyPI, помогая специалистам приоритизировать ручную проверку.

0скачиваний за 30 дней0лайковвеса обновлены19 июл 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

Stage 2 GNN — PyPI Supply-Chain Malware Detection — модель классификации графов на основе GraphSAGE и MLP для оценки риска вредоносного ПО в пакетах PyPI. Она разработана для второго этапа конвейера обнаружения: после отбора кандидатов по аномалиям метаданных модель анализирует графы вызовов API, извлечённые из AST исходного кода Python, чтобы помочь расставить приоритеты для проверки специалистом.

Архитектура включает два слоя GraphSAGE и двухслойный классификатор MLP. Узлы графа соответствуют вызовам API, рёбра кодируют последовательность вызовов и отношения вложенности; 32-мерные эмбеддинги инициализируются Word2Vec, скрытая размерность — 64. Модель обучена на сбалансированной выборке MalwareBench из вредоносных и доброкачественных пакетов, с акцентом на setup.py и __init__.py. В README указаны AUROC 0,983 и PR-AUC 0,986 на отложенном тестовом наборе той же коллекции.

Модель предназначена для защитной сортировки пакетов PyPI и выдаёт оценку, используемую как сигнал для ранжирования и ручного анализа. Эти метрики получены на сбалансированном разбиении и не отражают точность при реальной низкой доле вредоносных загрузок; порог следует настраивать под рабочую выборку. Обобщение на новые кампании, способы обфускации и полезные нагрузки вне этапа установки не оценивалось. Модель не предназначена для автоматического применения санкций; лицензия в предоставленных данных не указана.

Сценарии применения

  • ранжирование пакетов PyPI для проверки на вредоносный код
  • поиск подозрительных вызовов API в setup.py и __init__.py
  • защитная сортировка кандидатов после обнаружения аномалий метаданных
  • приоритизация Python-пакетов для анализа специалистом по безопасности

Ограничения

Оценка проведена на сбалансированном разбиении одного корпуса, поэтому приведённые показатели точности не переносятся напрямую на PyPI с низкой базовой долей вредоносных пакетов; рабочий порог нужно перенастроить. Обобщение на новые кампании, обфускацию и полезные нагрузки вне файлов установки не измерялось, поэтому результат следует использовать для ранжирования и ручной проверки.

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

Stage 2 GNN — PyPI Supply-Chain Malware Detection

A GraphSAGE classifier over AST-derived API call graphs, used as the Stage 2 component of a two-stage PyPI supply-chain malware detection pipeline. Stage 1 narrows 800K+ packages to a candidate set via metadata anomaly detection (IsolationForest over graph/metadata features); Stage 2 — this model — scores the candidates' source code.

Model

Architecture2-layer GraphSAGE + 2-layer MLP classifier
Embedding32-dim, initialized from Word2Vec over API-call sequences
Hidden dim64
Dropout0.3
Vocabulary21,085 API-call tokens
Parameters~840K
Checkpoint size3.4 MB

Input is a directed graph whose nodes are API calls extracted from a package's Python AST and whose edges encode call-sequence and containment relations. Dynamic/unresolvable receivers are normalized to a <dynamic> prefix (e.g. <dynamic>.decode.strip), which keeps the vocabulary bounded across arbitrary third-party code.

Training

Trained on the MalwareBench PyPI corpus, restricted to setup.py and __init__.py — the install-time entry points where supply-chain payloads overwhelmingly live.

  • 3,662 malicious / 3,662 benign packages (balanced)
  • Max 6 files per package
  • 60/20/20 train/val/test split, seed 42
  • 40 epochs max, early stopping patience 8, Adam @ lr 1e-3, batch size 16
  • Benign set includes mined hard negatives (benign packages with install-time side effects, subprocess use, and network calls)

Evaluation

Held-out test split: 1,573 packages (767 malicious / 806 benign).

  • AUROC 0.983
  • PR-AUC 0.986
ThresholdPrecisionRecallF1Accuracy
0.300.9750.9320.9530.955
0.500.9850.9310.9570.959
0.700.9930.9300.9600.962
0.850.9930.9220.9560.959

Best F1 is 0.960 at threshold 0.740.

Read these numbers carefully

The test split is balanced 50/50, and real PyPI is not — malicious packages are a very small fraction of uploads. Precision on a balanced split is not precision in deployment. At a realistic base rate the same score distribution yields substantially more false positives per true positive, so the operating threshold has to be re-tuned against the deployed candidate distribution rather than copied from the table above.

The model is also trained and evaluated on a single corpus (MalwareBench), so these figures reflect that corpus's notion of malicious. Generalization to novel campaigns, obfuscation styles, or non-install-time payloads is not measured here.

This checkpoint is one component of a larger pipeline and is not a standalone verdict source. Treat its output as a ranking signal for human review, not as an automated takedown trigger.

Usage

import torch

ckpt = torch.load("stage2_gnn_setup_init_v2.pt", map_location="cpu")

ckpt["config"]      # {'vocab_size': 21085, 'embed_dim': 32, 'hidden': 64, 'dropout': 0.3}
ckpt["vocab"]       # list[str], index -> API-call token ('<unk>' at 0)
ckpt["state_dict"]  # GraphSAGE weights
ckpt["extra"]       # test_report, training_history, training args

Instantiate the matching model definition from the training repository, then model.load_state_dict(ckpt["state_dict"]). Graphs must be built with the same AST extractor and token normalization used in training — the vocabulary is extractor-specific and will not transfer to a differently-built graph.

License

Not yet specified. No reuse rights are granted at this time — please contact the author before redistributing or building on these weights.

Intended use

Security research and defensive triage of the PyPI ecosystem: prioritizing which packages a human analyst looks at. Not intended for automated enforcement, and not evaluated for use outside PyPI Python packages.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · pytorch

Нельзя запустить

Графовые модели пока не поддерживаются.

Ревизия весов
954f642

0 моделей