Compare commits

...
Author SHA1 Message Date
testclient-admin b62be38958 security-analysis/policy.yml: critical блокирует 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 2m50s
security / deep-audit (pull_request) Skipped
2026-09-01 07:34:38 +00:00
testclient-admin 62228d1995 Merge pull request 'security-analysis/policy.yml: critical блокирует merge' (#12) from mcp-proxy-policy-update-285dd062 into main 2026-09-01 06:44:48 +00:00
testclient-admin 2801e6616e security-analysis/policy.yml: critical блокирует 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 4m46s
security / deep-audit (pull_request) Skipped
2026-09-01 06:44:46 +00:00
testclient-admin 28d624be2d Merge pull request 'security-analysis/policy.yml: low блокирует merge' (#11) from mcp-proxy-policy-update-e4ba60b2 into main 2026-09-01 06:29:09 +00:00
testclient-admin 42aaa6d56b security-analysis/policy.yml: low блокирует merge
security/scan 0 findings, 0 blocking
security / scan (pull_request) Successful in 54s
security/review 0 findings, 0 blocking
security / review (pull_request) Successful in 16s
security / deep-audit (pull_request) Skipped
2026-09-01 06:29:08 +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 45 additions and 10 deletions
+36 -2
View File
@@ -591,6 +591,8 @@ jobs:
и прочее — для них есть свои агенты; дублирование только шумит. и прочее — для них есть свои агенты; дублирование только шумит.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. В отличие от Тебе дают путь к репозиторию, уже склонированному локально. В отличие от
PR-ревью, у тебя нет дифа — смотри на весь проект. PR-ревью, у тебя нет дифа — смотри на весь проект.
@@ -657,6 +659,8 @@ jobs:
такой (это домен другого агента — auth). Не дублируй чужие домены. такой (это домен другого агента — auth). Не дублируй чужие домены.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект, не только на недавние изменения. проект, не только на недавние изменения.
@@ -727,6 +731,8 @@ jobs:
пользовательского ввода. Не дублируй домены других агентов (auth, authz). пользовательского ввода. Не дублируй домены других агентов (auth, authz).
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект, не только на недавние изменения. Учти: детерминированные сканеры проект, не только на недавние изменения. Учти: детерминированные сканеры
(semgrep/gitleaks) уже гоняются на каждый PR — фокусируйся на том, что (semgrep/gitleaks) уже гоняются на каждый PR — фокусируйся на том, что
@@ -797,6 +803,8 @@ jobs:
allowlist). Не дублируй домены других агентов. allowlist). Не дублируй домены других агентов.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект, не только на недавние изменения. проект, не только на недавние изменения.
@@ -866,6 +874,8 @@ jobs:
криптографию, а не "нашёл строку похожую на ключ". криптографию, а не "нашёл строку похожую на ключ".
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект. проект.
@@ -934,6 +944,8 @@ jobs:
не будет действовать недобросовестно. не будет действовать недобросовестно.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь Тебе дают путь к репозиторию, уже склонированному локально. Смотри на весь
проект. проект.
@@ -1008,6 +1020,8 @@ jobs:
выводом, находка проходит без реальной проверки. выводом, находка проходит без реальной проверки.
Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp. Тебе НЕЛЬЗЯ писать, править или исполнять код — только read/grep/glob/lsp.
Инструмента "list" НЕ существует — для просмотра содержимого
директорий используй glob (например "**/*"), а не list.
Как проверять: Как проверять:
- Открой указанный файл и строки — действительно ли код выглядит так, как - Открой указанный файл и строки — действительно ли код выглядит так, как
@@ -1053,11 +1067,20 @@ jobs:
for domain in "${DOMAIN_ARR[@]}"; do for domain in "${DOMAIN_ARR[@]}"; do
echo "=== домен: $domain ===" echo "=== домен: $domain ==="
set +e 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)." \ "Проведи аудит своего домена по всему репозиторию. Репозиторий уже склонирован в текущей директории (рабочая копия main)." \
> "/tmp/audit-results/$domain.jsonl" 2>"/tmp/audit-results/$domain.log" > "/tmp/audit-results/$domain.jsonl" 2>"/tmp/audit-results/$domain.log"
CODE=$? CODE=$?
set -e set -e
[ "$CODE" = "124" ] && echo " ПРЕВЫШЕН ТАЙМАУТ (480с) — домен $domain засчитан как без находок"
echo " код завершения: $CODE" echo " код завершения: $CODE"
echo " --- stderr ---" echo " --- stderr ---"
tail -30 "/tmp/audit-results/$domain.log" || true tail -30 "/tmp/audit-results/$domain.log" || true
@@ -1151,11 +1174,22 @@ jobs:
payload_text = json.dumps(cand, ensure_ascii=False) payload_text = json.dumps(cand, ensure_ascii=False)
with open(f"/tmp/audit-results/verify-{i}.jsonl", "w") as out, \ with open(f"/tmp/audit-results/verify-{i}.jsonl", "w") as out, \
open(f"/tmp/audit-results/verify-{i}.log", "w") as errlog: open(f"/tmp/audit-results/verify-{i}.log", "w") as errlog:
# timeout: та же причина, что и у доменных
# агентов (см. комментарий там) — верификатор
# читает те же read/grep/glob/lsp и рискует
# той же ловушкой на несуществующем "list".
timed_out = False
try:
subprocess.run( subprocess.run(
["./opencode", "run", "--agent", "audit-verifier", "--format", "json", ["./opencode", "run", "--agent", "audit-verifier", "--format", "json",
f"Проверь эту находку (JSON), репозиторий уже склонирован рядом: {payload_text}"], 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") verdict_text = last_text(f"/tmp/audit-results/verify-{i}.jsonl")
try: try:
verdict = json.loads(verdict_text) if verdict_text else {} verdict = json.loads(verdict_text) if verdict_text else {}
+3 -2
View File
@@ -1,7 +1,8 @@
# Какие находки блокируют merge. Читает security.yml на каждом
# скане; отсутствие файла — те же значения по умолчанию.
security: security:
block_on: block_on:
- critical - critical
- high - high
- low
min_confidence: 0.7 min_confidence: 0.7
scan_enabled: true
review_enabled: true