O 123% więcej zgłoszonych CVE dziennie w 2026 niż przed rokiem.

Zależności

Czym jest graf zależności?

Graf zależności pokazuje każdy pakiet, od którego zależy Państwa oprogramowanie, i pakiet, który go wprowadził. Lista mówi, co znajduje się w Państwa oprogramowaniu. Graf mówi, dlaczego tam jest i czego jeszcze dotyka, a właśnie to pytanie pojawia się, gdy wychodzi na jaw nowa podatność.

Zaktualizowano

The same dependencies as a tree and as a graph As a tree, express leads to body-parser and send, and debug appears twice, once under each. As a graph, debug is a single node with an edge from body-parser and an edge from send, forming a diamond. Tree shared packages repeat express body-parser send debug debug Graph one node, two parents express body-parser send debug

Węzły, krawędzie i ścieżki

W grafie zależności każdy pakiet jest węzłem, a każda relacja „zależy od” krawędzią od jednego pakietu do drugiego. Państwa projekt znajduje się na szczycie. Jego zależności bezpośrednie są o jedną krawędź dalej, a zależności przechodnie to wszystko niżej. Trasa od projektu do danego pakietu to jego ścieżka zależności, a jeden pakiet może mieć ich kilka.

Graf, drzewo czy lista

Te same zależności można pokazać na trzy sposoby, a każdy odpowiada na inne pytanie.

Widok Co pokazuje Co traci
Płaska lista Każdy pakiet raz, z jego wersją Dlaczego dany pakiet się tam znajduje
Drzewo Każdą ścieżkę od Państwa projektu, tak jak wypisują ją menedżery pakietów Współdzielone pakiety się powtarzają, więc drzewo zawyża rozmiar
Graf Każdy pakiet raz, z krawędzią od każdego rodzica Trudniej go czytać bez przeglądarki grafów

To współdzielone pakiety sprawiają, że grafy są ważne. Gdy dwie Państwa zależności potrzebują tego samego pakietu, powstaje romb: jeden węzeł z dwoma rodzicami. Naprawa podatności w takim pakiecie wymaga znajomości obu ścieżek, ponieważ każdy z rodziców może przypinać starą wersję.

Do czego służy graf zależności

  • Znajdowanie ścieżki naprawy. Podatny pakiet przechodni naprawia się przez aktualizację lub nadpisanie czegoś na jego ścieżce. Graf pokazuje, którą zależność bezpośrednią należy zmienić.
  • Mierzenie zasięgu szkód. Gdy pojawia się biuletyn, graf pokazuje, które z Państwa zależności bezpośrednich, usług i produktów prowadzą do dotkniętego pakietu.
  • Przegląd licencji. Licencja copyleft głęboko w grafie obowiązuje tak samo jak ta na szczycie, a ścieżka pokazuje, która zależność ją wprowadziła.
  • Planowanie aktualizacji. Duża aktualizacja jednego pakietu zmienia wszystko poniżej. Graf pokazuje, jaka część drzewa się zmieni.
  • Wykrywanie koncentracji ryzyka. Mały, nieutrzymywany pakiet, przez który przechodzi wiele ścieżek, to pojedynczy punkt awarii.

Jak uzyskać graf zależności

Z menedżera pakietów. Każdy menedżer pakietów wypisuje rozwiązane drzewo, a większość potrafi wyjaśnić, dlaczego dany pakiet się tam znajduje. Strona zależności przechodnie podaje polecenia dla npm, pnpm, Pythona, Go, Rusta, Mavena i Gradle.

Z GitHub. Graf zależności na karcie Insights repozytorium to podsumowanie manifestów i lockfile w repozytorium oraz zależności przesłanych przez dependency submission API. Dla obsługiwanych ekosystemów GitHub pokazuje ścieżkę przechodnią, którą trafiła każda zależność, i potrafi wyeksportować graf jako SBOM.

Z SBOM. CycloneDX zapisuje graf w sekcji dependencies, w której każdy komponent wymienia to, od czego zależy. SPDX używa relacji DEPENDS_ON między pakietami. Graf CycloneDX dla części aplikacji Express wygląda tak:

"dependencies": [
  { "ref": "my-app", "dependsOn": ["express"] },
  { "ref": "express", "dependsOn": ["body-parser", "send"] },
  { "ref": "body-parser", "dependsOn": ["raw-body", "debug"] },
  { "ref": "send", "dependsOn": ["mime-types", "debug"] }
]

Tutaj debug występuje pod dwoma rodzicami: to romb. Wiele SBOM-ów pomija relacje i wymienia tylko komponenty, co zachowuje inwentarz, ale oznacza utratę wszystkich ścieżek.

Graf jest tak dobry jak jego źródło

Większość grafów zależności powstaje z manifestów i lockfile, więc pokazuje drzewo zaplanowane przez menedżera pakietów. Nie pokazuje pakietów przywróconych z cache CI, narzędzi buildu zainstalowanych przez kroki konfiguracyjne ani kodu ściągniętego przez skrypty instalacyjne lub bezpośrednio, i nie potrafi stwierdzić, czy build zainstalował dokładnie to, co podaje lockfile. Zob. dlaczego lockfile nie jest zapisem tego, co dostarczono.

Grafy zależności w CRACI

CRACI buduje swój graf z samego buildu. To runner GitHub Actions, który rejestruje każdy pakiet pobrany przez każde zadanie, na każdym poziomie drzewa, łącznie z pakietami przywróconymi z cache CI, w SBOM określającym własną kompletność.

  • Widok grafu SBOM. Widok zależności pokazuje warstwy zależności SBOM w widokach Pivot, Graph, Blob, Chord i Sunburst, z filtrami głębokości i ważności.
  • Eksporty z pełnym drzewem. Eksporty CycloneDX i SPDX zawierają zależności przechodnie, każdą z deklarowaną licencją.
  • Dotknięte buildy w czasie. Gdy pojawia się nowa podatność, historia buildów pokazuje, które wcześniejsze buildy zawierały podatny pakiet, bezpośredni lub przechodni.

Zob. generowanie SBOM w CRACI lub proszę umówić demo, aby przejrzeć graf jednego z Państwa buildów.

Grafy zależności: najczęściej zadawane pytania

Czym jest graf zależności?

Graf zależności to mapa wszystkich pakietów, od których zależy Państwa oprogramowanie, ze strzałką od każdego pakietu do pakietów, których potrzebuje. Pokazuje nie tylko, co znajduje się w Państwa oprogramowaniu, ale też dlaczego: ścieżkę od Państwa kodu do każdej zależności przechodniej.

Czym drzewo zależności różni się od grafu zależności?

Drzewo pokazuje każdą ścieżkę osobno, więc pakiet potrzebny dwóm rodzicom pojawia się dwa razy. Graf pokazuje każdy pakiet raz, z krawędzią od każdego rodzica, który go potrzebuje. Menedżery pakietów wypisują drzewa, ponieważ łatwo je czytać; narzędzia analizujące wpływ pracują na grafie.

Czy SBOM zawiera graf zależności?

Może zawierać. CycloneDX ma sekcję dependencies, w której każdy komponent wymienia komponenty, od których zależy, a SPDX wyraża to samo relacjami DEPENDS_ON. Wiele SBOM-ów pomija relacje i wymienia tylko komponenty, co oznacza utratę ścieżek.

Jak wyświetlić graf zależności repozytorium GitHub?

Należy otworzyć kartę Insights repozytorium i wybrać Dependency graph. GitHub buduje graf z manifestów i lockfile w repozytorium oraz z tego, co przesłano przez jego dependency submission API, a dla obsługiwanych ekosystemów pokazuje ścieżkę, którą trafiła każda zależność przechodnia.

Czym jest zależność diamentowa?

Dwie Państwa zależności zależą od tego samego pakietu, więc graf tworzy kształt rombu. Jeśli potrzebują jego niekompatybilnych wersji, menedżer pakietów musi zainstalować dwie kopie lub zakończyć działanie błędem. To jeden ze sposobów, w jakie graf staje się trudniejszy w zarządzaniu, niż się wydaje.

Graf tego, co pobrał Państwa build

Proszę uruchomić jeden workflow GitHub Actions na CRACI i przejrzeć graf zależności jego zarejestrowanego SBOM, na każdym poziomie drzewa.

Umów demo