Files
huncode b78758dd3d
Build and deploy / deploy (push) Successful in 15s
revise April 2023 dependency security articles
2026-07-31 14:29:45 +03:00

8.9 KiB
Raw Permalink Blame History

П62 · 2023-04 · Безопасность зависимостей — три прохода саморевью

Рамка партии

  • Slug: editorial-2023-04-practice-dependency-security, editorial-2023-04-mechanism-dependency-security, editorial-2023-04-field-dependency-security.
  • Голос: М6, апрель 2023. Системный практик начинает с наблюдаемой цены update, различает границы артефактов и оставляет короткий проверяемый маршрут без выдуманного incident report или метрик.
  • Три материала не повторяют друг друга: практический triage advisory и достижимости; механизм manifest/lockfile/SBOM/runtime; полевой gate безопасного update и rollback.
  • Sidecar создаёт ровно пять файлов: этот review, web/scripts/upgrade-2023-04.mjs и три SVG с префиксом dependency-security-2023-. Скрипт не пишет articles.json, registry, README, очередь или Git.
  • Единственный fixture input помечен synthetic-dependency-security-input-v1. SYNTHETIC-ADVISORY-001, demo package names, versions, lockfile, SBOM, path и runtime labels — учебные значения; они не получены из scanner, CVE, registry, production lockfile, SBOM, trace или запуска приложения.

Проход 1 — факты и модель

  • Источники сверены 31.07.2026 по первичным или официальным страницам и их историческим датам, все существовали не позднее апреля 2023. Для triage используются GitHub Advisory Database, 14.11.2019, NTIA Minimum Elements for an SBOM, 12.07.2021 и NIST SP 800-218 SSDF v1.1 Final, 03.02.2022. Для модели добавлены npm Docs v7.24.2 package-lock.json, 22.09.2021, SPDX Specification 2.3.0, 2022 и npm Docs v8.19.4 npm ci / package.json, 26.10.2022. Источники везде названы рамкой или описанием формата, а не подтверждением состояния конкретного сервиса.
  • Перепроверена модель утверждений: advisory остаётся внешним сигналом; lockfile — synthetic resolved tree; SBOM — synthetic inventory record; supplied path — hypothesis для review. Ни один слой не назван доказательством CVE, exploitability, фактической загрузки модуля или production impact.
  • triageSyntheticAdvisory() сопоставляет только заданные package/version strings и возвращает vulnerabilityStatus: not-determined-by-fixture; достижимость всегда not-assessed-by-fixture. buildSyntheticInventory() намеренно оставляет runtime как not-observed-by-fixture и deployment inventory как not-proven-by-fixture.
  • planSyntheticSafeUpdate() требует явный synthetic project contract, сравнивает только labels, хранит named gates как synthetic declarations и всегда отдаёт compatibility и safety в состоянии not-proven-by-fixture. rollbackSyntheticSafeUpdate() возвращает лишь version label и не заявляет deployment effect. В fixture есть 22 assertions, включая invalid kind, malformed inventory, отсутствующий package/project contract, неполный gate и неверный candidate; отсутствуют scanner, network, installer, test runner, package download и runtime execution.

Проход 2 — язык, полнота и объём

  • В первых двух абзацах каждой статьи названы исходная проблема и цена: ложная аварийность или непросмотренный риск для advisory; неверное смешение manifest, lockfile и inventory; риск resolver/runtime regressions при update. После этого текст идёт по порядку «симптом → причина → проверка → действие».
  • У каждой статьи есть доступная таблица, воспроизводимый code/fixture, упорядоченный маршрут, SVG с содержательными alt и figcaption, отдельный раздел ограничения модели и минимум три официальных или первичных источника. Practical article не повторяет механизм, а field article не выдаёт named gates за результаты их исполнения.
  • npm run audit:draft -- scripts/upgrade-2023-04.mjs измерил основной текст без списка источников: practice — 8 613 знаков, mechanism — 8 592, field — 9 048. Все три значения находятся в заданном диапазоне 8–11 тыс. и в общем стандарте 5–15 тыс.
  • Редакционный проход удалил общий язык и анахронизмы: нет неназванных измерений, «универсального» процесса, fabricated scanner result, CVE, runtime PASS или обещания, что обновление автоматически безопасно. М6 использует точные объекты: package@version, commit, artifact identity, gate, environment, evidence и rollback condition.

Проход 3 — SVG, безопасность и выпуск

  • Три SVG разделяют роли: advisory-triage показывает входной сигнал, lockfile/SBOM и вопрос достижимости; lockfile-sbom — четыре границы данных; safe-update-gate — evidence gates и отдельный rollback. Подписи и alt прямо говорят, что это схемы synthetic процесса, а не scanner report или production trace.
  • xmllint --noout принял все три SVG. Safety scan не обнаружил script, foreignObject, inline handlers, внешние href/src, url(http...) или data: assets. Файлы не содержат пользовательского ввода, интерактивного поведения или raster embedded content.
  • Sharp отрендерил SVG на ширине 375 px: 375×396, 375×411 и 375×417 px. Ручной просмотр PNG подтвердил читаемость заголовков, шагов, стрелок и нижних подписей; обрезанных labels и перекрытий нет.
  • Выпускной проход подтверждает только sidecar: node --check — PASS; fixture — PASS 22/22; draft audit — PASS; import-safe export содержит ровно три revision, CLI JSON совпадает с import и нет полей date/author; XML, safety scan и Sharp-review — PASS. Registry, README, articles.json, очередь, документация, Git, commit и push не затрагивались.

Интеграционная приёмка

  • Основной редактор добавил явный reject для malformed inventory и отсутствующего project contract: валидный по advisory input больше не может завершиться исключением. Титулы npm-источников уточнены до legacy-версий v7.24.2 (22.09.2021) и v8.19.4 (26.10.2022). После исправлений fixture — PASS 22/22.
  • Ревизии добавлены в web/data/editorial-revisions.mjs поверх трёх исходных slug. web/data/articles.json, даты и авторы не изменялись; в registry 175 уникальных ревизий без дубликатов.
  • Строгий аудит npm run audit:articles -- editorial-2023-04-practice-dependency-security editorial-2023-04-mechanism-dependency-security editorial-2023-04-field-dependency-security — PASS: у каждой статьи 1 figure, 1 table и 1 code example.
  • Production-сборка cd web && npm run build — PASS: 374 статические страницы. README обновлён с 181/358 до 184/358 принятых материалов; осталось 174.