OpenAnt

Exploitation vlatest активный

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

vlatest
current

Установка
# Требования: Go 1.25+ и Anthropic API-ключ с доступом к Claude Opus 4.6

git clone https://github.com/knostic/OpenAnt.git
cd OpenAnt/apps/openant-cli/
make build
ln -sf "$(pwd)/apps/openant-cli/bin/openant" /usr/local/bin/openant

# Пример использования
openant setup llm
openant scan /path/to/repo --llm-config my-llm
openant serve
показать оригинал переведено ИИ

OpenAnt

OpenAnt

OpenAnt от Knostic — это продукт для поиска уязвимостей на основе моделей большого языка (LLM) с открытым исходным кодом, который помогает специалистам по безопасности проактивно находить подтверждённые уязвимости, минимизируя ложноположительные и ложноотрицательные срабатывания. Этап 1: обнаружение. Этап 2: атака. То, что выживает, — реально.

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

Почему открытый исходный код?

Учитывая всплеск уязвимостей, обнаруженных с помощью ИИ, мы надеемся, что OpenAnt станет инструментом, помогающим поддерживающим открытый исходный код опережать злоумышленников: они могут использовать его самостоятельно или отправить свой репозиторий на сканирование бесплатно.

Кроме того, так как Knostic сосредоточен на защите агентов и помощников по программированию, а не на исследованиях уязвимостей или безопасности приложений, и мы любим открытый исходный код, мы решили выпустить OpenAnt под лицензией Apache 2.0. К тому же, вы, возможно, слышали о Aardvark от OpenAI (теперь Codex Security) и Claude Code Security от Anthropic, и у нас нет никакого намерения конкурировать с ними.

Технические детали и бесплатное сканирование для проектов с открытым исходным кодом

Подробности о технической реализации, ограничениях и стоимости токенов можно найти в этом посте блога: https://knostic.ai/blog/openant

Чтобы отправить свой репозиторий на сканирование: https://knostic.ai/blog/oss-scan

Поддерживаемые языки

  • Go
  • Python
  • JavaScript/TypeScript (бета)
  • C/C++ (бета)
  • PHP (бета)
  • Ruby (бета)
  • Zig (бета)
  • Swift (бета)
  • Rust (бета)

Благодарности

Исследования и идеи: Nahum Korda.

Продуктовая реализация: Alex Raihelgaus, Daniel Geyshis.

Спасибо: Michal Kamensky, Imri Goldberg, Gadi Evron, Daniel Cuthbert, Josh Grossman и Avi Douglen.

Ознакомьтесь с Knostic

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

Локальная настройка

Соберите двоичный файл CLI (требуется Go 1.25+):

cd apps/openant-cli && make build

Это компилирует исходный код на Go и сохраняет двоичный файл в apps/openant-cli/bin/openant.

Создайте символическую ссылку в вашей переменной PATH, чтобы можно было запускать openant откуда угодно:

ln -sf "$(pwd)/apps/openant-cli/bin/openant" /usr/local/bin/openant

Примечание: выполните эту команду из корня репозитория, чтобы $(pwd) разрешался в правильный абсолютный путь.

Настройка LLM

OpenAnt направляет каждый этап конвейера через настраиваемую пару (поставщик, модель). Самый быстрый способ — интерактивный мастер:

openant setup llm

Вы называете конфигурацию (например, my-llm), выбираете поставщика для каждого этапа конвейера (любой из поставленных адаптеров ниже), один раз вводите его API-ключ для каждого поставщика (Bedrock использует цепочку учётных данных AWS — оставьте ключ пустым), и мастер проверяет каждую уникальную пару поставщик+модель запросом из 1 токена перед записью в ~/.config/openant/config.json. Запустите сканирование с этой конфигурацией, используя --llm-config:

openant scan /path/to/repo --llm-config my-llm

Значения по умолчанию в мастере отражают рекомендации проекта для каждого этапа (более мощные модели для обнаружения/проверки/анализа достижимости; более лёгкие модели для контекста, отчётов и генерации тестов) — вы можете изменить любой ответ на свой вкус.

Поставляемые адаптеры

Тип поставщика API-ключ от Примечания
anthropic console.anthropic.com Эталонный адаптер. НЕ входит в подписки Claude Pro / Max — отдельный биллинг.
openai platform.openai.com НЕ входит в подписки ChatGPT / Codex — отдельный биллинг.
google aistudio.google.com НЕ входит в Gemini Advanced — отдельный биллинг.
bedrock — (цепочка учётных данных AWS) Claude на AWS Bedrock. Нет api_key: учётные данные берутся из переменных окружения AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY или профиля ~/.aws, регион — из AWS_REGION. Идентификаторы моделей — это профили вывода (us.anthropic.claude-sonnet-4-6, global.anthropic.claude-haiku-4-5-20251001-v1:0, ...) — включите их в разделе "Доступ к моделям" в консоли Bedrock и перечислите их с помощью aws bedrock list-inference-profiles. Предлагается в openant setup llm (оставьте API-ключ пустым — цепочка учётных данных AWS, проверка пропускается) — полное руководство: utilities/llm/providers/BEDROCK.md.
openrouter openrouter.ai Шлюз ко многим поставщикам с одним ключом и одним предоплаченным балансом (также считывает OPENROUTER_API_KEY). Идентификаторы моделей — это slugи vendor/model (anthropic/claude-sonnet-4.6, openai/gpt-4o-mini, ...) — просмотреть их можно на openrouter.ai/models. Предлагается в openant setup llm (оставьте базовый URL пустым для значения по умолчанию OpenRouter) — полное руководство: utilities/llm/providers/OPENROUTER.md.
Все четыре поддерживают вызов инструментов, поэтому любой из них может управлять фазами enhance и verify, использующими цикл агентского применения инструментов.

Быстрый путь для настроек только с Anthropic

Если вы хотите использовать стандартные настройки Claude для каждой фазы и ничего больше, пропустите мастер настройки:

openant set-api-key sk-ant-...
openant scan /path/to/repo

Это использует встроенную конфигурацию openant-default (вкомпилированную в бинарник, config.json не требуется) — Claude Opus 4.6 для фаз обнаружения, Sonnet 4 для остальных.

Конфигурация, созданная вручную

Мастер записывает файл ~/.config/openant/config.json для вас, но вы можете редактировать его и вручную. Каждая конфигурация LLM должна перечислять все семь фаз конвейера:

{
  "$schema_version": 2,
  "default_llm": "my-llm",
  "llm_providers": {
    "anthropic": {"type": "anthropic", "api_key": "sk-ant-..."},
    "openai":    {"type": "openai",    "api_key": "sk-proj-..."},
    "google":    {"type": "google",    "api_key": "AIza..."}
  },
  "llm_configs": {
    "my-llm": {
      "app_context":  {"provider": "openai",    "model": "gpt-4o-mini"},
      "llm_reach":    {"provider": "anthropic", "model": "claude-opus-4-6"},
      "enhance":      {"provider": "openai",    "model": "gpt-4o-mini"},
      "analyze":      {"provider": "anthropic", "model": "claude-opus-4-6"},
      "verify":       {"provider": "anthropic", "model": "claude-opus-4-6"},
      "dynamic_test": {"provider": "google",    "model": "gemini-2.0-flash"},
      "report":       {"provider": "google",    "model": "gemini-2.0-flash"}
    }
  }
}

Провайдеры принимают пользовательский base_url для прокси, совместимых с OpenAI / Anthropic (vLLM, Bedrock, внутренние шлюзы); OpenRouter имеет собственный тип провайдера первого класса openrouter. Конфигурация openant-default (Claude для всех фаз) встроена и всегда доступна независимо от содержимого файла.

Добавление нового адаптера провайдера

Слой адаптеров OpenAnt — это небольшой рецепт на Python: один файл на Python, реализующий протокол LLMAdapter, одна фабрика для тестового каркаса проверки контракта, плюс запись в реестре. Этого достаточно, чтобы запускать адаптер из ручной конфигурации. Чтобы он также отображался в мастере openant setup llm и прошёл предсохранённую проверку, добавьте несколько точек интеграции на Go в apps/openant-cli/cmd/setup.go (список поддерживаемых провайдеров, case для проверки, карты моделей по умолчанию для каждой фазы) и функцию проверки на Go. 12 тестов контракта автоматически запускаются для вашего адаптера, как только он подключён. Подробности см. в docs/features/llm-providers/HOW_TO_ADD_AN_ADAPTER.md.

Среда выполнения Python

Код парсинга, улучшения, анализа и отчётности OpenAnt написан на Python 3.11+. CLI на Go выбирает интерпретатор в следующем порядке:

  1. Переменная окружения OPENANT_PYTHON (установите её, чтобы зафиксировать конкретный интерпретатор, например, OPENANT_PYTHON=python3.11).
  2. Управляемое виртуальное окружение в ~/.openant/venv/ (автоматически создаётся при первом использовании). CLI использует bin/python на Linux/macOS и Scripts\python.exe на Windows.
  3. python3 / python в PATH.

Если ни один из вариантов не даёт Python 3.11+, команда завершится с ошибкой, указывающей на python.org. Чтобы пересобрать устаревшее управляемое виртуальное окружение (например, после обновления Python), удалите ~/.openant/venv/ и повторно выполните любую команду openant.

Каталоги данных

OpenAnt создаёт два каталога:

  • ~/.config/openant/ — конфигурация CLI (config.json). Хранит ваш API-ключ, активный проект и настройки. Права доступа к файлу ограничены до 0600.
  • ~/.openant/ — данные проектов. Для каждого инициализированного проекта создаётся рабочая область в ~/.openant/projects/<организация>/<репозиторий>/, содержащая project.json и каталог scans/ с результатами для каждого коммита.

Анализ проекта

1. Инициализация

Укажите OpenAnt на репозиторий. Флаг -l (язык) обязателен — используйте go или python.

# Remote — clones the repo
openant init <repo-url> -l go

# Remote — pin to a specific commit
openant init <repo-url> -l go --commit <sha>

# Local — references the directory in-place
openant init <path-to-repo> -l go --name <org/repo>

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

2. Запуск конвейера

Каждый шаг получает результаты предыдущего из каталога сканирования проекта:

openant parse
openant enhance
openant analyze
openant verify
openant build-output
openant report -f summary

Или запустите полный конвейер одной командой:

openant scan --verify

Коды завершения (важно для CI)

openant scan — и каждое глагольное имя шага (analyze, verify, …) при пошаговом выполнении — завершается с кодом 1, если найдены уязвимости — это означает, что инструмент работает корректно, а не завершился с ошибкой. Контракт:

Код завершения Значение
0 Чистое сканирование — уязвимости не найдены
1 Найдены уязвимости (успешное выполнение)
2 Ошибка — само сканирование завершилось сбоем (проверьте errors в JSON-обёртке на stdout)

Общие шаги CI и супервизоры процессов воспринимают любой ненулевой код завершения как ошибку, что приводит к неверной классификации успешного выполнения с результатами. Ориентируйтесь на контракт, а не на разбор stdout:

rc=0
openant scan --verify /path/to/repo || rc=$?   # || captures: set -e safe
if [ "$rc" -gt 1 ]; then
  echo "scan FAILED (exit $rc)" >&2; exit "$rc"
fi
# rc 0 = clean, rc 1 = findings found — both are successful runs

Конструкция || rc=$? важна: в CI по умолчанию используется set -e (GitHub Actions run:, Jenkins sh), где простой вызов openant scan, завершающийся с кодом 1, прервёт выполнение скрипта до строки захвата — то есть воспроизведёт ту самую ошибку классификации, ради предотвращения которой существует этот раздел.

Веб-интерфейс

openant serve запускает локальный веб-интерфейс для того же конвейера сканирования: отправьте URL репозитория или локальный путь, наблюдайте за потоковым выводом логов сканирования и читайте HTML-отчёт, сводку в формате markdown и раскрытия — всё из браузера.

openant serve                       # http://127.0.0.1:8080, opens your browser
openant serve --addr 127.0.0.1:9000 # choose a port

Сервер привязывается только к loopback (он отклоняет любые не-loopback --addr) и предназначен для локального использования одним пользователем. Результаты сканирования сохраняются в ~/.openant/webui/ между перезапусками. Анализ по-прежнему отправляет исходный код вашему настроенному поставщику LLM, как и в CLI.

Инкрементальное и основанное на diff сканирование

Для репозиториев, где полное сканирование слишком медленное или затратное, OpenAnt может ограничить конвейер только теми единицами, тела которых пересекаются с фрагментами git diff:

openant scan --diff-base origin/main          # diff vs a ref
openant scan --pr 123                         # diff vs the base of a GitHub PR
openant scan --staged                         # diff vs HEAD using the staged index
openant scan --incremental                    # diff vs the last successful scan

Флаг --staged считывает git diff --cached и предназначен для хуков pre-commit или локальных запусков типа "просканировать то, что я собираюсь закоммитить". Базой является HEAD, а вершиной — индекс, поэтому сканируются файлы, добавленные через git add, а изменения только в рабочей области — нет.

Более короткая форма openant diff принимает те же флаги, например:

openant diff --staged --skip-dynamic-test

Работа с несколькими проектами

Конвейер работает с одним проектом за раз. Запуск openant init устанавливает newly инициализированный проект как активный, поэтому все последующие команды по умолчанию направлены на него.

Если вы работаете с несколькими проектами, у вас есть два варианта:

# Option 1: switch the active project
openant project switch org/repo
openant parse

# Option 2: target a project directly with -p
openant parse -p org/repo

Управление проектами

openant project list              # shows all projects, marks active
openant project show              # details of active project
openant project switch <org/repo> # switch active project

План развития

Список задач без строгого порядка:

  • Больше адаптеров поставщиков. Ollama (локальные модели), vLLM, Cohere, Mistral, Groq, Azure OpenAI — каждый из них требует небольшого Python-адаптера (плюс несколько точек соприкосновения Go для мастера/зонда, если вы хотите, чтобы он был доступен через openant setup llm) в соответствии с руководством для участников. Упростите доступ к локальному/внутреннему выводу.
  • Авторизация на основе подписки. Подписки ChatGPT / Codex, Claude Pro / Max и Gemini Advanced в настоящее время не предоставляют API-квоту — пользователям приходится поддерживать отдельный API-ключ для каждого поставщика. Адаптеры на основе OAuth, использующие потребительскую подписку, закрыли бы этот пробел.
  • Особенности вызова инструментов между поставщиками. Все три поставленных адаптера поддерживают вызов инструментов, но в долгом хвосте (параллельные вызовы инструментов, строгое соблюдение схемы, семантика повторных попыток при частичном JSON) поведение отличается в зависимости от поставщика. Реальные сканирования выявляют эти нюансы — PR welcome.
  • Больше языков. Список поддерживаемых языков выше отражает текущее покрытие. Часто упоминаются Java и C#.
  • Услуга хостинга сканирования. Knostic сегодня предлагает бесплатные сканирования для OSS-проектов через форму, ссылка на которую приведена выше; в будущем возможен API для самообслуживания для доверенных партнеров.

PR welcome по любому из этих пунктов — сначала откройте issue, если объем работы нетривиален, чтобы мы могли согласовать детали, прежде чем вы начнете работать.

ЛИЦЕНЗИЯ

Этот проект лицензирован по Apache 2. Подробности см. в файле LICENSE.

Отказ от ответственности и юридическое уведомление

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

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

Войдите, чтобы оставить комментарий