Morrisov crv (1988)

Jedna crta koda, tuđi kampus da se prikrije trag, i internet koji te večeri prvi put sazna da vjerovanje nije sigurnosni protokol.

poglavlje 23/2918 min čitanja1981 – 1990
ti@kronika:~$ ./sviraj k3_23_worm.mp3

# da, poglavlje ima pjesmu. ne, nitko ne zna zašto.

Srijeda, 2. studenog 1988. Negdje malo prije 20 sati po istočnoameričkom vremenu. Zamisli internet — ne onaj tvoj, ovaj: oko 60.000 strojeva, uglavnom sveučilišni Unix serveri, povezani u mrežu koja je tehnički nasljednica ARPANET-a, one mreže koju je financirao američki obrambeni resor još šezdesetih — a tu istu mrežu ćeš kasnije upoznati pod imenom koje danas svi znaju: internet. Šezdeset tisuća strojeva. Cijeli tvoj grad ima više stanovnika. To je internet 1988. — selo, ne metropola. Svi znaju sve o svima, ili se bar tako osjećaju.

U tom selu vrata se ne zaključavaju. Ne metaforički — stvarno. Lozinke postoje, ali ih čuvarice sustava tretiraju kao preporuku, ne kao zakon. sendmail — program koji na tim strojevima šalje i prima e-poštu — radi ono što mu se kaže bez puno pitanja, fingerd — mali servis koji na upit izbaci osnovne podatke o korisniku, tko je i kad se posljednji put javio — odgovara svakome tko pokuca, i nitko se ne ljuti kad im rootshell (pristup računalu s potpunim ovlastima, ono najviše što možeš dobiti) ostane otvoren preko noći, jer — pa tko bi to iskoristio? Svi ovdje su akademici, doktorandi, sistemski administratori koji se poznaju s konferencija i razmjenjuju kod slobodno, kao susjedi koji si posuđuju kosilicu. Kultura povjerenja nije bila naivnost. Bila je infrastruktura. Cijeli sustav je funkcionirao na pretpostavci da nitko od nas neće biti onaj koji to zabrlja.

U Ithaci, u državi New York, na sveučilištu Cornell, sjedi student po imenu Robert Tappan Morris. Dvadeset i dvije godine. Ima i zanimljivu obiteljsku pozadinu — onu vrstu koja te natjera da pomisliš: nije slučajno da je baš on ovo napravio. Otac mu je Robert Morris starji, glavni znanstvenik u National Computer Security Centeru, dijelu NSA-e — čovjek čiji je posao, bukvalno, razmišljati o tome kako se sustavi mogu obraniti. Sin je odlučio provjeriti obratno.

Morris ima ideju, i ta ideja je — gledano danas — poštena znanstvena znatiželja spojena s katastrofalno lošom procjenom razmjera.

20:30, 2. studenog 1988. Morris sjedi za terminalom — ali ne na Cornellu. Sjedi u MIT-ovom Laboratoriju za informatiku, ulogiran preko mreže s tuđe adrese, i pokreće program na kojem je radio tjednima. Zašto MIT, kad mu je Cornell pet sati vožnje bliži i deset koraka od sobe? Zato što je Morris znao da će netko, prije ili kasnije, pratiti trag do izvora, i htio je da taj trag završi na kampusu na kojem ga nema, a ne na onom na kojem jest. Fino razmišljanje za mladića koji je inače pametan. Samo jedan detalj mu nije sjeo: FBI ne traži adresu, traži čovjeka. A čovjek se, kao što ćemo vidjeti dalje u ovoj priči, uvijek nekako oda.

Program koji tu pokreće s pravom se zove crv, ne virus — razlika je bitna, i Morris ju je dobro razumio. Virus treba domaćina: datoteku koju će zaraziti i čovjeka koji će tu datoteku pokrenuti. Crv ne treba ništa od toga. Crv hoda sam. Otvori vrata, uđe, pa iz nove kuće otvori sljedeća vrata. I sljedeća. I sljedeća.

A vrata na internetu 1988. bila su, blago rečeno, širom otvorena. Morrisov program napada na tri fronte istovremeno, kao da je htio biti siguran da će mu se posrećiti bar jednom. Prva fronta: sendmail, kroz ugrađenu funkciju za debagiranje koju administratori ostavljaju upaljenu godinama nakon što je ikome zapravo trebala — crv joj šalje naredbe umjesto poruka, a sendmail ih poslušno izvršava. Druga fronta, ona koja zaslužuje pravu pozornost: fingerd.

Fingerd je uslužni program, sitnica — javi ti je li neki korisnik online i kad se posljednji put logirao. Bezopasan kao telefonski imenik. Problem je u tome kako fingerd prima ime osobe koju tražiš: sprema ga u fiksnu, ograničenu kutijicu memorije, bez provjere staneš li unutra. Ako mu pošalješ ime dulje nego što ta kutijica predviđa, program se ne buni, ne odbija — samo nastavi pisati preko rubova kutije, u memoriju koja mu ne pripada. Ono što tamo prepiše nije slučajno smeće: Morris je pažljivo složio te viškove tako da preko ruba kutijice odu i prave instrukcije za procesor, pa fingerd, umjesto da odgovori tko je online, poslušno pokreće crvov kod.

Treća fronta bila je jeftinija i manje elegantna: rječnik. Crv je pokušavao pogoditi lozinke iz popisa najčešćih riječi i njihovih varijacija — imena, prezimena unatrag, uobičajene kratke kombinacije — jer je znao, ispravno, da će velik dio strojeva na mreži imati postavljenu lozinku poput „password”, ili, još bolje, nikakvu. Selo bez katanaca ne treba genijalnog provalnika. Treba samo nekoga tko je voljan pokucati na dovoljno vrata.

Sve tri fronte pokrenuo je istovremeno, u 20:30, s Massachusetts Institute of Technologyja, uvjeren da izvodi elegantan mali eksperiment koji će pokazati koliko je interneta zapravo dostupno svakome tko se potrudi. Morris nije, tvrdit će kasnije i uporno, htio štetu. Htio je brojku. Htio je znati koliko strojeva postoji tamo vani, tiho, u sjeni, izbrojati ih bez da ikoga probudi.

Nije znao, još, da je u tu istu brojku ugradio grešku koja neće samo izbrojati strojeve — nego će ih, jedan po jedan, ugušiti.

22:00 — greška u parametru
§ 02

22:00 — greška u parametru

22:00, MIT, negdje u utrobi mreže. Crv je vani već skoro sat i pol, i da je Morris ostao gledati ekran umjesto što je (kako priča kaže) izašao van na pivo dok se stvar sama posluži internetom, vjerojatno bi u ovom trenutku problijedio. Jer ono što je zamislio kao elegantan, tih, pristojan program koji tiho luta mrežom, pretvara se, negdje između provale kroz fingerd i sljedeće žrtve, u nešto što nijedan administrator sustava na svijetu nije te večeri očekivao vidjeti na svom stroju.

Zamisao je, treba reći, bila skoro pristojna. Crv se, prije nego što bi zarazio novi stroj, trebao pitati: je li ovdje već netko od mene? Logično — ako je program već tu, nema smisla da se ista mašina napuni s dvjesto identičnih kopija same sebe, to je i njemu, kao autoru, bilo jasno da bi bila katastrofa. Zamisli da imaš gosta koji, prije nego što uđe u tvoju dnevnu sobu, pita jesi li već ugostio nekog istog imena. Pametno. Higijenski. Skoro pa lijepo od njega.

Ali onda je Morris, negdje u glavi, čuo tihi glas paranoika: a što ako neki administrator, kad primijeti crva, namjerno postavi lažni odgovor? Program koji se predstavlja kao da je zaraza već tu, samo da otjera pravog crva dalje — nešto kao lampa za komarce koja se pravi da je već druga lampa, pa komarac ode dalje tražiti. Rješenje protiv te varke zvučalo je razumno: neka crv, i kad dobije odgovor „već sam ovdje”, jednom od sedam puta ipak ignorira tu poruku i inficira stroj ponovno. Statistička sigurnosna mjera. Osiguranje protiv lažiranja.

E vidiš, tu je greška. Ne u ideji — ideja je bila u redu, čak pametna. Greška je u brojci, i u tome što nitko, ni sam autor, nije sjeo i pomnožio što ta jedna sedmica radi kad je pustiš na tisuće strojeva istovremeno, svaki od kojih razgovara s desecima drugih. Jedan od sedam ne znači „rijetka iznimka koja se pojavi tu i tamo”. Jedan od sedam, na mreži gdje se stroj A javlja stroju B, koji se javlja stroju C, koji se opet javlja stroju A — znači da se crv množi brže nego što ga bilo tko stigne izbrisati.

Matematika iza toga nije komplicirana — upravo suprotno, to je najstrašnija stvar u cijeloj priči. Uzmi jedan zaraženi stroj. On, prije nego što bilo tko stigne reagirati, pokuša zaraziti svaki drugi stroj s kojim ima ikakvu vezu — preko sendmaila, preko rupe u fingerd-u, ili preko pogađanja lozinki iz malog rječnika koji je Morris ugradio u kod. Od tih pokušaja, statistički, jedan od sedam „upali” čak i na strojevima koji su već zaraženi. Što znači: broj aktivnih kopija crva na jednom stroju ne raste linearno, kako je Morris vjerojatno zamišljao — raste geometrijski, jer svaki novi pokušaj infekcije pokreće novi proces, koji sam pokušava zaraziti sve oko sebe, uključujući stroj na kojem već sjedi.

Do 22:00 to više nije apstrakcija. Na Berkeleyju, na Stanfordu, na desecima sveučilišnih VAX i Sun strojeva, procesi se množe kao zečevi u laboratoriju bez predatora. Jedan stroj koji bi u normalnom radu vrtio dvadesetak procesa, sad vrti stotine kopija istog programa — svaka od njih pokušava, marljivo i bez pardona, zaraziti dalje, provjeriti mrežne susjede, pogoditi lozinku, replicirati se opet. Memorija se puni. Puni se i swap — dio diska koji stroj koristi kao rezervnu memoriju kad mu prava memorija (RAM) ponestane, sporiji je od nje, i kad se i on zagusi, stroju ostaje samo da se muči. Procesor je zauzet sam sobom. Sistem koji je do prije koji sat odgovarao na naredbe u djeliću sekunde, sad treba pola minute da ispiše i jedan znak na terminalu.

Ono što je u ovoj priči istinski zlobno nije to da je Morris htio srušiti internet — svi izvori, pa i sud kasnije, slažu se da nije. Zlobno je koliko je mala odluka bila dovoljna da se dogodi ono što se dogodilo. Ne backdoor, ne namjerni sabotažni kod, ne zlonamjerna rutina koja briše diskove. Samo jedna brojka, sedmica, ubačena kao zaštita od zamišljenog protivnika koji se pravi mrtav — i baš ta jedna brojka je, u kombinaciji s eksponencijalnom prirodom mreže, pretvorila akademski eksperiment u najveći ispad koji je internet do tada vidio.

Zanimljivo je koliko je ta greška banalna u usporedbi s onim što je crv tehnički inače postizao. Probijanje sendmaila prekoračenjem međuspremnika — buffer overflow, odnosno trik kad programu ubaciš više podataka nego što je predvidio da će primiti, pa mu višak preplavi memoriju i pokvari susjedni dio — pogađanje lozinki grubom silom te iskorištavanje rupe u fingerd-u bili su ozbiljni, promišljeni inženjerski potezi. Katastrofu nije napravila ta sofisticirana strana. Katastrofu je napravio jedan broj, tiho zakopan u if-uvjetu koji je trebao spriječiti baš to što je uzrokovao. Ako ti ovo zvuči kao metafora za pola informatičke povijesti — nisi jedini koji je to primijetio.

Noć — sistemci protiv nevidljivog
§ 03

Noć — sistemci protiv nevidljivog

Ponoć, 3. studenog. Negdje u Berkeleyju sistemac gleda ekran koji se puni brojkama koje nemaju smisla — 5, 20, 40. Riječ je o »load average«, broju koji govori koliko je procesor zagušen poslom (zamisli ga kao brzinomjer za koliko se stroj muči da obradi sve što od njega tražiš); normalno bi taj broj noću, dok se odvijaju rutinski poslovi, bio nizak i dosadan, a sad izgleda kao da je netko preko noći na stroj natrpao pet puta previše posla. Prvi refleks svakog admina na svijetu je isti: podigni telefon, nazovi kolegu na drugom sveučilištu, pitaj ima li i on isti cirkus. I onda dolazi prva prava spoznaja te noći, ona koja bi trebala biti komična da nije toliko zastrašujuća — mail ne radi. Naravno da ne radi. Sendmail je upravo taj kroz koji je crv i ušao, a stroj koji ga pokreće je pod opsadom. Mreža koju pokušavaš spasiti je ista mreža kojom se dogovaraš kako je spasiti. Zamisli vatrogasca koji dođe pogasiti požar i otkrije da mu je crijevo zapaljeno.

Tako se cijela obrana te noći odvija — ne preko interneta, nego preko telefonskih linija, ARPANET-ova starijeg, sporijeg, ali fizički odvojenog rođaka. Ljudi diktiraju heksadecimalni ispis koda kolegi na drugom kraju države, slovo po slovo, kao kad diktiraš broj kreditne kartice. Netko drži slušalicu ramenom i tipka istovremeno. Negdje se budi šef odjela, negdje dekan, negdje netko iz vladine agencije koja će sutra imati puno pitanja. Prva konkretna odluka koju timovi donose nije »kako popraviti«, nego »kako amputirati« — cijeli kampusi počinju fizički isključivati veze prema van, čvor po čvor, kao da mreži stavljaš stegu na krvarenje. To je karantena u najbukvalnijem smislu: internet 1988. je dovoljno malen i dovoljno rijedak da se doslovno može ugasiti sekcija po sekcija, kao požarni prekidač u kazalištu.

Do dva ujutro formiraju se dvije neformalne, ali povijesno važne ekipe — jedna na Berkeleyju, druga na MIT-u — koje rade ono što bi se danas zvalo »reverse engineering« uživo, i to bez alata koji bi to ime opravdali. Pojednostavljeno, reverse engineering znači da uzmeš gotov program i pokušaš unatrag rekonstruirati kako je napisan i zašto radi to što radi — kao kad bi razglavio sat da vidiš koji zupčanik tjera koji, samo što ovdje zupčanici pucaju po tebi dok ih razglavljuješ. Netko je uhvatio binarnu kopiju crva prije nego što se sam obrisao (crv je, uz sve svoje mane, imao ugrađen mehanizam samobrisanja — pokušaj urednosti koji djeluje gotovo ironično usred ovog kaosa), i sad ga dva tima »disasembliraju« paralelno, to jest ručno pretvaraju gomilu nula i jedinica natrag u nešto što nalikuje kodu koji bi čovjek mogao pročitati, uspoređujući bilješke telefonom svakih pola sata. Nema Stack Overflowa, nema foruma, nema ni pojma »buffer overflow« kao svakodnevnog žargona — postoji samo šesnaestični ispis na ekranu i ljudi koji pokušavaju u glavi rekonstruirati logiku netko drugog, usred noći, dok im telefoni neprestano zvone.

Do jutra jedan od timova identificira ranjivosti — sendmail, fingerd i, dakako, slabe lozinke — i počinje kolati privremeni patch, opet preko istih sporih kanala, opet telefonom i faksom, dok se sama vatra još širi. Koliko je zapravo strojeva zaraženo, nitko te noći ne zna s preciznošću, i nitko ne zna ni danas — brojka koja se najčešće navodi, oko deset posto od tadašnjih šezdesetak tisuća strojeva na mreži, dolazi iz procjena samog Morrisa i naknadnih analiza, ne iz ičeg što bi izdržalo revizorski pregled. Neki povjesničari tvrde da je stvarni broj manji, jer se panika brzo pretvorila u glasine, a glasine u legendu. Ali i ta manja brojka, u mreži koja je bila zamišljena kao susjedstvo gdje se svi znaju, dovoljna je da za jednu noć promijeni značenje riječi „povjerenje” u informatici zauvijek.

Do zore crv je uglavnom pod kontrolom — ne pobijeđen, samo iscrpljen, kao požar koji je pojeo sve što je moglo gorjeti. Sunce izlazi nad kampusima punim praznih šalica kave i ljudi koji nisu spavali, i koji još ne znaju da su upravo, na terenu, izmislili posao koji do jučer nije postojao ni po imenu.

Dani poslije — otkriće i suđenje
§ 04

Dani poslije — otkriće i suđenje

Subota, 5. studenog. New York Times izlazi s imenom: Robert Tappan Morris. Otac je cijelu karijeru proveo objašnjavajući ljudima zašto su slabe i opcionalne lozinke loša ideja. Sin je upravo dokazao da je u pravu, na najskuplji mogući način.

Morris je isprva pokušao ostati anoniman — otud i puštanje crva s računala na MIT-u, a ne s Cornella, taktika koja je trebala zamesti trag do njega. Nije upalilo. Kod je bio prepun tragova: komentari, stil pisanja, čak i par identifikatora koji su vodili ravno do njegova računa na Cornellu. Sistemci koji su ga secirali te noći nisu bili glupi ljudi, a mreža od šezdesetak tisuća strojeva ipak je bila dovoljno malo selo da glasine putuju brže od samog crva. Do trenutka kad je New York Times objavio ime, ono je već kolalo unutar zajednice — novine su samo stavile pečat na ono što je struka već znala.

Pravni sustav u to vrijeme nije imao gotovo ništa za ovakav slučaj. Zakon o računalnoj prijevari i zloupotrebi nije predvidio studenta koji iz akademske zajebancije pušta samoumnožavajući program koji mu pobjegne kontroli. Ipak, zakon je bio dovoljno širok da se Morris u njega uklopi, i 1990. postaje prva osoba u povijesti osuđena po tom zakonu. Presedan koji će odjekivati desetljećima — svaki sljedeći hakerski slučaj u Americi, od tinejdžera u podrumu do državno sponzoriranih grupa, mjeri se prema tom istom paragrafu koji je napisan prije nego što je itko znao da će Morrisov crv postojati.

A kazna? Tri godine uvjetno. Četristo sati društveno korisnog rada. Novčana kazna od 10.050 dolara. Za nešto što je zaustavilo — po različitim procjenama — desetak posto tadašnjeg interneta (odnosno ARPANET-a, DARPA-ine mreže koja će kasnije narasti u ono što danas zovemo internetom) i nanijelo štetu koja se, ovisno koga pitaš, mjerila u milijunima dolara izgubljenog vremena, spaljenih noći i otkazanih istraživanja. Nesrazmjer je toliki da zvuči kao postavka za vic: čovjek srušio deseti dio svjetske mreže, dobio kaznu kao da je pretjerao na parkingu.

Ono što povezuje ta dva života — studenta koji je slučajno srušio internet i investitora koji je pomogao izgraditi novi — nije oprost, ni zaborav. To je jednostavno način na koji Silicijska dolina funkcionira: greška koja je 1988. bila savezni zločin, 2005. je već gotovo »origin story«, priča o počecima koju ćeš ispričati na pitchu. Nitko to ne izgovara naglas na konferencijama, ali svi znaju priču.

Ostavština: kraj nevinosti
§ 05

Ostavština: kraj nevinosti

Nekoliko tjedana nakon 2. studenog, u nekom sivom uredu na Carnegie Mellonu, DARPA — agencija Ministarstva obrane SAD-a koja je desetljećima ranije i financirala izgradnju ARPANET-a — potpisuje papire i rađa novu instituciju: CERT, Computer Emergency Response Team. Prva ekipa na svijetu čiji je posao, u punom radnom vremenu, čekati da nešto pukne i onda trčati. Ne fakultetski projekt, ne diplomski rad nekog entuzijasta koji voli lomiti stvari — institucija. Vlada Sjedinjenih Država je upravo, službeno, priznala da je sigurnost mreže problem dovoljno ozbiljan da zaslužuje svoj proračun. To se ne događa zbog teorije. Događa se zbog jednog studenta koji je htio izmjeriti internet, pa je slomio od dvije do šest tisuća strojeva, ovisno koga pitaš.

I tu je prekretnica, ako je tražiš na jednom mjestu: sigurnost prestaje biti akademska tema. Do studenog 1988. sigurnost je bila nešto o čemu se pisao rad, prezentacija na konferenciji, možda poglavlje u knjizi koje svi preskoče. Nešto što rade ljudi kojima je zabavno razmišljati kako bi netko mogao biti zlonamjeran, u svijetu u kojem, iskreno, nitko nije bio. Nakon crva, sigurnost postaje budžetska linija. Postaje posao. Postaje razlog da neka firma postoji, da neki čovjek ima titulu koja prije nije postojala, da se piše protokol za stvar koju dan prije nitko nije smatrao problemom.

I upravo je to ono što se srušilo te noći — ne sendmail, ne fingerd, ne neki poslužitelj u podrumu. Srušilo se povjerenje kao dizajnerski princip. Internet je do tog trenutka bio građen na pretpostavci da su svi na njemu, po definiciji, u redu: lozinke opcionalne jer zašto ne bi bile, vrata otključana jer koga bi to smetalo. Nakon crva ta pretpostavka umire i nikad se više ne vraća. Od tog trenutka nadalje svaki sustav gradi se pod drugom pretpostavkom — da će neki student, negdje, iz dosade, znanstvene znatiželje ili čiste gluposti, pokušati vidjeti što se dogodi kad pritisne gumb koji ne bi trebao pritisnuti.

Sjeti se poglavlja o von Neumannu — ista arhitektura koja je dala univerzalno računalo dala je i buffer overflow, jer program i podaci sjede u istoj memoriji i stroj ne pravi razliku između njih. To je bio dug potpisan 1945., a fingerd ga je platio 1988. Ali crv nije samo naplatio jedan tehnički dug. Otvorio je novi račun, jedan koji nikad ne dosegne nulu: dug sigurnosti kao vječne kategorije. Poslije će doći crvi koji su prijetili, ali nisu stigli (nasreću), doći će crvi koji jesu, doći će cijela industrija čiji je jedini posao zamišljati najgore što bi netko mogao učiniti tvom kodu i onda se pripremiti za to. CERT je bio prvi znak. Nije bio zadnji.