Det er 2018. Vi lever i fremtiden. Vi kan bestille en pizza, se, at den bliver lavet, og se den blive leveret til vores hus. Så hvorfor kan vi ikke stemme online?

Lad os starte med noget baggrund om, hvad programmeringssprog er, og hvorfor vi har brug for dem. Snart kan du se, hvorfor du aldrig skulle ønske at stemme online (og hvorfor du aldrig ønsker en computer hvor som helst i nærheden af ​​dig, når du stemmer).

Du ved sandsynligvis computere, der kører på binær, 1 og 0. Og det at skrive binært er svært - så svært, faktisk, at dybest set ingen ønsker at gøre det. Selv hvis du lykkes med at gøre det, er det, du producerer, bare en masse tal, og det vil være meget svært for nogen - inklusive dig om et par uger, når du først har glemt, hvad du skrev - for at finde ud af, hvad din kode faktisk gør.

Så i stedet opfandt vi datalogi "maskinsprog." Dette er abstraktioner, der ændrer binær kode til noget, der i det mindste er lidt tættere på sprog, som mennesker taler. De er stadig basale, men de er et skridt i den rigtige retning. Maskinsprog er baseret på - og bundet til - hardware på hvilken som helst maskine, de er designet til. Så selvom du ikke kan sige noget let som at "tilføje 10 og 20 sammen og udskrive det resultat på skærmen," kan du sige "placere værdien 10 i register en, placér værdien 20 i register to, før begge disse registre i adder en, og sæt output i register tre, og udskriv indholdet af register tre på skærmen. ”Maskinsproget oversættes derefter - dette kaldes“ kompileret ”- til de binære 1'ere og 0'ere, der kræves for faktisk at køre på din computer .

Der er åbenlyse ulemper her: Du skal være fortrolig med din computers hardware for at skrive på et maskinsprog, og hver computers arkitektur er lidt anderledes. Derudover skal du eksplicit specificere hvert trin i processen. Det er en smerte. Men hovedet er, at når man ser på et program skrevet på maskinsprog ned ad vejen, er hvad der sker meget klarere - især sammenlignet med at se på en uendelig strøm på 1s og 0s i binær.

Uanset hvad du skriver, har du tillid til kompilatoren til nøjagtigt at omdanne det, du skrev til binær kode. Hvis jeg ville rod med dine resultater, var alt hvad jeg havde brug for at rod med din compiler.

Det næste trin op er at abstrahere hardwaren, så du ikke behøver at vide placeringen af ​​ting som "tilføjere" og "registre." Hvis du bygger en smart nok compiler, kan du designe maskinuafhængige programmeringssprog, med mere abstrakte instruktioner, der let kunne håndtere ting som "tilføj 10 og 20 sammen, og udskriv det resultat på skærmen." Du vil derefter stole på kompilatoren til at oversætte det til maskinsprog og derefter til binært.

Mens alle disse programmeringssprog indtager forskellige tilgange til at løse dette problem, deler de det samme mål: at gøre computerkode lettere for mennesker at læse, hvilket gør det lettere at forstå og lettere at vedligeholde. Programmeringssprog i dag gør udskrivning af resultatet af 10 + 20 så simpelt som at skrive dette:

tryk 10 + 20

Har du set årsagen til, at du ikke kan stole på nogen computer?

Jeg giver dig et tip: Det er der i kompilatoren.

Uanset hvad du skriver, har du tillid til kompilatoren til nøjagtigt at omdanne det, du skrev til binær kode. Hvis jeg ville rod med dine resultater, var alt hvad jeg havde brug for at rod med din compiler.

Hvis jeg for eksempel ændrede “print” -kommandoen, så den altid føjede 1 til de numre, du gav det, kørte dit program ikke ordentligt - selvom du programmerede det korrekt. Du kan aldrig finde fejlen bare ved at se på din kildekode, fordi det ikke er her, hvor fejlen er. Det er skjult i kompilatoren.

Dette eksempel er grundlæggende, og du vil opdage det temmelig hurtigt, fordi dit program åbenbart ville være ødelagt. Men hvad nu hvis jeg gjorde noget mere subtilt? Hvad hvis jeg i stedet for at kommunikere med “print” -kommandoen ændrede kompilatoren, så hver gang den opdagede kode, der involverede adgangskoder, gjorde den det, så adgangskoden “ryaniscool” også fungerede?

Det er ikke verdens ende, hvis nogen kommer ind og ser, at min pizza bliver leveret. Ingen er interesseret nok til at forsøge at bryde det. Men afstemning er ikke en af ​​disse sager.

Hvis jeg gjorde det, ville jeg have, hvad der kaldes en "bagdør" i ethvert computerprogram, du bygger med min compiler. Med andre ord kan du låse din hoveddør alt, hvad du vil, men det betyder ikke noget, fordi jeg har en hemmelig dør bagpå, som ingen ved om. Ligegyldigt hvad du skriver, uanset hvor sikker din adgangskodekode er, fungerer min adgangskode til "ryaniscool" også - og du ved ikke engang det.

Det er klart, at dette er et problem. Og du kan tænke, ”Men kompilatorer er computerprogrammer som enhver anden. Jeg kunne se på kildekoden til min compiler for at sikre mig, at der ikke er nogen ondsindet kode der. Alt hvad jeg skulle gøre, er at finde den del, der taler om at tilføje 'ryaniscool' som en adgangskode, tage den ud, og jeg ville have det godt. Ret?"

Og det kunne du også. Bortset fra, som du sagde, er kompilatorer computerprogrammer som enhver anden. Og det betyder, at de selv er samlet.

Her er alt, hvad jeg skulle gøre for at udnytte det:

Trin 1

Som før, ville jeg skrive kode, der tilføjer "ryaniscool" som en gyldig adgangskode til alt, hvad den samler, og sætter dette i kompilatoren. På dette tidspunkt tilføjer jeg en bagdør til alt, hvad kompilatoren udarbejder, men jeg vil blive fanget, hvis nogen ser på kilden til min kompilator. Så jeg går videre til trin 2.

Trin 2

Jeg skriver kode til den kompilator, der registrerer, når den samler sig selv, og når det sker tilføjer den koden for trin 1 i kompilatoren. Når jeg nu kompilerer kompilatoren, laver den en ny version af sig selv, der tilføjer kompileringsinstruktioner til, hvordan man indsætter "ryaniscool" -adgangskoden, når compileren genopbygges. Og for at dække mine spor, er alt, hvad jeg har brug for at gøre, at fjerne de ondsindede instruktioner fra compilerkilden, og jeg er færdig.

Hver gang compileren genopbygges, bygger den sig sådan, at den indeholder instruktioner til at tilføje min bagdør. Hver gang denne kompilator bygger noget andet, følger den disse instruktioner og bygger min bagdør lige ind. Og der vil ikke være en enkelt linje med ondsindet kode tilbage i nogen kildekode, der afslører det.

Den eneste måde at registrere denne fejl er at gå over den binære kode selv - en opgave, der starter hårdt og bliver bogstaveligt umulig, når programmer bliver mere komplekse. William Shakespeares komplette værker kommer på under 6 megabyte. Firefox-browseren alene kræver 200 megabyte bare for at installere den, og det er kun et program på din computer. Der er ikke et menneske i live, der har læst alle 200 megabyte af den kode. Det er ikke engang skrevet på et sprog designet til mennesker at læse.

Hvorfor bruger vi disse mareridtmaskiner?

Intet af dette er nyt. I 1984 præsenterede Ken Thompson - manden, der designede og implementerede Unix, forfader til de operativsystemer, som de fleste computere og telefoner kører på - et papir kaldet “Reflections on Trusting Trust” og nåede denne konklusion:

Moralen er åbenlyst. Du kan ikke stole på kode, som du ikke helt oprettede dig selv ... Ingen mængde verifikation eller kontrol af kildeniveau beskytter dig mod at bruge ikke-tillidskode.

Ved "helt at oprette dig selv" betyder ikke Ken bare et program, du skrev, men et, du skrev hele stakken til: alt ned til kompilatoren. Meget få mennesker har tid, færdigheder og penge til at opbygge en computer fra bunden, inklusive al den software, der er på den. Dette ser ud til at være en kugle i hovedet for at have tillid til computere med noget.

Og alligevel stoler vi på computere med alle mulige ting. Så hvad giver? Hvorfor bruger vi disse mareridtmaskiner?

For det første er computere virkelig sjove og praktiske. Og de er praktiske på mange måder. Desuden kan et compilerhack være vanskeligt at trække i praksis: Du har brug for tid og motivation for at målrette mod nogen. Sandheden er, at der er mange tilfælde, hvor du ikke har brug for absolut tillid til din computer: Det er trods alt ikke verdens ende, hvis nogen kommer ind og ser min pizza blive leveret. Ingen er interesseret nok til at forsøge at bryde det.

Men afstemning er ikke en af ​​disse sager.

Den eneste sikre måde at stemme med en computer på, er en, hvorpå der vælges en papirstemme i synet af vælgeren, godkendes og derefter opbevares i en stemmeseddel.

Afstemning er et tilfælde, hvor resultatet af et hack kan have enorme effekter. Afstemning er også relativt let at målrette (du ved hvornår og hvor det vil ske), og der er en meget stærk motivation til at ændre resultatet. Så let som jeg kunne tilføje den "ryaniscool" adgangskode, kunne jeg ændre kommandoen "tilføje", så når den stemte sammen, tilføjede den noget ekstra til det parti efter eget valg.

Hvor meget skal jeg tilføje? Helt ærligt, på dette tidspunkt er det helt op til mig. Derfor denne konklusion: Afstemning online vil aldrig være sikker. Computerafstemning vil aldrig være sikker.

Den eneste sikre måde at stemme med en computer på, er en, hvorpå der vælges en papirstemme i synet af vælgeren, godkendes og derefter opbevares i en stemmeseddel. På den måde, hvis nogen mener, at computersystemerne blev kompromitteret - hvis der overhovedet er nogen grund til at mistænke for, at nogen har tilføjet stemmerne forkert - så er der et papirspor. Med andre ord er computeren at tilføje stemmerne en bekvemmelighed, intet mere. Den virkelige afstemning, den virkelige magt, ligger stadig i papirafstemningen.

Uden den papirspor, har du forladt computeren.

Og ingen skal nogensinde have tillid til en computer.

OPDATERINGER:

Der har været nogle tilbagevendende temaer i diskussionen omkring dette essay, så jeg troede, at jeg ville inkorporere dem her i Q + A-format! Essayet ovenfor er ikke ændret, men jeg troede, at nedenstående kan være nyttigt, hvis du gerne vil læse mere om dette emne!

Sp .: Hvad mener du med computerafstemning?

A: Jeg taler om et system, hvor du udelukkende stemmer på en computer: der genereres intet papirspor. I dette tilfælde er computeren autoriteten for det, du har stemt: der er ingen anden kilde, du kan kontrollere dobbelt.

En etisk og mere sikker måde at bruge computere til at stemme på er at bruge dem ikke som en autoritet, men som en bekvemmelighed. Hvis du stemmer på en papirafstemning, og en computer scanner, at for at tilføje et resultat, kan du føle dig mere sikker, for hvis noget går galt, er der stadig et fysisk papirspor. Hvis du stemmer på en computer, men derefter udskriver det en papirafstemning, som du skal bekræfte som værende nøjagtig, før din afstemning er optaget, kan du også føle dig mere sikker, fordi i begge disse situationer er computeren en bekvemmelighed. Det er, når computeren bliver en autoritet, at problemerne opstår.

Sp: Kan dette ikke løses ved at give hver person, der stemmer en hemmelig kode, eller en slags nøgle, eller måske kunne vi biometrisk scanne deres øjne eller fingeraftryk eller noget? Eller hvad hvis vi sikkerhedskopierede stemmer et eller andet sted på internettet, det andet, de blev foretaget?

A: Nej. Koder og nøgler kan opfanges eller duplikeres, og enhver biometrisk scanner ville være en computer, der er sårbar over for nøjagtigt de samme problemer, der diskuteres her. Og ethvert netværkssystem - hvor computeren deler den stemmer for at "sikkerhedskopiere det" et andet sted - afhænger igen af, at der ikke er manipuleret. Undskyld.

Q: Okay, men måske kunne vi teste vores programmer og se, om vores kompilerede kode fungerer anderledes end hvad vi forventer?

A: Dette fungerer ikke af et par grunde. Selvfølgelig, i mit "ændre værdien af ​​det, 10 + 20 tilføjer til" eksempel, ville det være let at teste og fange eventuelle ændringer. Men selvom du troede at teste det i første omgang - og hvorfor ville du gøre det? - det løser stadig ikke problemet. Min ondsindede kode kunne opdage, når den testes og ikke gøre noget dårligt, kun blive aktiv, når du ikke ser.

Lyder som scifi, ikke?

Det er allerede gjort: I Volkswagen-emissionskandalen 2015 opdagede bilens ombordcomputere, da deres emissioner blev testet og kørte i en miljøvenlig tilstand med lav effekt og skiftede til en forurenende tilstand med høj effekt, da testen var ovre . Computerne opdagede, da de blev testet, handlede efter deres bedste opførsel og stoppede derefter, når testen var slut. Denne skandale kostede Volkswagen 18,32 mia. Dollars til at fastsætte, forresten, ikke inklusive den bøde på 2,8 mia. Dollars, de betalte.

Den eneste grund til, at Volkswagen ville gøre dette i første omgang, er fordi det ville være rentabelt for dem, og de troede, at de ikke ville blive fanget. De samme incitamenter gælder for et valg.

Spørgsmål: Hvis jeg er tvunget til at stemme på en computer, betyder det da, at jeg ikke burde stemme?

A: Nej, du skal absolut stemme alligevel. Formålet med at blande sig i et valg er at frigøre dig. Hvis du ikke stemmer, fratrækker du dig selv franchise med 100% effektivitet. Gå til afstemning, og gør derefter, hvad du skal gøre for at sikre, at du aldrig behøver at bruge computerafstemning nogensinde igen.

Spørgsmål: Betyder det, at vi ikke skal stole på computere for noget?

A: I en absolut forstand: ja. Du skal ikke have 100% tro på noget computersystem. Men det er tydeligvis ikke praktisk, og i de fleste tilfælde behøver du ikke have 100% tro på en computer. Et af de få sager, du ville være, er ved afstemning. Det næste spørgsmål går nærmere ind på dette.

Q: Kom nu. Vi banker online, milliarder af dollars flyttes digitalt hver dag, og du skrev endda dette på en computer. Du er bestemt alarmerende og / eller hyklerisk?

A: Det er her ideen om absolut tillid kommer ind. Jeg stoler ikke absolut på computere, men banker online. Men det skyldes, at hvis noget går galt, kan banken ordne det bagefter. Du bruger et kreditkort, vel vidende, at der er en chance for, at dine oplysninger kan blive stjålet - men hvis det sker, har du tillid til, at kreditkortselskabet ordner det. Og det vil de - fordi den fortjeneste, de får fra dig ved hjælp af deres kort hver dag, udgør omkostningerne til dækning af svig og ødelagt software.

Men der er ingen måde at korrigere et ødelagt valg efter dette.

Det hele er et spørgsmål om kompromis: at offentliggøre dette online var praktisk, og jeg gjorde det vel vidende, at mine ord kunne ændres. Der er en risiko, de kunne være - men i sidste ende er det ikke verdens ende. Lav indsats, og fordelene opvejer ulemperne. Tilsvarende banker jeg online - fordi det også er praktisk, og jeg er villig til at gå på kompromis, fordi jeg ved, at selvom der er en chance for, at mine data og / eller penge kunne blive stjålet, føler jeg mig relativt sikker på, at banken vil dække dem. Og ja, jeg bruger computere til at sende venner $ 10 for at betale dem tilbage til middag, men jeg gør det, fordi indsatsen er så lav. Det er kun $ 10.

Indsatsen er ikke lav, når det kommer til afstemning.

Og et valgsystem - et demokrati - er ikke den slags ting, du vil gå på kompromis med.

Spørgsmål: Hvad med blockchain? Du skal have nævnt blockchain. Det er en ny teknologi, der ikke eksisterede i 1984, og som bestemt kunne løse dette problem.

A: Nej, nej, nej. Undskyld. Jeg ønsker, at det også fungerede.

Sp .: Du ved ikke, hvad du taler om, og hvem gjorde dig til en autoritet? Hvorfor skal jeg stole på dig?

A: Som jeg siger i essayet, er dette ikke mine strålende originale ideer. Jeg omformulerer dybest set, hvad Ken Thompson argumenterede i 1984 i hans Reflections on Trusting Trust-papir. Ken's argument er faktisk stærkere: hans eksempel er login-programmet, hvis analog bruges på næsten enhver computer. Jeg taler bare om at stemme. Ken's papir har stået som en papiropgave inden for datalogi i over 30 år, men det er ikke kendt uden for computervidenskabskredse. Derfor ønskede jeg at skrive dette essay.

(I øvrigt er der en måde at korrigere for de spørgsmål, Ken rejste, og jeg parafraserede: du kunne kompilere din kode to gange, en gang med en ny compiler og en gang med en kendt-god compiler. Hvis du sammenligner de to output og de er det samme, du ved, at din kompilator er god. Dette rejser naturligvis spørgsmålet om, hvor du vil få den kendte-gode kompilator fra - her er en ph.d.-afhandling om det emne).

Spørgsmål: Okay, sikker på, at dette er temmelig tørt, men det hele er hypotetisk. Vi bruger computere til at kontrollere atomreaktorer til at råbe højt. Hvis tingene ikke var sikre, ville vi vide det.

A: Et angreb, der ligner det, der er drøftet her - hvor beviset for angrebet var skjult - blev foretaget i det virkelige liv for få år siden med Stuxnut-ormen i 2010. Og det angreb - du gætte det - atomcentrifuger .

Disse angreb sker allerede. Ups.

Q: Computerafstemning kan være dårlig, men papirstemmerne kan også ændres, ved du. De er heller ikke perfekte.

A: Absolut. Men papirstemmer har nogle få store fordele: Deres ulemper er godt forstået (ingen skriver store essays om, hvorfor du ikke kan stole på papiret), og deres sårbarheder er begrænset til fysisk adgang.

Hvis jeg vil forkaste et papirvalg, skal jeg enten stjæle afstemninger eller ændre afstemninger eller stemmesedler - uanset hvad, har jeg brug for fysisk adgang til den stemmeseddel. Og det begrænser den skade, en dårlig skuespiller kan gøre. En kedelig teenager halvdelen af ​​verdenen væk kan ikke gennemføre et papirvalg ved valg af stemmesedlen fra hans kælder. Det samme kan ikke siges ved computerafstemning.

Og oven på alt dette er der en enkel kendsgerning: programmerere er ikke perfekte. Selv hvis angrebet i dette essay ikke bruges, betyder det ikke, at dit computerafstemningssystem er sikkert. Heck, Google - hvem jeg tror, ​​at vi alle kan blive enige om at ansætte nogle meget smarte mennesker - har et dusørsystem, hvor de betaler dig kontante penge, hvis du hjælper dem med at finde bugs i deres egen software, fordi de ikke kan garantere, at de ikke har lavet fejltagelser.

Programmering af software er hårdt. Computere er hårde. Selv en strålende, velmenende softwareudvikler kan begå en enkelt fejl, der åbner en hel softwarestack for indtrængen. Heartbleed-bug blev introduceret ved et uheld i 2011 - i open source-software, som i teorien enhver på kloden kunne have set på, undersøgt og opdaget - men den blev ikke fundet før i 2014, hvor 17% af serverne på internettet var nu sårbare.

Det blev gjort ved et uheld. Forestil dig hvad nogen kan gøre, hvis de prøvede.

Se, jeg ved, det stinker at høre, at computerafstemning er dårlig. Det stinker at stille op udenfor, i fysisk rum, når det er så let at forestille sig bare at stemme på en app på din telefon i din frokostpause og være færdig med det. Men vigtigere end, at et valg er praktisk, er det at være nøjagtig, og selvom computerafstemning helt sikkert ville være praktisk, håber jeg, at jeg har overbevist dig om, at du ikke skal stole på, at den er nøjagtig.

Q: Er der en relevant xkcd?

A: Der er altid en relevant xkcd.