È il 2018. Viviamo in futuro. Possiamo ordinare una pizza, guardarla mentre viene preparata e vederla consegnare a casa nostra. Quindi perché non possiamo votare online?

Cominciamo con alcuni retroscena su cosa sono i linguaggi di programmazione e perché ne abbiamo bisogno. Presto vedrai perché non dovresti mai voler votare online (e perché non vuoi mai un computer vicino a te quando voti).

Probabilmente sai che i computer funzionano su binari, 1s e 0s. E scrivere in binario è difficile - così difficile, in realtà, che praticamente nessuno vuole farlo. Anche se riesci a farlo, quello che stai producendo è solo un mucchio di numeri, e sarà molto difficile per chiunque, incluso te in poche settimane, una volta che dimentichi quello che hai scritto, capire quale sia il tuo codice lo fa davvero.

Quindi, invece, noi informatici abbiamo inventato i "linguaggi automatici". Queste sono astrazioni che cambiano il codice binario in qualcosa che è almeno un po 'più vicino alle lingue che parlano gli umani. Sono ancora semplici, ma sono un passo nella giusta direzione. I linguaggi delle macchine sono basati e collegati all'hardware di qualsiasi macchina per cui sono progettati. Quindi, mentre non puoi dire qualcosa di semplice come "aggiungi 10 e 20 insieme e stampa quel risultato sullo schermo", puoi dire "posiziona il valore 10 nel registro uno, posiziona il valore 20 nel registro due, inserisci entrambi questi registri in sommare uno, inserire l'output nel registro tre e stampare sullo schermo il contenuto del registro tre. ”Il linguaggio della macchina viene quindi tradotto - questo è chiamato“ compilato ”- nei binari 1 e 0 richiesti per essere effettivamente eseguiti sul computer .

Ci sono ovvi aspetti negativi qui: devi avere familiarità con l'hardware del tuo computer per scrivere in un linguaggio macchina, e l'architettura di ogni computer è leggermente diversa. Inoltre, è necessario specificare esplicitamente ogni fase del processo. Questo è un dolore. Ma il lato positivo è che quando guardi un programma scritto in linguaggio macchina lungo la strada, ciò che sta accadendo è molto più chiaro, specialmente se paragonato a un flusso infinito di 1 e 0 in binario.

Indipendentemente da ciò che scrivi, ti fidi del compilatore per trasformare accuratamente ciò che hai scritto in codice binario. Se volessi incasinare i tuoi risultati, tutto ciò che dovrei fare è incasinare il tuo compilatore.

Il prossimo passo è quello di sottrarre l'hardware, quindi in realtà non è necessario conoscere la posizione di cose come "additivi" e "registri". Se si crea un compilatore abbastanza intelligente, è possibile progettare linguaggi di programmazione indipendenti dalla macchina, con istruzioni più astratte che potrebbero facilmente gestire cose come "aggiungi 10 e 20 insieme e stampi quel risultato sullo schermo". Quindi faresti affidamento sul compilatore per tradurlo in linguaggio macchina e poi in binario.

Mentre tutti questi linguaggi di programmazione adottano approcci diversi per risolvere questo problema, condividono lo stesso obiettivo: rendere il codice del computer più facile da leggere per gli umani, il che rende più facile la comprensione e la manutenzione. I linguaggi di programmazione oggi rendono la stampa del risultato di 10 + 20 semplice come scrivere questo:

stampa 10 + 20

Hai individuato il motivo per cui non ti fidi di nessun computer?

Ti darò un suggerimento: è lì nel compilatore.

Indipendentemente da ciò che scrivi, ti fidi del compilatore per trasformare accuratamente ciò che hai scritto in codice binario. Se volessi incasinare i tuoi risultati, tutto ciò che dovrei fare è incasinare il tuo compilatore.

Ad esempio, se cambiassi il comando "stampa" in modo che aggiungesse sempre 1 ai numeri che gli hai dato, il tuo programma non funzionerebbe correttamente, anche se lo hai programmato correttamente. Non troverai mai il problema tecnico solo guardando il tuo codice sorgente perché non è il problema. È nascosto nel compilatore.

Quell'esempio è di base e lo rileveresti abbastanza rapidamente perché il tuo programma sarebbe ovviamente rotto. E se avessi fatto qualcosa di più sottile? Che cosa succede se invece di scherzare con il comando "stampa", ho cambiato il compilatore in modo che ogni volta che ha rilevato il codice che coinvolge le password, ha reso così anche la password "ryaniscool" ha funzionato?

Non è la fine del mondo se qualcuno entra e vede la consegna della mia pizza. A nessuno importa abbastanza per provare a romperlo. Ma il voto non è uno di questi casi.

Se lo facessi, avrei quello che viene chiamato "backdoor" in ogni programma che crei con il mio compilatore. In altre parole, puoi bloccare la tua porta d'ingresso tutto ciò che vuoi, ma non importa perché ho una porta segreta dietro che nessuno sa. Indipendentemente da ciò che scrivi, non importa quanto sia sicuro il tuo codice password, anche la mia password di "ryaniscool" funzionerà, e non lo saprai nemmeno.

Ovviamente, questo è un problema. E potresti pensare: “Ma i compilatori sono programmi per computer come tutti gli altri. Potrei guardare il codice sorgente del mio compilatore per assicurarmi che non ci sia codice dannoso lì. Tutto quello che dovrei fare è trovare la parte che parla dell'aggiunta di "ryaniscool" come password, eliminarla e andrei bene. Giusto?"

E tu potresti. Tranne, come hai detto, i compilatori sono programmi per computer come tutti gli altri. Ciò significa che essi stessi sono compilati.

Ecco tutto ciò che dovrei fare per sfruttarlo:

Passo 1

Come prima, scriverei il codice che aggiunge "ryaniscool" come password valida a tutto ciò che compila e lo inserisco nel compilatore. A questo punto, sto aggiungendo una backdoor a tutto ciò che il compilatore compila, ma rimarrò sorpreso se qualcuno guarda l'origine del mio compilatore. Quindi vado al passaggio 2.

Passo 2

Scrivo codice per il compilatore che rileva quando si sta compilando da solo e quando ciò accade, aggiunge il codice per il passaggio 1 nel compilatore. Ora, quando compilo il compilatore, crea una nuova versione di se stesso che aggiungerà nelle istruzioni del compilatore come inserire la password "ryaniscool" ogni volta che il compilatore viene ricostruito. E per coprire le mie tracce, tutto ciò che dovrei fare è rimuovere le istruzioni dannose dalla fonte del compilatore e il gioco è fatto.

Ogni volta che il compilatore viene ricostruito, si costruirà in modo tale da contenere le istruzioni per aggiungere la mia backdoor. Ogni volta che quel compilatore costruisce qualcos'altro, seguirà quelle istruzioni e costruirà la mia backdoor direttamente. E non ci sarà una sola riga di codice dannoso rimasta in qualsiasi codice sorgente che lo rivela.

L'unico modo per rilevare questo errore è quello di ripassare da soli il codice binario, un'attività che inizia duro e diventa letteralmente impossibile man mano che i programmi diventano più complessi. Le opere complete di William Shakespeare arrivano a meno di 6 megabyte. Il solo browser Firefox richiede solo 200 megabyte per installarlo, e questo è solo un programma sul tuo computer. Non esiste un essere umano in vita che abbia letto tutti i 200 megabyte di quel codice. Non è nemmeno scritto in un linguaggio progettato per essere letto dagli umani.

Perché stiamo usando queste macchine da incubo?

Niente di tutto questo è nuovo. Nel 1984, Ken Thompson, l'uomo che ha progettato e implementato Unix, progenitore dei sistemi operativi su cui girano la maggior parte dei computer e dei telefoni, ha presentato un documento intitolato "Riflessioni sulla fiducia" e ha raggiunto questa conclusione:

La morale è ovvia. Non puoi fidarti del codice che non hai creato totalmente da solo ... Nessuna quantità di verifica o controllo a livello di sorgente ti proteggerà dall'uso di codice non attendibile.

Per "crearti totalmente", Ken non significa solo un programma che hai scritto, ma uno per cui hai scritto l'intero stack: tutto fino al compilatore. Pochissime persone hanno il tempo, le competenze e i soldi per costruire un computer da zero, incluso tutto il software su di esso. Questo sembrerebbe essere un proiettile in testa per fidarsi dei computer con qualsiasi cosa.

Eppure, ci fidiamo dei computer con ogni sorta di cose. Quindi, cosa dà? Perché stiamo usando queste macchine da incubo?

Bene, per prima cosa, i computer sono davvero divertenti e convenienti. E sono pratici in molti modi. Inoltre, un hack del compilatore può essere difficile da realizzare in pratica: avresti bisogno di tempo e motivazione per colpire qualcuno. La verità è che ci sono molti casi in cui non hai bisogno di assoluta fiducia nel tuo computer: dopo tutto, non è la fine del mondo se qualcuno entra e vede la consegna della mia pizza. A nessuno importa abbastanza per provare a romperlo.

Ma il voto non è uno di questi casi.

L'unico modo sicuro per votare con un computer è quello in cui una scheda elettorale viene stampata in vista dell'elettore, approvata e quindi archiviata in una scheda elettorale.

Il voto è un caso in cui il risultato di un hack può avere effetti enormi. Anche il voto è relativamente facile da prendere di mira (sai quando e dove accadrà) e c'è una forte motivazione a modificare il risultato. Con la stessa facilità con cui ho potuto aggiungere quella password "ryaniscool", ho potuto modificare il comando "aggiungi" in modo che, quando si trattava di valutare i voti, aggiungesse qualche extra per il partito di mia scelta.

Quanto dovrei aggiungere? Onestamente, a questo punto, dipende interamente da me. Da qui questa conclusione: il voto online non sarà mai sicuro. Il voto al computer non sarà mai sicuro.

L'unico modo sicuro per votare con un computer è quello in cui una scheda elettorale viene stampata in vista dell'elettore, approvata e quindi archiviata in una scheda elettorale. In questo modo, se qualcuno pensa che i sistemi informatici siano stati compromessi, se c'è qualche motivo per sospettare che qualcuno abbia aggiunto i voti in modo improprio, allora c'è una traccia cartacea. In altre parole, il computer sommando i voti è una comodità, niente di più. Il vero voto, il vero potere, sta ancora nel voto di carta.

Senza quella traccia di carta, ti fidi del computer.

E nessuno dovrebbe mai fidarsi di un computer.

AGGIORNAMENTI:

Ci sono stati alcuni temi ricorrenti nella discussione intorno a questo saggio, quindi ho pensato di incorporarli qui in formato Q + A! Il saggio di cui sopra non è stato modificato, ma ho pensato che il seguito potrebbe essere utile se desideri fare qualche lettura in più su questo argomento!

D: Cosa intendi per voto al computer?

A: Sto parlando di un sistema in cui voti esclusivamente su un computer: non viene generata alcuna traccia cartacea. In questo caso, il computer è l'autorità su ciò che hai votato: non c'è altra fonte che puoi ricontrollare.

Un modo etico e più sicuro di utilizzare i computer nel voto è quello di usarli non come autorità, ma come comodità. Se voti a scrutinio cartaceo e un computer esegue la scansione per sommare un risultato, puoi sentirti più sicuro, perché se qualcosa va storto c'è ancora una traccia di carta fisica. Se voti su un computer ma poi stampa un voto cartaceo, che devi confermare come accurato prima di registrare il tuo voto, allora puoi anche sentirti più sicuro, perché in entrambe queste situazioni il computer è una comodità. È quando il computer diventa un'autorità che sorgono i problemi.

D: Non è stato possibile risolvere questo problema dando a ogni persona che vota un codice segreto, o una sorta di chiave, o forse potremmo scansionare biometricamente i loro occhi o le impronte digitali o qualcosa del genere? O se avessimo eseguito il backup dei voti da qualche parte su Internet nel momento in cui sono stati creati?

A: No. Codici e chiavi possono essere intercettati o duplicati e qualsiasi scanner biometrico sarebbe un computer, vulnerabile agli stessi identici problemi discussi qui. E qualsiasi sistema in rete - in cui il computer lo condivide vota per "eseguirne il backup" da qualche altra parte - dipende ancora una volta da non essere manomesso. Scusate.

D: Okay, ma forse potremmo testare i nostri programmi e vedere se il nostro codice compilato agisce in modo diverso da quello che ci aspettiamo?

A: Questo non funziona per un paio di ragioni. Certo, nel mio esempio "modifica il valore di ciò che aggiunge 10 + 20", sarebbe facile testare e rilevare eventuali cambiamenti. Ma anche se pensassi di provarlo in primo luogo - e perché dovresti? - che ancora non risolve il problema. Il mio codice dannoso potrebbe rilevare quando viene testato e non fare nulla di male, diventando attivo solo quando non stai guardando.

Sembra scifi, giusto?

Bene, è già stato fatto: nello scandalo delle emissioni di Volkswagen del 2015, i computer di bordo dell'auto hanno rilevato quando le loro emissioni sono state testate e hanno funzionato in una modalità ecologica a bassa potenza e sono passati a una modalità inquinante ad alta potenza quando il test era finito . I computer hanno rilevato quando venivano testati, hanno agito sul loro comportamento migliore e poi si sono fermati al termine del test. Questo scandalo è costato a Volkswagen $ 18,32 miliardi per risolvere, tra l'altro, senza includere la multa di $ 2,8 miliardi che hanno pagato.

L'unica ragione per cui la Volkswagen lo farebbe in primo luogo è perché sarebbe stato redditizio per loro e pensavano che non sarebbero stati catturati. Gli stessi incentivi si applicano alle elezioni.

D: Se sono costretto a votare su un computer, significa che non dovrei votare?

A: No, dovresti assolutamente votare comunque. Lo scopo di immischiarsi in un'elezione è di privarti del diritto di voto. Se non voti, ti stai già privando del diritto di voto con un'efficienza del 100%. Vai a votare e, successivamente, fai quello che devi fare per assicurarti di non dover mai più usare il voto per computer.

D: Questo significa che non dovremmo fidarci dei computer per nulla?

A: In senso assoluto: sì. Non dovresti avere il 100% di fiducia in nessun sistema informatico. Ma ovviamente non è pratico e, nella maggior parte dei casi, non è necessario avere il 100% di fiducia in un computer. Uno dei pochi casi in cui dovresti votare. La domanda successiva approfondisce questo aspetto in modo più dettagliato.

Q: Dai. Facciamo operazioni bancarie online, miliardi di dollari si spostano digitalmente ogni giorno e hai persino scritto questo su un computer. Sei sicuramente allarmista e / o ipocrita?

A: È qui che nasce l'idea di assoluta fiducia. Non mi fido assolutamente dei computer, ma faccio banca online. Ma è perché, se qualcosa va storto, la banca può ripararlo in seguito. Utilizzi una carta di credito, sapendo che esiste la possibilità che le tue informazioni possano essere rubate, ma se ciò accade, hai la certezza che la società delle carte di credito le risolverà. E lo faranno - perché il profitto che ricavano da te usando la loro carta ogni giorno compensa le spese per la copertura di frodi e software non funzionante.

Ma non c'è modo di correggere le elezioni rotte dopo il fatto.

È tutta una questione di compromesso: pubblicare questo online è stato conveniente e l'ho fatto sapendo che le mie parole potevano essere modificate. Esiste il rischio che possano essere, ma alla fine non è la fine del mondo. La posta in gioco bassa e i benefici superano gli aspetti negativi. Allo stesso modo, faccio operazioni bancarie online, perché è anche conveniente e sono disposto a scendere a compromessi perché so che, mentre esiste la possibilità che i miei dati e / o denaro possano essere rubati, sono relativamente sicuro che la banca li coprirà. E sì, uso i computer per inviare agli amici $ 10 per ripagarli a cena, ma lo faccio perché la posta in gioco è così bassa. Sono solo $ 10.

La posta in gioco non è bassa quando si tratta di votare.

E un sistema elettorale - una democrazia - non è il genere di cose su cui vuoi scendere a compromessi.

D: Che dire della blockchain? Avresti dovuto menzionare la blockchain. Questa è una nuova tecnologia che non esisteva nel 1984 e che potrebbe sicuramente risolvere questo problema.

A: No, no, no. Scusate. Vorrei che funzionasse anche io.

D: Non sai di cosa stai parlando e chi ti ha reso un'autorità? Perché dovrei fidarmi di te?

A: Come ho detto nel saggio, queste non sono le mie brillanti idee originali. Fondamentalmente sto riformulando ciò che Ken Thompson ha sostenuto nel 1984 nel suo documento Riflessioni sul Trusting Trust. L'argomento di Ken è in realtà più forte: il suo esempio è il programma di accesso, un analogo del quale viene utilizzato in quasi tutti i computer. Sto solo parlando di voto. L'articolo di Ken è stato considerato un documento fondamentale nell'informatica per oltre 30 anni, ma non è ben noto al di fuori dei circoli informatici. Ecco perché volevo scrivere questo saggio.

(Per inciso, c'è un modo per correggere i problemi sollevati da Ken e io ho parafrasato: potresti compilare il tuo codice due volte, una volta con un nuovo compilatore e una con un compilatore noto. Se confronti i due output e sono i lo stesso, sai che il tuo compilatore è buono. Questo, naturalmente, solleva la domanda da dove otterresti quel compilatore noto-buono - ecco una tesi di dottorato su questo argomento).

D: Okay, certo che è abbastanza complicato, ma è tutto ipotetico. Usiamo i computer per controllare i reattori nucleari, per gridare forte. Se le cose non fossero sicure, lo sapremmo.

A: Un attacco molto simile a quello discusso qui - in cui erano nascoste le prove dell'attacco - è stato fatto nella vita reale solo pochi anni fa, con il worm Stuxnut nel 2010. E quello ha attaccato - avete indovinato - centrifughe nucleari .

Questi attacchi stanno già avvenendo. Ops.

D: Il voto al computer può essere negativo, ma anche le schede elettorali possono essere modificate. Neanche loro sono perfetti.

A: Assolutamente. Ma le schede elettorali hanno alcuni enormi vantaggi: i loro lati negativi sono ben compresi (nessuno sta scrivendo grandi saggi sul perché non si può fidare della carta) e le loro vulnerabilità sono limitate all'accesso fisico.

Se voglio fare casini con un'elezione a scrutinio cartaceo, ho bisogno di rubare le schede, o di cambiare le schede, o di fare una votazione - in entrambi i casi, ho bisogno dell'accesso fisico a quella scheda. E questo limita la quantità di danno che un cattivo attore può fare. Un adolescente annoiato a metà del mondo non può effettuare un'elezione a scrutinio di carta dal suo seminterrato. Lo stesso non si può dire per il voto al computer.

Inoltre, c'è un semplice fatto: i programmatori non sono perfetti. Anche se l'attacco in questo saggio non viene utilizzato, ciò non significa che il sistema di votazione del tuo computer sia sicuro. Diamine, Google - che penso che possiamo tutti concordare di assumere alcune persone molto intelligenti - hanno un sistema di premi in cui ti pagano soldi in contanti se li aiuti a trovare bug nel loro software, perché non possono garantire che non abbiano fatto errori.

La programmazione del software è difficile. I computer sono difficili. Anche uno sviluppatore di software brillante e ben intenzionato può fare un singolo errore che apre un intero stack di software all'intrusione. L'errore Heartbleed è stato introdotto per caso nel 2011 - in software open source che in teoria chiunque sul pianeta avrebbe potuto guardare, esaminare e rilevare - ma non è stato trovato fino al 2014, con il 17% dei server su Internet erano ora vulnerabili.

Ciò è stato fatto per caso. Immagina cosa può fare qualcuno se ci provasse.

Senti, so che fa schifo sentire che votare per computer non va bene. Fa schifo allinearsi fuori, nello spazio fisico, quando è così facile immaginare di votare un'app sul telefono durante la pausa pranzo e finirla. Ma più importante di un'elezione che sia conveniente è che sia accurato, e mentre il voto al computer sicuramente sarebbe conveniente, spero di averti convinto che non dovresti fidarti che sia preciso.

D: Esiste un xkcd rilevante?

A: C'è sempre un xkcd rilevante.