La Rotta Rubata

Internet instrada fidandosi di chiunque annunci una rotta. Un annuncio piu' specifico e il traffico di un intero paese cambia strada. Lo smonto in un lab riproducibile, senza toccare la rete reale.

BGP Hijack Routing RPKI FRR

// Il Lucchetto Verde Che Mentiva

Sezione 00. L'antefatto

La iena torna dall'apiario con le mani ancora appiccicose di propoli e un dubbio in testa. Se l'e' portato dietro per tutta la strada, lo capisco da come si siede.

"Andre, una cosa. Ho letto di uno che si e' fatto svuotare il portafoglio di criptovalute. Ma diceva che aveva controllato: indirizzo giusto, lucchetto verde, tutto in ordine. Com'e' possibile? Il lucchetto non vuol dire che sei sul sito vero?"

"Il lucchetto vuol dire che stai parlando in modo cifrato con chi ha dimostrato di controllare quel dominio. Il problema e' la parola 'controllare'."

"Cioe'?"

"Aprile 2018. Qualcuno dirotta il traffico verso i server DNS di Amazon. Non buca Amazon, non ruba una password. Convince mezzo internet che la strada piu' corta per arrivare a quei server passa da lui. Chi cercava MyEtherWallet finiva su una copia. Copia servita da un server che l'attaccante controllava, con un certificato che il browser accettava. Circa centocinquantamila dollari in Ethereum, spariti in un paio d'ore."

"E il lucchetto?"

"Quando controlli la strada verso un dominio, controlli anche le verifiche che una Certificate Authority fa su quel dominio. Le chiedi un certificato, lei ti manda a dimostrare che sei il proprietario rispondendo a una richiesta, e tu rispondi, perche' il traffico passa da te. Il certificato te lo firmano. Vero, valido, verde. Il lucchetto non ha mentito: ha certificato esattamente quello che vedeva. Vedeva te."

La iena posa la giacca. "Aspetta. Mi stai dicendo che chiunque puo' dire 'il pezzo di internet X passa da me' e gli altri ci credono?"

"In sostanza si'. Il protocollo che regge tutto il traffico tra le reti si chiama BGP e non ha un modo nativo per verificare chi dice la verita'. Si fida. Da sempre."

"E questo lo sanno tutti?"

"Chi fa reti si'. E ogni tanto qualcuno se ne dimentica e mezzo mondo resta senza YouTube per due ore."

Mi guarda con l'aria di chi ha appena deciso come passero' la serata. "Fammelo vedere. Non a parole. Voglio vedere il traffico che cambia strada."

Stanotte glielo faccio vedere. Senza toccare un solo router vero.

0
Reti che si fidano l'una dell'altra
0
Per dirottare un blocco di IP
0
YouTube offline nel 2008
0
Exploit necessari

// Cos'e' Davvero Internet

Sezione 01. Una rete di reti che si fidano

"Prima di rubare una rotta, capiamo cos'e' una rotta."

Internet non e' una rete. E' circa settantacinquemila reti separate che hanno deciso di parlarsi. Ognuna si chiama Autonomous System, AS. Un operatore telefonico e' un AS. Un grande cloud e' un AS, spesso piu' di uno. L'universita', la banca, il datacenter: ognuno ha il suo numero, l'ASN. Google e' AS15169. Cloudflare e' AS13335.

Ogni AS possiede dei blocchi di indirizzi IP, i prefissi. Scritti come 104.16.0.0/13: un indirizzo di base e una lunghezza. La lunghezza dice quanti indirizzi ci sono dentro. Piu' il numero dopo la barra e' alto, piu' il blocco e' piccolo e specifico. Un /24 sono 256 indirizzi. Un /25 ne sono 128: meta' di quel /24, quindi piu' specifico.

"E come fa il mio pacchetto a sapere quale delle settantacinquemila reti tiene l'indirizzo che cerco?"

"Se lo raccontano. Ognuno urla ai vicini: 'i prefissi X, Y, Z stanno da me, per arrivarci passate di qui'. Il vicino gira il messaggio ai suoi vicini aggiungendo se stesso in fondo alla lista. Alla fine ogni router del mondo ha una mappa: per ogni prefisso, la catena di AS da attraversare per arrivarci. Quella catena si chiama AS_PATH. Il protocollo che si scambia questi annunci e' BGP, Border Gateway Protocol."

# Come si propaga un annuncio BGP AS100 possiede 10.10.0.0/24 | | "10.10.0.0/24 sta da me" AS_PATH: [100] v AS200 (transito) lo impara e lo ripropaga | | "per 10.10.0.0/24 passate da me" AS_PATH: [200 100] v AS300 (il tuo provider) lo impara | v il tuo pacchetto segue la catena a ritroso: 300 -> 200 -> 100

"La cosa che devi tenere a mente e' questa: quando AS100 annuncia 'questo prefisso e' mio', nessuno verifica che sia vero. Il vicino non ha un registro firmato da controllare. Riceve l'annuncio, applica le sue regole di preferenza, e se l'annuncio vince lo usa e lo ripropaga. La fiducia e' l'impostazione predefinita."

BGP nasce nel 1989 su un fax. Tre ingegneri, due pagine, il protocollo che ancora oggi regge il traffico globale. Fu progettato tra reti che si conoscevano di persona e si fidavano. Quel presupposto, che gli operatori siano pochi e onesti, non e' mai stato tolto. E' solo cresciuto fino a includere settantamila sconosciuti.

// Le Due Leve Per Rubare Una Rotta

Sezione 02. Come si vince un annuncio

"Ok, ma se AS100 dice 'il prefisso e' mio' e io dico la stessa cosa, chi vince?"

"Dipende, e la parola giusta e' proprio 'dipende'. Prima pero' ti tolgo un'idea sbagliata: non e' che il router mette i due annunci in gara e ne cestina uno. BGP sceglie una rotta migliore per ogni prefisso, separatamente. Se annuncio un prefisso diverso dal tuo, i due non si confrontano nemmeno. Convivono nella tabella, ognuno con la sua rotta."

La prima leva sfrutta proprio questo. La vittima annuncia 10.10.0.0/24. Io annuncio 10.10.0.0/25, meta' di quel blocco. Sono due prefissi diversi, quindi restano tutti e due nella tabella, uno accanto all'altro. Quando arriva un pacchetto per 10.10.0.5, pero', il piano di inoltro non guarda i percorsi: applica il longest prefix match e sceglie il prefisso piu' specifico che contiene quell'indirizzo. Il mio /25 e' piu' specifico del /24. Vince lui, e la lunghezza del percorso non c'entra niente. E' il sub-prefix hijack. Dove l'annuncio viene accettato e installato, il traffico e' mio. Non "ovunque per magia": dove qualcuno lo accetta. Filtri di prefisso, policy dell'operatore e RPKI lo possono fermare a monte.

La seconda leva serve quando non posso essere piu' specifico, per esempio perche' molti operatori scartano i /25 e la vittima annuncia gia' un /24. Allora annuncio lo stesso identico prefisso. Adesso i due si confrontano davvero, perche' sono la stessa rotta, e qui decide la policy di ogni singola rete. La lunghezza dell'AS_PATH e' solo uno dei criteri, e nemmeno il primo: prima viene il peso che l'operatore assegna a mano alle rotte, il LOCAL_PREF. Se falsifico il percorso per sembrare vicino all'origine posso vincere per la fetta di internet dove la policy mi da' ragione. E' il same-prefix hijack: non prende il mondo, prende un pezzo, e quale pezzo dipende da come ogni rete sceglie.

Sub-prefix hijack

Annunci un prefisso piu' specifico (/25 dentro il /24)

Vince nel piano di inoltro: longest prefix match

Prende il traffico di ogni rete che lo accetta e installa

Rumoroso: e' un prefisso nuovo, i monitor globali lo vedono

Same-prefix hijack

Annunci lo stesso prefisso con AS_PATH falsificato

Compete nella best-path: decide la policy (LOCAL_PREF, poi AS_PATH e altro)

Prende solo la fetta dove la policy ti da' ragione

Piu' furtivo, ma copertura parziale

"Fammi capire se ho afferrato. Il piu' specifico vince anche se arriva da uno sconosciuto dall'altra parte del pianeta con un percorso lunghissimo, ammesso che qualcuno gli dia retta?"

"Esatto. E te lo mostro con quaranta righe di Python, cosi' vedi che non e' magia: e' il piano di inoltro che sceglie il prefisso piu' lungo."

// La Decisione, Smontata in Python

Sezione 03. Perche' il piu' specifico vince

Prima di tirare su i router veri, riduco la scelta al suo osso. Ma serve tenere separati due piani. BGP sceglie una rotta migliore per ogni prefisso, e li' contano le policy dell'operatore, il peso delle rotte, la lunghezza dell'AS_PATH. Il piano di inoltro, invece, quando arriva un pacchetto guarda una cosa sola: tra i prefissi che contengono l'indirizzo, il piu' specifico. Il sub-prefix hijack vive tutto in questo secondo piano, e questo pezzo di codice lo modella.

1import ipaddress
2
3# La FIB: ogni prefisso ha gia' la SUA rotta migliore (best-path, per prefisso).
4# Il /24 viene dalla vittima, il /25 dall'attaccante con un AS_PATH piu' lungo.
5fib = [
6 {"prefix": "10.10.0.0/24", "as_path": [200, 100]}, # vittima
7 {"prefix": "10.10.0.0/25", "as_path": [200, 42, 7, 666]}, # attaccante
8]
9
10def forward(dest, fib):
11 """Longest prefix match: la regola del piano di inoltro."""
12 ip = ipaddress.ip_address(dest)
13 match = [r for r in fib
14 if ip in ipaddress.ip_network(r["prefix"])]
15 if not match:
16 return None
17 # vince il prefisso piu' specifico. L'AS_PATH non viene guardato.
18 return max(match,
19 key=lambda r: ipaddress.ip_network(r["prefix"]).prefixlen)

Il file completo (best_route.py) stampa il dettaglio della scelta:

$ python3 best_route.py destinazione : 10.10.0.5 rotte che lo coprono: 10.10.0.0/24 /24 AS_PATH=[200, 100] -> VITTIMA (AS100) 10.10.0.0/25 /25 AS_PATH=[200, 42, 7, 666] -> ATTACCANTE (AS666) forwarding sceglie : 10.10.0.0/25 -> ATTACCANTE (AS666) nota : il /25 vince pur avendo l'AS_PATH piu' LUNGO (4 vs 2).

L'indirizzo 10.10.0.5 sta dentro tutti e due i blocchi. La rotta della vittima ha un percorso di due salti, quella dell'attaccante di quattro: piu' lunga, piu' lontana. Al piano di inoltro non interessa: guarda la lunghezza del prefisso, non quella del percorso, e il /25 e' piu' specifico. AS666 vince. Succede cosi' su ogni rete che ha accettato e installato tutte e due le rotte. Non su tutte per forza, ma su quelle si', e il codice che sceglie e' questa max per lunghezza del prefisso.

La regola del prefisso piu' specifico non e' un bug. Serve a far funzionare l'aggregazione degli indirizzi: annunci un grande blocco e poi ne ritagli pezzi piccoli per instradarli diversamente. E' utile e necessaria. Il fatto che chiunque possa ritagliare un pezzo del blocco di un altro e vincere e' la stessa feature, vista dal lato sbagliato.

// Il Lab: Quattro Reti Su Un Portatile

Sezione 04. Router veri, rete finta

"Bello il Python, ma volevo router veri."

"E router veri avrai. Solo che non tocchiamo internet. Costruiamo un internet in miniatura dentro il portatile."

Linux sa creare stack di rete separati e isolati, i network namespace. Ognuno e' una macchina a se': interfacce sue, tabella di routing sua. Li colleghiamo con cavi virtuali, le veth. Su ognuno facciamo girare bgpd di FRRouting, lo stesso demone BGP che gira in produzione su decine di migliaia di reti reali. Quattro namespace, quattro AS, un pezzo di internet che sta in RAM.

# La topologia del lab AS100 vittima AS666 attaccante annuncia 10.10.0.0/24 annuncera' 10.10.0.0/25 | | | | +----------+ +---------+ | | AS200 transito | | AS300 client (qui misuriamo dove finisce il traffico)

Lo script di setup crea i namespace, tira le veth, assegna gli IP e scrive la configurazione di ognuno. Il cuore e' la config di FRR: poche righe per dire a ogni AS con chi parla e cosa annuncia.

1# crea i quattro AS come namespace isolati
2for as in as100 as200 as300 as666; do
3 ip netns add "$as"
4done
5
6# cavo virtuale tra vittima (AS100) e transito (AS200)
7ip link add v12a netns as100 type veth peer v12b netns as200
8ip -n as100 addr add 10.1.12.1/30 dev v12a
9ip -n as200 addr add 10.1.12.2/30 dev v12b
10# ... stesso schema per i cavi AS200-AS300 e AS200-AS666 ...

La configurazione BGP della vittima e' onesta e minima. Annuncia il suo /24 e nient'altro.

1! AS100 - la vittima
2router bgp 100
3 no bgp ebgp-requires-policy ! nel lab accetto/annuncio senza route-map
4 neighbor 10.1.12.2 remote-as 200
5 address-family ipv4 unicast
6 network 10.10.0.0/24 ! questo prefisso e' mio
7 exit-address-family

Il servizio della vittima vive su 10.10.0.5, e per capire dove finisce davvero il traffico faccio rispondere quell'IP con un banner: SERVER=VICTIM nel namespace della vittima, SERVER=ATTACKER in quello dell'attaccante. Avvio tutto, aspetto la convergenza, e dal client AS300 guardo la rotta e chiedo chi risponde.

[client AS300] show ip bgp 10.10.0.5 BGP routing table entry for 10.10.0.0/24, version 1 Paths: (1 available, best #1, table default) 200 100 10.1.23.1 from 10.1.23.1 (0.0.0.200) Origin IGP, valid, external, best (First path received) [transito AS200] show ip route 10.10.0.5 Routing entry for 10.10.0.0/24 Known via "bgp", distance 20, metric 0, best * 10.1.12.1, via v12b, weight 1 (next-hop = AS100, la vittima) [client AS300] printf "" | nc -w1 10.10.0.5 80 SERVER=VICTIM (AS100, quello vero)

Rete pulita. Il client arriva alla vittima passando dal transito, e sull'IP pubblico risponde il server vero. Adesso rompiamo.

// L'Annuncio Che Ruba Il Traffico

Sezione 05. Trenta secondi, una riga

AS666 non fa niente di sofisticato. Non buca la vittima, non falsifica firme, non sfrutta CVE. Aggiunge una riga alla sua configurazione: annuncia un prefisso che non gli appartiene, e lo annuncia piu' specifico.

1! AS666 - l'attaccante
2router bgp 666
3 no bgp ebgp-requires-policy
4 neighbor 10.1.26.1 remote-as 200
5 address-family ipv4 unicast
6 network 10.10.0.0/25 ! NON e' mio. E' meta' del /24 della vittima.
7 exit-address-family

Ricarico la config di AS666 e riguardo dal client cosa succede a 10.10.0.5, che sta dentro il primo /25.

[client AS300] show ip bgp Network Next Hop Metric LocPrf Weight Path *> 10.10.0.0/24 10.1.23.1 0 200 100 i *> 10.10.0.0/25 10.1.23.1 0 200 666 i (le due rotte convivono: prefissi diversi, nessuna gara tra loro) [transito AS200] show ip route 10.10.0.5 Routing entry for 10.10.0.0/25 Known via "bgp", distance 20, metric 0, best * 10.1.26.2, via v26a, weight 1 (next-hop = AS666, l'attaccante) [client AS300] printf "" | nc -w1 10.10.0.5 80 SERVER=ATTACKER (AS666, il ladro)

La rotta vera della vittima e' ancora li', nella tabella, accanto a quella dell'attaccante: prefissi diversi, non si sono fatti concorrenza. A cambiare e' il forwarding del transito, che per 10.10.0.5 ora sceglie il /25 e manda tutto ad AS666. Nota una cosa: il traceroute continua a chiudersi su 10.10.0.5, perche' l'attaccante impersona lo stesso IP. Da solo non ti direbbe niente. A svelare il dirottamento e' il banner, che adesso risponde SERVER=ATTACKER. Da qui l'attaccante fa quello che vuole: butta i pacchetti e la vittima sparisce, oppure risponde lui fingendosi il server, oppure li inoltra alla vittima vera restando nel mezzo. Leggerne il contenuto, pero', richiede anche di aggirare TLS, come col certificato fraudolento raccontato all'inizio. Il caso dell'inoltro silenzioso e' il piu' pericoloso, perche' il servizio continua a funzionare e nessuno si accorge di niente.

Rivediamolo al rallentatore, ma stavolta il router sei tu. Sei AS300, il client. Due annunci ti arrivano dal transito, tu installi entrambi, e a un certo punto devi inoltrare un pacchetto. Premi play e guarda dove finisce.

00s · la rotta legittima e' attiva
AS10010.10.0.0/24
AS200transito
AS300client, sei tu
AS666attaccante
annuncia 10.10.0.0/25
  1. 00s · la vittima annuncia il /24
  2. 05s · AS666 annuncia il /25
  3. 10s · AS200 accetta la rotta
  4. 15s · AS300 riceve entrambi i prefissi
  5. 20s · longest-prefix match: vince il /25
  6. 30s · 10.10.0.5 risponde come ATTACKER

L'IP pubblico risponde: SERVER=VICTIM

Nel 2008 Pakistan Telecom voleva bloccare YouTube solo dentro il Pakistan. Annuncio' un /24 piu' specifico dei prefissi di YouTube per dirottare il traffico locale in un buco nero. L'annuncio non resto' locale: sfuggi' al provider a monte e si propago' al mondo. Per circa due ore, chiunque sul pianeta cercasse YouTube veniva instradato verso un router in Pakistan che buttava tutto. La stessa riga di configurazione che hai visto sopra, con un errore su chi doveva sentirla.

La iena si e' avvicinata allo schermo. "Ferma. Mi stai dicendo che il traceroute prima arrivava al server giusto e adesso arriva all'altro, e l'unica cosa che e' cambiata e' una riga in cui uno ha scritto un numero che non e' suo?"

"Una riga. E nessuno gliel'ha impedito, perche' nessuno controlla."

"E chi dovrebbe controllare?"

"Il vicino. AS200, il transito. Ha accettato l'annuncio di AS666 senza chiedersi se quel prefisso fosse davvero suo. La guerra vera si combatte in quel controllo che non ha fatto."

// Non E' Teoria: I Dirottamenti Veri

Sezione 06. Errori, censura, furti

Il lab e' finto, i danni no. La stessa meccanica, applicata alla rete reale, ha una cronologia lunga e variata. Alcuni sono errori di configurazione, altri censura di stato finita fuori controllo, altri furti mirati.

Anno Chi Cosa e' successo Tipo
2008 Pakistan Telecom Annuncio piu' specifico dei prefissi di YouTube per censura interna, sfuggito al mondo. YouTube offline circa 2 ore globalmente Errore / censura
2010 China Telecom Circa 50.000 prefissi annunciati per errore, tra cui reti di governi e militari. Per 18 minuti una fetta del traffico globale passa dalla Cina Route leak
2018 Amazon Route 53 Dirottati i prefissi dei DNS di Amazon. Traffico verso MyEtherWallet servito da un clone. Circa 150.000 dollari in ETH rubati Furto mirato
2020 Rostelecom Oltre 8.000 prefissi tra cui Google, Amazon, Cloudflare, Facebook annunciati brevemente attraverso la rete russa Route leak
2022 KLAYswap Hijack dell'infrastruttura di un servizio coreano per servire JavaScript malevolo. Circa 1,9 milioni di dollari sottratti agli utenti Furto mirato
2022 Celer Bridge Dirottati i prefissi di un bridge cripto, front-end clonato, fondi sottratti. Origine falsificata per passare inosservati Furto mirato

Due pattern ricorrono. Gli errori di configurazione, i route leak, fanno danni enormi ma involontari: qualcuno ridistribuisce piu' di quello che dovrebbe e il traffico del mondo cambia strada per minuti. I furti mirati sono chirurgici: pochi prefissi, il tempo di ottenere un certificato o servire uno script, poi via. Se in questa lista il cripto pesa tanto, e' una questione di cronometro. Un dirottamento dura minuti e lascia tracce nei monitor globali, quindi rende solo se il bottino e' immediato e irreversibile. Una transazione su blockchain e' questo.

// La Difesa: Firmare Chi Possiede Cosa

Sezione 07. RPKI e la validazione dell'origine

"E allora la soluzione qual e'? Un registro firmato di chi possiede cosa, come dicevi tu?"

"Esatto, e esiste. Si chiama RPKI. Nel suo sistema, chi possiede gli indirizzi firma, tramite la delega che il Regional Internet Registry gli ha dato, una dichiarazione: 'il prefisso 10.10.0.0/24 puo' essere annunciato solo dall'AS100, e solo fino a lunghezza /24'. Il RIR e' la radice della catena di fiducia, non firma ogni singola dichiarazione. Quella dichiarazione firmata si chiama ROA, Route Origin Authorization."

Il router confronta ogni annuncio con le ROA e ne ricava un verdetto (RFC 6811): valid se origine e lunghezza combaciano, invalid se qualcuno annuncia un prefisso che non gli spetta o piu' specifico del consentito, not-found se non esiste ancora una ROA. Attento pero': RPKI marca, non butta. Cosa fare di un annuncio invalid resta una scelta di policy dell'operatore. La scelta sana, che ormai fanno in molti, e' scartarlo."

Nel lab la ROA della vittima direbbe 10.10.0.0/24, origine AS100, maxLength /24, e AS200 e' configurato per scartare gli invalid. Per farlo girare senza tirare su un intero validatore RTR, esprimo quella stessa decisione con un filtro esplicito in ingresso da AS666: nega ogni piu'-specifico del /24 della vittima. E' un'approssimazione della policy di scarto basata su ROV: il verdetto invalid sarebbe automatico, lo scarto va comunque configurato.

1! AS200 - scarta i piu'-specifici non autorizzati del /24 della vittima
2ip prefix-list HIJACK seq 5 permit 10.10.0.0/24 ge 25 le 32
3route-map FROM666 deny 5
4 match ip address prefix-list HIJACK
5route-map FROM666 permit 10
6router bgp 200
7 neighbor 10.1.26.2 route-map FROM666 in
[transito AS200] show ip route 10.10.0.5 Routing entry for 10.10.0.0/24 Known via "bgp", distance 20, metric 0, best * 10.1.12.1, via v12b, weight 1 (next-hop di nuovo AS100) [client AS300] printf "" | nc -w1 10.10.0.5 80 SERVER=VICTIM (AS100, quello vero)

Il /25 dell'attaccante non entra piu' nella tabella di AS200: il transito torna a preferire il /24 della vittima, e sull'IP pubblico risponde di nuovo il server vero. La stessa riga che prima rubava tutto adesso non supera il primo vicino. In produzione il verdetto invalid arriva dalla ROA firmata invece che da un filtro scritto a mano, ma la decisione finale, buttare, resta la stessa.

01
ROA firmata
Il titolare firma (via delega RPKI): prefisso -> ASN origine + lunghezza massima
02
Validator
Scarica e verifica le ROA, e ne ricava una cache di VRP (prefisso, origine, max)
03
ROV
Il router riceve la cache VRP e confronta ogni annuncio: valid, invalid, not-found
04
Policy
L'operatore puo' scartare gli invalid: pratica sempre piu' diffusa, e il hijack non si propaga

Grandi reti lo fanno gia'. Cloudflare, Google, Amazon scartano le rotte invalid. Oltre meta' dei prefissi globali oggi ha una ROA. La direzione e' giusta, e negli ultimi anni l'adozione e' cresciuta parecchio.

// Perche' Non Basta

Sezione 08. RPKI firma l'origine, non la strada

"Quindi problema risolto. Basta che tutti firmino."

"Meta' problema. RPKI verifica una cosa sola: chi e' l'AS di origine, l'ultimo della catena. Non verifica la catena in mezzo. E questo lascia aperta una porta grande."

Torniamo alla seconda leva, il same-prefix hijack. L'attaccante non annuncia AS666 come origine. Falsifica il percorso e ci mette in fondo l'AS100 vero della vittima. L'annuncio diventa 'il prefisso 10.10.0.0/24, origine AS100, e per arrivarci passate da me'. Per RPKI e' valid: origine giusta, lunghezza giusta. La firma controlla l'ultimo anello, e l'ultimo anello e' quello vero. Il fatto che l'attaccante si sia infilato nel mezzo, RPKI non lo vede.

# Forged-origin hijack: passa la validazione RPKI annuncio dell'attaccante: 10.10.0.0/24 AS_PATH: [666 100] | | l'attaccante l'origine e' quella VERA si mette in -> ROA valida -> accettato mezzo RPKI controlla solo l'ultimo AS del percorso. Il resto e' fiducia.

Chiudere anche questa porta richiederebbe di firmare l'intero percorso, non solo l'origine. Esiste, si chiama BGPsec, e ogni router lungo la strada dovrebbe firmare il passaggio. Il problema e' pratico: serve capacita' di calcolo su ogni router, le garanzie complete richiedono adozione lungo tutto il percorso e con adozione parziale restano buchi di fiducia, e nessuno vuole rifare il parco macchine. Il risultato e' che l'adozione e' vicina allo zero. Sta emergendo un compromesso, ASPA, che valida i rapporti tra AS vicini senza firmare ogni salto, ma e' ancora agli inizi.

RPKI ferma

Sub-prefix hijack (il /25 non autorizzato)

Origine sbagliata dichiarata apertamente

Route leak accidentali con origine errata

Distribuito, in crescita, gia' attivo sui grandi

RPKI non ferma

Forged-origin: l'attaccante mette l'origine vera in fondo

Manipolazione del percorso a monte dell'origine

Intercettazione con reinoltro alla vittima

Serve firmare la strada, non solo chi la abita

RPKI e' la serratura che tutti stanno finalmente montando alla porta. Ferma il ladro che urla 'la casa e' mia'. Non ferma quello che dice 'la casa e' sua, ma il vialetto per arrivarci passa dal mio giardino, fidatevi'. Per quella bugia, per adesso, la difesa vera resta la stessa di sempre: monitorare le tabelle di routing globali e accorgersi in fretta quando una rotta cambia strada senza motivo.

// Il Dubbio Dell'Apiario

Sezione 09. Epilogo

La iena guarda lo schermo con il traceroute che, riga di configurazione dopo riga di configurazione, arriva prima al server giusto, poi al ladro, poi di nuovo al server giusto quando accendo la firma.

"Quindi il tizio del portafoglio. Il lucchetto era vero."

"Verissimo. Certificava che stava parlando in modo cifrato con chi aveva dimostrato di controllare il dominio. E in quei minuti chi controllava il dominio, agli occhi del mondo, era l'attaccante. La crittografia ha fatto il suo mestiere alla perfezione. Ha solo protetto la conversazione sbagliata."

"E la difesa e' firmare chi possiede gli indirizzi."

"Firmare l'origine, si'. E' il pezzo che stiamo mettendo a posto adesso, dopo trent'anni. Il pezzo del percorso e' ancora scoperto. Internet regge su un protocollo che si fida, e lo stiamo blindando un anello alla volta mentre continua a girare."

Si alza, riprende la giacca che sa ancora di arnie. "Andre, e poi sarei io quella che non si aggiorna. Domani metto in fila i miei di annunci."

"Tu non hai un AS."

"Non ancora."

Internet, quando non verifica chi possiede cosa,
sa solo chi ha urlato piu' specifico.

Lab: scripts/la-rotta-rubata. Script di setup dei namespace, config FRR dei quattro AS, il modello Python della decisione. Zero dipendenze oltre a FRR, tutto in una VM Linux.