<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Lambda on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/lambda/</link>
        <description>Recent content in Lambda on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 06 Oct 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/lambda/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Serverless security</title>
        <link>https://www.matteobianchi.eu/p/serverless-security/</link>
        <pubDate>Tue, 06 Oct 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/serverless-security/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/serverless-security/cover.png" alt="Featured image of post Serverless security" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Il serverless (AWS Lambda, Azure Functions, Cloud Functions) porta l&amp;rsquo;astrazione all&amp;rsquo;estremo: non
gestisci server, non applichi patch al sistema operativo, non dimensioni capacità. Questo &lt;strong&gt;elimina&lt;/strong&gt;
davvero alcune classi di rischio — niente OS da tenere aggiornato, niente server esposti da indurire. Ma
la sicurezza non svanisce: si &lt;strong&gt;sposta&lt;/strong&gt;. La superficie d&amp;rsquo;attacco si concentra su ciò che resta tuo —
il codice, le sue dipendenze, i permessi di ogni funzione, e i dati che entrano dai trigger.&lt;/p&gt;
&lt;h2 id=&#34;dove-si-sposta-il-rischio&#34;&gt;Dove si sposta il rischio
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    TRIG[&amp;#34;Trigger&amp;lt;br/&amp;gt;(HTTP, coda, storage, DB...)&amp;#34;] --&amp;gt;|&amp;#34;evento = input&amp;lt;br/&amp;gt;non fidato&amp;#34;| FN[Funzione]
    FN --&amp;gt;|&amp;#34;permessi propri&amp;lt;br/&amp;gt;(ruolo IAM)&amp;#34;| RES[Risorse cloud]
    DEP[Dipendenze&amp;lt;br/&amp;gt;del codice] -.parte della funzione.-&amp;gt; FN
    style TRIG fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Tre punti caldi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L&amp;rsquo;evento è input non fidato.&lt;/strong&gt; Una funzione è invocata da &lt;em&gt;trigger&lt;/em&gt; — una richiesta HTTP, un
messaggio in coda, un file caricato, un record di database. Ogni evento è un input esterno da
validare: l&amp;rsquo;injection non sparisce col serverless, cambia solo porta d&amp;rsquo;ingresso.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ogni funzione ha i suoi permessi.&lt;/strong&gt; Con tante piccole funzioni, è facile dare a tutte un ruolo
largo &amp;ldquo;per comodità&amp;rdquo;. È l&amp;rsquo;opposto di ciò che serve: il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/principio-minimo-privilegio/&#34; &gt;privilegio
minimo&lt;/a&gt; va applicato &lt;strong&gt;per funzione&lt;/strong&gt;, così che
una funzione compromessa possa toccare solo le sue risorse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le dipendenze sono codice tuo.&lt;/strong&gt; Una funzione è il tuo codice più le librerie che importa: una
dipendenza vulnerabile è una vulnerabilità della funzione. Vanno scansionate come qualsiasi altro
software.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;il-privilegio-minimo-moltiplicato&#34;&gt;Il privilegio minimo, moltiplicato
&lt;/h2&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;Antipattern serverless comune:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  un solo ruolo &amp;#34;FunctionRole&amp;#34; con permessi larghi, condiviso da 50 funzioni
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → compromessa UNA funzione, l&amp;#39;attaccante ha i permessi di TUTTE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Pattern corretto:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  un ruolo per funzione, con SOLO i permessi di quella funzione
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → il raggio d&amp;#39;esplosione resta confinato a quella singola funzione
&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;Il serverless moltiplica il numero di identità (una per funzione): è un&amp;rsquo;occasione per un privilegio
minimo granulare, o una trappola se si cede alla comodità del ruolo unico. La granularità qui non è un
lusso: è ciò che impedisce che una funzione marginale diventi la chiave di tutto.&lt;/p&gt;
&lt;h2 id=&#34;effimero-non-vuol-dire-invulnerabile&#34;&gt;Effimero non vuol dire invulnerabile
&lt;/h2&gt;&lt;p&gt;Un mito del serverless: &amp;ldquo;le funzioni durano pochi secondi, quindi non c&amp;rsquo;è persistenza da attaccare&amp;rdquo;. È
vero che l&amp;rsquo;ambiente è effimero, ma l&amp;rsquo;attaccante non ha bisogno di persistere &lt;em&gt;nella funzione&lt;/em&gt;: gli basta
usarne i &lt;strong&gt;permessi&lt;/strong&gt; nei secondi d&amp;rsquo;esecuzione per leggere dati, chiamare altre risorse, esfiltrare. E
spesso gli ambienti vengono &lt;em&gt;riusati&lt;/em&gt; tra invocazioni, lasciando in memoria segreti o dati della
richiesta precedente. L&amp;rsquo;effimerità riduce la persistenza, non l&amp;rsquo;impatto.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; il serverless toglie OS, patch e server da gestire, cioè gran parte di ciò di cui parla questa serie. Non è di per sé molto più sicuro, al punto che preoccuparsene tanto è controproducente?&lt;/summary&gt;
&lt;p&gt;È più sicuro su alcuni assi e identico o più insidioso su altri, e trattarlo come &#34;sicuro per
costruzione&#34; è precisamente l&#39;errore che porta agli incidenti serverless reali. Cosa guadagni davvero,
ed è tanto: niente sistema operativo da patchare (sparisce un&#39;enorme fonte di vulnerabilità), niente
server esposti da indurire, niente capacità da proteggere da esaurimento, e un isolamento degli ambienti
d&#39;esecuzione gestito dal provider. Questo elimina classi intere di attacchi, ed è un vantaggio reale.
Ma ciò che resta è proprio il cuore di questa serie, non la sua periferia: &lt;em&gt;identità e permessi&lt;/em&gt;
(ogni funzione è un principal con un ruolo — e il privilegio minimo per funzione è più critico che mai,
perché le funzioni sono tante), &lt;em&gt;validazione degli input&lt;/em&gt; (ogni trigger è una porta d&#39;ingresso per
dati non fidati, e l&#39;injection vive benissimo nel serverless), &lt;em&gt;dipendenze&lt;/em&gt; (il tuo codice più le
librerie, scansionabili come qualsiasi software), &lt;em&gt;segreti&lt;/em&gt; e &lt;em&gt;dati&lt;/em&gt; (gestiti come ovunque).
In più il serverless introduce rischi &lt;em&gt;propri&lt;/em&gt;: la proliferazione di funzioni con permessi che
nessuno rivede, i trigger che collegano servizi in catene difficili da seguire, il riuso degli ambienti.
La sensazione di &#34;più sicuro quindi me ne preoccupo meno&#34; è esattamente ciò che fa dare a tutte le
funzioni lo stesso ruolo largo e fa saltare la validazione degli input &#34;tanto è solo una funzioncina&#34;.
Il serverless sposta il lavoro di sicurezza dall&#39;infrastruttura al codice e ai permessi: è meno lavoro in
totale, ma concentrato dove un errore si paga caro. Approfittane per fare bene ciò che resta, non per
smettere di guardarlo.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il serverless elimina OS e server, ma sposta il rischio su codice, dipendenze, validazione degli input
dei trigger e permessi — con il privilegio minimo &lt;em&gt;per funzione&lt;/em&gt; come difesa centrale. Finora abbiamo
guardato i singoli servizi; sopra tutti c&amp;rsquo;è il modo in cui organizzi gli account, che decide gli argini
dell&amp;rsquo;intero ambiente. È il prossimo capitolo, &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/multi-account-landing-zone/&#34; &gt;multi-account e landing
zone&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
