# Gemini 4 Carbon или GPT-6 Astra для аудита безопасности кода: что выбрать

> AI Release · @ai_release1 · https://ai-release.org/guides/gemini-4-carbon-ili-gpt-6-astra-dlya-audita-bezopasnost.html

## TL;DR

- Gemini 4 Carbon — модель Google с одним профилем: безопасность. Заявленный цикл: найти уязвимость → подтвердить, что она рабочая → написать патч.
- Google отчиталась, что Carbon впереди в трёх проверках: обнаружение уязвимости, подтверждение эксплуатируемости, ремонт кода. Состав участников сравнения и цифры в посте не приводятся.
- Carbon не продаётся в открытой рознице — условия доступа к нему сверяйте с документацией провайдера.
- По GPT-6 Astra замеров в аудите безопасности в наших материалах нет — его место в сравнении определяется вашим собственным прогоном на своём репозитории.
- Время выполнения: 40–60 минут. Уровень сложности: Intermediate. Понадобится: git, Python 3.11+, pytest, jq, curl, API-ключ с доступом к выбранной модели.

## Требования и подготовка: стенд и доступы
![Иллюстрация к разделу «Требования и подготовка: стенд и доступы»](https://ai-release.org/guides/img/gemini-4-carbon-ili-gpt-6-astra-dlya-audita-bezopasnost-ru-1.jpg?v=1793263622)


**Что сделать:** поднять изолированный стенд, куда модель будет писать патчи, и зафиксировать базовую линию тестов.

**Зачем:** аудит без изолированной ветки и без «зелёного» прогона тестов до начала работы не даёт отличить поломку от находки. Если тесты падали до аудита, вы не поймёте, что сломал патч модели.

**Как проверить:** тесты зелёные, ветка создана, ключи лежат в `.env`, который не попадёт в git.

```bash
git clone <ваш-репозиторий> audit-stand && cd audit-stand
git switch -c ai-audit/run-01
mkdir -p .aisec/reports

pytest -q | tail -3
# ожидаемый вывод: 12 passed in 4.31s
```

Чек-лист перед первым запросом к модели:

- [ ] Python 3.11+ установлен (`python3 -V`)
- [ ] `jq` и `curl` доступны (`jq --version`)
- [ ] тесты до аудита зелёные (см. команду выше)
- [ ] API-ключ с доступом к выбранной модели получен
- [ ] задан лимит расходов на прогон (в консоли провайдера)
- [ ] `.env` добавлен в `.gitignore`

```bash
cat > .env <<'EOF'
AISEC_API_KEY=<ваш-api-ключ>
AISEC_BASE_URL=<базовый-url-api>
MODEL_ID=<model-id>
EOF
grep -q '^\.env$' .gitignore || echo '.env' >> .gitignore
set -a; . ./.env; set +a
echo "$MODEL_ID"
```

`<model-id>` — идентификатор модели из консоли провайдера: для Gemini 4 Carbon и для GPT-6 Astra он разный, точное значение сверьте с документацией. `<базовый-url-api>` — endpoint оттуда же. `set -a` экспортирует переменные из файла в окружение, поэтому они видны `curl` без ручного `export`.

**Пример:** объём аудита ограничиваем списком файлов, иначе прогон по всему репозиторию упрётся в квоту:

```bash
git ls-files '*.py' | head -20 > .aisec/scope.txt
wc -l < .aisec/scope.txt
# ожидаемый вывод: 20
```

Если у вас пока нет выстроенного процесса вокруг ИИ-помощников, начните с обзора [ИИ для программистов: помощники для кода в 2026](https://ai-release.org/guides/ii-dlya-koda.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide) — там разобрано, чем ассистент в редакторе отличается от отдельной модели для аудита.

## Сравнение Gemini 4 Carbon и GPT-6 Astra

| Критерий | Gemini 4 Carbon | GPT-6 Astra |
|---|---|---|
| Профиль | Один профиль — безопасность: найти, подтвердить, отремонтировать | Профиль в аудите безопасности в наших постах не описан — сверьтесь с документацией |
| Обнаружение уязвимости | Google отчиталась о преимуществе в этой проверке | Замеров в постах нет |
| Подтверждение эксплуатируемости | Заявлено как отдельный навык модели | Замеров в постах нет |
| Ремонт кода | Заявлено: пишет патч | Замеров в постах нет |
| Доступ | «В открытую розницу не выкидывают» — условия сверяйте с документацией | Контекст по модели — в [гайде по GPT-6 Astra](https://ai-release.org/guides/gpt-6-astra-ili-gpt-6-1-sol-chto-vybrat-dlya-raboty-cha.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide) |
| Цена | В наших постах не публиковалась | В наших постах не публиковалась |

Контекст релиза: две недели назад Google расширяла доступ к Gemini 4 Argon для платящих пользователей и разработчиков — это отдельная модель, не путайте её с Carbon. Carbon выходит вне открытой розницы, поэтому первым шагом проверяйте, что у вашего аккаунта вообще есть доступ к нужному `<model-id>`.

## Ключевой процесс: прогон аудита по трём стадиям
![Иллюстрация к разделу «Ключевой процесс: прогон аудита по трём стадиям»](https://ai-release.org/guides/img/gemini-4-carbon-ili-gpt-6-astra-dlya-audita-bezopasnost-ru-2.jpg?v=1793263629)


**Что сделать:** разбить аудит на три отдельных вызова модели — обнаружение, подтверждение, патч. Формат ответа задаётся JSON-схемой.

**Зачем:** смешивать стадии в одном запросе нельзя. Находка без воспроизведения — это гипотеза, а патч без подтверждённой находки ломает код на ровном месте. Три стадии дают три разных артефакта, каждый из которых проверяется отдельно.

**Как проверить:** на выходе каждой стадии появляется валидный JSON, а команда воспроизведения реально падает на уязвимом коде.

Схема находки, на которую опираемся:

```json
{
  "findings": [
    {
      "id": "F-001",
      "file": "app/api/orders.py",
      "line": 42,
      "cwe": "CWE-639",
      "severity": "high",
      "claim": "GET /orders/<id> не проверяет tenant_id",
      "repro": "pytest tests/test_authz.py::test_tenant_isolation",
      "patch_diff": "<унифицированный diff>"
    }
  ]
}
```

Стадия 1 — обнаружение:

```bash
FILE=app/api/orders.py
jq -n --arg model "$MODEL_ID" --rawfile code "$FILE" '{
  model: $model,
  temperature: 0,
  response_format: {type: "json_object"},
  messages: [
    {role: "system", content: "Ты аудитор безопасности. Верни только JSON: findings[] с полями id, file, line, cwe, severity, claim, repro, patch_diff. Если уязвимостей нет — findings: []."},
    {role: "user", content: ("Файл: " + $code)}
  ]
}' > .aisec/request.json

curl -sS "$AISEC_BASE_URL" \
  -H "Authorization: Bearer $AISEC_API_KEY" \
  -H "Content-Type: application/json" \
  --data @.aisec/request.json \
  | jq -r '.choices[0].message.content' > .aisec/reports/F-orders.raw.json

jq -e '.findings | length' .aisec/reports/F-orders.raw.json
# ожидаемый вывод: 2
```

Поля `messages`/`choices` — конверт OpenAI-совместимого API; если у вашего провайдера другой формат ответа, сверьтесь с документацией и поправьте `jq`-путь. `temperature: 0` убирает разброс между прогонами, иначе один и тот же файл даёт разные находки.

Стадия 2 — подтверждение. Команда `repro` должна падать на уязвимом коде: упавший тест и есть доказательство, что дыра рабочая.

```bash
for t in $(jq -r '.findings[].repro' .aisec/reports/*.raw.json | sort -u); do
  if $t >/dev/null 2>&1; then echo "NOT CONFIRMED: $t"; else echo "CONFIRMED: $t"; fi
done
# ожидаемый вывод:
# CONFIRMED: pytest tests/test_authz.py::test_tenant_isolation
# NOT CONFIRMED: pytest tests/test_orders.py::test_total
```

Стадия 3 — патч только по подтверждённым находкам:

```bash
jq -r '.findings[] | select(.severity=="high") | .patch_diff' .aisec/reports/*.raw.json > .aisec/patches.diff
git apply --check .aisec/patches.diff && git apply .aisec/patches.diff
pytest -q
```

`git apply --check` сначала проверяет применимость diff без изменения файлов — это дешевле, чем откатывать наполовину применённый патч.

## Проверка результата и приёмка
![Иллюстрация к разделу «Проверка результата и приёмка»](https://ai-release.org/guides/img/gemini-4-carbon-ili-gpt-6-astra-dlya-audita-bezopasnost-ru-3.jpg?v=1793263636)


**Что сделать:** собрать сводку по всем отчётам и прогнать приёмочный чек-лист.

**Зачем:** «модель что-то нашла» — не результат. Результат — таблица находок, где у каждой есть файл, строка, CWE и воспроизведение, а после патчей тесты снова зелёные.

**Как проверить:** сводка по severity и `git diff --stat` совпадают с ожиданиями, полный прогон тестов проходит.

```bash
jq -s '[.[].findings[]] | group_by(.severity) | map({severity: .[0].severity, n: length})' .aisec/reports/*.raw.json
# ожидаемый вывод: [{"severity":"high","n":2},{"severity":"medium","n":3}]

git diff --stat
# ожидаемый вывод: app/api/orders.py | 14 ++++++----
```

Приёмочный чек-лист прогона:

- [ ] у каждой находки заполнены `file`, `line`, `cwe`, `repro`
- [ ] каждый `repro` падал до патча и проходит после
- [ ] `pytest -q` после патчей зелёный
- [ ] находки с `NOT CONFIRMED` помечены как ложноположительные и не патчились
- [ ] в отчёте нет находок без `patch_diff`
- [ ] `time` прогона записан — он понадобится для сравнения Carbon и GPT-6 Astra на вашем коде

**Пример:** успех выглядит так — сводка `high: 2`, оба `repro` в статусе `CONFIRMED`, после `git apply` строка `12 passed`.

## Как выбрать

- Нужен весь цикл в одной модели — обнаружение, подтверждение эксплуатируемости и патч: берите Gemini 4 Carbon. Это единственная модель в наших постах, у которой такой профиль заявлен явно.
- Нужен ассистент на всё сразу (чат, объяснение кода, генерация тестов) и аудит лишь как эпизодическая задача: сравните GPT-6 Astra по [гайду по GPT-6 Astra и GPT-6.1 Sol](https://ai-release.org/guides/gpt-6-astra-ili-gpt-6-1-sol-chto-vybrat-dlya-raboty-cha.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide), но замеров по безопасности там нет — считайте это непроверенной гипотезой.
- Доступ к Carbon не подтверждён (в открытую розницу модель не выкидывают): прогоните шаги выше на GPT-6 Astra и сравните по числу подтверждённых находок, а не по впечатлениям. Условия и цены обеих моделей сверяйте с документацией — в постах их нет.

## Возможные проблемы и решения

**Проблема. Модель вернула прозу вместо JSON**

- Ошибка: `jq: error (at <stdin>:0): Cannot index string with number`
- Причина: не включён JSON-режим ответа или в промпте нет требования «верни только JSON»; температура выше нуля.
- Решение: выставить `temperature: 0` и `response_format: {"type": "json_object"}`, проверить результат перед разбором:
```bash
jq -e . .aisec/reports/F-orders.raw.json >/dev/null && echo OK
```

**Проблема. Прогон упирается в квоту на середине репозитория**

- Ошибка: `{"error":{"code":429,"message":"Resource has been exhausted (e.g. check quota).","status":"RESOURCE_EXHAUSTED"}}`
- Причина: слишком много параллельных запросов или исчерпан лимит аккаунта.
- Решение: снизить параллельность и разнести запросы по времени:
```bash
cat .aisec/scope.txt | xargs -P 2 -I{} bash -c 'sleep 2; ./audit_one.sh {}'
```
Если 429 повторяется — проверьте квоту в консоли провайдера, лимиты сверьте с документацией.

**Проблема. Патч не применяется**

- Ошибка: `error: patch failed: app/api/orders.py:42` / `error: app/api/orders.py: patch does not apply`
- Причина: модель строила diff по своей версии файла, а в ветке файл уже другой.
- Решение: передавать в запрос ровно то содержимое, что лежит в HEAD, и применять с трёхсторонним слиянием:
```bash
git show HEAD:app/api/orders.py > /tmp/current.py
git apply -3 .aisec/patches.diff
git diff --stat
```

## Резюме и следующие шаги

Для аудита безопасности кода берите Gemini 4 Carbon, если у вашего аккаунта есть к нему доступ: это единственная модель в наших материалах с заявленным циклом «найти → подтвердить → написать патч». GPT-6 Astra проверяйте тем же стендом и сравнивайте по числу подтверждённых находок, а не по описаниям.

## FAQ

**Gemini 4 Carbon — это режим Gemini 4 или отдельная модель?**
Отдельная модель с одним профилем — безопасность. Google описывает её как инструмент, который находит уязвимость, подтверждает её эксплуатируемость и пишет патч, а не как «модель умнее в чате».

**GPT-6 Astra находит уязвимости лучше, чем Gemini 4 Carbon?**
В наших постах нет ни одного замера GPT-6 Astra по аудиту безопасности. Google отчиталась о преимуществе Carbon в трёх проверках, но состав участников сравнения и цифры не приводятся, поэтому вопрос решается только собственным прогоном на вашем репозитории.

**Можно ли купить Gemini 4 Carbon в открытой продаже?**
По нашему посту — нет, версию «в открытую розницу не выкидывают». Каналы доступа и условия использования сверьте с документацией Google.

**Сколько стоит прогон аудита на Carbon или GPT-6 Astra?**
Цены обеих моделей в наших материалах не публиковались — сверьтесь с документацией провайдера и задайте лимит расходов в консоли до запуска.
