<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Runtime Security on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/runtime-security/</link>
        <description>Recent content in Runtime Security on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 21 Jul 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/runtime-security/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Runtime security: vedere l&#39;attacco mentre accade</title>
        <link>https://www.matteobianchi.eu/p/runtime-security-falco/</link>
        <pubDate>Tue, 21 Jul 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/runtime-security-falco/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/runtime-security-falco/cover.png" alt="Featured image of post Runtime security: vedere l&#39;attacco mentre accade" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Ogni controllo visto finora è &lt;em&gt;preventivo&lt;/em&gt;: cerca di impedire che un difetto nasca o che un carico
non conforme parta. Ma la prevenzione, da sola, è una scommessa che prima o poi si perde: un CVE
zero-day, una configurazione sfuggita, una credenziale rubata. La &lt;strong&gt;runtime security&lt;/strong&gt; accetta questa
realtà e aggiunge l&amp;rsquo;altra metà: &lt;em&gt;osservare il comportamento reale&lt;/em&gt; dei container in esecuzione e
reagire quando qualcosa esce dal normale. Si appoggia a &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/ebpf-network-security/&#34; &gt;eBPF&lt;/a&gt;
per vedere nel kernel senza modificare le app.&lt;/p&gt;
&lt;h2 id=&#34;lidea-il-comportamento-atteso&#34;&gt;L&amp;rsquo;idea: il comportamento atteso
&lt;/h2&gt;&lt;p&gt;Un container ha un comportamento prevedibile e stretto: un server web ascolta su una porta, legge
certi file, parla con certi servizi. Tutto il resto è sospetto.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    OBS[eBPF osserva nel kernel:&amp;lt;br/&amp;gt;syscall, exec, rete, file] --&amp;gt; ENG[Motore di regole&amp;lt;br/&amp;gt;Falco]
    ENG --&amp;gt; N{Comportamento&amp;lt;br/&amp;gt;atteso?}
    N --&amp;gt;|sì| OK[Normale]
    N --&amp;gt;|no| AL[&amp;#34;ALLERTA:&amp;lt;br/&amp;gt;shell in un container web,&amp;lt;br/&amp;gt;connessione a IP ignoto,&amp;lt;br/&amp;gt;scrittura su /etc&amp;#34;]
    AL --&amp;gt; ACT[Notifica / blocca / isola]
    style AL fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;A differenza dell&amp;rsquo;antivirus basato su firme, la runtime security moderna ragiona per &lt;strong&gt;comportamento&lt;/strong&gt;:
non &amp;ldquo;riconosco questo malware&amp;rdquo;, ma &amp;ldquo;questo container sta facendo qualcosa che un container di quel tipo
non dovrebbe fare&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;cosa-rileva-falco&#34;&gt;Cosa rileva Falco
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Falco&lt;/strong&gt;, lo standard CNCF, osserva le syscall via eBPF e le valuta contro regole. Segnali tipici di
compromissione:&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;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&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;Esempi di regole comportamentali:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - shell avviata dentro un container             ← quasi mai legittimo in prod
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - processo che legge /etc/shadow                ← tentativo di furto credenziali
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - connessione in uscita verso IP non previsto   ← possibile C2 / esfiltrazione
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - scrittura in una directory di sistema         ← tampering del binario
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - montaggio sospetto o accesso al socket Docker  ← tentativo di escape
&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;Molti di questi sono proprio ciò che un&amp;rsquo;immagine &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/container-image-security/&#34; &gt;distroless&lt;/a&gt;
rende &lt;em&gt;impossibile&lt;/em&gt; (niente shell) o che l&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/kubernetes-hardening/&#34; &gt;hardening&lt;/a&gt;
rende &lt;em&gt;difficile&lt;/em&gt; — la prevenzione riduce ciò che Falco deve vedere, e Falco cattura ciò che la
prevenzione non ha fermato. Difesa in profondità.&lt;/p&gt;
&lt;h2 id=&#34;allertare-o-bloccare&#34;&gt;Allertare o bloccare?
&lt;/h2&gt;&lt;p&gt;Due modalità, con un compromesso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detect (allerta)&lt;/strong&gt;: segnala l&amp;rsquo;anomalia a chi risponde. Nessun rischio di bloccare traffico
legittimo, ma richiede qualcuno (o un&amp;rsquo;automazione) che reagisca in fretta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce (blocca/isola)&lt;/strong&gt;: ferma il processo o isola il pod automaticamente. Reazione immediata,
ma un falso positivo può interrompere un servizio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La pratica comune: partire in detect per &lt;em&gt;imparare&lt;/em&gt; il comportamento normale e tarare le regole,
riducendo i falsi positivi, e passare a enforce solo sulle anomalie ad alta confidenza. Le allerte
alimentano la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/siem-log-correlation/&#34; &gt;detection e il SIEM&lt;/a&gt; e innescano la
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/incident-response-devsecops/&#34; &gt;risposta agli incidenti&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;il-rumore-è-il-vero-nemico&#34;&gt;Il rumore è il vero nemico
&lt;/h2&gt;&lt;p&gt;Come ogni detection, la runtime security vive o muore sui falsi positivi. Mille allerte al giorno
equivalgono a zero allerte: nessuno le guarda. Il lavoro vero non è installare Falco, è &lt;em&gt;tarare&lt;/em&gt; le
regole sul comportamento reale dei propri carichi, sopprimere il rumore noto e mantenere solo i
segnali azionabili. Una detection ignorata è peggio di nessuna detection, perché dà un falso senso di
copertura.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se ho già fatto prevenzione seria — immagini distroless, hardening, admission control, network policy — cosa mi aggiunge davvero la runtime security? Non dovrebbe essere già tutto bloccato?&lt;/summary&gt;
&lt;p&gt;La prevenzione risponde alla domanda &#34;può succedere?&#34; e tu l&#39;hai ridotta tanto; la runtime security
risponde a una domanda diversa, &#34;&lt;em&gt;sta&lt;/em&gt; succedendo?&#34;, e nessuna quantità di prevenzione la rende
superflua, per tre ragioni. Primo, la prevenzione ha un orizzonte: conosce i difetti e le configurazioni
sbagliate &lt;em&gt;note oggi&lt;/em&gt;. Uno zero-day nella tua applicazione, una catena di exploit che nessuna
policy prevedeva, una credenziale legittima rubata e usata in modo legittimo-ma-malevolo — tutto questo
passa i controlli preventivi proprio perché non viola nessuna regola conosciuta. La runtime security non
chiede &#34;questo è permesso?&#34; ma &#34;questo è &lt;em&gt;normale&lt;/em&gt; per questo container?&#34;, e un comportamento
anomalo è anomalo anche se tecnicamente permesso. Secondo, la prevenzione può avere buchi che non sai di
avere: una policy di admission con un&#39;eccezione dimenticata, un namespace legacy non ancora hardened, un
workload con una deroga temporanea diventata permanente. La runtime security è la rete che vede cosa
succede &lt;em&gt;davvero&lt;/em&gt;, indipendentemente da cosa credevi di aver bloccato — e spesso è lì che scopri
che un controllo preventivo non era attivo dove pensavi. Terzo, e decisivo: la prevenzione non lascia
&lt;em&gt;testimonianza&lt;/em&gt;. Se un attacco riesce nonostante tutto, senza osservazione a runtime non lo sai —
non hai allerta, non hai timeline, non hai le prove per capire cosa è stato toccato. La runtime security
è ciò che trasforma una compromissione silenziosa e indefinita in un incidente rilevato, delimitato e
investigabile. Il punto non è che la prevenzione sia debole: più è forte, meno rumore deve gestire la
detection e più ogni allerta è significativa. I due lavorano insieme — la prevenzione riduce la
superficie e il volume, la detection copre l&#39;inevitabile residuo e ti dà occhi su ciò che la prevenzione
non ha visto. La sicurezza seria non sceglie tra &#34;impedire&#34; e &#34;rilevare&#34;: fa entrambi perché falliscono
in modi diversi.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;La runtime security accetta che la prevenzione prima o poi ceda: osserva il comportamento reale via
eBPF, segnala la shell inattesa e la connessione sospetta, allerta o blocca, e dà la testimonianza
che la prevenzione non lascia. Vive e muore sulla taratura dei falsi positivi. Tra i comportamenti più
sensibili c&amp;rsquo;è l&amp;rsquo;accesso ai segreti: come i container ottengono le credenziali in un cluster, senza
lasciarle in chiaro, è il prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
