Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
VulnLLM-R — Специализированная LLM для рассуждений, предназначенная для обнаружения уязвимостей в исходном коде на C/C++ и Python, с построением датасетов, обучением SFT/DPO и скриптами для воспроизведения результатов. | Kitploit
Инструменты/GitHubGitHub/ucsb-mlsec/vulnllm-r
Статический анализ кода (SAST)Анализ уязвимостейАнализ КодаМашинное ОбучениеСтатьи и Исследования
GitHubucsb-mlsec/vulnllm-r

VulnLLM-R

Специализированная LLM для рассуждений, предназначенная для обнаружения уязвимостей в исходном коде на C/C++ и Python, с построением датасетов, обучением SFT/DPO и скриптами для воспроизведения результатов.

Репозиторий
370584 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

VulnLLM-R: Специализированная LLM для рассуждений при обнаружении уязвимостей

  • Статья: arXiv:2512.07533
  • Код и данные: GitHub
  • Демо: Веб-демо
  • Модель: Модель 7B
model_size_vs_f1_scatter_01

Окружение и набор данных

🛠️ Создание окружения

  • Установите Git LFS и клонируйте репозиторий (файлы LFS загружаются автоматически при клонировании)
root@kitploit:~
git lfs install          # one-time setup
git clone https://github.com/ucsb-mlsec/VulnLLM-R.git
cd VulnLLM-R
# If you cloned before installing Git LFS, run: git lfs pull
  • Создайте новое окружение conda
root@kitploit:~
conda create -n vulnscan python=3.11
conda activate vulnscan
  • Установите необходимые пакеты
root@kitploit:~
pip install -e . -e ./vulscan/train/LLaMA-Factory -e ./vulscan/model_zoo

Воспроизведение наших результатов

root@kitploit:~
# generate VulnLLM-R-7B's results
python -m vulscan.test.test --output_dir results/test_data --dataset_path ./datasets/test/function_level/ ./datasets/test/repo_level/ --language python c java --model UCSB-SURFI/VulnLLM-R-7B --requests_per_minute 1000 --save --use_cot --batch_size 4 --tp 2 --vllm --max_tokens 8192 --random_cwe

python -m vulscan.test.test_hf \
      --output_dir results/test_hf \
      --hf_dataset UCSB-SURFI/VulnLLM-R-Test-Data \
      --hf_split repo_level function_level \
      --language c python java \
      --model UCSB-SURFI/VulnLLM-R-7B \
      --save --use_cot --vllm --tp 2

# [optional] generate other models' results with our shell script 
# remember to add your API keys to .env file if you want to run commercial models
# use ./run_test.sh -h for more options
./vulscan/test/run_test.sh -o results/test_data -t 2 # -o means output directory, -t means tensor parallelism
./vulscan/test/run_test.sh -o results/test_data -M o3-mini # -M means model name, which runs only one model.
./vulscan/test/run_test.sh -o results/test_data -M gpt-5.4 -e high # -e sets reasoning effort (e.g., none/low/medium/high/xhigh)
./vulscan/test/run_test.sh -o results/test_data -M claude-opus-4-6 -e high

# [optional] draw plot to compare with other models
python plots/plot_language_comparison_models.py --results-dir results/test_data
python plots/plot_model_size_scatter.py --results-dir results/test_data # Note: Labels may overlap with scatter points. Adjust text positions manually if needed.

Существующие дистиллированные наборы данных

  • Distill-DeepSeek
  • Distill-QwQ

Мы также предоставляем сокращённую версию рассуждений дистиллированных наборов данных:

  • Reduced-Distill-DeepSeek
  • Reduced-Distill-QwQ

Технические детали

📚 Создание обучающих и тестовых наборов данных

Объединяем существующие наборы данных обнаружения уязвимостей на уровне функций: PrimeVul [1], SecCodePLT [2], Juliet [3], Sven [4], и Arvo [5]. Среди этих наборов данных PrimeVul содержит самые сложные функции. Мы создаём два обучающих набора: чистый (без PrimeVul) и шумный (с PrimeVul), чтобы можно было обучаться на относительно простых наборах и тестироваться на сложном наборе PrimeVul. Обратите внимание, что мы называем обучающий набор с PrimeVul "шумным" не потому, что данные зашумлены. Это относительно произвольное название, которое мы использовали изначально.

  • После загрузки всех наборов данных в vulscan/data_process/data_utils есть набор скриптов для обработки и объединения наборов.
    • raw_to_us.py: Объединение исходных данных в наш набор данных и удаление избыточных данных
    • check_cwe_correct.py: Вычисление точности для каждой категории CWE
    • generate_arvo_raw_data.py: Генерация структурированных исходных данных из набора данных arvo
    • arvo_to_us.py: Переформатирование структурированных исходных данных arvo в формат нашего набора данных
    • split_good_bad_for_juliet.py: Извлечение данных из исходного набора Juliet 1.3 и преобразование их в требуемый формат, что составляет часть нашего набора c clean_dataset
    • add_sven_to_clean_dataset.py: Извлечение данных из набора Sven, формирующих часть нашего набора C clean_dataset
    • sync_large_small.py: Синхронизация изменений noisy_dataset/large_train/c с noisy_dataset/small_train/c
    • remove_testing_from_training.py: Добавление тега human к каждому элементу данных, означающего, что точка проверена человеком и используется как тестовые данные -: Добавление поля related_cwe в набор данных.

🤔 Генерация данных рассуждений для обучения

После создания наборов данных мы сгенерируем данные рассуждений для нашего обучающего набора. Мы запросим модели рассуждений DeepSeek-r1 и QwQ для генерации данных рассуждений и отфильтруем те, у которых очень длинные цепочки рассуждений. Код для генерации данных рассуждений находится в vulscan/data_process/generate_reasoning, а данные рассуждений будут сохранены в datasets/reasoning_data.

root@kitploit:~
cd vulscan/data_process/generate_reasoning

generate_reasoning/generate.py — это основной скрипт для генерации данных рассуждений. Для каждой точки данных он генерирует n образцов данных рассуждений и выбирает тот, где ответ правильный и длина минимальна. Примеры запуска с моделями QwQ и DeepSeek-r1 (с использованием together.AI API, который медленнее, но более стабилен, чем официальный API):

root@kitploit:~
python generate.py \
--tp 2 \
--dataset_type clean_dataset \
--batch_size 200 \
--n 8 \
--training_set train \
--model_name Qwen/QwQ-32B

# or
python generate.py \
--dataset_type noisy_dataset \
--batch_size 200 \
--n 8 \
--training_set small_train \
--model_name together-deepseek-reasoner \
--together_deepseek

После генерации исходных данных рассуждений мы можем дополнительно использовать другую модель для их обобщения и сокращения без нарушения структуры

root@kitploit:~
python extract_reasoning.py

Мы можем дополнительно отфильтровать данные рассуждений по определённой длине с помощью generate_reasoning/filter.py; num_processes изменяется в зависимости от количества ядер вашего процессора.

root@kitploit:~
python filter.py \
--dataset_type noisy_dataset \
--training_set small_train \
--model_name Qwen/QwQ-32B \ 
--filter_input_length 16000 \
--filter_all_length 32000 \
--num_processes 16 \
--filter_correct_only # for filtering wrong predictions
# --model_name together-deepseek-reasoner \

Наконец, нам нужно переформатировать сгенерированные данные рассуждений для целевой модели, которую мы будем обучать (Qwen-Instruct).

root@kitploit:~
python reformat_ds.py \
--dataset_type noisy_dataset \
--training_set small_train \
--model_name Qwen/QwQ-32B \
--filter_input_length 16000 \
--filter_all_length 32000 \
--push_to_hub \
--push_to_hub_organization secmlr \
--filter_correct_only 

Для набора данных DPO:

root@kitploit:~
python generate_dpo.py \
--tp 2 --dataset_type clean_dataset \
--batch_size 200 --n 8 --training_set train \
--model secmlr/VD-QWQ-Clean-8k_qwen2_7B_full_sft_1e-5

🤖 Обучение SFT и DPO

Подробнее см. vulscan/train/README.md

Результаты будут сохранены в каталоге results/test_qwen/results.json.

🔍 Тестирование обученных моделей

Если вы хотите воспроизвести наши результаты, вы можете выполнить следующую команду:

root@kitploit:~
# open-source model
python -m vulscan.test.test --output_dir results/one_of_4 \
--dataset_path ./datasets/test/test_clean ./datasets/test/test_primevul_pair \
--language c python --model Qwen/Qwen2.5-7B-Instruct \
--requests_per_minute 100 --save --use_cot \
--use_policy --batch_size 4 --tp 2 --vllm --max_tokens 16384 \
--random_cwe

# api model
python -m vulscan.test.test --output_dir results/one_of_4 \
--dataset_path ./datasets/test/test_clean ./datasets/test/test_primevul_pair \
--language c python --model o3-mini-2025-01-14 \
--requests_per_minute 100 --save --use_cot \
--use_policy --batch_size 4 --max_tokens 16384 --random_cwe

# local saved model
python -m vulscan.test.test --output_dir results/one_of_4 \
--dataset_path ./datasets/test/test_clean ./datasets/test/test_primevul_pair \
--language c python \
--model vulscan/train/result/VD-QWQ-Clean-16k/qwen2_7B_full_sft_1e-5 \
--requests_per_minute 100 --save --use_cot --use_policy \
--batch_size 4 --tp 2 --vllm --max_tokens 16384 --random_cwe

# our model
python -m vulscan.test.test --output_dir results/one_of_4 \
--dataset_path ./datasets/test/test_clean ./datasets/test/test_primevul_pair \
--language c python \
--model secmlr/VD-QWQ-Noisy-Small-8k_qwen2_7B_full_sft_1e-5 --revision aa3235b \
--requests_per_minute 100 --save --use_cot --use_policy \
--batch_size 4 --tp 2 --vllm --max_tokens 16384 \
--random_cwe # whether to randomize the order of cwe and related cwes

После тестирования ответы моделей и их производительность будут сохранены в каталоге results/test_data. Если вы хотите рассчитать производительность на основе ответов модели, вы можете выполнить следующую команду:

root@kitploit:~
python -m vulscan.test.test_existing_json \
--json_file results/test_data/datasets_test_test_clean__cot_c_policy_QwQ-32B-Preview.json # the results file
root@kitploit:~
python generate_constitution.py --model gpt-4o --input_dir results/train --output_dir results/train/constitution

Цитирование

root@kitploit:~
@article{nie2025vulnllmrspecializedreasoningllm,
      title={VulnLLM-R: Specialized Reasoning LLM with Agent Scaffold for Vulnerability Detection}, 
      author={Yuzhou Nie and Hongwei Li and Chengquan Guo and Ruizhe Jiang and Zhun Wang and Bo Li and Dawn Song and Wenbo Guo},
      year={2025},
      journal={arXiv preprint arXiv:2512.07533},
      url={https://arxiv.org/abs/2512.07533}, 
}
Скачать инструмент
data_utils.py
  • Объединённые данные будут сохранены в
    • datasets/clean_dataset: обучающие данные без PrimeVul
      • datasets/clean_dataset/python содержит данные из SVEN и SecCodePLT
      • datasets/clean_dataset/c содержит данные из Juliet и SVEN
    • datasets/noisy_dataset
      • datasets/noisy_dataset/small_train: Содержит обучающие данные из PrimeVul и SVEN с выбранными CWE ( мы используем данные PrimeVul в этом наборе для обучения)
      • datasets/noisy_dataset/large_train: Содержит обучающие данные из PrimeVul, SVEN и SecCodePLT с большим количеством CWE (этот набор может быть использован позже для обучения более крупных моделей)
      • datasets/noisy_dataset/test: Небольшой тестовый набор из PrimeVul, проверенный человеком
    • datasets/test
      • datasets/test/test_clean: Тестовые данные из SVEN, SecCodePLT и Juliet; с OOD CWE, которые не входят в обучающий набор
      • datasets/test/test_primevul_pair: исходные тестовые данные PrimeVul
  • Статистика набора данных; можно запустить vulscan/data_process/data_utils/get_cwe_stat.py для получения гистограммы набора данных
  • Набор данныхЯзыкОбучение/ТестCWE# Безопасных# УязвимыхСредняя длина
    Clean (seccodeplt)PythonОбучение2012811281741
    Clean (juliet)C/C++Обучение22171616533689
    Hard (primevul filtered)C/C++Обучение26271729524689
    Long Context (Oss-fuzz)C/C++Обучение347560412761
    Simple (seccodeplt)PythonТест24 (6 ood)7474814
    Simple (juliet)C/C++Тест38 (14 ood)3583762575
    Hard (PrimeVul, SecLLMHolmes)C/C++Тест13 (5 ood)1451524545
    Long Context (Oss-fuzz)C/C++Тест3 (0 ood)032018929
    primevul test (noisy)C/C++Тест56 (34 ood)4214225341