Files
huncode bb964e1f54
Build and deploy / deploy (push) Successful in 16s
revise May 2023 static analysis articles
2026-07-31 14:49:05 +03:00

11 KiB
Raw Permalink Blame History

П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 и чужие изменения не редактировались.