<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>SCA on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/sca/</link>
        <description>Recent content in SCA on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 21 Apr 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/sca/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>SCA: il codice che non hai scritto</title>
        <link>https://www.matteobianchi.eu/p/sca-e-dipendenze/</link>
        <pubDate>Tue, 21 Apr 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/sca-e-dipendenze/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/sca-e-dipendenze/cover.png" alt="Featured image of post SCA: il codice che non hai scritto" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/sast-analisi-statica/&#34; &gt;SAST&lt;/a&gt; analizza il codice che scriviamo. Ma in
un&amp;rsquo;applicazione moderna quel codice è una frazione del totale: il resto sono &lt;strong&gt;dipendenze&lt;/strong&gt; — librerie
open source, transitivamente centinaia di pacchetti che non abbiamo mai letto. La &lt;strong&gt;SCA (Software
Composition Analysis)&lt;/strong&gt; si occupa di questo codice: trova le vulnerabilità &lt;em&gt;note&lt;/em&gt; (CVE) nelle librerie
che importiamo. Log4Shell ci ha insegnato quanto possa pesare una sola riga in un &lt;code&gt;pom.xml&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;lalbero-delle-dipendenze-transitive&#34;&gt;L&amp;rsquo;albero delle dipendenze transitive
&lt;/h2&gt;&lt;p&gt;Il punto chiave: non si importano le librerie dichiarate, si importa il loro intero albero.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    APP[La tua app] --&amp;gt; A[libreria-web]
    APP --&amp;gt; B[client-http]
    A --&amp;gt; C[parser-json v1.2]
    B --&amp;gt; C
    B --&amp;gt; D[logging-lib v2.0&amp;lt;br/&amp;gt;CVE-2024-XXXX]
    style D fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Hai dichiarato &lt;code&gt;client-http&lt;/code&gt;, ma ti ritrovi &lt;code&gt;logging-lib v2.0&lt;/code&gt; vulnerabile &lt;em&gt;senza averla mai scritta&lt;/em&gt;
nel tuo manifest. La SCA risolve l&amp;rsquo;intero albero e confronta ogni nodo con i database di
vulnerabilità. La maggior parte dei CVE che ti colpiscono vive nelle dipendenze &lt;strong&gt;transitive&lt;/strong&gt;, quelle
che non hai scelto consapevolmente.&lt;/p&gt;
&lt;h2 id=&#34;non-tutti-i-cve-ti-riguardano&#34;&gt;Non tutti i CVE ti riguardano
&lt;/h2&gt;&lt;p&gt;Il tranello della SCA è il diluvio di avvisi. Un CVE in una libreria &lt;em&gt;non significa&lt;/em&gt; che la tua app
sia vulnerabile. Due domande filtrano il rumore:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Per ogni CVE segnalato:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1. Uso davvero la funzione vulnerabile?   (reachability)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2. Il percorso è esposto a input ostile?  (exploitability nel mio contesto)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Se entrambe NO → rischio basso, patch pianificata, non emergenza.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Gli strumenti più avanzati fanno &lt;strong&gt;reachability analysis&lt;/strong&gt;: controllano se il tuo codice chiama
davvero la funzione vulnerabile. Un CVE in un metodo che non invochi mai è rumore a bassa priorità;
uno nel percorso di autenticazione esposto a internet è un&amp;rsquo;emergenza. Prioritizzare per contesto, non
per numero di avvisi, è ciò che tiene il team sano — lo vedremo meglio nel capitolo sul
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/vulnerability-management-triage/&#34; &gt;vulnerability management&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;aggiornare-senza-rompere&#34;&gt;Aggiornare senza rompere
&lt;/h2&gt;&lt;p&gt;La SCA non serve a nulla se poi non si aggiorna. Le pratiche che funzionano:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bot di aggiornamento&lt;/strong&gt; (Dependabot, Renovate) che aprono pull request automatiche per le nuove
versioni, testate dalla CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lockfile&lt;/strong&gt; committati: la build è riproducibile, si sa esattamente quale versione gira.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggiornamenti piccoli e frequenti&lt;/strong&gt; invece del salto di tre major ogni due anni, che nessuno osa
fare perché romperebbe tutto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;nel-flusso-di-lavoro&#34;&gt;Nel flusso di lavoro
&lt;/h2&gt;&lt;p&gt;La SCA sta nella CI (su ogni pull request, analizzando il manifest e il lockfile) e come scansione
periodica del codice già in produzione: un CVE nuovo può emergere su una dipendenza che non tocchi da
mesi. Questo richiede di sapere &lt;em&gt;cosa&lt;/em&gt; gira davvero in produzione — l&amp;rsquo;inventario degli artefatti, che
è il tema della SBOM, tra pochi capitoli.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se continuo ad aggiornare le dipendenze a ogni CVE, non introduco instabilità e rischio di supply chain (una versione nuova compromessa) peggiore del CVE stesso?&lt;/summary&gt;
&lt;p&gt;È una tensione reale e va gestita, non ignorata in nessuna delle due direzioni. Aggiornare alla cieca
a ogni avviso è sbagliato quanto non aggiornare mai: una nuova versione può introdurre regressioni, o —
caso raro ma grave — essere una release compromessa, come negli attacchi di supply chain dove l&#39;account
di un maintainer viene violato. La risposta non è scegliere tra &#34;sempre&#34; e &#34;mai&#34;, è &lt;em&gt;prioritizzare e
verificare&lt;/em&gt;. Prioritizzare: non tutti i CVE sono emergenze, la reachability analysis e il contesto
dicono quali patchare subito e quali possono attendere una finestra pianificata, così non sei in
aggiornamento perpetuo. Verificare: l&#39;aggiornamento passa dalla CI con i tuoi test, non va dritto in
produzione; aggiorni a versioni che hanno qualche giorno di vita, non all&#39;ora zero; usi il lockfile con
gli hash così sai che stai scaricando esattamente l&#39;artefatto atteso; e, per i rischi di supply chain
veri, ti appoggi alla verifica della provenienza e delle firme (SLSA, Sigstore — i prossimi capitoli)
invece di fidarti del solo numero di versione. Il rischio di una dipendenza vulnerabile nota, con exploit
pubblico, è quasi sempre più alto e più certo del rischio ipotetico di una release compromessa che i
controlli di provenienza intercettano. Aggiornare in modo disciplinato riduce entrambi; non aggiornare
ne elimina uno solo e ti lascia l&#39;altro, che è anche il più sfruttato.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;La SCA illumina il codice che non hai scritto: risolve l&amp;rsquo;albero transitivo, trova i CVE noti e — se
fatta bene — li prioritizza per reachability invece che per conteggio. Insieme al SAST copre il
codice, nostro e altrui, in modo statico. Ma entrambi guardano il codice &lt;em&gt;fermo&lt;/em&gt;. Alcuni difetti si
vedono solo quando l&amp;rsquo;applicazione gira e risponde a richieste reali: è il turno dell&amp;rsquo;analisi dinamica,
prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
