Blocco#21 - Linguaggio macchina
Il computer non è un dispositivo: è un'estensione della tua mente [Mark Shuttleworth]
L'invenzione del computer è molto più di un'innovazione tecnologica. I calcolatori meccanici esistono da migliaia di anni, ma fino a qualche secolo fa erano specializzati nell’assolvere un’unica funzione (vedi astrolabio e sestante). L'idea di Charles Babbage fu rivoluzionaria perché distinse, per la prima volta nella storia, tra calcolatore e istruzioni. Non più una macchina ad hoc per ciascuna funzione, ma un dispositivo programmabile in grado di eseguire qualsiasi operazione. Ciò ha separato la macchina dalla sua anima, ovvero la realtà fisica (hardware) da quella astratta (software). In altre parole, Charles Babbage ha donato all'umanità una nuova forma di linguaggio astratto: il codice macchina.
Il passo successivo avvenne grazie a Von Neumann, che sostituì la programmazione meccanica, eseguita mediante cavi e schede perforate, con la programmazione elettronica, costituita da informazione. Ciò ha permesso ai computer di sviluppare due nuove abilità: memorizzare le istruzioni del processo e modificare le istruzioni stesse. Grazie a Von Neumann, il linguaggio macchina ha imparato a scrivere se stesso.
Se vista dal punto di vista delle vulnerabilità del potere astratto, la distinzione tra hardware (realtà fisica) e software (realtà astratta) spiega molte problematiche della società attuale. Ogni software, che si tratti di un'applicazione sul cellulare o un sistema operativo, non è una realtà fisica bensì un costrutto astratto: esiste solo perché interpretabile dalla mente umana.
Chiariamo il concetto: il codice di un sistema operativo non coincide con l'insieme dei bit dell’hard disk dov'è memorizzato, così come la bibbia non coincide con le molecole d’inchiostro impresse su carta1. Il software è un'idea che può essere copiata, trasmessa e diffusa in modo indipendente dal supporto fisico. Può essere salvato su un dischetto, stampato su una maglietta o imparato a memoria, come un'ideologia, una ricetta o un romanzo. E’ il nostro cervello a dare significato alle sequenze di uni e zeri scolpite nel silicio, esattamente come nel caso di un testo scritto: senza gli esseri umani, esisterebbero solo circuiti integrati privi di valore semantico2.
Da questo punto di vista il software è una credenza, un’utopia astratta simile alle ideologie religiose, economiche e politiche, e per questo soffre delle stesse vulnerabilità sistemiche dei poteri astratti, quali ad esempio:
Il potere informatico tende a concentrarsi nelle mani degli individui più abili nell’inventare “storie” scritte in linguaggio macchina. Nel contesto del software i cacciatori-narratori sono personaggi come Bill Gates, Steve Jobs, Larry Page, Elon Musk o Mark Zuckerberg
Chi sale al potere può cambiare le regole del gioco per centralizzare il potere. Questo è uno dei motivi per cui aziende come Microsoft, Google, Amazon o NVIDIA detengono talmente potere da sfidare nazioni intere (o far eleggere chi gli conviene)
I malintenzionati possono sfruttare le falle logiche del sistema (i bug del codice) per derubare, truffare o manipolare gli utenti
Queste vulnerabilità possono essere associate alla mancanza di opportuni segnali di controllo. Nel caso delle gerarchie sociali, come ad esempio politica e economia, i segnali che vengono applicati in modo errato (o nel momento sbagliato) sono referendum, circolari, normative e decreti. Questi segnali dovrebbero impedire ai furbi e disonesti di aggirare le regole del sistema, ma trattandosi di segnali astratti, anziché fisici, essi sono spesso difettosi, contradditori o aggirabili. Nel caso del software la situazione è simile, con la differenza che i segnali ci sembrano reali, perché si manifestano come sciami di elettroni. Tendiamo a confondere la forma con la sostanza, e credere che i segnali informatici siano concreti, mentre in realtà sono astratti tanto quanto quelli religiosi, politici ed economici3.
Un software potrebbe essere vulnerabile perché non prevede un segnale di controllo, o perché ne implementa uno errato. Oppure il segnale viene inviato in ritardo o interrotto in anticipo (rispetto alla durata dell'attacco). Purtroppo, nel contesto dell'informatica, la questione delle vulnerabilità è molto più grave, perché lo spazio in cui vivono le applicazioni software permette infinite possibilità. Anche le altre forme di linguaggio, come libri o spartiti musicali, permettono di creare un numero potenzialmente infinito di opere diverse. Ma il contenuto di un libro, come le note di un brano musicale, sono usate tendenzialmente in modo passivo: il lettore o l'ascoltatore non può modificare il testo originale dell'opera. Può produrne una nuova versione, registrando la cover di una canzone, ma ciò non modifica l'opera originale. Al contrario, quando un hacker riesce a modificare il codice di un software, ciò impatta tutte le copie del programma installate sui dispositivi delle vittime. Inoltre, poiché il linguaggio macchina vive all'interno di circuiti elettronici il cui stato varia milioni di volte al secondo, è possibile generare miliardi di variazioni in tempi brevissimi.
Un'altra differenza tra linguaggi convenzionali e linguaggio macchina è che il software permette praticamente qualsiasi utilizzo. Possiamo sviluppare videogiochi, gestionali, istruzioni per droni, applicazioni di streaming, riprodurre musica, editare video, regolare servo meccanismi e controllare dispositivi domotici. Le altre forme di linguaggio possono al più descrivere questi casi d'uso, ma non possono implementarli. Un libro può contenere le istruzioni di un software, ma non può eseguirle. Ciò rende il linguaggio macchina infinitamente più versatile di qualsiasi altra forma di linguaggio, poiché permette di generare un numero infinito di applicazioni, le quali possono trovarsi in un numero infinito di stati diversi.
Conseguentemente è impossibile per un’azienda prevenire tutti i modi di aggirare (o sfruttare) un’applicazione, perché un numero infinito di stati implica un numero infinito di vettori d'attacco. Ciò fa sì che il linguaggio macchina sia la forma di potere astratto più vulnerabile nella storia dell’uomo, molto più di leggi, governi e dogmi religiosi. Un modo di limitare le vulnerabilità del software è imporre vincoli fisici su di esso, ma ciò non è sempre efficace. Ad esempio, l'atto di chiudere a chiave la stanza che ospita i server di una banca non impedisce ad un hacker di accedere al database aggirando il firewall. Al contrario, l'atto di distruggere un hard-disk con un martello rende completamente inaccessibili i dati. Ciò suggerisce che solo imponendo dei limiti fisici all'esecuzione del software, ovvero riducendo il suo spazio degli stati ad un numero finito di combinazioni, potrebbe essere possibile individuare e quindi mitigare tutte (o quasi) le vulnerabilità.
Finora abbiamo solo scalfito la superficie del problema. Per enfatizzare quanto sia grave la situazione, riassumiamo i motivi principali che spiegano perché il software sia la forma di potere astratto più vulnerabile della storia:
Spazio degli stati infinito: come appena visto, poiché non esistono limiti fisici alla complessità di un software, non esiste un limite teorico al numero di stati realizzabili, quindi non è possibile prevenire il numero di stati pericolosi, inconsistenti o fallaci
Complessità emergente: la transizione di un singolo bit, ovvero una modifica minuscola nello stato di una macchina, può condurre a comportamenti macroscopici imprevedibili, in modo simile all’effetto farfalla
Ingegneria dilettante: quasi sempre lo sviluppo di applicazioni software inizia prima che sia completa la stesura dei requisiti, svolta l'analisi dei rischi ed effettuati tutti i collaudi. Quanti di voi volerebbero su un areo che è stato costruito prima di terminare la fase di progettazione? Al contrario, un software è considerato utile anche se “crasha” una volta su dieci. Chi volerebbe su un aereo che si schianta il 10% delle volte? Inoltre, le applicazioni software sono distribuite anche da autodidatti, spesso senza garanzie o certificazioni. Chi si farebbe operare da un medico che ha studiato su YouTube?
Modularità: nel mondo reale le leggi della fisica costringono gli ingegneri a progettare interfacce semplici e funzionali, come ad esempio il giunto dei treni o la prolunga di un rubinetto. Al contrario, nello spazio astratto dell'informatica, le interfacce progettate per connettere componenti diversi possono essere complesse a piacere, per cui è impossibile prevedere a priori tutte le possibili interazioni tra moduli. Detto in parole semplici: nel ciberspazio è possibile costruire giunti, connettori, raccordi e adattatori degni di un quadro di Escher: non si può escludere a priori che possano essere collegati in modo imprevisto.
Eccessiva astrazione: tutti i costrutti del software, come i datatype (String, Integer, Char ecc.) e i concetti di ciclo, funzione, programmazione a oggetti ecc., sono astrazioni prive di realtà fisica, il cui significato è arbitrario. Lo stesso dicasi per termini di livello superiore quali design pattern, web service, cloud ecc. Negli ultimi decenni l'informatica si è evoluta per ridurre al minimo lo sforzo cognitivo richiesto ai programmatori. Invece di dover dominare il linguaggio macchina, l'Assembler o i dettagli di un compilatore, un moderno sviluppatore deve conoscere librerie, framework o la sintassi di qualche annotation. Ciò rende più semplice ed efficiente lo sviluppo del software, ma introduce ulteriori livelli di astrazione, per cui nessuno ha il controllo sui segnali scambiati dietro le quinte. Ciò stimola la reificazione, cioè la tendenza a percepire come concreti questi costrutti. Si finisce così col credere che una classe Java sia oggettivamente una “classe”, dimenticando che la parola “classe” è un simbolo astratto che abbiamo scelto in modo arbitrario, perché funzionale. Questo modo di lavorare è l'esatto opposto di ciò che a cui auspicano i responsabili alla sicurezza informatica, i quali vorrebbero poter prevedere, bloccare e contenere i segnali pericolosi o dannosi. In sintesi: le moderne metodologie di sviluppo del software offrono semplicità al costo della perdita di controllo sul funzionamento di basso livello.
Riassumendo, l'informatica è uno spazio astratto di dimensione infinita, che essendo privo di vincoli fisici offre un numero infinito di vulnerabilità, per cui è impossibile prevedere, contenere o arrestare tutti i segnali che potrebbero rompere o aggirare il software. Ciò rende il sistema indifendibile a priori dagli attacchi sistematici provenienti dall'interno (programmatori malintenzionati e aziende corrotte) o dall'esterno (hackers e truffatori)4.
Per mitigare il problema, l'informatica adotta la soluzione dei ranghi, ovvero un sistema di autorizzazioni, che distingue tra amministratori, moderatori, utenti e ospiti. Ciò è simile a quanto avviene nel potere astratto vigente, ovvero leggi e governi. Ma l'atto di difendere una legislazione legiferando normative è un'illusione, perché qualsiasi norma può essere aggirata, ignorata o cambiata, sia dall'interno (corruzione) che dall'esterno (conquista). Illudersi di proteggere una regola astratta con altre regole astratte è come pensare di sollevarsi da terra alla maniera del barone di Münchhausen. Nel caso del software, l'atto di difendere un sistema informatico limitando l'accesso degli utenti è altrettanto fallace, poiché significa applicare regole astratte per difendere altre regole astratte. Una soluzione migliore sarebbe quella di garantire un controllo fisico sui segnali di basso livello, cioè la capacità di intervenire direttamente sull’hardware sottostante5.
Per questi motivi l'adozione di una gerarchia astratta (amministratori, moderatori utenti ecc. ) conferisce alle architetture software gli stessi problemi che assillano da millenni i poteri esecutivo, legislativo e giudiziario, ovvero:
Disuguaglianza: distribuzione asimmetrica del potere tra pochi individui
Sistema fiduciario: necessità di fidarsi di chi amministra il sistema
Vulnerabilità endogena: le regole possono essere modificate da chi governa
Gioco a somma zero: l'aumento di potere di un utente implica quasi sempre la diminuzione di potere altrui (vedi teoria dei giochi)
Conclusioni
I sistemi software, tra cui internet e il ciberspazio, presentano le stesse problematiche di qualsiasi gerarchia fondata sul potere astratto, cioè immaginario e convenzionale. Gli utenti (i sudditi) devono fidarsi del potere di chi comanda, e sperare che queste persone siano abbastanza oneste e competenti da difendere il sistema sia dall'infiltrazione di individui corrotti, sia dall'attacco dei malintenzionati.
Poiché è impossibile imporre limiti fisici al software mediante il software stesso, il costo di attacco degli organismi astratti informatici (fattore CA, Cost of Attack) consta solamente dei watt necessari per alimentare il computer dove è inviato (o trattenuto) il segnale malizioso. Al contrario, il beneficio dell'attacco (fattore BA, Benefit of Attack) cresce con l'aumento degli utenti e delle risorse disponibili nel ciberspazio. Ciò implica che il parametro BCR del ciberspazio (il rapporto costi-benefici), che descrive quanto allettante è una preda, può solo che crescere nel tempo.
Milioni di anni di evoluzione suggeriscono che il ciberspazio attrarrà sempre più infiltrati e predatori, che saranno quasi sempre gli individui più furbi, disonesti ed egoisti. Anche in questo caso la storia si ripete: i cacciatori-narratori moderni, come gli amministratori delle multinazionali informatiche, sono selezionati tra coloro più bravi nel “raccontare storie”, che in questo caso significa: convincere gli utenti a “credere” nell'utilità delle loro applicazioni software.
Questi predatori possono prendere possesso del sistema principalmente in due modi. Possono attaccare il sistema all'interno, infiltrandosi in un'azienda informatica per collocare back door, trap door o altri difetti intenzionali. Oppure possono attaccarlo dall'esterno (hackers), impersonando un ruolo di alto livello per prendere possesso di un server centralizzato. Una volta “assunto il controllo sul controllore”, il predatore deve solo inviare (o trattenere) i segnali necessari per distruggere (o rubare) tutte le risorse che desidera.
La situazione assomiglia alla questione del potere politico, con la differenza che il potere politico può essere contenuto o decentralizzato tramite forza fisica, come ad esempio manifestazioni, scioperi, rivoluzioni e guerre. Al contrario, il potere astratto del software non è fisicamente ostacolabile, per cui è destinato a diventare sempre più centralizzato, vulnerabile e insicuro. Ciò spiega, in termini biologici anziché politici, l'enorme potere ottenuto negli ultimi decenni da aziende quali Microsoft, Google, Amazon o Meta.
Se questa analisi è corretta il potere informatico non può essere contenuto da nessuna normativa o autorità, perché nessuna legge astratta può essere vincolata in modo sicuro da un’altra legge astratta. Per mitigare il problema, l’umanità dovrebbe scoprire un meccanismo simile alla violenza fisica, ma applicabile in ambito informatico. Qualcosa capace di dichiarare guerra ai poteri centrali nel ciberspazio applicando watt di energia elettrica, anziché affidandosi a normative o aggiornamenti software.
Una soluzione di questo tipo esiste da oltre dieci anni, e funziona come un orologio svizzero. Si tratta di uno strumento che introduce un principio nuovo: la possibilità di opporre resistenza fisica ai poteri informatici ed economici. Nei prossimi capitoli ne esploreremo il funzionamento, cercando di capire se – e in quale misura – potrebbe rappresentare la prima rivoluzione del nuovo millennio.
Se tutte le copie cartacee della bibbia fossero distrutte, ma qualcuno l’avesse imparata a memoria (o registrata su un dispositivo audio), sarebbe possibile riprodurre la bibbia su qualsiasi supporto. La bibbia esiste fin tanto qualcuno ne ricorda il contenuto, indipendentemente dal numero di copie cartacee in circolazione.
I contenuti multimediali, quali ad esempio immagini e suoni, sono salvati come sequenza di bit, e riprodotti mediante opportuni decoder. Se l’umanità perdesse gli algoritmi di decodifica, come ad esempio la formula per tradurre un JPEG in immagine (o un MP3 in musica), i supporti multimediali diventerebbero indecifrabili. Gli algoritmi di decodifica sono la stele di Rosetta che rende possibile la traduzione dei contenuti multimediali.
Una circolare ministeriale è immaginaria esattamente quanto la bibbia. La cellulosa di una circolare è un agglomerato di protoni ed elettroni a cui noi diamo significato. Non c’è alcuna differenza sostanziale tra un segnale elettrico, composto da elettroni in movimento, e un segnale legislativo, composto da acido nigrosinico o blu di metilene.
L’attuale potere totalitario delle Big Tech è stato previsto decenni fa da parte del movimento cypherpunk. I punk si ribellano alle imposizioni culturali, i cypherpunk lottano contro la distopia informatica.
Un altro approccio è quello dell’agorismo, che combatte l’egemonia dei partiti politici offrendo strumenti di disobbedienza civile, anziché varare leggi più democratiche, che sono anch’esse soggette alle vulnerabilità del potere politico, e quindi aggirabili.