IT EN

Skip intro per sempre: ascesa, gloria e lenta agonia di Flash

Dal cartone vettoriale per modem a 28,8k al plugin più bucato di Internet: SWF, ActionScript, JIT spraying, «Thoughts on Flash» e il kill switch che ha fermato perfino dei treni.

Copertina in stile poster anni 2000: «Skip intro per sempre», un pezzo di puzzle (plugin mancante) e un enorme pulsante SKIP INTRO

C'è stato un tempo in cui aprire il sito di una pizzeria significava aspettare quaranta secondi di caricamento, guardare un logo che rimbalzava su una musica techno e cercare disperatamente il pulsante SKIP INTRO. Il menu era un cerchio rotante, il tasto "indietro" del browser non funzionava e Google non vedeva niente. Era il web in Flash, e per una decina d'anni è stato semplicemente il web.

Tra pochi mesi saranno cinque anni da quando Flash è stato spento per sempre. Ecco com'è andata: un plugin nato per disegnare cartoni animati diventato la piattaforma più usata (e più bucata) di Internet, prima di sparire da un giorno all'altro.

1993–1996: un programma di disegno che voleva essere un'altra cosa

Tutto parte da SmartSketch, un programma di disegno vettoriale per pen computer scritto da Jonathan Gay per la sua piccola azienda, FutureWave Software. I pen computer non decollano, Internet sì. FutureWave aggiunge l'animazione, un player per i browser di allora e nel 1996 lancia FutureSplash Animator. Tra i primi clienti ci sono MSN e Disney.

Nel dicembre 1996 Macromedia compra FutureWave e cambia nome al prodotto: Macromedia Flash 1.0. L'idea vincente è tecnica. Nel 1996 i modem vanno a 28,8 kbit/s, e un'animazione vettoriale pesa una frazione di una GIF animata delle stesse dimensioni e si adatta a qualsiasi risoluzione.

Dentro un file SWF

Il formato SWF è un piccolo capolavoro di compattezza, pensato per i modem. Si apre con una firma di tre byte: FWS per i file non compressi, CWS se il resto è compresso con zlib (da Flash 6) e ZWS con LZMA (da Flash 11). Seguono il numero di versione e la lunghezza del file. Poi viene la parte più da "anni '90": un rettangolo con le dimensioni dello stage, codificato a bit e non a byte, e misurato in twip, cioè ventesimi di pixel.

import struct, zlib

def swf_header(path):
    data = open(path, "rb").read()
    sig, ver, length = data[:3], data[3], struct.unpack("<I", data[4:8])[0]
    body = zlib.decompress(data[8:]) if sig == b"CWS" else data[8:]
    nbits = body[0] >> 3                      # 5 bit: quanti bit per ogni campo
    bits = int.from_bytes(body[:(5 + 4 * nbits + 7) // 8], "big")
    total = (5 + 4 * nbits + 7) // 8 * 8
    field = lambda i: (bits >> (total - 5 - nbits * (i + 1))) & ((1 << nbits) - 1)
    xmin, xmax, ymin, ymax = (field(i) for i in range(4))
    off = (5 + 4 * nbits + 7) // 8
    fps = body[off + 1] + body[off] / 256         # frame rate in virgola fissa 8.8
    return sig.decode(), ver, length, (xmax - xmin) / 20, (ymax - ymin) / 20, fps

# ('CWS', 9, 48213, 550.0, 400.0, 24.0)  -> il classico stage 550x400 a 24 fps

Dopo l'header il file è una sequenza di tag, ognuno con un codice e una lunghezza: DefineShape per le forme, PlaceObject2 per metterle sulla scena, ShowFrame per passare al fotogramma successivo, DoAction per il codice. Le forme sono curve di Bézier quadratiche, e ogni lato memorizza quale riempimento ha a sinistra e quale a destra. Un player può ignorare i tag che non conosce, ed è per questo che un SWF del 1998 si apriva ancora con il player del 2020.

2000–2006: ActionScript, ovvero quando il cartone animato impara a programmare

Flash nasce come strumento per animatori, ma i programmatori se ne impadroniscono presto. Il codice si diffonde in tre fasi:

  • ActionScript 1 (Flash 5, 2000): un dialetto di ECMAScript eseguito da AVM1, una macchina virtuale a stack e piuttosto lenta. Il codice si poteva attaccare a qualsiasi fotogramma o pulsante, quindi la logica di un progetto finiva sparsa in centinaia di posti diversi della timeline. Fare debug significava una caccia al tesoro.
  • ActionScript 2 (2003): classi, tipi e extends, ma solo in apparenza. Il compilatore traduceva tutto nello stesso bytecode AVM1.
  • ActionScript 3 (Flash Player 9, 2006): una VM completamente nuova, AVM2, con bytecode tipizzato e un compilatore JIT. Era fino a dieci volte più veloce. Adobe dona il motore, Tamarin, a Mozilla, che avrebbe dovuto usarlo per ECMAScript 4. ES4 viene abbandonato nel 2008, e AS3 resta l'unico linguaggio al mondo che assomiglia al JavaScript che non è mai esistito.

Nel frattempo, nel 2005, Adobe compra Macromedia per 3,4 miliardi di dollari. Lo stesso anno nasce YouTube, che usa Flash per i video: il formato FLV, prima con il codec Sorenson Spark, poi con On2 VP6, poi con H.264 dal 2007. Flash è installato su oltre il 95% dei computer connessi a Internet, e si può dire senza esagerare che il video sul web è Flash.

Il periodo d'oro (che era anche il periodo brutto)

A metà degli anni 2000 Flash è ovunque, e porta con sé una serie di problemi:

  • Siti interamente in Flash. Un unico SWF da 3 MB conteneva l'intero sito: niente URL per le singole pagine, niente tasto "indietro", niente testo selezionabile o indicizzabile, niente accessibilità. Il preloader con la percentuale era un genere artistico a sé.
  • Il pulsante SKIP INTRO. Le intro animate erano così diffuse che saltarle divenne un'abitudine universale. Molti designer le hanno odiate prima ancora degli utenti.
  • Prestazioni. Un banner pubblicitario in Flash poteva tenere un core della CPU al 100%. Sui Mac la ventola partiva appena si apriva un sito di notizie.
  • Crash. Il plugin girava dentro il processo del browser, quindi quando Flash si bloccava cadeva tutto il browser. Firefox nel 2010 introdusse plugin-container, un processo separato per i plugin, soprattutto per questo motivo. Il messaggio "Shockwave Flash has crashed" è diventato parte della cultura popolare.
  • Privacy. I Local Shared Objects, i "cookie Flash", sopravvivevano alla cancellazione dei cookie del browser. Alcuni servizi li usavano per far "risorgere" i cookie cancellati, i cosiddetti zombie cookie.

Allo stesso tempo, Flash era lo strumento con cui una generazione ha imparato a fare animazione e videogiochi. Newgrounds, Homestar Runner, i giochi di Miniclip e Kongregate, FarmVille: un'intera industria creativa nata dentro un plugin.

Sicurezza: il plugin con più buchi di un groviera

Il problema serio però era la sicurezza. Un plugin NPAPI era codice nativo, scritto in C++, che riceveva file binari complessi da qualsiasi sito, li interpretava con parser scritti in tutta fretta, li compilava con un JIT ed era installato sul 95% dei PC. Per chi scriveva exploit era il bersaglio perfetto. Flash ha accumulato più di mille CVE, e per anni è stato uno dei componenti preferiti dagli exploit kit.

Due tecniche sono diventate famose:

  • JIT spraying (Dion Blazakis, 2010): espressioni ActionScript costruite apposta, come una lunga catena di XOR con costanti scelte con cura, fanno sì che il compilatore JIT scriva in memoria eseguibile codice macchina che contiene lo shellcode nascosto nelle costanti. In questo modo si aggirava il DEP.
  • Corruzione di Vector.<uint>: con un piccolo overflow si sovrascrive il campo lunghezza di un vettore AS3 e si ottiene un vettore lungo quanto tutta la memoria, cioè lettura e scrittura arbitrarie. Nel 2015 Adobe, con l'aiuto di Google Project Zero, introdusse protezioni come heap separati e controlli sulla lunghezza.

Il punto più basso arriva a luglio 2015. Viene bucata Hacking Team, un'azienda italiana che vendeva software di sorveglianza ai governi, e tra i 400 GB di file pubblicati ci sono diversi exploit 0-day per Flash, che finiscono negli exploit kit nel giro di poche ore. Mozilla blocca Flash in Firefox. Alex Stamos, responsabile della sicurezza di Facebook, chiede pubblicamente ad Adobe di annunciare una data di fine vita.

2007–2010: l'iPhone e i «Thoughts on Flash»

Nel frattempo era arrivato un problema ancora più grosso. Nel 2007 esce l'iPhone, e non supporta Flash. Per un po' sembra una mancanza. Poi diventa una scelta.

Nell'aprile 2010 Steve Jobs pubblica «Thoughts on Flash», una lettera aperta con sei obiezioni: Flash è proprietario; il "web completo" ormai si fa con H.264 e HTML5; Flash è la prima causa di crash sui Mac e ha problemi di sicurezza; la decodifica video via software consuma la batteria; i contenuti Flash sono pensati per il mouse, non per le dita; e Apple non vuole che uno strato di terze parti si metta tra le app e la piattaforma. Al netto degli interessi commerciali di Apple, tecnicamente aveva ragione su quasi tutto.

Adobe prova la strada di Android: Flash Player 10.1 arriva sui telefoni nel 2010. Su un processore ARM single-core, però, l'esperienza è quella che vi aspettate. Nel novembre 2011 Adobe abbandona Flash per il mobile.

2010–2020: la morte per mille tagli

Flash non è morto per una singola decisione. È stato sostituito un pezzo alla volta dagli standard del web:

Flash serviva per...Sostituito da
Video<video>, H.264/VP9, Media Source Extensions (YouTube passa a HTML5 di default nel 2015)
Grafica e animazioni<canvas>, SVG, CSS animations, WebGL
AudioWeb Audio API
Webcam e microfonoWebRTC, getUserMedia
SocketWebSocket
Giochi ad alte prestazioniasm.js, poi WebAssembly

I browser fanno il resto. Chrome rimuove il supporto NPAPI nel 2015 (Flash sopravvive solo perché Google lo integra come plugin PPAPI, isolato in una sandbox), poi rende Flash "click-to-play" e infine lo blocca di default. Firefox elimina tutti i plugin NPAPI tranne Flash nel 2017.

Il 25 luglio 2017 Adobe annuncia la data ufficiale: Flash Player non sarà più supportato dal 31 dicembre 2020. Apple, Google, Microsoft, Mozilla e Facebook pubblicano lo stesso giorno i loro piani per eliminarlo.

12 gennaio 2021: la bomba a orologeria

Adobe non si limita a interrompere gli aggiornamenti. Le ultime versioni di Flash Player contengono una data di scadenza: dal 12 gennaio 2021 il player si rifiuta di eseguire qualsiasi contenuto e mostra un'icona che rimanda alla pagina sulla fine del supporto. Microsoft distribuisce anche un aggiornamento di Windows (KB4577586) che rimuove Flash dal sistema.

Il mondo scopre allora chi usava ancora Flash, in modi molto concreti:

  • la rete ferroviaria di Dalian, in Cina, resta in parte bloccata per quasi un giorno perché il sistema di gestione dei treni era scritto in Flash. Il problema viene "risolto" installando una versione vecchia del player, senza la scadenza;
  • l'agenzia delle entrate sudafricana, che usava moduli Flash per le dichiarazioni, distribuisce in fretta un proprio browser con Flash integrato;
  • in Cina Flash continua a vivere in una versione distribuita da un partner locale di Adobe, che per anni è stata criticata perché installava adware.

Ogni sistemista ha un ricordo simile: un pannello di gestione di uno switch, una console di virtualizzazione o un NAS il cui pannello web, da un giorno all'altro, mostrava solo un pezzo di puzzle grigio.

Che cosa resta, a settembre 2025

Quasi cinque anni dopo, Flash è morto ma i suoi contenuti continuano a vivere grazie ad alcuni progetti di conservazione:

  • Ruffle: un emulatore di Flash scritto in Rust e compilato in WebAssembly, che gira direttamente nel browser senza plugin. Il supporto ad AVM1 è molto buono, quello per AS3 è arrivato più tardi ma migliora a ogni release. Internet Archive e Newgrounds lo usano per far funzionare di nuovo migliaia di animazioni e giochi.
  • Flashpoint Archive: un progetto volontario che ha archiviato oltre centomila giochi e animazioni web, con un launcher che li rende giocabili offline.
  • L'editor non è mai sparito: dal 2016 si chiama Adobe Animate ed esporta in HTML5 Canvas. Il runtime AIR è passato a Harman, che lo mantiene per le app che lo usano ancora.

C'è un'ironia di fondo. Ruffle è sicuro grazie a Rust e alla sandbox di WebAssembly, cioè proprio le cose che mancavano a Flash: la sicurezza della memoria e un ambiente isolato.

Riassunto per chi ha cliccato SKIP INTRO

AnnoEventoCommento
1996FutureSplash → Macromedia FlashAnimazioni vettoriali per modem a 28,8k
2000ActionScript 1 / AVM1Codice incollato ai fotogrammi
2005Adobe compra Macromedia; nasce YouTubeIl video sul web è Flash
2006ActionScript 3 / AVM2 + JITVeloce, tipizzato, e ottimo per il JIT spraying
2007iPhone senza FlashL'inizio della fine
2010«Thoughts on Flash»Sei motivi, quasi tutti fondati
2015Leak di Hacking TeamIl mondo chiede una data di fine vita
2017Annuncio EOLData fissata: 31/12/2020
12 gen 2021Il kill switchAnche alcuni treni a Dalian si fermano
OggiRuffle, FlashpointFlash sopravvive dentro una sandbox

Morale ingegneristica: una tecnologia può avere successo perché risolve un problema reale (nel 1996 il web non sapeva fare animazioni né video) e poi fallire perché diventa un livello proprietario che nessuno può correggere al posto suo. Gli standard aperti sono più lenti, ma alla fine arrivano.

Alla prossima storia di bit. Il pulsante per saltare l'intro, questa volta, non serve. 🧩