Метрики репозиторію

Шкідливі залежності

Як inspect.software визначає залежності, про які корпус OpenSSF повідомляє як про шкідливі пакети, чому їх оцінюють окремо від вразливостей і що ця знахідка стверджує, а чого не стверджує.

Методологія v1.13.0Оновлено 2026-07-22

Вразлива залежність — це помилка. Шкідлива залежність — це атака. Це не та сама знахідка, і цей реєстр не оцінює їх однаково.

Шкідливі залежності ставлять одне запитання: чи містить граф залежностей, до якого резолвиться цей репозиторій, пакет, про який повідомлено як про шкідливе програмне забезпечення?

Звідки беруться свідчення

Джерелом є корпус OpenSSF malicious-packages — відкрито ліцензований і підтримуваний спільнотою реєстр пакетів, визнаних шкідливими в публічних реєстрах: тайпсквоти, захоплення облікових записів, атаки плутанини залежностей і пакети, що постачають готові шкідливі бінарні файли.

OSV.dev вбирає цей корпус і віддає його під ідентифікаторами MAL- поряд зі звичайними сповіщеннями про безпеку. Оскільки цей реєстр і так звертається до OSV по сповіщення про залежності, шкідливі пакети надходять запитом, який уже робився. Ця знахідка не коштує жодного додаткового запиту, жодного додаткового очікування і жодної додаткової залежності від третьої сторони.

Чому це оцінюється окремо від сповіщень

До методології v1.10.0 такі повідомлення рахувалися як звичайні сповіщення, і це було хибно у спосіб, який варто назвати прямо.

Повідомлення про шкідливий пакет не несе ані вектора CVSS, ані позначки критичності — оцінювати нема чого, бо шкідливе програмне забезпечення не має рівня критичності, лише стан. Оцінюване як сповіщення, воно провалювалося до критичності unknown, яка важить як помірна вразливість. Пакет, про який було встановлено, що він викрадає облікові дані, важив трохи менше за середній CVE.

Три властивості, які роблять вразливість оцінюваною, відсутні всі:

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

Тому шкідлива залежність тепер повністю вилучається зі знахідок за сповіщеннями і трактується як тривожний сигнал: множник і межа, а не зняті бали. Вона застосовує множник 35% до оцінки стану безпеки і до зваженого індексу здоров'я та обмежує обидва значенням 29 — верхньою межею діапазону «Критичний». Це на один діапазон суворіше за межу 49 для юрисдикцій високого ризику, бо тут ідеться про підтверджену компрометацію програмного забезпечення, а не про наражання на ризик.

Пакет, який несе і повідомлення про шкідливість, і звичайні CVE, з'являється лише під цією знахідкою. Його вразливості не мають значення.

Відкликані артефакти повідомляються, а не оцінюються

Реєстр, який вилучає шкідливий пакет, закриває питання: нічого придатного до встановлення не лишається, і репозиторій, який резолвиться до нього, сьогодні не постачає шкідливого програмного забезпечення. Тому кожна знахідка перевіряє, чи віддає реєстр досі саме цю резолвлену версію. Якщо ні, знахідка лишається у звіті — проєкт залежить від імені, яке було скомпрометоване, і це варто бачити, — але вона не піднімає сигналу і не коштує балів.

Перевірка свідомо питає про резолвлену версію, а не про найновішу версію пакета. Після вилучення npm лишає реліз-заглушку, позначену -security, як найновішу версію пакета. Це захищає всіх, хто резолвить діапазон версій, і нікого з тих, хто закріпив погану версію точно. Читання найновішої версії виправдало б перший репозиторій, на якому ця знахідка взагалі спрацювала, — він закріплює скомпрометований пакет саме на тій версії, яку реєстр досі віддає.

Там, де відповіді дістати неможливо — екосистема, якої перевірка не охоплює, або реєстр, що не відповів, — знахідка оцінюється так, ніби пакет лишається доступним. Неспроможність достукатися до реєстру не є свідченням того, що шкідливе програмне забезпечення відкликано.

Прямі та непрямі рахуються однаково

Здебільшого оцінювання залежностей у цьому реєстрі відрізняє задекларовану пряму залежність від тієї, що затягнута транзитивно, бо першу мейнтейнер обрав, а другу успадкував.

Тут ця відмінність не діє. Скрипт встановлення пакета виконується на тій глибині, на якій пакет сидить у резолвленому графі; викрадач облікових даних на чотири рівні нижче компрометує машину рівно так само ретельно, як і названий у маніфесті. Повідомляються обидва, оцінюються обидва, і звіт зазначає, який саме випадок, щоб читач бачив, звідки пакет потрапив.

Чого ця знахідка не стверджує

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

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

Це не наше визначення. Класифікація належить корпусу OpenSSF, досягнута його власним процесом і його власними джерелами, і цей реєстр повідомляє її, а не відтворює. Повідомлення, відкликане вище за течією, зникає з наступного сканування.

Як часто це спрацьовує

Рідко — і за задумом, і за вимірюванням. Перед запуском цієї метрики її прогнали на вибірці з 300 репозиторіїв, що охоплювала 46 889 резолвлених залежностей, і вона не знайшла нічого.

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

Коли це не оцінюється

Як і сповіщення про залежності, ця метрика виключається — а не оцінюється нулем — щоразу, коли граф залежностей або звернення до OSV були недоступні. Репозиторій ніколи не карається за вимкнений граф залежностей GitHub; звіт каже, що перевірка не виконувалася, а не натякає на чистий результат.

Де це виявлено

Цю знахідку мають 10 репозиторіїв у публічному реєстрі.