Vulnerabilitate în WordPress e pleonasm
Posted in: WordPress, By: SaltwaterC, At: August 13th, 2009
Cu riscul de a supăra vreo câțiva spălați pe creier ce suferă de ‘fanboyism’, WordPress încă suge pe partea de securitate. Da, s-au făcut progrese, da, timpul de răspuns al echipei de dezvoltare este scăzut (vezi cazul 2.8.4), da, am eu mania unor reguli stricte (prea stricte în opinia neavizată a unora), da, am boala bug report. În fine, prin Iunie am încercat lupta împotriva morilor de vânt din punctul de vedere al posibilitaților de a lansa vectori de atac CSRF prin intermediul WordPress – folosind cont fără opțiunea de ‘unfiltered HTML’. Și da, aș fi contribuit cu un patch – deși problema nu este ușoară. Ca o paranteză, în cazul WordPress măcar am reușit să creez puțină vâlvă – alții precum cei de la SMF (Simple Machine Forums) nici în ziua de astăzi nu au răspuns la mail privind această problemă a CSRF-ului.
Sunt conștient de faptul că la nivel de WordPress problemele sunt minore sau inexistente datorită acelui sistem de token signature (wp_nonce), dar cumulat cu plug-in-uri defecte sau potențiale vulnerabilități pot duce la un efect de domino. Chiar descoperisem un plug-in vulnerabil la acest tip de atac, dar a fost patch-uit înainte să apuc să dau mail dezvoltatorului. Știu că unii pot atribui poveștii de mai sus valențe beletristice legate de droburi de sare, dar eu sunt dintre cei ce s-au mai fript cu WordPress – din fericire nu pe blogul personal. De fapt mulți dezvoltatori de plug-in-uri nu au o cultură a securității, și ca să nu fiu ipocrit, chiar și plug-in-ul subsemnatului are o problemă minoră ce ar putea fi exploatată printr-ul XSS+AJAX – deși e foarte dificil, dar nu mai este menținut din Ianuarie (va urma o rescriere completă). Iar o platformă atât de eterogenă are punctul cel mai slab localizat în codul cel mai slab – ce adesea va fi primul atacat având în vedere că acest aspect este o regulă în (in)securitate, iar caracterul deschis al platformei și plug-in-urile aferente elimină orice urmă de ‘security through obscurity’.
Pe de altă parte, la anumite probleme răspunsul a fost destul de prompt. În aceeași zi cu povestirea cu CSRF-ul de mai sus am dat un mail echipei de securitate cu niște XSS vectors localizați. S-a scris despre asta, deși detaliile sunt vagi. Problema raportată se manifestă doar pe IE 6, unele și pe IE 7, dar echipa WordPress nu s-a obosit să dea detalii. Atacurile se puteau lansa prin proprietăți CSS nefiltrate. Browserele decente nu suferă de această problema, dar judecând după cota de piață a IE 6 & 7 – lucrurile nu sunt roz. Din păcate vulnerabilitatea se regăsește în toate versiunile anterioare lui 2.8.2, deci în cazul în care un blog arbitrar are posibilitatea de user registration și contribuție – este recomandat minim WP 2.8.2. Problema e însăși acea kses, menținută de către dezvoltatorii WordPress. Oficial proiectul kses e mort – nu a mai avut suport de prin 2006. Iar kses nu a fost concepută ca o bibliotecă sigură până la paranoia. Spre exemplu HTML Purifier bifează cu succes toate test case-urile ce se găsesc in cheat sheet-ul celor de la ha.ckers.org dar nu observ nici un efort în adoptarea acestuia. Au fost făcute plug-in-uri în acest sens – dar această funcționalitate ar trebui să fie ‘core level’. Filtrul WordPress a fost testat parțial de către subsemnatul – iar rezultatul îl vedeți mai sus. Nu am testat event handlers pe JavaScript pentru ca sunt 90 si ceva, iar un test case corect ar fi preferabil sa il codez, nu sa il fac de mana din motive de dimensiuni.
Din păcate, etic ar fi fost să se menționeze și cine și-a pierdut timpul pentru a le testa aplicația și raporta vulnerabilitatea. Da, nu am fost creditat. Nu este prima oară când se întâmplă, dar în cazul WordPress este deranjant pentru că dialogul nu a mers fin precum în cazul altora. Am ales metoda mail – pentru că din nou, așa e etic, spre deosebire de acțiunea de a pune totul pe grok.org ca sa panichez lumea – ce oricum pune botul la F.U.D. mai mult decât trebuie.
Știu că a vorbi este ușor și in principiu este degeaba. Cum am spus în repetate rânduri, oricine poate să își dea cu părerea – dar nu orice părere conteaza. Cam din perioada amintită mai sus tot ameninț lumea cu un blog engine implementat pe un M.V.C. framework iar motivele sunt evidente. Nu contest cantitatea de timp investită in WordPress, numărul de plug-in-uri disponibile (ce în timp devin enervante pe partea de maintenance), dar prea multă entropie și mentalitate îmbâcsită s-a strâns acolo. Dar pentru a face ceva – evident, este nevoie de timp, motiv pentru care WordPress înca se bucură de acest status quo pe care îl are având în vedere că am facut un numar consistent de deploy-uri la viața mea (iar pe unele le mențin).
Salut
Cu menţiunea că nu sunt un expert în securitatea sau securizarea WordPress-ului, înclin să fiu de acord cu efectul de domino de care vorbeai. WordPress a „prins” şi încă nesperat de bine (dovadă cele 4 milioane de descărcări pentru WP2.8), iar lucrul de care mă tem cel mai mult este ca nu cumva această platformă să devină o ţintă, aşa cum s-a întâmplat cu Internet Explorer. Aşa cum se spunea într-un documentar, o tragedie este doar o sumă de coincidenţe.
Mi s-a părut deranjantă pasivitatea de care a dat dovadă echipa care se ocupă de întreţinerea proiectului WordPress în urmă cu două zile, când pe blogul lor se anunţau vacanţe la munte, în timp ce „internet-ul” vuia de problema cu din wp-login. Au încercat să facă un update pe întuneric.
P.S. Am citit discuţia pe core.trac.wordpress.org, iar dacă ne raportăm la cota de piaţă de care încă se bucură IE7, dar mai ales IE 6 (P.S. Microsoft tocmai a anunţat că NU va retrage suportul pentru IE6 care ne va mai bântui multă vreme), situaţia pare destul de încâlcită. Aş vrea din tot sufletul să exagerez, şi te rog să mă corectezi dacă n-am dreptate fiindcă eşti mai în temă, este că orice site bazat pe WordPress poate fi atacat / blocat / şters, dacă cineva îşi doreşte cu adevărat acest lucru. Îmi poţi recomanda un ghid de securizare ?
Discutia de pe core.trac.wordpress.org nu se refera la bugul rezolvat (XSS) – ce intradevar a durat o saptamana de la report pana la release – dar nu a fost public disclosure. Se refera la CSRF ce este un tip diferit de atac ce afecteaza majoritatea browserelor, destul de dificil de prevenit (de unde si refuzul echipei WP), si mai are o proprietate: daca e bine facut, nu e detectabil. In log-urile site-ului atacat apare un request legitim din partea unui utilizator legitim. CSRF se poate si pe mail, dar orice client decent (web sau desktop) nu va incarca imaginile in mod implicit iar gradul de incredere este proportional cu gradul de incredere in adresa de unde origineaza mesajul. Nu este si cazul browserelor web. Ar putea fi implementate tehnici de prevenire la nivel de browser, dar problema este putin mai complicata. Eu i-am gasit solutie la nivel server side – dar inca nu am testat scalabilitatea. Stiu ca in teorie este nevoie de niste social engineering pentru a folosi cu succes astfel de vectori, dar nu este imposibil. In plus, nu este nevoie sa folosesti acelasi site.
In CSRF exista o sursa – locul unde se poate posta un vector de atac, si o tinta care va fi site-ul afectat si poate fi remote. WP de regula poate fi sursa, tinta doar in cazul plug-in-urilor vulnerabile. Exemplu: am folosit http://linuxsoft.ro/forum/ pentru a ataca http://bash.linuxsoft.ro/. Forum-ul permite postarea de vectori CSRF, dar in principiu nu este afectat de ei deoarece identifica sesiunea pentru anumite actiuni. Bash-ul nu permite postarea de vectori CSRF, dar este atacabil din exterior. De aici si acel efect de domino de care vorbeam. Link-ul afectat: http://bash.linuxsoft.ro/viewquote/286/ – se observa numarul mare de voturi pozitive – in aceasta a constat atacul: voturi pozitive executate de utilizatori legitimi fara ca ei sa stie. Acesta nu a fost un exemplu cu consecinte grave a fost mai mult demonstratie. De altfel, in prezent rescriu Linux Soft Bash intr-o forma securizata – da, sunt membru vechi al comunitatii, am mai contribuit cu cod. In general CSRF-ul este enervant sau aplica ceea ce am facut mai sus. Dar are un potential mai mare – depinde doar de site-ul tinta cat de bine este securizat.
In concluzie am identificat doua surse: SMF si un WP deschis autentificarii catre public – iar acel public poate sa posteze continut, ceea ce din acest punct de vedere face WP ca fiind destul de trist dincolo de sfera personal blog – unde orice atac poate fi intentionat, si este alegerea celor cu privilegii (iar problema devine una de incredere). Tinte … se pot gasi zilnic la cat de putin se investeste in web security in general.
interesant