Soluții - PC Magazine Romania, Iulie 2004
Securitatea aplicaților JSP
Mircea Scărlătescu
Securitatea siturilor web este o problemă mereu la modă în această perioadă.
Dacă la începutul anilor ´90 siturile web erau doar o înlănțuire de texte
și imagini, reprezentând mici și nesemnificative prezentări ale unor idei sau
servicii, astăzi majoritatea serviciilor oferite de firme sunt dublate de o
variantă electronică, disponibilă pe web. Din păcate insă, securitatea este
o problemă care devine din ce în ce mai greu de asigurat, o dată cu diversificarea
serviciilor electronice și cu accesul la acestea.
Tocmai accesul pe diferite canale (din ce în ce mai multe) la paginile web,
începând cu "clasicele" calculatoare, și continuând cu device-urile
de gen PDA, sau telefoane mobile face ca problema cea mai mare a securității
să devină restricționarea acestui acces pentru cei rău intenționați. Un hacker
va încerca mai intâi să spargă un sit prin canalele pe care un utilizator corect
le folosește pentru a comunica cu situl (formulare de preluare a datelor etc).
Doar dacă așa nu va reuși va încerca și metode ceva mai avansate, sau și mai
bine, va renunța.
Metoda imediată de protejare a siturilor împotriva acestui gen de atacuri este
reprezentată de validarea input-ului de la utilizator.
În cele ce urmează încercăm să prezentăm o serie de strategii de implementare
a aplicațiilor web privind în special validarea input-ului de la utilizator.
Tehnologiile JSP facilitează, așa cum știți deja, realizarea de conținut dinamic
pentru mediul World Wide Web prin introducerea de cod Java în cadrul documentelor
de tip HTML. Paginile JSP sunt parsate și convertite de motorul Java în Servlet-uri
(serverul web JavaEnabled). Așa cum ați putut vedea în numerele anterioare,
JSP-ul oferă multe tag-uri asemănatoare cu HTML care interacționează cu baze
de date și obiecte Java pentru a produce conținutul dinamic.
Pentru cei care sunt familiarizați cu modul de lucru CGI, tehnologia JSP îmbunătătește
mult acest protocol, în domeniul sesiunilor, a conexiunilor persistente. Se
știe că în general un proces CGI era distrus mereu odată cu închiderea parsării
scriptului, însă în JSP conexiunile persistente permit o implementare mult mai
eficientă a acestor procese.
Trebuie precizat faptul că Java rezolvă multe din problemele de securitate
pe care le aveau limba-jele de programare mai vechi. Colectarea variabilelor
nefolosite, accesul la pagini etc. sunt mult mai bine tratate, facând astfel
ceva mai grea spargerea unei aplicații web JSP.
Nu trebuie înțeles că este foarte greu să scrii cod JSP care să nu fie securizat
suficient. De asemenea trebuie avut în vedere că arhitectura JSP este destul
de complexă și complicată pentru cei neexperimentați, iar din interacțiunea
incorectă între acestea pot apărea găuri de securitate.
Despre utilizatori, îmi aduc aminte de un stimat profesor al catedrei de calculatoare
din Facultatea de Automatică București, care ne spunea la cursurile lui că toți
utilizatorii trebuie considerați în cadrul etapei de programare ca fiind stupizi
și rău intenționați. J Desigur, toți am luat-o atunci ca pe o glumă, dar dupa
ani și ani de experiență sfatul lui nu mai pare chiar așa de neadecvat. Așadar
cam orice input de la utilizator trebuie să fie validat și verificat astfel
încât să conțină doar elementele ce nu pot pune în pericol intergritatea datelor
din sistem.
Dar, de fapt, ce înțelegem prin input de la utilizator? Orice informație venită
prin: URL-uri (protocolul GET), formulare (protocol POST), cookie-uri și altele.
Problemele apar atunci când un atacator încearcă să execute diferite comenzi
sau scripturi care nu trebuie să fie executate decât de persoane autorizate.
Spre exemplu, prin intermediul clasei Runtime metoda exec() poate executa o
comandă pe server, ceea ce pentru un hacker reprezintă o ocazie excelentă de
a accesa părti ale sistemului, care în nici un caz
nu-i sunt permise. Să ne imaginăm doar cazul în care acesta încearcă și reusește
să schimbe parola de root a unui server web ce rulează pe Linux. Consecințele
sunt ușor de imaginat, iar munca de reparare a pagubelor de multe ori înseamnă
refacerea întregului sistem.
Un alt exemplu de atac este încercarea de a identifica resursele pe care un
script le utilizează pentru a funcționa corect. De exemplu, un hacker poate
încerca să afle parola de acces la o bază de date folosită de script, având
acces astfel direct la date (e ușor de ghicit în ce scop: rularea de interogări
și comenzi SQL pentru a prelua sau distruge informații senzitive pentru sistem).
Un exemplu în acest sens este reprezentat de mediatizatul caz în care un hacker
din Marea Britanie a reușit să acceseze baza de date a companiei de telefonie
mobilă unde era abonat, și a vorbit pe gratis destul de mult timp - nu încercați
așa ceva acasă! ☺
Validarea datelor trimise de un utilizator reprezintă verificarea sintactică
a input-urilor (uneori și semantică). Dacă apar erori sau elemente neconforme,
sunt mai multe posibilități de a "ataca" situația:
- eliminarea (ignorarea) elementelor neconforme;
- înlocuirea elementelor nesigure sau nelegale cu altele acceptate;
- raportarea unei erori către utilizator (cel mai întâlnit caz);
Datele transmise prin protocolul GET reprezintă cea mai veche metodă de transmitere
a datelor, și în mod cert cea mai demodată și nerecomandată. Astfel GET-ul încapsulează
datele transmise în URL, și este cam cel mai ușor mod de a-ți face public date
ce nu ar trebui să ajungă așa. În primul rând, datele pot fi citite "cu
ochiul liber", pot să fie memorate de browser (în secțiuni precum HISTORY,
sau altele de acest gen), și cel mai grav pot să fie logate (trecute în log-uri
de activitate) atât de servere proxy, cât și de routere sau alte echipamente
inteligente de rețea. Astfel, transmiterea de parole, date de acces la baze
de date sau alte date senzitive prin GET reprezintă o invitație evidentă pentru
un hacker. O precizare importantă aici, din punctul de vedere al JSP, datele
din GET sau POST (metoda recomandată în acest caz) sunt tratate la fel, deci
programarea nu devine mai dificilă dacă nu folosim GET.
Conceptul de cookie a fost introdus de Netscape, și reprezintă o informație
stocată la client, care este folosită la o reaccesare a unui sit pentru a continua
o sesiune începută înainte, sau în diferite alte scopuri. Și JSP folosește metode
specifice cu acest tip de date (mai bine zis tip de stocare a datelor). Există
o clasa specială pentru lucrul cu ele, denumită javax.servlet.http. Cookie.
Sunt două motivele pentru care nu trebuie să vă bazați prea mult pe cookie-uri
atunci când lucrați la un site web. Datele stocate sunt vizibile oricând local
pentru utilizator, deci datele sensibile nu trebuie stocate astfel, și în al
doilea rând, un hacker poate modifica oricând aceste date în scopuri malițioase.
Folosirea JavaBeans
Componentele reutilizabile JavaBeans oferă o funcționalitate sporită siturilor
realizate în JSP. Un Bean va conține proprietăți care sunt inițializate de către
situl respectiv prin transmiterea de parametrii, iar funcționalitarea unui Bean
respectă conceptul de "cutie neagră" (black box): ne interesează doar
rezultatul operațiilor, nu și modalitatea de realizare. Astfel, proprietățile
unui bean se vor inițializa prin declarații de tip nume=valoare. Iată și un
exemplu:
<jsp:useBean id="boabaJava1" class="BoabaJava"> <jsp:setProperty name=" boabaJava1" property="*"/> <jsp:useBean>
Prin declarația de mai sus, toate propritățile beanului se inițializează prin
URL (notația *). Prin această metodă, toate datele vor fi construite din sit
și transmise în clar. Problema apare în momentul în care un hacker încearcă
să transmită date eronate care vor afecta funcționalitatea acestui bean, și-l
vor face să nu mai funcționeze corect, să dea rezultate neașteptate sau chiar
ascunse în mod normal. Soluția în acest caz este reprezentată de metode de verificare
a datelor introduse.
O problemă sensibilă în cadrul implementării cu multe variante de JSP este
reprezentată de ascunderea codului JSP. Desigur, orice aplicație web trebuie
să prezinte doar rezultatul rulării codului, nu și sursa. Însă într-o variantă
Allaire´s JRun spre exemplu, dacă URL-ul de apel conținea la sfârșit .jsp%00
atunci server-ul nu recunoștea această pagină ca fiind una JSP, nu o parsa și
trimitea pagina ca fișier text la client, afisând astfel tot codul JSP (se știe
că orice server web, atunci când întâlnește o extensie pe care nu o cunoaște,
interpretează cererea ca fiind una pentru un fișier text, și trimite ca atare
răspunsul la client). Într-o problemă similară, sever-ul Tomcat (o versiune
a acestuia) avea un bug de acest gen: la tastarea adresei:
http://server/page.js%2570
serverul era păcălit, pentru că în codarea URL a lui % este de fapt %25 iar
70 este codarea lui p. Dar, pentru că extensia nu era clar .jsp, server-ul nu
invoca mașina Java pentru parsare, ci returna documentul în clar.
De asemenea, dificultatea de a învăța la început JSP-ul a fost rezolvată parțial
de producătorii de servere web prin prezentarea unor exemple de scripturi, și
includerea lor în distribuții. Problema e că de multe ori aceste scripturi conțineau
bug-uri de securitate importante, care în cele mai multe cazuri au devenit publice,
și într-un mediu precum Internetul au fost exploatate.
De aceea, aceste exemple se recomandă a fi eliminate la instalarea unei mașini
pe web.
De asemenea, după alegerea unui server pentru rularea de aplicații JSP, administratorii
de sistem trebuie să verifice cât mai des siturile producătorilor, pentru a
instala eventuale patch-uri pentru servere, sau pentru a respecta anumite indicații
din partea producătorilor.
Concluziile, după acest scurt studiu de caz al problemelor de securitate ce
afectează tehnologia JSP (dar nu numai), sunt că nici un server nu este perfect,
și că scăpări în programare au și cei mai importanți producători, dar și că
programarea web este din punct de vedere al securității poate cea mai dificilă
ramură a programării. Sfaturile de mai sus, sunt desigur doar începutul. Tristul
adevăr este că întodeauna hacker-ii vor fi cu un pas în fața celor ce programează.
Desigur, reversul medaliei este că încet-încet prin învățarea din alte atacuri
reușite, situl propriu poate să fie aproape perfect…
Mult succes!
|