Перейти к основному содержимому
  1. Статьи/

Пентесты с помощью ИИ: что умеют локальные LLM

Оглавление

Локальные LLM развиваются с огромной скоростью, и новые релизы демонстрируют значительно улучшенную производительность при меньшем потреблении памяти. Во многих случаях эти небольшие новые модели по своим возможностям сравнимы с более громоздкими старыми моделями, что даёт возможность эффективно использовать локальные LLM для тестирования на проникновение.

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

В этой статье я представляю сравнительный анализ нескольких LLM в разных форматах квантизации, с практическими выводами об их эффективности, ограничениях и ожидаемом поведении в реальных сценариях тестирования на проникновение. Кроме того, в статье даны рекомендуемые параметры конфигурации для LLM-движка llama.cpp, которые позволяют улучшить результаты.

Ключевые выводы
#

Лучшая модель в целом: GLM-4.7-Flash-UD-Q8_K_XL

Лучшее соотношение скорости и эффективности: Qwen3.5-35B-A3B-Q8_0

Лучшая детализация уязвимостей: Qwen3.6-27B-UD-Q8_K_XL

Лучшая модель маленького размера: Qwen3.5-9B-UD-Q8_K_XL (эта модель обошла OpenAI GPT-OSS-120B по точности идентификации уязвимостей)

Лучший MCP: Chrome DevTools MCP работает лучше, чем Burp MCP

Тестовая инфраструктура
#

Тесты проводились на десктопе со следующими спецификациями:

RAM: 48 GB

GPU: 3090 TI + 3090 (Total 48 GB Vram)

CPU: AMD Ryzen™ 9 5900X × 24

OS: Ubuntu 24.04.3 LTS

Движок для запуска LLM: llama.cpp

Тестовый кейс
#

Основная задача этого теста — выявить, могут ли локальные LLM определять конечные точки веб-приложения и выполнять тестирование на SQL-инъекцию, чтобы обнаружить уязвимости, используя только собственные рассуждения и знания. Цель теста — сравнить разные локальные модели и определить, какая из них лучше всего подходит для тестирования на проникновение и демонстрирует лучшие результаты в автономных пентестах.

Чтобы провести такое сравнение, я разработал пользовательское веб-приложение с несколькими уязвимостями, которые позволяют осуществлять SQL-инъекции. В тесте намеренно не применялись ранее известные уязвимые приложения, чтобы модели не могли использовать предварительные знания о них: это могло бы исказить результаты и не отразить истинные способости LLM в проведении пентестов.

Использованный в этом тесте промпт доступен здесь.

Тестовое веб-приложение содержит пять конечных точек с уязвимостями для SQL-инъекций:

/login -> SQL-инъекция позволяет обойти аутентификацию

/users -> SQL-инъекция в параметре поиска раскрывает данные пользователей

/profile/<user_id> -> SQL-инъекция дает доступ к профилю любого пользователя

/products -> SQL-инъекция через параметры категории и сортировки

/orders -> SQL-инъекция дает просмотр всех заказов

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

В тестовой среде были реализованы следующие условия:

  1. Доступ LLM к инструментам MCP для выполнения тестов на проникновение, таких как Chrome DevTools MCP, и доступ к терминалу для выполнения любых команд.

  2. Доступ LLM к серверам MCP, которые позволяют модели хранить и извлекать результаты.

  3. Моделям не было предоставлено никакой дополнительной информации, а также возможности поиска в Интернете или доступа к RAG — чтобы LLM работали, используя только свои собственные знания.

  4. Тестовый сценарий позволял LLM итеративно повторять задачи в цикле, с доступом к серверу Chrome MCP и возможностью выполнения любых необходимых команд.

  5. Тест завершался, если модель превышала лимит вызовов инструментов (200), достигала лимита контекста (150К) или явно завершала сессию, используя инструмент завершения сессии.

  6. Оценка была разделена на две отдельные фазы:

    1. Фаза обнаружения конечных точек

    2. Фаза выявления уязвимостей

  7. Время завершения, количество использованных токенов и количество взаимодействий, представленные в этой статье, измерялись только во время фазы выявления уязвимостей, после того как конечные точки приложения уже были успешно определены моделью в отдельной сессии.

  8. Каждая тестовая сессия стартовала с начального контекста в 10.000 токенов, содержащего все необходимые конфигурации MCP, инструменты и системные промпты.

Протестированные модели
#

В тестировании принимали участие следующие модели:

  • GLM-4.7-Flash-UD-Q8_K_XL

  • GLM-4.7-Flash-UD-Q5_K_XL

  • GLM_4.7_flash-Q4_K_M

  • Qwen3.5-35B-A3B-UD-Q8_K_XL

  • Qwen3.5-35B-A3B-UD-Q4_K_XL

  • Qwen3.5-27B-UD-Q8_K_XL

  • Qwen3.5-27B-UD-Q4_K_XL

  • Qwen3.5-9B-UD-Q8_K_XL

  • Qwen3.5-9B-UD-Q4_K_XL

  • Qwen3.6-35B-A3B-UD-Q8_K_XL

  • Qwen3.6-35B-A3B-UD-Q4_K_XL

  • Qwen3.6-27B-UD-Q8_K_XL

  • Qwen3.6-27B-UD-Q4_K_XL

  • Qwen3-Coder-Next-UD-Q5_K_XL

  • Qwen3-Coder-Next-UD-Q4_K_XL

  • gpt-oss-120b-F16

  • gemma-4-31B

Для теста использовались модели в формате Unsloth GGUF, который обеспечивает уменьшенный объем памяти при сохранении сопоставимой — и в некоторых случаях улучшенной — производительности, по сравнению с исходными релизами.

Квантизация
#

В тестировании были использованы форматы квантизации Q4 и Q8, чтобы изучить средние и крупные варианты каждой модели.

Квантизация — это процесс снижения точности числовых значений параметров модели (например, с 16-битного до 4-битного числа). Квантизация применяется для улучшения производительности и сокращения объема используемой памяти, но может немного снизить точность результата.

В простой аналогии: Q4 — это как просмотр видео на YouTube в разрешении 480p, а Q8 — это как просмотр видео на YouTube в разрешении 1080p. Оба варианта работают, но один обеспечивает более четкое качество вывода.

Ниже приведено простое сравнение между Q4 и Q8:

ФункцияQ4 (4-бит)Q8 (8-бит)
Бит на значение4 бита8 бит
Размер моделиМаленький (~50% от Q8)Больший (около 2× Q4)
Использование VRAMНизкоеОт среднего до высокого
СкоростьБыстрееНемного медленнее
ТочностьНизкая (приблизительная)Более высокая (ближе к исходной)

Сравнительные результаты тестирования разных моделей
#

МодельКвантизацияСкорость вывода (токенов/с)*Время завершения (минуты)*Использованные токены*Количество взаимодействий*Количество выявленных уязвимостей (из 5)*
GLM-4.7-FlashUD-Q8_K_XL80226,051405
Qwen3.5-35B-A3BQ8_096233307515
Qwen3.5-9BUD-Q8_K_XL62333,209495
Qwen3.5-35B-A3BUD-Q8_K_XL83454,862425
Qwen3.6-35B-A3BUD-Q8_K_XL1015520981305
Qwen3.6-35B-A3BUD-Q4_K_XL83581817895
Qwen3.5-27BUD-Q8_K_XL21750720725
Qwen3.6-27BUD-Q8_K_XL251656740745
Qwen3.5-35B-A3BUD-Q4_K_XL107133307514
Qwen3.5-9BUD-Q4_K_XL95266,797544
Qwen3.5-27BUD-Q4_K_XL35541,995654
Qwen3.5-122B-A10BUD-Q4_K_XL221142097414
GLM-4.7-flashQ4_K_M74240,470373
gpt-oss-120bf1631422,344203
Qwen3-Coder-NextUD-Q5_K_XL52436421663
gemma-4-31BQ4_K_M21450752403
GLM-4.7-FlashUD-Q5_K_XL69554250593
Qwen3.6-27BUD-Q4_K_XL2924716121363

Скорость вывода: Как быстро модель генерирует вывод, измеряется в токенах в секунду.

Время завершения (минуты): Общее время от начала задачи до завершения.

Использованные токены: Общее количество входных и выходных токенов, использованных в задаче.

Количество взаимодействий: Сколько циклов “запрос/ответ” агент выполнил, чтобы завершить задачу.

Обнаруженные уязвимости (из 5): Сколько из пяти уязвимостей агент успешно обнаружил.

Примечание: По каждой модели в таблице представлен лучший результат из пяти выполнений. Выбор лучшего результата связан с тем, что целью теста была оценка максимальных практических способностей каждой модели в стабильных условиях, а не измерение средней консистенции результатов. Фактические результаты могут варьироваться в зависимости от структуры промпта, версии сборки llama.cpp, конфигурации вывода и стабильности вызова инструментов.

Топ 5 моделей
#

GLM-4.7-Flash-UD-Q8_K_XL: Эта модель продемонстрировала лучшие способности в выполнении инструкций, достигая намеченных целей с наименьшим использованием токенов, при этом обеспечивая подробные и качественные результаты. Кроме того, ее хорошие способности в программировании значительно увеличивают ее ценность для технических и автоматизационных задач.

Qwen3.5-35B-A3B-Q8_0: Эта модель достигла лучшего баланса между скоростью, низким потреблением токенов и общей производительностью, при этом обеспечивая надежные и качественные результаты на протяжении всего процесса тестирования.

Qwen3.6-27B-UD-Q8_K_XL: Эта модель обеспечила наиболее подробный анализ уязвимостей и наиболее четкие технические объяснения. Хотя она была медленнее, чем другие модели, качество описаний уязвимостей, доказательств и рассуждений делает её лучшей по содержательности отчетов.

Qwen3.5-9B-UD-Q8_K_XL: Несмотря на то, что это относительно небольшая модель, она успешно идентифицировала все уязвимости. Хотя глубина анализа и описания уязвимостей не были сравнимы с более крупными моделями, она все равно смогла выполнить задачу.

Qwen3.6-35B-A3B-UD-Q4_K_XL: Эта модель продемонстрировала, что квантизация Q4 может обеспечить высококачественные результаты в пентестах. Модель успешно идентифицировала все уязвимые конечные точки, при этом поддерживая высокую скорость вывода.

Ключевые выводы
#

  • После тестирования нескольких сборок llama.cpp в ходе этого тестирования я обнаружил, что сборка b8175 (d903f30e2) оказалась наиболее стабильной и продемонстрировала заметную разницу в производительности при запуске Qwen3-Coder-Next и GLM4.7-Flash. Более новые сборки, вплоть до последней (b8541, ded446b34) демонстрируют регрессию производительности, с результатами вывода, отклоняющимися от тех, которые давала b8175. Я протестировал идентичные параметры llama.cpp на нескольких сборках, и b8175 была единственной версией, способной надежно завершить полную сессию тестирования на проникновение от начала до конца.

  • Сборка llama.cpp версии 8942 (f53577432) значительно улучшила генерацию токенов (с 49 токенов/с до 80 токенов/с) для модели GLM-4.7-Flash-UD-Q8_K_XL. Кроме того, качество рассуждений модели и поведение при выводе заметно улучшились.

  • У меня были проблемы c вызовом инструментов в моделях Qwen3.5 и Qwen3.6, пока я не нашел правильный шаблон чата.

  • Я заметил, что в случае моделей Qwen3.5, если ваш промпт инструктирует LLM возвращать вывод в формате JSON, и при этом вызов инструментов включен, модель будет выдавать вызовы инструментов как сырой текстовый вывод JSON, а не использовать синтаксис вызова инструментов OpenAI - это приведет к тому, что ваш агент неправильно истолкует их как обычный вывод, а не как вызов инструментов, что нарушит поток выполнения.

  • Модель GLM-4.7-Flash-UD-Q8_K_XL выделилась как лучшая локальная LLM для выполнения инструкций. Несмотря на ее более низкую скорость вывода, модель продемонстрировала хорошую согласованность результатов в нескольких тестах, включая работу с OpenClaw и плагином RooCode в VS Code.

  • Qwen3-Coder-Next хорошо справляется с задачами тестирования на проникновение и с задачами кодирования, но не дотягивает до уровня других моделей по стабильности вызова инструментов. Я наблюдал периодические сбои как во время сессий тестирования на проникновение, так и при использовании этой модели с плагином RooCode в VS Code.

  • Qwen3.6-35B-A3B обеспечивает лучшую скорость вывода без ущерба для качества вывода.

  • Использование Chrome DevTools MCP оказалось значительно более эффективным, чем использование Burp Suite MCP или предоставление агенту доступа к терминалу для запуска curl.

  • Версия сборки llama.cpp существенно влияет на результаты вывода LLM.

  • Скорость вывода не обязательно означает, что LLM завершит задачу быстрее. Я наблюдал случаи, когда более медленные модели завершали задачи раньше, чем более быстрые, в основном из-за более методического подхода и меньшего количества ошибок в процессе работы.

Конфигурации и результаты работы каждой модели
#

GLM-4.7-Flash-UD-Q8_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model GLM-4.7-Flash-UD-Q8_K_XL.gguf –alias
“unsloth/GLM_4.7_flash” –temp 0.6 –top-p 1.0 –min-p 0 –repeat-penalty
1.0 –top-k 20 –port 8021 –ctx-size 100000 –host 0.0.0.0 –fit on

Результаты:

  • Модель определила все конечные точки.

  • Определила 5/5 уязвимых конечных точек.

  • Следовала инструкциям и представила данные в профессиональном виде.

  • Уязвимости описаны детально.

  • Лучшие результаты получаются с версией llama.cpp: 8175 (d903f30e2).

Qwen3.5-27B-UD-Q4_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.5-27B-UD-Q4_K_XL.gguf –alias
“unsloth/Qwen3.5-27B-UD-Q4_K_XL.gguf” –temp 0.6 –top-p 1.0 –min-p 0
–repeat-penalty 1.0 –top-k 20 –port 8021 –ctx-size 100000 –host 0.0.0.0
–fit on –flash-attn on

Результаты:

  • Определила все конечные точки.

  • Определила 3/5 уязвимых конечных точек.

  • Лучшие результаты с версией llama.cpp: 8667 (c08d28d08).

Qwen3.5-35B-A3B-UD-Q4_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.5-35B-A3B-Q8_0.gguf –alias
“unsloth/Qwen3.5-35b” –host 0.0.0.0 –port 8021 –temp 0.6 –top-p 1.0
–min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit on –jinja
–chat-template-file ../llama_tests/template.txt –flash-attn on
–chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.
  • Определила 3/5 уязвимых конечных точек.
  • Лучшие результаты с версией llama.cpp: 8667 (c08d28d08).

Qwen3.5-35B-A3B-Q8_0.gguf
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.5-35B-A3B-Q8_0.gguf –alias
“unsloth/Qwen3.5-35b-Q8_0” –host 0.0.0.0 –port 8080 –temp 0.6 –top-p 1.0
–min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit on –jinja
–chat-template-file ../llama_tests/template.txt –flash-attn on
–chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.
  • Определила 5/5 уязвимых конечных точек.
  • Лучшие результаты с версией llama.cpp: 8809 (b1be68e8c).

Qwen3-Coder-Next-UD-Q5_K_XL
#

Параметры Llama:

 ./llama.cpp/llama-server     –model
Qwen3-Coder-Next-UD-Q5_K_XL-00001-of-00003.gguf     –alias
“unsloth/Qwen3-Coder-Next-UD-Q5_K_XL”    –temp 0.6 –top-p 1.0 –min-p 0 
–repeat-penalty 1.0 –top-k 20      –port 8021     –ctx-size 100000 –host
0.0.0.0 –fit on

Результаты:

  • Определила все конечные точки.

  • Определила 3/5 уязвимых конечных точек.

  • Лучшие результаты с версией llama.cpp: 8175 (d903f30e2).

Qwen3.5-122B-A10B-UD-Q4_K_XL
#

Параметры Llama:

./llama.cpp/llama-server     –model
Qwen3.5-122B-A10B-UD-Q4_K_XL-00001-of-00003.gguf    –alias
“unsloth/Qwen3.5-122B-A10B-UD-Q4_K_XL”       –temp 0.6 –top-p 1.0 –min-p
0  –repeat-penalty 1.0 –top-k 20 –port 8021     –ctx-size 100000 –host
0.0.0.0 –fit on –flash-attn on –jinja –chat-template-file
../llama_tests/template.txt –flash-attn on –chat-template-kwargs
“{\\enable_thinking\\: false}”

Результаты:

  • Лучшие результаты с версией llama.cpp: 8809 (b1be68e8c).

  • Определила все конечные точки.

  • Определила 4/5 уязвимых конечных точек.

GLM-4.7-Flash-UD-Q5_K_XL
#

Параметры Llama:

./llama.cpp/llama-server     –model GLM-4.7-Flash-UD-Q5_K_XL.gguf   
–alias “unsloth/GLM_4.7_flash-UD-Q5_K_XL”       –temp 0.6 –top-p 1.0 –min-p
0  –repeat-penalty 1.0 –top-k 20 –port 8021     –ctx-size 100000 –host
0.0.0.0 –fit on

Результаты:

  • Определила все конечные точки, но также добавила конечную точку, которая не существует, со статусом “не найдено”.

  • Определила 3/5 уязвимых конечных точек.

  • Лучшие результаты с версией llama.cpp: 8175 (d903f30e2).

Qwen3.5-35B-A3B-UD-Q8_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.5-35B-A3B-UD-Q8_K_XL.gguf –alias
“unsloth/Qwen3.5-35b-UD-Q8_K_XL” –host 0.0.0.0 –port 8021 –ctx-size
100000 –fit on –split-mode layer –cache-type-k q8_0 –cache-type-v q8_0
–flash-attn on –parallel 1 –temp 0.6 –top-p 0.95 –min-p 0.00 –top-k 20
–kv-offload –flash-attn on –jinja –chat-template-file
../llama_tests/template.txt –flash-attn on –chat-template-kwargs
“{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.

  • Определила 5/5 уязвимых конечных точек.

  • Если запустить без этого шаблона чата, возникают проблемы с вызовом инструментов.

GLM_4.7_flash-Q4_K_M
#

Параметры Llama:

./llama.cpp/llama-server –model GLM-4.7-Flash-Q4_K_M.gguf –alias
“unsloth/GLM_4.7_flash-Q4_K_M” –temp 0.7 –top-p 1.0 –min-p 0.01 –port
8021 –ctx-size 100000 –host 0.0.0.0 –fit on

Результаты:

  • Определила все конечные точки.

  • Определила 3/5 уязвимых конечных точек.

  • Лучшие результаты с версией llama.cpp: 8175 (d903f30e2).

gpt-oss-120b-f16
#

Параметры Llama:

./llama.cpp/llama-server     –model gpt-oss-120b-F16.gguf  –alias
“gpt-oss-120b-F16”         –temp 0.6     –top-p 1.0     –min-p 0.0   
–top-k 0.0 -ngl -1    –port 8021     –ctx-size 100000 –host 0.0.0.0 -fit
on

Результаты:

  • Определила все конечные точки, но также включила дубликаты конечных точек.

  • Определила 3/5 уязвимых конечных точек.

Qwen3.5-9B-UD-Q8_K_XL
#

Параметры Llama:

./llama.cpp/llama-server     –model Qwen3.5-9B-UD-Q8_K_XL.gguf    
–alias “unsloth/Qwen3.5-9B-UD-Q8_K_XL”  –seed 3407   –temp 0.6 –top-p
0.95 –min-p 0.01  –repeat-penalty 1.0 –top-k 40      –port 8021    
–ctx-size 100000 –host 0.0.0.0 –fit on –jinja –chat-template-file
../llama_tests/template.txt –flash-attn on –chat-template-kwargs
“{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.

  • Определила 5/5 уязвимых конечных точек.

  • Не следовала точным инструкциям, но смогла предоставить хороший результат.

Qwen3.6-35B-A3B-UD-Q8_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.6-35B-A3B-UD-Q8_K_XL.gguf –alias
“unsloth/Qwen3.6-35b-A3B-UD-Q8_K_XL” –host 0.0.0.0 –port 8021 –temp 0.6
–top-p 1.0 –min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit
on  –jinja –chat-template-file ../llama_tests/template.txt –flash-attn
on –chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.

  • Определила 5/5 уязвимых конечных точек.

  • Детальное резюме результатов.

  • Если запустить без этого шаблона чата, возникают проблемы с вызовом инструментов.

  • Не следовала инструкциям использовать только инструменты Chrome DevTools MCP, и в итоге использовала curl, что заняло больше времени.

Qwen3.6-35B-A3B-UD-Q4_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf –alias
“unsloth/Qwen3.6-35B-A3B-UD-Q4_K_XL” –host 0.0.0.0 –port 8021 –temp 0.6
–top-p 1.0 –min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit
on  –jinja –chat-template-file ../llama_tests/template.txt –flash-attn
on –chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.

  • Нашла все уязвимые конечные точки, а также ещё одну уязвимость, которой не было в задаче.

  • Если запустить без этого шаблона чата, возникают проблемы с вызовом инструментов.

Qwen3.5-27B-UD-Q8_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.5-27B-UD-Q8_K_XL.gguf–alias
“unsloth/Qwen3.5-27B-UD-Q8_K_XL” –host 0.0.0.0 –port 8021 –temp 0.6
–top-p 1.0 –min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit
on  –jinja –chat-template-file ../llama_tests/template.txt –flash-attn
on –chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Определила все конечные точки.

  • Определила 5/5 уязвимых конечных точек с подробным описанием.

  • Выдала детальное резюме результатов.

  • Если запустить без шаблона чата, возникнут проблемы с вызовом инструментов.

Qwen3.6-27B-UD-Q4_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.6-27B-UD-Q4_K_XL.gguf–alias
“unsloth/Qwen3.6-27B-UD-Q4_K_XL” –host 0.0.0.0 –port 8021 –temp 0.6
–top-p 1.0 –min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit
on  –jinja –chat-template-file ../llama_tests/template.txt –flash-attn
on –chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Эта модель показала самые слабые результаты среди всех протестированных.

  • Выявила 3/5 уязвимых конечных точек.

  • Требовала наибольшее время для определения уязвимых конечных точек.

Qwen3.5-9B-UD-Q4_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model Qwen3.5-9B-UD-Q4_K_XL.gguf –alias
“unsloth/Qwen3.5-9B-UD-Q4_K_XL” –host 0.0.0.0 –port 8021 –temp 0.6
–top-p 1.0 –min-p 0 –repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit
on  –jinja –chat-template-file ../llama_tests/template.txt –flash-attn
on –chat-template-kwargs “{\\enable_thinking\\: false}”

Результаты:

  • Не смогла определить все конечные точки.

  • Определила 4/5 уязвимых конечных точек с подробной информацией.

  • Не следовала инструкциям.

  • Хороший результат с учетом малого размера модели.

  • Если запустить без шаблона чата, возникнут проблемы с вызовом инструментов.

gemma-4-31B-it-UD-Q8_K_XL
#

Параметры Llama:

./llama.cpp/llama-server –model gemma-4-31B-it-UD-Q8_K_XL.gguf –alias
“unsloth/gemma4” –host 0.0.0.0 –port 8021 –temp 0.6 –top-p 1.0 –min-p 0
–repeat-penalty 1.0 –top-k 20 –ctx-size 100000 –fit on

Результаты:

  • Каждый тестовый запуск вызывал сбой llama.cpp. Я видел сообщения в репозитории llama.cpp, связанные с этой ошибкой.

  • Загрузка модели с помощью LM Studio и использование встроенного чата для вызова Chrome MCP также привели к сбою.

  • Проблема может быть связана с unsloth-версией модели: когда я использовал Ollama для загрузки оригинальной версии от Google, сработало без проблем.

gemma-4:31B - Ollama
#

Результаты:

  • Для запуска использовалась Ollama.

  • Модель определила все конечные точки.

  • Определила 3/5 уязвимых конечных точек.

Ограничения теста
#

  • Тестировались только уязвимости для SQL-инъекций.

  • Архитектура приложения достаточно проста.

  • Нет сложности с аутентификацией.

  • Нет доступа к RAG и к поиску в Интернете.

  • Нет сохранения состояния.

  • Ограниченный набор инструментов MCP.

  • Результаты сильно зависят от промптов/шаблонов.

  • Нестабильность сборки llama.cpp влияет на воспроизводимость результатов.

Общие выводы
#

Результаты этого тестирования показывают, что современные локальные LLM способны эффективно выполнять задачи автономного тестирования на проникновение при использовании подходящих инструментов MCP и правильно настроенной среды. Хотя облачные модели все еще предлагают более сильные возможности, несколько локальных моделей продемонстрировали высококонкурентную производительность в обнаружении конечных точек и выявлении уязвимостей, а также в логических рассуждениях и использовании инструментов.

Исследование также выявило, что одна только скорость вывода не является надежным показателем эффективности работы AI-агента в реальных условиях. Такие факторы, как чёткое выполнение инструкций, качество рассуждений, надёжность вызова инструментов, структура промптов и стабильность сборки llama.cpp, имеют гораздо большее влияние на общий процесс выполнения задач и качество результатов.