JSLR – biblioteca Javascript ce este începutul sfârșitului vulnerabilităților XSS
9JSLR, termen derivat din ASLR (Address space layout randomization) este o abordare ce presupune randomizarea unor tag-uri și atribute astfel încât atacatorul să nu poate injecta cod HTML/Javascript malițios fără a știe token-ul generat. Este foarte ușor de implementat pentru că orice website poate fi rescris, adăugând un id ce confirmă validitatea tag-ului. De asemenea, o procedură similară trebuie folosită și pentru atributele tagurilor.
Biblioteca interceptează codul HTML înainte de a fi randat de browser, folosind un element plaintext, DOM-ul este folosit pentru a crea o copie a HTML-ului înainte de a adăuga codul înapoi. Se activează JSLR pentru a verifica integritatea fiecărui atribut și tag.
Exemplu de fișier protejat de JSLR
Este foarte important să adaugi X-Frame-Options și X-XSS-Protection: 1;mode=block pentru a fi siguri că atacatorul nu modifică comportamentul bibliotecii JSLR.
<?php require('jslr.inc.php'); $JSLR = new JSLR; ?> <!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>JSLR <script src="<?php $JSLR->getWebPath()?>jslr.js" type="text/javascript"></script> <script type="text/javascript"> try { JSLR=JSLR('<?php $JSLR->getID()?>','<?php $JSLR->getSingleQuoteID()?>','<?php echo $JSLR->doubleQuote?>'); } catch(e) { document.write('<plaintext>Error unable to find JSLR. Check the web path.'); } </script> </head> <body> <iframe <?php $JSLR->getID()?>_src="http://www.microsoft.com/"></iframe> </body> </html>
Limitări
În varianta existentă, JSLR poate rula doar în browserele moderne, orice browser ce nu suportă evenimentul DOMContentLoaded nu va putea rula, dar această limitare va fi scoasă pe parcurs iar JSLR va putea fi folosit pentru orice browser până la IE6. Evident, că browserele trebuie să ofere libertatea ca biblioteca să aibă acces complet asupra DOM-ului. De asemenea, orice injecție deasupra scriptului JSLR va face bypass la protecție pentru că vectorul va fi randat înainte că JSLR să apuce să-l protejeze.
Puțin rafinată aceasta abordare și ar putea fi sfârșitul atacurilor XSS clasice. Biblioteca e Open Source așa că ideile voastre ar putea fi foarte ușor integrate în următoarele versiuni oficiale, dacă simțiți nevoia, evident, să contribuiți. Mai multe detalii tehnice aici iar un demo aici.
Orice browser dupa IE6.
Eu am privit browserele intr-o scara progresiva rasturnata deci merge. 🙂
O alta librarie care poate ajuta impotriva unor atacuri prin Javascript este js.js. Acesta este un interpretor de Javascript, facut in Javascript. Ruleaza de vreo 200 de ori mai incet decat SpiderMonkey, dar este complet izolat de pagina web, deci what happens in js.js, stays in js.js (unless you interact with it :)) )
@Roland Dar cookie-urile cine le controleaza in js.js?
js.js nu cred că e orientată împotriva atacurilor de tip XSS, pentru că nu controlează ce injectezi într-un element DOM, ci mai degrabă te ajută să poți executa remote Javascript safely. Un eval() mai safe, de exemplu pentru jsonp sau chestii de genul.
Un fel de JavaScript + plus un token anti CSRF? 🙂
@Roland: „The compiled version of js.js is 3MB and only 594KB after gzip compression. ” De ce as baga inca o jumatate de mega content in pagina ? Nu mai bine ne sanitizam variabilele ?
Unde este era aia in care imi parea mult sa am 30 kb per page ….
un atac de tip xss poate fi considerat si construirea unui scampage ce nu necesita js:)
Hmm, deja acolo e o alta discutie. Nu poti sa spui ca scam page-urile sunt unul si acelasi lucru. Plus ca, biblioteca are protectie pentru tag-uri, deci implicit si pentru HTML.