Compare commits

..
Author SHA1 Message Date
testclient-admin 8b3db0f060 security-analysis/policy.yml: low не блокирует merge
security/scan 0 findings, 0 blocking
security / scan (pull_request) Successful in 51s
security/review 0 findings, 0 blocking
security / review (pull_request) Successful in 15s
security / deep-audit (pull_request) Skipped
2026-09-01 05:55:29 +00:00
testclient-admin 2aeedc9f01 Merge pull request 'Add Level 0 + Level 1 + Level 2 security scanning' (#3) from add-security-scanning into main
Reviewed-on: #3
2026-08-30 12:37:29 +00:00
testclient-admin 2610530cd8 Level 0: security scanning for pull requests
security/scan 0 findings, 0 blocking
security / scan (pull_request) Successful in 57s
security/review 0 findings, 0 blocking
security / review (pull_request) Successful in 16s
security / deep-audit (pull_request) Skipped
2026-08-30 09:57:08 +00:00
testclient-admin 31ccd9fe46 Level 0: security scanning for pull requests 2026-08-30 09:57:07 +00:00
testclient-admin a757556f9d Level 0: security scanning for pull requests 2026-08-30 09:57:07 +00:00
2 changed files with 44 additions and 10 deletions
+36 -2
View File
@@ -591,6 +591,8 @@ jobs:
и прочее — для них есть свои агенты; дублирование только шумит.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. В отличие от
PR-ревью, у тебя нет дифа — смотри на весь проект.
@@ -657,6 +659,8 @@ jobs:
такой (это домен другого агента — auth). Не дублируй чужие домены.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект, не только на недавние изменения.
@@ -727,6 +731,8 @@ jobs:
пользовательского ввода. Не дублируй домены других агентов (auth, authz).
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект, не только на недавние изменения. Учти: детерминированные сканеры
(semgrep/gitleaks) уже гоняются на каждый PR — фокусируйся на том, что
@@ -797,6 +803,8 @@ jobs:
allowlist). Не дублируй домены других агентов.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект, не только на недавние изменения.
@@ -866,6 +874,8 @@ jobs:
криптографию, а не "нашёл строку похожую на ключ".
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект.
@@ -934,6 +944,8 @@ jobs:
не будет действовать недобросовестно.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект.
@@ -1008,6 +1020,8 @@ jobs:
выводом, находка проходит без реальной проверки.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Как проверять:
- Открой указанный файл и строки — действительно ли код выглядит так, как
@@ -1053,11 +1067,20 @@ jobs:
for domain in "${DOMAIN_ARR[@]}"; do
echo "=== домен: $domain ==="
set +e
./opencode run --agent "audit-$domain" --format json \
# timeout, не голый opencode: живьём поймали модель,
# зациклившуюся на несуществующем инструменте "list"
# (retry без самокоррекции) — без внешней границы
# такой домен держит job часами вместо ожидаемых
# единиц минут на пустом репозитории. 480с — щедрый
# запас над нормой (~1 минута на домен), не жёсткий
# лимит по содержанию: таймаут просто списывает
# домен как "без находок", а не блокирует остальные.
timeout 480 ./opencode run --agent "audit-$domain" --format json \
"Проведи аудит своего домена по всему репозиторию. Репозиторий уже склонирован в текущей директории (рабочая копия main)." \
> "/tmp/audit-results/$domain.jsonl" 2>"/tmp/audit-results/$domain.log"
CODE=$?
set -e
[ "$CODE" = "124" ] && echo " ПРЕВЫШЕН ТАЙМАУТ (480с) — домен $domain засчитан как без находок"
echo " код завершения: $CODE"
echo " --- stderr ---"
tail -30 "/tmp/audit-results/$domain.log" || true
@@ -1151,11 +1174,22 @@ jobs:
payload_text = json.dumps(cand, ensure_ascii=False)
with open(f"/tmp/audit-results/verify-{i}.jsonl", "w") as out, \
open(f"/tmp/audit-results/verify-{i}.log", "w") as errlog:
# timeout: та же причина, что и у доменных
# агентов (см. комментарий там) — верификатор
# читает те же read/grep/glob/lsp и рискует
# той же ловушкой на несуществующем "list".
timed_out = False
try:
subprocess.run(
["./opencode", "run", "--agent", "audit-verifier", "--format", "json",
f"Проверь эту находку (JSON), репозиторий уже склонирован рядом: {payload_text}"],
stdout=out, stderr=errlog,
stdout=out, stderr=errlog, timeout=480,
)
except subprocess.TimeoutExpired:
timed_out = True
if timed_out:
print(f" candidate {i} ({cand.get('_domain')}): ПРЕВЫШЕН ТАЙМАУТ верификатора (480с) — находка отброшена, не подтверждена")
continue
verdict_text = last_text(f"/tmp/audit-results/verify-{i}.jsonl")
try:
verdict = json.loads(verdict_text) if verdict_text else {}
+2 -2
View File
@@ -1,7 +1,7 @@
# Какие находки блокируют merge. Читает security.yml на каждом
# скане; отсутствие файла — те же значения по умолчанию.
security:
block_on:
- critical
- high
min_confidence: 0.7
scan_enabled: true
review_enabled: true