Agora
Media
Libraria Byblos



AgoraNews  





PC Magazine Ro  




NET Report   




Ginfo   




agora ON line   





PC Concrete   





Liste de discuții   




Cartea de oaspeți   




Mesaje   





Agora   





Clic aici
PC Magazine





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!


PC Magazine Ro | CD ROM | Redactia | Abonamente | CautareArhive

Copyright © 1999-2004 Agora Media.

[email protected]

LG - LifeŽs Good

www.agora.ro

deltafri

www.agora.ro

www.agora.ro

www.agora.ro