Facebookov luknjast antispam filter

Mandi

9. okt 2011 ob 16:06:08

Facebook je v začetku tedna brez pretiranega pompa vklopil varnostno preverjanje povezav v status updejtih, kjer se na splošno nesrečo pojavlja vse več spama. Nepridipravi imajo namreč venomer manj uspeha s klasičnimi e-mail sporočili, zato se preusmerjajo na zlorabo poštnih nabiralnikov legitimnih uporabnikov, oz. (ker so gesla v veliko primerih ista), njihovih profilov na socialnih omrežjih.

Zaščita deluje v partnerstvu s podjetjem WebSense. Vsak link, ki ga uporabnik Facebooka vpiše v še svež status update, se pošlje njihovim strežnikom, ki ga poskenirajo in preverijo tako po url-ju kot po vsebini. Če je kaj sumljivega, bo status update opremljen z opozorilom, da polinkana vsebina morda ni varna, ob kliku pa še posebno opozorilno okno (glej sliko). S tem se skuša imitirati izkušnjo iz brskalnikov, ki že nekaj časa ponujajo opozarjanje pred nalaganjem nevarnih vsebin.

A kot se izkaže, je vsa ta "cloud-based zaščita" (kot jo imenujejo), v svojem bistvu precej plastična. Websense pri preverbi zahtevka spoštuje pravila lepega vedenja in zahtevek sproži iz svojih lastnih strežnikov in z iskreno nastavljenim User-Agentom facebookexternalhit/1.0. To spamerjem omogoči, da prepoznajo Facebookovo varnostno preverbo in ji vrnejo navidez legitimno vsebino, npr. sličico, vsem ostalim (tj. facebook uporabnikom) pa servirajo neželeno vsebino.

Hekerska skupina Hatter je objavila varnostno opozorilo pred tem, skupaj z primerom (proof of concept, PoC), ki v osnovi zgleda takole:

<?php

$_agent = $_SERVER['HTTP_USER_AGENT']; 
if(preg_match('/facebook/i',$_agent)) {
  // lolcat for facebook and their malware filters
  header("Content-Type: image/jpeg");
  readfile("lolcat.jpg");
} else {
  // rickroll for everyone else ;)
  header("Location: http://www.youtube.com/watch?v=oHg5SJYRHA0");
}
?>

Gornja koda, ki jo je mogoče sila enostavno prepisati v praktično vsak programski jezik, najprej preveri polje User-Agent, s katerim se identificira brskalnik (isto bi lahko naredila z IP naslovom odjemalca). Ker se Facebookovi in Websensovi strežniki predstavijo kot taki, jim je mogoče servirati navidezno pošteno vsebino, kar je dovolj, da gre status update naprej nespremenjen. Kasnejši uporabniki, ki potem kliknejo na link s svojimi firefoxi, chromi in IE devetkami, pa dobijo tisto vsebino, ki jim jo je spammer hotel prikazat.

Napadu malce komično pravijo CSCF oz. cross-site content forgery, kar sliči na CSRF napade, ki delujejo s vstavljanjem linkov v emaile in okužene strani (npr. - simulirano - <img src="http://www.facebook.com/deletepost/12" /> ), v upanju, da je uporabnik že prijavljen na napadeno stran in da bo zato podtaknjeni zahtevek naredil svoje. CSCF preverjeno deluje tudi na Google+ in nekaterih drugih platformah. Braniti se še vedno da, po eni strani s prijavo takih statusov (crowdsourcing), po drugi strani pa tako, da bi Facebook vnaprej izdelal svoj posnetek povezave in uporabniku prikazal tega. Če se bodo za to odločili, je veliko vprašanje, ker je v igri precej ovir, tako tehničnih kot pravnih (gre v bistvu za kopiranje strani - s taistim problemom se trenutno sooča Amazon v zvezi s svojim Silk brskalnikom).