vyvchy
    Теми розділу

    11 · Security для QA

    Ланцюг постачання і залежності

    Зміст

    Найгучніші інциденти останніх років приїхали не через баг у вашому коді. Вони приїхали пакетом, якого ніхто в команді не читав, або оновленням від вендора, якому довіряли за замовчуванням. Поля, куди вставити пейлоад, тут немає: є , реєстр пакетів і дерево залежностей на сотні сторонніх компонентів.

    Щодня це стосується вас дуже приземлено: прочитати звіт сканера й вирішити, чи це блокер; зрозуміти, що означає червоний security-крок у пайплайні; прийняти пулреквест від бота. Глава — канонічний виклад теми на сайті: означення й стоять у главі про модель загроз, гігієна секретів у CI — у главі про секрети та конфігурацію в CI, а тут — кут ланцюга постачання.

    Збої ланцюга постачання: A03 у OWASP Top 10:2025

    (Software Supply Chain Failures) — це поламки чи інші компрометації процесу збирання, дистрибуції або оновлення ПЗ; найчастіша причина — вразливості або зловмисні зміни в сторонньому коді, інструментах та інших залежностях. Категорія A03:2025 розширює стару A06:2021 Vulnerable and Outdated Components на весь екосистемний ланцюг. У самій десятці вона стоїть третьою, а от в опитуванні спільноти очолила список: рівно 50% респондентів поставили її на №1 — і ці два числа плутають постійно.

    Пастка тут статистична. З відповідними пов'язано лише 11 CVE, бо такі збої важко виявляти, — але там, де їх таки тестували, категорія дала найвищу середню частоту, 5,19%. Мала кількість записів означає сліпу пляму інструментів, а не безпеку продукту.

    Ознаки вразливості — три питання до команди: чи є облік версій усіх компонентів, включно з транзитивними; чи є регулярне сканування й підписка на бюлетені безпеки; чи не захищений пайплайн CI/CD слабше за системи, які він збирає й розгортає. Запобігання дзеркальне: централізовано вести , моніторити CVE, NVD і OSV, брати компоненти лише з офіційних джерел і віддавати перевагу підписаним пакетам.

    Сценарії варто знати поіменно: Log4Shell (CVE-2021-44228) — zero-day віддаленого виконання коду в Apache Log4j; Shai-Hulud 2025 року — «перший успішний самопоширюваний npm-хробак». А SolarWinds показує, чому дату треба атрибутувати: сторінка A03 пише «The 2019 SolarWinds compromise that led to ~18,000 organizations being compromised», шпаргалка Software Supply Chain Security — «The 2020 SolarWinds and 2021 Codecov incidents are excellent real-world examples of this». Обидва джерела канонічні й розходяться, тож рік називають разом із джерелом, а не як усталений факт.

    Поверхом нижче стоїть A08:2025 Software or Data Integrity Failures: код та інфраструктура, які не захищають від того, щоб невалідні або недовірені код чи дані трактувалися як довірені й валідні, — і саме на нижчому рівні, ніж A03. Контроль симетричний: або рівноцінні механізми, що підтверджують й незміненість.

    Де саме рветься ланцюг

    Ланцюг постачання ПЗ шпаргалка OWASP означує цитатою з NIST: «a collection of steps that create, transform, and assess the quality and policy conformance of software artifacts». Рветься він по найслабшій ланці: дефект в одному компоненті — вразливій сторонній залежності або хибно налаштованому VCS — ставить під весь ланцюг. Категорій загроз чотири, і залежності лише одна з них.

    підміна коду до збірки

    підміна артефакту без правки коду

    вразлива або скомпрометована залежність

    компрометація на доставці

    Вихідний код

    Середовище збірки

    Залежності: прямі й транзитивні

    Артефакт

    Розгортання і рантайм

    Збій ланцюга

    підміна коду до збірки

    підміна артефакту без правки коду

    вразлива або скомпрометована залежність

    компрометація на доставці

    Вихідний код

    Середовище збірки

    Залежності: прямі й транзитивні

    Артефакт

    Розгортання і рантайм

    Збій ланцюга

    Вектори названо поіменно: , компрометація інфраструктури постачальника, крадіжка сертифікатів підпису коду, експлуатація CI/CD. Два контролі — прямо про QA. Постачальника оцінюють до інтеграції, і серед питань стоять «чи проєкт активно підтримують» і «чи має він достатнє тестове покриття з правилами, релевантними безпеці». Рев'ю коду до злиття шукає не лише випадкові дефекти, а навмисно закладений шкідливий код. Решта інженерна: збірки ізольовані й одноразові, компоненти беруть тільки цифрово підписані, а фінальний бінарник теж скануть — «one should not simply assume that the final result is secure».

    Термін шпаргалка цитує зі SLSA 1.0: «the verifiable information about software artifacts describing where, when and how something was produced»; генерує його платформа збірки, а не локальна машина розробника.

    Вразлива залежність: від знахідки до рішення

    Проєкти делегують стороннім бібліотекам цілі класи операцій, і плата одна: «the security posture of the real application is now resting on it». (vulnerable dependency) визначається через «відому вразливість», а та має точне формулювання: «a "known vulnerability" is a publicly reported flaw in a package».

    Звідси сліпа пляма. За дослідник і постачальник разом випускають CVE; за CVE не завжди створюють, не завжди потрапляє в глобальну базу — і інструменти виявлення потенційно сліпі. Чистий звіт сканера доводить відсутність записів у базах, а не відсутність вразливостей.

    Далі — процедура, названа джерелом не срібною кулею, а основою під адаптацію. Чотири випадки:

    • Фікс існує. Оновлюють спокійно лише за наявності автоматизованих тестів — модульних, інтеграційних, функціональних або security — на функції, що використовують зачеплену залежність. Тести тут лагодження; критерій випуску — «all tests succeed».
    • Фікса ще немає. Ігнор має покривати тільки цей CVE: пакет буває зачеплений кількома вразливостями, у кожної свій номер.
    • Саморобний патч. Потрібен , який імітує вразливість: він доводить дієвість патча і стежить, щоб той не зник пізніше.
    • Постачальник ще не знає — знахідка з допису про повне розкриття або з пентесту, і CVE немає.

    Дві межі знімають половину суперечок. Транзитивну вразливість лікують на прямій залежності, бо втручання в транзитивну часто б'є по стабільності. А рішення «приймаємо ризик» ухвалює Chief Risk Officer на основі технічного висновку команди й показників CVSS, а не сама команда. І пара, яку постійно змішують: вразлива залежність не дорівнює зловмисній.

    SCA: що роблять npm audit і pip-audit — і чого не роблять

    Спершу чесно про термін. (Software Composition Analysis) канон розкриває як абревіатуру й називає місце в пайплайні, але означення не дає жодне джерело: у словнику ISTQB software composition analysis має нуль входжень. Місце в процесі описує : , і SCA або інструменти відстеження залежностей запускають під час стандартних автоматизованих релізних або за регулярним розкладом.

    • npm audit надсилає опис залежностей у реєстр і просить звіт про відомі вразливості. Технічно це мережева операція: npm формує JSON з іменами й версіями кожного пакета в дереві й робить POST у реєстр. Довгі ланцюжки у звіті звуться (meta-vulnerability) — залежність вразлива через залежність від вразливих версій вразливого пакета, і частину таких знахідок не можна полагодити автоматично.
    • pip-audit сканує Python-оточення на пакети з відомими вразливостями; джерело даних назване поіменно — Python Packaging Advisory Database через PyPI JSON API.
    • Відтворюваність: npm audit вимагає ; із --no-package-lock дерево перебудовується щоразу й результати можуть відрізнятися на кожному прогоні.

    Контракт із CI — місце, де читання ламається найчастіше. За замовчуванням npm audit падає на будь-якій знахідці, а --audit-level цю межу зсуває: він задає мінімальний рівень, з якого команда завершується ненульовим кодом (шкала значень — null, info, low, moderate, high, critical, none). Пастку називає саме джерело: не фільтрує звіт, а лише зсуває поріг фейлу, тож зелений ран із --audit-level=high не означає, що середніх знахідок немає. У pip-audit шкала простіша (0 і 1), зате код виходу не пригнічується.

    Найнеочевидніше: ненульовий код виходу не доводить нової вразливості. Коли політика свіжості релізу (min-release-age, before) не дає npm audit fix поставити пропатчену версію, npm лишає пакет на вразливій версії, попереджає, що фікс заблоковано, і виходить із ненульовим кодом. Тобто червоний крок означає три різні речі: «вразливість без фікса», «фікс є, але його блокує наша ж політика» і «поріг налаштований не так, як думає команда» — про побудову придатного гейта далі йдеться в главі про автоматизацію.

    Чого SCA не робить: це не коду («it analyzes dependency trees, not code»), не захист від зловмисних пакетів і не гарантія повноти бази; фіди «not immune to extraneous or spam reports», тож шум гасять точково, за ID звіту. І в пайплайні це одна з п'яти дій: перевірити підписи або provenance, валідувати SBOM, прогнати SCA і статичний аналіз, ставити залежності строго за локом.

    Lock-файл, скрипти встановлення й пакет, якого ви не замовляли

    Механіка package.json і команд пакетного менеджера живе в главі про модулі та npm; тут lock-файл цікавить рівно як контроль безпеки. Дає він детерміновані інсталяції й вимушену узгодженість очікувань у команді, а шпаргалка ланцюга постачання формулює це як захід: щоб зменшити шанс непомітно підтягнути скомпрометовану чи вразливу версію, залежності обмежують конкретною версією, раніше перевіреною як легітимна й безпечна.

    Сам по собі файл не гарантує нічого. Виявивши розбіжність між package.json і локом, і npm, і Yarn компенсують її за маніфестом — ставлять інші версії, ніж записані в локу, і «весь сенс lock-файла зводиться нанівець». Контролем він стає, лише коли дотримання вимагають: тоді будь-яка розбіжність перериває встановленняyarn install --frozen-lockfile або npm ci. Прапорці встановлення теж версіонують: рекомендація — закомітити .npmrc, щоб вони проходили рев'ю разом із локом. Шпаргалка CI/CD Security додає другу половину контролю — пін версії і звірку цілісності завантаженого пакета з відомим добрим хешем; обидві дії, каже вона, можна виконати «via a platform's "lock" or similar file», а далі окремим реченням: «Remember to enforce the lockfile».

    Друга поверхня — момент встановлення. npm будується на скриптах, які пакет оголошує й які виконуються в конкретних точках його інсталяції, тож зловмисники «run any arbitrary command when their package is installed». Важіль --ignore-scripts має названу межу: команди, чиє призначення — запустити скрипт (npm test, npm start), свій скрипт усе одно виконають. Дрібниця з наслідком для аудиту: --omit не звужує лок — залежності далі резолвляться й потрапляють у package-lock.json, просто не лягають на диск.

    Третя поверхня — ім'я пакета: не пакет, а процес його розв'язання. Шпаргалка CI/CD Security означує це як dependency chain abuse і називає три способи — плутанина залежностей, і захоплення акаунта супровідника.

    • Тайпосквотинг (typosquatting) — шкідливі модулі під іменами, дуже схожими на популярні. Ім'я пакета в пулреквесті читають так само уважно, як URL у фішинговому листі.
    • Плутанина залежностей (dependency confusion) — пакет у публічному реєстрі з іменем вашого внутрішнього приватного, але з вищим номером версії. Захист названо: імена зі (@yourorg/package-name).
    • (slopsquatting) — вектор, що експлуатує AI-асистентів: модель галюцинує неіснуючу назву пакета, а зловмисник публікує під нею шкідливий. Перевірка з джерела пряма: npm view <package-name> перед встановленням будь-якого запропонованого AI пакета. Ширша тема AI-коду належить главі про безпеку й приватність при роботі з AI.

    Плагіни самої CI-платформи — той самий клас: вони збільшують .

    SBOM і граф залежностей: інвентар складу й шлях компонента

    SBOM (Software Bill of Materials) — машиночитний інвентар компонентів; (dependency graph) — орієнтований граф, що показує відношення між ними. SBOM відповідає «що всередині», граф — «чому воно всередині». Мінімальний склад названо точно: ім'я й версія в канонізованій формі, унікальний ідентифікатор пакета (purl), контрольна сума (бажано SHA256) і ребра зв'язків — пряма проти транзитивної залежності. Генерують SBOM під час збірки, а не руками, у точно названий момент — після розв'язання залежностей і перед пакуванням; форматів два стандартних, SPDX і CycloneDX, і на реліз потрібен щонайменше один машиночитний SBOM, підписаний: «unsigned SBOMs can be forged».

    Поруч живе (Vulnerability Exploitability eXchange) — машиночитний документ про те, чи відома вразливість реально зачіпає конкретний продукт і за яких умов. Це аргумент із джерелом замість «ми вирішили, що не страшно».

    Ні

    Так

    Транзитивна

    Пряма

    Знахідка: CVE у складі продукту

    Зіставити CVE з компонентами SBOM

    VEX: чи зачіпає нас?

    Зафіксувати обґрунтування, дії немає

    Пряма чи транзитивна?

    Граф: знайти шлях і прямого предка

    Оновити пряму залежність

    Тести на функції, що використовують залежність

    Перегенерувати SBOM: компонента немає

    Ні

    Так

    Транзитивна

    Пряма

    Знахідка: CVE у складі продукту

    Зіставити CVE з компонентами SBOM

    VEX: чи зачіпає нас?

    Зафіксувати обґрунтування, дії немає

    Пряма чи транзитивна?

    Граф: знайти шлях і прямого предка

    Оновити пряму залежність

    Тести на функції, що використовують залежність

    Перегенерувати SBOM: компонента немає

    Останній крок і є перевіркою фікса, придатною для QA: не «PR змерджено», а «компонента більше немає у складі».

    Граф на платформі GitHub будується з маніфестів і lock-файлів репозиторія, тож він рівно настільки повний, наскільки повні ці файли, і «порожній граф» є дефектом вхідних даних. По кожній залежності видно версію, ліцензію, файл-джерело й наявність відомих вразливостей, а для транзитивних — шлях, яким залежність потрапила у проєкт. Політика CI названа окремо: валити пайплайн, якщо впала генерація SBOM, але не валити на низькопріоритетних знахідках, які не потребують дії — їх виносять на дашборд .

    Dependabot: три різні речі під одним іменем

    У розмові це злипається в одне, а насправді механізмів три, і плутанина коштує пріоритетів.

    • Алерти. Тригерів два: нова вразливість у GitHub Advisory Database або зміна графа залежностей; скан іде по гілці за замовчуванням. В алерті — зачеплений файл, опис із severity і версія з фіксом, якщо така є, а сам алерт призначають на людину, команду або агента, щоб він не завис нічий.
    • Security-апдейти — автоматичні пулреквести на залежності з відомими вразливостями.
    • Version-апдейти — пулреквести, що тримають залежності свіжими, навіть коли вразливостей немає: гігієна, а не реакція на інцидент. Вмикаються окремо, файлом dependabot.yml, і за замовчуванням чекають 3 дні від релізу версії; на security-апдейти це не поширюється. CI-пайплайн теж вважається залежністю: звіряються рефи екшенів і перевикористовуваних воркфлоу.

    Роль людини названа дослівно: «check that your tests pass, review the changelog and release notes ... and then merge it». Автомердж за самим зеленим чекбоксом цієї вимоги не виконує.

    Межі, через які «алертів немає» не дорівнює «вразливостей немає»: алерти не ловлять кожної проблеми, база має , тригерять лише перевірені GitHub advisory, архівні репозиторії не скануються взагалі, а для GitHub Actions алерти генеруються лише для екшенів на семантичному версіюванні, не на SHA. Плюс: при увімкненні приходять сповіщення лише про нові знахідки, а якщо пулреквести ігнорують, сам ставить оновлення на паузу.

    І пастка, яку ловлять на прогоні: секрети недоступні воркфлоу, які тригернули події Dependabot, а незаданий секрет повертає порожній рядок. Тест, що мовчки пішов без авторизації, дасть не помилку конфігурації, а дивний функціональний фейл.

    CVE і CVSS: пріоритизація без ілюзій

    Означення обох стоять у главі 1; тут — лише те, що змінює рішення про пріоритет.

    • Кількість CVE не міряє захищеність. У A03 — 11 CVE при найвищій середній частоті 5,19%, а A09:2025 названо «неймовірно важкою для тестування» з лише 723 CVE.
    • Публічний бал — це Base чужого середовища. Постачальники оцінок, зокрема NVD, зазвичай дають лише Base Scores, позначені як CVSS-B; сама база підтверджує це переліком того, чого вона не оцінює: Environmental не рахує взагалі, натомість дає калькулятор.
    • Бал — не ризик. NVD формулює прямо: «CVSS не є мірою ризику»; це фактор пріоритизації, а не готовий пріоритет.
    • 10.0 інколи означає «даних немає»: коли вендор оголосив вразливість без деталей, NVD виставляє найгірший сценарій.
    • Окремий запис не доводить дефекту в контексті. README навмисно вразливого стенда фіксує випадок, коли для однієї з його вразливостей завели CVE-2023-39848.
    • Запис має бути придатним до дії. Мінімальний склад : резюме з описом впливу, перелік вразливих версій, перелік версій із патчем і CVE; запитати CVE — обов'язок організації, що приймає звіт.

    Разом це симетрична пара: число записів не міряє захищеність, а окремий запис не доводить дефекту.

    Секрети в репозиторії очима ланцюга постачання

    Гігієна секретів у CI — тема розділу про Git і CI. Тут інший кут: секрет у репозиторії є самостійною поверхнею атаки, а пайплайн — ланкою ланцюга. Коли креденшели на кшталт API-ключів і паролів захардкодженими, вони стають цілями.

    (secret scanning) проходить усю історію git на всіх гілках, а не робочу копію, — тож «прибрав наступним комітом» не є лагодженням. Явище має назву: , неконтрольоване розповзання креденшелів по репозиторіях. Поверхня скану ширша за код — тікети, заголовки й коментарі пулреквестів, вікі, секретні gist-и. Для QA це буквально про токен, вставлений у баг-репорт «щоб відтворити».

    Порядок дій після знахідки контрінтуїтивний: ротувати зачеплений креденшел негайно, а секрету з історії — «time-intensive and often unnecessary», якщо ключ уже відкликано. Пріоритет визначають перевірки валідності: сервіс-емітент відповідає, чи ключ ще діє. Окрема межа: для партнерських провайдерів платформа повідомляє провайдера напряму, і такі знахідки в алертах репозиторія не показуються взагалі. Ловити краще раніше за коміт — в IDE або pre-commit-хуком, пам'ятаючи компроміс: секрети зі сталим форматом ловляться легше, а пароль, придуманий людиною, правила під формат пропускають.

    Другий канал витоку — публікація пакета: якщо існують обидва ignore-файли, у реєстр їде все, чого немає в .npmignore. Надійніший механізм — поле files у package.json, яке працює як .

    І кут, заради якого секрети стоять тут: атаки на ланцюг постачання дедалі частіше цілять саме в білд-артефакти, реєстри й CI-креденшели. Звідси правило трактувати пайплайн як прод — та сама ознака, яку A03 називає дефектом.

    Сторонній JavaScript: ланка поза вашою збіркою

    Аналітика, чат-віджети, теги маркетингу — це залежності, яких немає в lock-файлі. Браузер звертається до серверів третьої сторони напряму, а версію коду визначає вендор у момент запиту. Головний ризик — компрометація сервера і впорскування шкідливого коду в оригінальний тег; розкладається він на втрату контролю над змінами, виконання довільного коду в клієнта і витік даних третім сторонам.

    • приїжджає без вашого релізу: щойно файли змінилися у вендора, наступний виклик із будь-якого браузера отримає вже змінений JavaScript.
    • Привілеї — ті самі, що в користувача: сторонній код рідко рев'ювають перед інтеграцією, а виконується він «similar to XSS attacks» (XSS).
    • Передрелізна перевірка частково втрачає силу — джерело каже це прямо, включно з IAST, RAST, SAST і DAST.

    Технічний контроль — (SRI): розробник рахує метадані цілісності для скрипта вендора й додає їх до елемента script, і тоді виконується лише перевірений код. Дві умови, про які забувають: SRI працює, якщо на хості вендора ввімкнено CORS, а після оновлення у вендора сторінка залишиться «secure but not working» — очікуваний наслідок механізму, а не загадка. Жорсткіша ізоляція — винести скрипт в iframe з іншого домену, який працює як «jail». Обмеження джерел скриптів політикою — тема CSP і заголовків безпеки.

    Найдешевша автоматична перевірка — наявність атрибута integrity на зовнішніх скриптах:

    test('усі зовнішні скрипти мають integrity', async ({ page }) => {
      await page.goto('/');
      const unprotected = await page.$$eval('script[src]', (nodes) =>
        nodes
          .map((n) => ({ src: (n as HTMLScriptElement).src, sri: n.getAttribute('integrity') }))
          .filter((s) => new URL(s.src).origin !== location.origin && !s.sri)
          .map((s) => s.src),
      );
      expect(unprotected).toEqual([]);
    });

    Поруч варто мати живий інвентар: які сторонні скрипти реально виконуються на проді й із яких доменів. Такого списку в lock-файлі немає — а домен покинутого вендора зловмисник може перереєструвати на себе.

    Типові помилки

    • Виглядає як «сканер зелений — залежності чисті», а насправді за повного розкриття CVE може не існувати взагалі, і сканер, що живиться лише базою CVE, тут сліпий.
    • Виглядає як «поставили --audit-level=high, середніх знахідок немає», а насправді прапорець не фільтрує звіт, а лише зсуває поріг фейлу.
    • Виглядає як «червоний аудит — нова вразливість», а насправді ненульовий код виходу буває й тоді, коли фікс існує, але його заблокувала політика свіжості релізу.
    • Виглядає як «lock-файл є, версії зафіксовані», а насправді при розбіжності з маніфестом менеджер мовчки поставить інші версії, доки дотримання лока не форсують.
    • Виглядає як «ми ще нічого не запускали, лише поставили залежності», а насправді скрипти пакета виконуються під час самої інсталяції.
    • Виглядає як «алертів немає — усе гаразд», а насправді архівні репозиторії не скануються, база має затримку, а партнерські знахідки в алерти не потрапляють.
    • Виглядає як «секрет прибрано наступним комітом», а насправді скан іде по всій історії всіх гілок, і ключ лишається живим до відкликання.
    • Виглядає як «у бюлетені 9.8 — критично для нас», а насправді це Base-бал чужого середовища, а 10.0 інколи означає, що деталей просто немає.

    Підсумок

    • Ланцюг рветься в чотирьох місцях: вихідний код, середовище збірки, залежності, розгортання. Пайплайн, захищений слабше за системи, які він збирає, — уже дефект за OWASP.
    • Автотести на функції, що використовують залежність, — передумова оновлення, а не звіт після нього. Саморобний патч без тесту, що імітує вразливість, — незавершена робота.
    • Lock-файл стає контролем лише тоді, коли його дотримання форсують (npm ci, --frozen-lockfile).
    • Червоний security-крок читають за причиною, а не за кольором: «вразливість без фікса», «фікс заблокувала політика» і «поріг налаштований інакше» дають однаковий ненульовий код виходу.
    • Порожній звіт не доводить нічого — ні у сканера, ні у вкладці алертів, ні в кількості CVE. Доказом виправлення є перегенерований SBOM, у якому вразливого компонента більше немає.

    Можливі питання

    • Що таке Software Supply Chain Failures і чому про них так багато говорять у 2025? Чекають означення через процес збирання, дистрибуції й оновлення; сильна відповідь розводить два числа — A03 у самій десятці й №1 в опитуванні спільноти — і додає парадокс 11 CVE при найвищій частоті.
    • Чим npm audit відрізняється від Dependabot? Чи розводить кандидат разовий аналіз дерева й механізм платформи з алертами та двома типами пулреквестів.
    • Знайшли CVE з балом 9.8 у транзитивній залежності. Ваші дії? Дивляться на порядок: зіставити з компонентом, перевірити, чи зачіпає нас, лікувати на прямій залежності, підтвердити перегенерованим SBOM.
    • Навіщо в CI npm ci, якщо є npm install? Перевіряють кут безпеки, а не швидкість: розбіжність лока й маніфесту має перервати встановлення, а не мовчки залатати іншими версіями.
    • Що таке тайпосквотинг і плутанина залежностей? Дві різні механіки — схоже ім'я проти вищої версії під іменем внутрішнього пакета — і названий захист скоупом.
    • Секрет випадково закомітили. Що робити першим? Перша дія — ротація й відкликання, а не переписування історії: скан бачить усю історію, а відкликаний ключ робить чистку здебільшого зайвою.
    • Чи покриває SCA ризик стороннього JavaScript? Перевіряють межу: аналітичний скрипт не проходить через збірку, у lock-файлі його немає, і контроль тут інший — інвентар доменів, SRI та ізоляція.

    Джерела

    Збої ланцюга постачання: A03 у OWASP Top 10:2025

    Де саме рветься ланцюг

    • OWASP Cheat Sheet — Software Supply Chain Security — означення за NIST, найслабша ланка, чотири категорії загроз і вектори, оцінка постачальника, рев'ю коду, ізольовані збірки, підписи, provenance за SLSA 1.0.

    Вразлива залежність: від знахідки до рішення

    • OWASP Cheat Sheet — Vulnerable Dependency Management — делегування класів операцій, два способи розкриття, чотири випадки, ігнор на конкретний CVE, тест під саморобний патч, фікс на прямій залежності, роль CRO.
    • pypa/pip-audit — README — «відома вразливість» як публічно повідомлений дефект; інструмент не захищає від зловмисних пакетів.
    • OWASP Cheat Sheet — Software Supply Chain Security — інвентаризація як перший крок і моніторинг залежностей після .
    • GitHub Docs — Dependabot alerts — залежність із відомою вразливістю робить проєкт ціллю.

    SCA: що роблять npm audit і pip-audit — і чого не роблять

    • OWASP DevSecOps Guideline — розкриття абревіатури SCA у переліку перевірок пайплайна поруч із SAST, IAST і DAST.
    • ISTQB Glossarysoftware composition analysis у словнику відсутній: означення терміна канон не дає.
    • OWASP Web Security Testing Guide v4.2 (PDF, 465 стор.) — DAST, SAST і SCA під час автоматизованих релізних воркфлоу або за розкладом.
    • npm CLI — npm-audit — що надсилається в реєстр, мета-вразливість, межі npm audit fix, залежність від lock-файла, коди виходу й поведінка --audit-level.
    • npm CLI — config (--audit-level) — шкала значень порогу й ненульовий код виходу, коли політика свіжості блокує фікс.
    • pypa/pip-audit — README — що сканує інструмент і звідки бере дані, коди виходу, межа «не аналізатор коду», шум фідів і точковий ігнор.
    • OWASP Cheat Sheet — Vulnerable Dependency Management — сканер, що живиться лише базою CVE, сліпий за повного розкриття.
    • OWASP Cheat Sheet — NPM Security — п'ять дій перевірки пакета в CI, серед яких SCA лише одна.

    Lock-файл, скрипти встановлення й пакет, якого ви не замовляли

    • OWASP Cheat Sheet — NPM Security — що дає lock-файл, тиха компенсація за маніфестом і спосіб вимагати дотримання, скрипти встановлення, тайпосквотинг, плутанина залежностей, слопсквотинг і перевірка npm view.
    • OWASP Cheat Sheet — Software Supply Chain Security — пінінг версій як захід проти непомітного підтягування скомпрометованої версії.
    • OWASP Cheat Sheet — CI/CD Securitydependency chain abuse і три його способи, пін версії плюс звірка хеша, вимога форсувати lock-файл, плагіни як поверхня атаки.
    • npm Docs — npm ci — обов'язковість lock-файла й вихід з помилкою при розбіжності, коміт .npmrc, межа ignore-scripts, поведінка --omit, аудит-звіти під час установки.

    SBOM і граф залежностей: інвентар складу й шлях компонента

    • OWASP Cheat Sheet — Dependency Graph SBOM — означення SBOM, графа й VEX, мінімальний склад, момент генерації і формати, підпис, чотири кроки тріажу, політика fail-fast проти warn.
    • GitHub Docs — Dependency graph — з чого будується граф, що видно по залежності, шлях транзитивної, dependency review у пулреквесті, експорт SBOM.
    • OWASP Cheat Sheet — Software Supply Chain Security — автоматизація виробництва й споживання SBOM як частина CI/CD організації.
    • OWASP Cheat Sheet — NPM Security — SBOM разом із provenance, щоб простежити, що зібрано і звідки прийшли входи.

    Dependabot: три різні речі під одним іменем

    • GitHub Docs — Dependabot alerts — тригери й склад алерту, власник, межі: затримка бази, лише перевірені advisory, архівні репозиторії, SHA-закріплені екшени.
    • GitHub Docs — Dependabot version updates — різниця security- і version-апдейтів, dependabot.yml, cooldown 3 дні, екшени як залежності, роль людини, автопауза.
    • GitHub Docs — Using secrets in GitHub Actions — секрети недоступні воркфлоу від подій Dependabot; незаданий секрет повертає порожній рядок.
    • GitHub Docs — Dependency graph — граф як джерело даних для алертів.

    CVE і CVSS: пріоритизація без ілюзій

    Секрети в репозиторії очима ланцюга постачання

    • GitHub Docs — Secret scanning — креденшел як ціль, скан усієї історії на всіх гілках, secret sprawl, поверхня поза кодом, «ротувати негайно, історію потім», перевірки валідності, партнерські знахідки поза алертами.
    • OWASP Cheat Sheet Series — Secrets Management — детект в IDE і pre-commit-хуком, компроміс правил під сталий формат, CI/CD як продове середовище.
    • OWASP Cheat Sheet — NPM Security — витік через ignore-файли при публікації, поле files як allow-list, атаки на артефакти, реєстри й CI-креденшели.
    • OWASP Top 10:2025 — A03 Software Supply Chain Failures — слабше захищений пайплайн як ознака вразливості категорії.

    Сторонній JavaScript: ланка поза вашою збіркою

    • OWASP Cheat Sheet — Third Party Javascript Management — прямий контакт браузера з вендором, головний ризик і три його форми, миттєве доїжджання змін, привілеї рівня користувача, втрата валідності передрелізних перевірок, SRI і вимога CORS, «secure but not working», iframe як jail, перереєстрований домен.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.