Programul fingerd este un utilitar care permite obtinerea de informatii despre utilizatori. De obicei, este folosit pentru a identifica numele intreg sau numele de conectare (login) al unui utilizator, daca acesta se afla in sesiune si posibil, alte informatii despre persoana respectiva, cum ar fi numerele de telefon etc. Acest program este rulat ca daemon sau proces in fundal (background), pentru rezolvarea cererilor de informatii venite de la distanta, utilizandu-se protocolul fingerd, Acest program accepta conexiuni de. la programe ce ruleaza in alta parte, citeste linia de intrare si trimite raspuns receptorului care a adresat intrebarea.
Punctul slab exploatat, prin care se 'sparge' acest program, implica modificarea buffer ului de intrare folosit de acesta. Biblioteca f/0 a limbajului C are cateva rutine care citesc intrarea fara a verifica limitele buffer-ului implicat in aceasta operatiune. In particular, apelul functiei gets preia datele de intrare intr-un buffer, fara a face verificarea limitelor acestuia. Apelul acestei functii a fost exploatat de Vierme. Rutina gets nu este singura care are acest neajuns. O intreaga familie de rutine din biblioteca C-ului face posibila depasirea buffer ului, atunci cand se decodifica intrarea sau cand se formateaza iesirea, daca utilizatorul nu specifica explicit numarul de caractere pentru conversie.
Cu toate ca programatorii experimentati sunt cunoscatori ai acestor probleme, multi dintre ei continua sa foloseasca aceste rutine. Necazul este ca orice server de retea sau program privilegiat, care utilizeaza aceste functii, poate fi compromis datorita utilizarii unei intrari improprii. Interesant este ca recent, au mai fost descoperite inca doua comenzi in standardul BSD UNIX, care au aceasta problema.
Dupa atacul asupra INTERNET-ului au fost relevate mai multe probleme potentiale si mai multe modalitati de a le inlatura, dar cu toate acestea, biblioteca cu aceste rutine continua sa fie utilizata.
Programul Sendmail
Programul sendmail este un serviciu de posta electronica, destinat sa ruteze scrisorile intr-o retea eterogena. Programul are mai multe moduri de operare, dar unul dintre acestea este exploatat de Vierme si implica lansarea serviciului ca proces in background (daemon). In acest mod de lucru, procesul se afla in starea de 'ascultare' la un port TCP (25), pentru a face distribuirea postei sosite prin protocolul standard INTERNET, SMTP (Simple Mail Transfer Protocon. Cand o astfel de situatie este detectata, procesul intra intr-un dialog cu un alt proces de la distanta, pentru a determina expeditorul, destinatarul, instructiunile de distribuire si continutul mesajului.
Punctul slab exploatat in sendmail este legat de o optiune de depanare a codului. Viermele transmite comanda DEBUG la sendmail si apoi specifica destinatarul mesajului, ca un set de comenzi si nu ca o adresa utilizator. Intr-o operatiune normala, acest lucru nu este permis; insa, in activitatea de depanare a codului este posibila verificarea postei sosite pentru un anumit destinatar, fara a se apela rutinele de adresare. Prin utilizarea acestei optiuni, testele pot rula programe care sa afiseze starea sistemului de posta, fara trimiterea de mesaje sau stabilirea unei conexiuni. Aceasta optiune de depanare este adesea utilizata tocmai datorita complexitatii configurarii lui sendmail.
Programul sendmail este de mare importanta, mai ales pentru sisteme UNIX derivate din BSD, deoarece manuieste procese complexe de rutare si distribuire a postei. Totusi, in ciuda importantei mari si a utilizarii largi, cea mai mare parte a administratorilor de sisteme stiu putin despre felul in care lucreaza sendmail. Desi sunt relatate multe aparitii de driver e scrise de administratori de sisteme sau modificari aduse Kernel-ului, nimeni nu a adus inca modificari la sendmail sau la configuratia fisierelor sale. In concluzie, punctele slabe prezentate in sendmail sunt putin cunoscute, iar unele dintre ele sunt depistate si comunicate pe masura descoperirii lor.
Parole
Una din 'piesele de rezistenta' ale Viermelui implica incercarea de a descoperi parolele utilizatorilor. In sistemele UNIX, utilizatorul furnizeaza o parola ca semn de verificare a identitatii. Parola este criptata, utilizand o versiune a algoritmului DES, iar rezultatul este comparat cu rezultatul criptarii anterioare, prezent in fisierul letclpasswd. Daca acestea coincid, accesul este permis. In acest fisier nu sunt incluse parolele in clar si algoritmul se presupune a fi neinversabil; deci, fara cunoasterea parolei nu avem acces.
Organizarea parolelor in UNIX permite unor comenzi neprivilegiate sa utilizeze informatii din fisierul /etc/passwd si sa acceseze schema de autentificare a parolelor. Deci se permite un atac prin criptarea unei liste cu parole posibile si compararea rezultatelor cu fisierul letclpasswd, fara a se face apel la o functie sistem, special dedicata. De fapt, securitatea parolelor este asigurata in principal prin numarul mare de incercari ce trebuie efectuate pentru a le determina, cu toate combinatiile de caractere posibile. Din nefericire, exista masini care lucreaza rapid si costul unei astfel de actiuni este in continua descrestere, datorita rapiditatii dezvoltarii produselor hard.
Divizand procesul pe mai multe procesoare, se reduce mult timpul necesar determinarii unei parole. Astfel de atacuri sunt usurate mult, atunci cand utilizatorul alege drept parola un cuvant comun sau des folosit. In acest caz, toata cautarea se rezuma la determinarea parolei prin verificarea unor cuvinte comune, existente intr-o astfel de lista (vezi capitolul 2).
Viermele utilizeaza pentru spargerea parolei un astfel de tip de atac. In acest sens se foloseste o lista de cuvinte standard, cuvinte care sunt considerate a fi parole posibile. Viermele asigura criptarea lor prin intermediul unei versiuni rapide a algoritmului de cifrare si apoi, compara rezultatul cu continutul fisierului /etc/passwd. Deci Viermele exploateaza accesul la acest fisier, cuplat cu tendinta utilizatorilor de a alege cuvinte comune drept parole.
Un defect discutat in prezent si care a fost exploatat de Vierme implica utilizarea sesiunilor de incredere. Una din facilitatile utile ale soft-ului de retea al lui BSD UNIX este suportul de executie a proceselor pe masini aflate la distanta. Pentru a se evita repetarea tiparirii parolelor pentru accesul in conturi aflate la distanta, se asigura posibilitatea unui utilizator de a specifica o lista cu perechi gazda cont, care sunt considerate a fi de incredere, in sensul ca un acces la distanta de la calculatorul gazda la acel cont se face fara a utiliza parola contului respectiv. Acest aspect este responsabil de numeroasele accese neautorizate la calculatoare, dar continua sa fie utilizat, fiind convenabil. Viermele a exploatat acest mecanism prin incercarea de a localiza host-urile de incredere si a determina perechile corespunzatoare. Acest lucru a fost realizat prin examinarea de catre Vierme a fisierului de pe host-ul curent, care contine perechile host/conturi. Odata ce Viermele gaseste astfel de candidati, va incerca, in modul cel mai rapid, sa se autoinstaleze pe aceste masini, folosind facilitatea executiei la distanta, copiindu-se pe sine pe masina de la distanta, ca si cum ar fi un utilizator autorizat, care efectueaza o operatie standard de la distanta. Pentru a inlatura astfel de incercari in viitor, este necesar ca actualul mecanism de acces la distanta sa fie anulat si inlocuit cu ceva nou. Un mecanism nou creat, care se apropie de cerintele de mai sus, este server ul de autentificare Kerberos (vezi subcapitolul 7.4).