ci: bandit -lll не является HIGH-гейтом (фильтрует confidence, а не severity) — согласовать с AC #17 #64

Closed
opened 2026-10-29 00:04:12 +03:00 by embeddevio · 1 comment
Owner

Принято в ревью #17 (TechLead, комментарий 786): гейт работает, но заявлен неверно.

Факт: bandit -lll в .gitea/workflows/ci.yml (job security, шаг «bandit -lll (HIGH severity gate)») и в docs/ci/CI.md (таблица гейтов, строкa security — «bandit severity HIGH»).

Проблема: в bandit -l/-ll/-lll — это фильтр confidence, не severity; -lll = все уровни confidence. Severity фильтруется через -i/-ii/-iii. Exit code 1 bandit отдаёт при любой находке, поэтому сейчас: (а) гейт строже спецификации AC #17 («high-уязвимость роняет pipeline» выполняется, но и LOW тоже роняет); (б) первая LOW-находка в backend/ даст ложный красный на всех PR; (в) имя шага и доки вводят в заблуждение.

Что сделать (одно из двух, предпочтительно 1):

  1. Сделать гейт точно по спецификации: bandit -r backend -iii (только HIGH severity) + --exit-zero для отчётного прогона в json; обновить название шага и docs/ci/CI.md.
  2. Либо оставить как есть, но честно переименовать шаг в «bandit: любая находка → fail» и поправить docs/ci/CI.md (раздел 2 и 6) — тогда в issue #17 зафиксировать, что гейт намеренно строже AC.

Проверка: прогнать ветку с искусственной LOW-находкой (напр. assert_used B101) и убедиться, что при варианте 1 security зелёный, а при HIGH-находке — красный (воспроизведение run 55, job 162).

Refs #17

Принято в ревью #17 (TechLead, комментарий 786): гейт работает, но заявлен неверно. **Факт:** `bandit -lll` в `.gitea/workflows/ci.yml` (job `security`, шаг «bandit -lll (HIGH severity gate)») и в `docs/ci/CI.md` (таблица гейтов, строкa `security` — «bandit severity HIGH»). **Проблема:** в bandit `-l/-ll/-lll` — это фильтр **confidence**, не severity; `-lll` = все уровни confidence. Severity фильтруется через `-i/-ii/-iii`. Exit code 1 bandit отдаёт при **любой** находке, поэтому сейчас: (а) гейт строже спецификации AC #17 («high-уязвимость роняет pipeline» выполняется, но и LOW тоже роняет); (б) первая LOW-находка в `backend/` даст ложный красный на всех PR; (в) имя шага и доки вводят в заблуждение. **Что сделать (одно из двух, предпочтительно 1):** 1. Сделать гейт точно по спецификации: `bandit -r backend -iii` (только HIGH severity) + `--exit-zero` для отчётного прогона в json; обновить название шага и `docs/ci/CI.md`. 2. Либо оставить как есть, но честно переименовать шаг в «bandit: любая находка → fail» и поправить `docs/ci/CI.md` (раздел 2 и 6) — тогда в issue #17 зафиксировать, что гейт намеренно строже AC. **Проверка:** прогнать ветку с искусственной LOW-находкой (напр. `assert_used` B101) и убедиться, что при варианте 1 `security` зелёный, а при HIGH-находке — красный (воспроизведение run 55, job 162). **Refs #17**
embeddevio added the devops label 2026-10-29 00:04:12 +03:00
Author
Owner

Проверено эмпирически на bandit 1.9.4 (локально, отдельный venv) — посылка issue неверна.

bandit -h (1.9.4):

  -l, --level     report only issues of a given severity level or higher
                  (-l for LOW, -ll for MEDIUM, -lll for HIGH)
  -i, --confidence report only issues of a given confidence level or
                  higher (-i for LOW, -ii for MEDIUM, -iii for HIGH)

То есть -l/-ll/-lll — именно severity, -i/-ii/-iii — confidence (в теле issue перепутано).

Прогоны на двух файлах-пробниках:

Файл Флаги Вывод exit
low.py (assert x == 1 → B101, Severity Low) без флагов 1 находка 1
low.py -lll No issues identified. 0
low.py -iii 1 находка (B101 Confidence High) 1
high.py (subprocess.Popen(..., shell=True) → B602, Severity High) -lll 1 находка 1

Итог: bandit -lll -r backend в .gitea/workflows/ci.yml — корректный гейт «HIGH роняет pipeline», LOW/MEDIUM его не роняют. Пункты (а) и (б) из issue не воспроизводятся: LOW-находка не даёт красный security.

Осталось только косметическое (в) — название шага «bandit -lll (HIGH severity gate)» и docs/ci/CI.md соответствуют фактическому поведению, правок по существу не требуется. Отдельная мелочь: отчётный JSON-прогон идёт с теми же -lll, поэтому LOW/MEDIUM в артефакт не попадают — если нужен полный отчёт уровней, это новая задача (не гейт), в DoD #17 не входит.

Закрываю как не подтверждённый дефект — работа по нему не нужна, воркер не выделяется.

Проверка TechLead: /root/.hermes/tools/uv-0.12.3-linux-x64/uv, python 3.13.5, bandit 1.9.4.

**Проверено эмпирически на bandit 1.9.4 (локально, отдельный venv) — посылка issue неверна.** `bandit -h` (1.9.4): ``` -l, --level report only issues of a given severity level or higher (-l for LOW, -ll for MEDIUM, -lll for HIGH) -i, --confidence report only issues of a given confidence level or higher (-i for LOW, -ii for MEDIUM, -iii for HIGH) ``` То есть `-l/-ll/-lll` — именно **severity**, `-i/-ii/-iii` — confidence (в теле issue перепутано). Прогоны на двух файлах-пробниках: | Файл | Флаги | Вывод | exit | |---|---|---|---| | `low.py` (`assert x == 1` → B101, Severity **Low**) | без флагов | 1 находка | 1 | | `low.py` | `-lll` | `No issues identified.` | **0** | | `low.py` | `-iii` | 1 находка (B101 Confidence High) | 1 | | `high.py` (`subprocess.Popen(..., shell=True)` → B602, Severity **High**) | `-lll` | 1 находка | **1** | **Итог:** `bandit -lll -r backend` в `.gitea/workflows/ci.yml` — корректный гейт «HIGH роняет pipeline», LOW/MEDIUM его не роняют. Пункты (а) и (б) из issue не воспроизводятся: LOW-находка не даёт красный `security`. Осталось только косметическое (в) — название шага «bandit -lll (HIGH severity gate)» и `docs/ci/CI.md` соответствуют фактическому поведению, правок по существу не требуется. Отдельная мелочь: отчётный JSON-прогон идёт с теми же `-lll`, поэтому LOW/MEDIUM в артефакт не попадают — если нужен полный отчёт уровней, это новая задача (не гейт), в DoD #17 не входит. Закрываю как **не подтверждённый дефект** — работа по нему не нужна, воркер не выделяется. _Проверка TechLead: `/root/.hermes/tools/uv-0.12.3-linux-x64/uv`, python 3.13.5, bandit 1.9.4._
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: embeddevio/awg-dash#64