11 KiB
11 KiB
П63 · 2023-05 · Статический анализ — три прохода саморевью
Рамка пакета
- Slug:
editorial-2023-05-practice-static-analysis,editorial-2023-05-mechanism-static-analysis,editorial-2023-05-field-static-analysis. - Голос: М6, май 2023. Автор пишет как инженер надёжности и безопасности: различает контракт инструмента, project context и policy decision; не заменяет их риторикой, личным опытом или непроверенными цифрами.
- Три статьи не повторяют друг друга: practice разбирает классификацию шумного сигнала; mechanism отделяет SARIF, rule, result и context record; field фиксирует keep/tune/scoped suppress, owner, expiry и rollback.
- Sidecar создаёт ровно пять файлов: этот review,
web/scripts/upgrade-2023-05.mjsи три SVG с префиксомstatic-analysis-2023-. Скрипт не записываетarticles.json, registry, README, очередь, Git или чужие файлы. - Fixture использует только
synthetic-static-analysis-input-v1. URI, строка, ruleId, revision, fingerprint, message и context — учебные значения, созданные в памяти. Они не получены из репозитория, SARIF-файла, scanner, CI, CVE, trace, baseline или production runtime.
Проход 1 — источники, факты и границы
- Источники перепроверены 31.07.2026 по первичным или официальным страницам; все были опубликованы до мая 2023. OASIS SARIF 2.1.0 имеет статус OASIS Standard и дату 27.03.2020; рядом указан его JSON Schema. Semgrep v1.20.0 опубликован 28.04.2023; в исходнике CLI с этим тегом версии объявлена опция
--sarif. NIST SP 800-218 SSDF v1.1 имеет статус Final от 03.02.2022. - Формулировки разграничены: SARIF описан как format interchange, а не как модель application; Semgrep source подтверждает наличие CLI output option в указанной версии, а не запуск этой версии здесь; SSDF используется как рамка владения и evidence, а не как доказательство эффективности правил.
- Одна опасная категория названа без ложного verdict: конструкция команды из недоверенного значения. Rule match не назван finding, CVE, доказанной достижимостью, exploitability или production risk. У result сохраняются
sourceRead: not-performed-by-fixture,scannerExecution: not-performed-by-fixture,reachability: not-assessed-by-fixtureиsecurityOutcome: not-determined-by-fixture. buildSyntheticSarifLog()строит один учебный SARIF 2.1.0 log только в памяти;classifySyntheticSignal()принимает отдельную context record и возвращаетcontext-incomplete, если нет asset, entry point, trust boundary, owner или release scope.planSyntheticRuleDecision()допускает только keep, tune и scoped suppress; global disable не является допустимым action. После независимой приёмки он принимает только календарные ISO-даты, требуетreviewBy <= expiresOnдля suppress и отклоняет tune с прежней revision.rollbackSyntheticRuleDecision()возвращает только state учебного плана и не заявляет config effect.- В fixture 24 детерминированные assertion: есть positive path и negative cases для неверного kind, другой версии SARIF, отсутствующей trust boundary, global disable, suppress без scope/expiry, несуществующей календарной даты, review после expiry и tune без требуемых evidence или с прежней revision. В коде отсутствуют file I/O, network, shell execution, scanner invocation, package installation, реальный исходный код и real-world output.
Проход 2 — голос, полнота и объём
- Первые два абзаца каждой статьи сначала называют наблюдаемую проблему и цену: потеря сигнала после глобального отключения; ошибка переноса SARIF-полей в project decision; отсутствие owner/scope/rollback у исключения. Затем материал проходит по маршруту «симптом → причина → проверка → действие».
- В каждом материале есть отдельная доступная таблица, invocable synthetic fixture, упорядоченная последовательность, содержательная SVG-фигура с
altи подписью, ограничения модели, rollback и следующий шаг. Rule YAML явно помечен учебным fragment и не выдаётся за запущенное правило. npm run audit:draft -- scripts/upgrade-2023-05.mjsизмерил основной текст без списка источников: practice — 8 253 знака, mechanism — 8 382, field — 9 442. Все три статьи находятся в требуемом диапазоне 5–15 тыс. и в целевом диапазоне 8–10 тыс. знаков для этой темы.- Редакционный проход убрал универсальные обещания и несуществующий опыт: нет заявлений об actual false-positive rate, coverage, real findings, CVE, сканировании, runtime, эффективности policy или результатах команды. М6-язык называет объекты и границы: rule revision, SARIF version, result fingerprint, trust boundary, owner, scope, expiry, rule diff и config rollback.
Проход 3 — визуалы, безопасность и выпуск
triage-funnelобъясняет путь от rule/result через форму и context к разрешённым решениям;rule-contextразделяет владельцев данных;decision-gateпоказывает evidence для keep/tune/suppress, отдельный масштаб global policy и rollback. После первого рендера узкие подписи во второй и третьей схеме были перепроектированы; повторный просмотр на 375 px подтвердил, что labels не обрезаются и последовательность читается.- Все три SVG прошли
xmllint --noout. Safety scan не нашёлscript,foreignObject, inline event handler,javascript:илиdata:image. В SVG нет внешних ресурсов, пользовательского ввода, интерактивного кода или embedded raster. - Sharp повторно отрендерил фигуры на ширине 375 px и ручной просмотр PNG подтвердил видимые заголовки, стрелки, критичные поля и нижние оговорки. Фигуры описывают synthetic policy contract, не scanner report и не production trace.
- Выпускной проход подтверждает только sidecar:
node --check— PASS; fixture — PASS 24/24 после независимого model review; draft audit — PASS; import-safe export содержит ровно три revision безdate/author; XML, SVG safety scan и Sharp review — PASS. Registry, README,articles.json, очередь, Git, commit и push не затрагивались. Интеграцию и отдельную редакторскую приёмку оставлены главному агенту.
Приёмка главного редактора
- Источники сверены отдельно от текста: OASIS SARIF подтверждает статус OASIS Standard и дату 27.03.2020; GitHub API подтверждает публикацию Semgrep v1.20.0 28.04.2023, а raw source того же тега — опцию
--sarif; NIST CSRC фиксирует SP 800-218 Final от 03.02.2022. Ни один из этих источников не используется как свидетельство запуска анализатора в этом репозитории. - Независимый model review нашёл два пропуска. План раньше принимал невозможную календарную дату и permit-ил
tuneс прежней rule revision; для suppress также не было отношения междуreviewByиexpiresOn. Добавлены строгая проверка ISO-даты, правилоreviewBy <= expiresOn, запрет на неизменённую revision и три negative case. Fixture теперь проходит 24/24, а не только проверяет наличие непустых строк. - Визуальный review на 375 px подтвердил читаемость трёх SVG. На воронке triage диагональный крест пересекал подпись о global disable; его заменили компактной иконкой, чтобы запрет и причина не конкурировали за один слой.
- После подключения ровно трёх revision строгий audit подтвердил 8 426 / 8 382 / 9 814 знаков, по одной фигуре, таблице и примеру в каждой статье; импортный registry содержит 184 уникальные revision. Production build прошёл с 374 статическими страницами.
articles.jsonи чужие изменения не редактировались.