123% di CVE segnalate in più al giorno nel 2026 rispetto all'anno scorso.

Dipendenze

Che cos'è un grafo delle dipendenze?

Un grafo delle dipendenze mappa tutti i pacchetti da cui dipende il Suo software e quale pacchetto ha introdotto ciascuno di essi. Un elenco Le dice che cosa c'è nel Suo software. Il grafo Le dice perché è lì e che cos'altro tocca, ed è proprio la domanda che si pone quando emerge una vulnerabilità.

Aggiornato il

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

Nodi, archi e percorsi

In un grafo delle dipendenze ogni pacchetto è un nodo, e ogni "dipende da" è un arco da un pacchetto a un altro. Il Suo progetto si trova in cima. Le sue dipendenze dirette sono a un arco di distanza, e le sue dipendenze transitive sono tutto ciò che sta più in basso. Il tragitto dal Suo progetto a un pacchetto qualsiasi è il suo percorso di dipendenza, e un pacchetto può averne diversi.

Grafo, albero o elenco

Le stesse dipendenze si possono mostrare in tre modi, e ciascuno risponde a una domanda diversa.

Vista Che cosa mostra Che cosa perde
Elenco piatto Ogni pacchetto una volta, con la sua versione Perché ogni pacchetto è lì
Albero Ogni percorso dal Suo progetto, così come lo stampano i package manager I pacchetti condivisi si ripetono, quindi l'albero ne sovrastima le dimensioni
Grafo Ogni pacchetto una volta, con un arco da ciascun padre Più difficile da leggere a occhio senza un visualizzatore

I pacchetti condivisi sono il motivo per cui i grafi contano. Quando due delle Sue dipendenze richiedono lo stesso pacchetto, si forma un diamante: un nodo con due padri. Per correggere una vulnerabilità in quel pacchetto bisogna conoscere entrambi i percorsi, perché ciascuno dei due padri può fissare la vecchia versione.

A che cosa serve un grafo delle dipendenze

  • Trovare il percorso di correzione. Un pacchetto transitivo vulnerabile si corregge aggiornando o forzando con un override qualcosa lungo il suo percorso. Il grafo mostra quale dipendenza diretta aggiornare.
  • Misurare il raggio d'impatto. Quando arriva un advisory, il grafo mostra quali delle Sue dipendenze dirette, dei Suoi servizi e dei Suoi prodotti portano al pacchetto interessato.
  • Esaminare le licenze. Una licenza copyleft in profondità nel grafo vale quanto una in cima, e il percorso Le dice quale dipendenza l'ha introdotta.
  • Pianificare gli aggiornamenti. Un aggiornamento major di un pacchetto cambia tutto ciò che sta sotto. Il grafo mostra quanta parte del Suo albero cambia.
  • Individuare le concentrazioni di rischio. Un piccolo pacchetto non mantenuto attraverso cui passano molti percorsi è un singolo punto di guasto.

Come ottenere un grafo delle dipendenze

Dal package manager. Ogni package manager stampa l'albero risolto, e la maggior parte può spiegare perché un singolo pacchetto è presente. Dipendenze transitive elenca i comandi per npm, pnpm, Python, Go, Rust, Maven e Gradle.

Da GitHub. Il dependency graph nella scheda Insights di un repository è un riepilogo dei manifest e dei lockfile presenti nel repository, più le dipendenze inviate tramite la dependency submission API. Per gli ecosistemi che lo supportano, GitHub mostra il percorso transitivo che ha introdotto ogni dipendenza e può esportare il grafo come SBOM.

Da una SBOM. CycloneDX registra il grafo in una sezione dependencies, in cui ogni componente elenca ciò da cui dipende. SPDX usa relazioni DEPENDS_ON tra i pacchetti. Un grafo CycloneDX per una parte di un'app Express si presenta così:

"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"] }
]

Qui debug compare sotto due padri: un diamante. Molte SBOM omettono le relazioni ed elencano solo i componenti, il che conserva l'inventario ma perde tutti i percorsi.

Un grafo vale quanto la sua fonte

La maggior parte dei grafi delle dipendenze è costruita a partire da manifest e lockfile, quindi mostra l'albero pianificato dal package manager. Non mostra i pacchetti ripristinati dalle cache CI, gli strumenti di build installati dai passaggi di setup né il codice scaricato da script di installazione e download, e non può dire se la build ha installato esattamente il lockfile. Veda perché un lockfile non è un registro di ciò che è stato distribuito.

I grafi delle dipendenze in CRACI

CRACI costruisce il suo grafo dalla build stessa. È un runner GitHub Actions che registra ogni pacchetto scaricato da ciascun job, a ogni profondità dell'albero e compresi i pacchetti ripristinati dalle cache CI, in una SBOM che dichiara la propria completezza.

  • Una vista a grafo della SBOM. La vista delle dipendenze mostra i livelli di dipendenza della SBOM nelle viste Pivot, Graph, Blob, Chord e Sunburst, con filtri per profondità e gravità.
  • Esportazioni con l'albero completo. Le esportazioni CycloneDX e SPDX includono le dipendenze transitive, ciascuna con la sua licenza dichiarata.
  • Build colpite nel tempo. Quando emerge una nuova vulnerabilità, la cronologia delle build mostra quali build passate contenevano il pacchetto vulnerabile, diretto o transitivo.

Veda la generazione di SBOM in CRACI oppure prenoti una demo per esplorare il grafo di una delle Sue build.

Grafi delle dipendenze: domande frequenti

Che cos'è un grafo delle dipendenze?

Un grafo delle dipendenze è una mappa di tutti i pacchetti da cui dipende il Suo software, con una freccia da ogni pacchetto ai pacchetti di cui ha bisogno. Non mostra solo che cosa c'è nel Suo software, ma anche perché: il percorso dal Suo codice a ogni dipendenza transitiva.

Qual è la differenza tra un albero delle dipendenze e un grafo delle dipendenze?

Un albero mostra ogni percorso separatamente, quindi un pacchetto richiesto da due padri compare due volte. Un grafo mostra ogni pacchetto una sola volta, con un arco da ciascun padre che ne ha bisogno. I package manager stampano alberi perché sono facili da leggere; gli strumenti che analizzano l'impatto lavorano sul grafo.

Una SBOM contiene un grafo delle dipendenze?

Può contenerlo. CycloneDX ha una sezione dependencies in cui ogni componente elenca i componenti da cui dipende, e SPDX esprime la stessa cosa con relazioni DEPENDS_ON. Molte SBOM omettono le relazioni ed elencano solo i componenti, perdendo così i percorsi.

Come vedo il grafo delle dipendenze di un repository GitHub?

Apra la scheda Insights del repository e scelga Dependency graph. GitHub lo costruisce dai manifest e dai lockfile presenti nel repository, più tutto ciò che viene inviato tramite la sua dependency submission API, e per gli ecosistemi che lo supportano mostra il percorso che ha introdotto ogni dipendenza transitiva.

Che cos'è una dipendenza a diamante?

Due delle Sue dipendenze dipendono entrambe dallo stesso pacchetto, quindi il grafo forma un diamante. Se ne richiedono versioni incompatibili, il package manager deve installarne due copie oppure fallire: è uno dei modi in cui un grafo diventa più difficile da gestire di quanto sembri.

Veda il grafo di ciò che la Sua build ha introdotto

Esegua un workflow GitHub Actions su CRACI ed esplori il grafo delle dipendenze della sua SBOM registrata, a ogni profondità dell'albero.

Prenota una demo