8.9 KiB
8.9 KiB
П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.