taint mode = on sau grija mare la parsarea inputului
Toata lumea a urlat azi ca Google marcheaza ca malware orice rezultat (si ca atare esti trimis mereu catre pagina aia cu "acest site poate dauna grav sanatatii").Ma asteptam sa fie cauzat de o problema subtila cauzata de infrastructura complexa a motorului de cautare, un script sau un balancer care a crapat intr-un mod exotic si care a cauzat acest bitflip, in orice caz la o lectie de high-availability si/sau cluster design. Am fost dezamagit cand am aflat ca problema a fost extrem de banala, din categoria Web Security 101. Explicatia se gaseste si pe blogul oficial Google.
Pe scurt, marcarea ca malware a site-urilor se face prin blacklistul celor de la stopbadware.org, blacklist in care s-a strecurat din greseala o expresie regulata care face match pe orice URL. Eh, asta e, human error. Corect, dar unul din primele lucruri pe care le inveti ca programator (sau ar trebui sa le inveti) este ca intotdeauna sa verifici corectitudinea datelor venite din surse externe, fie pentru a detecta date malitioase, fie pentru a evita erori umane (cui nu i s-a intamplat sa dea paste aiurea intr-un formular?).
Ca sysadmin, prima chestie care imi vine in cap e sa adaug in Nagios un check prin care sa verific mereu in blacklist ca un site legitim e mereu aprobat, eventual si un rezultat contrar (DNSBL-urile de e-mail au niste known positives cu care se pot face astfel de verificari, probabil si URIBL-urile). Dar sunt de parere ca oricine scrie o aplicatie gandita pentru a primi date din alta parte are datoria sa impuna cat mai multe safety checks pentru a evita situatii jenante.
Si ca sa nu-mi racesc gura de pomana, cateva linkuri:
- WWW Security FAQ - putin cam vechi, partile practice sunt cam prafuite, dar conceptele sunt foarte aplicabile;
- perldoc perlsec, care explica importanta taint mode in perl (desi cred ca textul care m-a invatat pe mine este cursul de CGI al lui Ovid, care din pacate nu mai e pe web, dar e inca disponibil in wayback machine);
- articolul wikipedia despre "fuzzy testing".