My Hacker News 15 minutes of fame: the numbers

So on Feb 25th my Do Not Donate-page was featured on Hacker News and that obviously brought some extra page-views.

Here are some more numbers for that memorable day;

  • Most popular pages:
    1. Do not donate: 10 013
    2. Homepage/ archives: 1 108
    3. about:futtta: 235
  • Referrers:
    1. Hacker News 7 978
    2. Facebook 112
    3. Search Engines 84
  • Outgoing links:
    1. https://en.wikipedia.org/wiki/Flanders 959
    2. https://en.wikipedia.org/wiki/List_of_countries_by_inequality-adjusted_HDI#List 809
    3. https://profiles.wordpress.org/futtta 596
    4. https://www.kiva.org 87

And my server? Even at the busiest time (around 10-11 AM UTC+1) it quietly hummed along with a 0.11 system load 🙂

iGoogle Facebook gadget security flaw fixed & explained

I just received confirmation from the Google Security Team that the bug I discovered in the iGoogle Facebook Gadget which allowed attackers to log into an other user’s Facebook account bypassing all authentication, has been fixed. So now that the hole has been closed, let’s look at what was happening, shall we?
The gadget uses the Facebook’s Javascript API to the connect with Facebook, asking you for permission to access your FB data. In the process of getting that authorization, the gadget exchanges tokens with Facebook, some of which should absolutely be kept safe from prying eyes. And that’s where things went wrong: the gadget had the authentication info in the URL. So if a user of the iGoogle Facebook gadget clicked a link to an external site in the news feed, the request for that page had a referrer that contained all authentication-info.
And that’s exactly what happened on last week, when I spotted this referrer in my blog stats:

http://facebookiggadget.appspot.com/?exp_rpc_js=1&exp_track_js=1&st=c%3Dig%26e%3DAPu7icpJzJJhOouS8TuGegSqFHHI8XHU1r55OllrNbk0ey/aTpkUFx9jPKB/cwgcEZoGfcBuc43x/CuzuEL2cQinYglFvhFWKtlXg6j/JtKC0%252BWsAu3vo/3ZR/WA64J/Fmw1YuUFgT7q&v=fdb2b406636e1f3cff1c5d7e660f59eb&container=ig&view=home&lang=nl&country=BE&up_session=%7B%22uid%22:%221165373488%22, %22session_key%22:%2291d52d2ed5a130fd941b11f1-1175373488%22, %22secret%22:%22fdee68961b3cdee5b51390a4bdeac7a0%22,%22expires%22:0, %22access_token%22:%2283101558C90fd9KfA9KJQh5uT98TqIjxQpzUi4.%22,
%22sig%22:%22dd635ef67af1f59c1c671215076cce10%22%7D
&parent=http://google.be&libs=7ndonz73vUA/lib/liberror_tracker.js,iHKb-4mKuMY/lib/librpc.js,vrFMICQBNJo/lib/libcore.js,a5j4V1JuNVE/lib/libsetprefs.js&is_signedin=1&synd=ig&view=home

You can guess what happened when I opened that URL; the iGoogle Facebook gadget initialized using the embedded credentials, automatically logging me in as the guy that was unlucky enough to have clicked the link to my blog.
But how could this vulnerability have been exploited, you may ask? Well, easy enough; create a page that is viral enough for people to share or like  (likespam or even likejacking) and wait for users of the iGoolge Facebook-gadget (there’s over 1 million of them after all) to follow the links, feeding your webserver logfiles with credential-rich referrers.
As Google confirmed this bug indeed has been fixed. The new version of the gadget, which was deployed late last week, does not leak credentials in the referrer-URL any more:

http://facebookiggadget.appspot.com/?lang=en&country=us&.lang=en&.country=us&synd=ig&mid=101&ifpctok=6472409229927695377&exp_rpc_js=1&exp_track_js=1&exp_ids=17259&parent=http://www.google.com&libs=7ndonz73vUA/lib/liberror_tracker.js,iHKb-4mKuMY/lib/librpc.js,vrFMICQBNJo/lib/libcore.js,a5j4V1JuNVE/lib/libsetprefs.js

So if anyone asks me what my good deed for this year was; I helped protect 1 million people’s Facebook accounts from being hacked.
Sounds swell, no? 😉

On vous emmerde et ça va chier; de vertaling

on vous emmerde et ça va chierEen Nederlandse Facebook-vriendin vroeg om een vertaling van de stravve affiche die ik vorige week bij Brussel-Noord had zien hangen.
Bij deze Ellen;

Aan al diegenen die denken …
… dat als we “nee” zeggen, dat eigenlijk “ja” betekent
… dat bezopen zijn een excuus is voor hun daden
… dat hun maat te verontschuldigen is omdat “hij jong is”, “het niet goed met hem gaat” of omdat “hij niet gevaarlijk is”
… dat zich durven verdedigen tegenover opdringerigheid hetzelfde is als “seksueel gefrustreerd zijn” , “slecht geneukt zijn” en “geen humor hebben”
… dat ze zich zomaar tegen ons aan kunnen schurken zonder te vragen en we daar zin in hebben
… dat ze ons mogen afbreken of klote-opmerkingen maken omdat we wijven zijn
… dat wanneer we gemaquilleerd, in jurk of rok of met een décolleté rondlopen, we hen de toelating geven om ons op te vrijen en dat we daar dan niet over moet komen klagen
… dat we publiek bezit zijn als we niet als koppel op straat komen
… dat als we hen niet willen, dat is omdat we al “bezet” zijn (= bezit van een ander mannetje)
… dat wanneer men een vuurtje geeft, men ook sex verplicht is
… dat wanneer we hen vuur geven, we daarna ook sex verplicht zijn
… dat als men hen ophitst, men ook seks is verschuldigd
… dat een seksuele relatie sowieso eindigt met penetratie en/of ejaculatie
… dat ze ons beledigen door ons als feministe te behandelen
Aan iedereen die zich niet geviseerd voelt maar die het wel zou moeten zijn
We schijten op jullie en het zal stinken!

Crashing, teleporting and syncing Virtualbox

I’ve been playing around with Virtualbox over the last few days, trying to set it up just right for me. One of the hurdles was working around a bug in the 3.0.0 release that caused guests to crash when performing downloads in them. Changing the virtual network card from “PCnet-FAST III” to “Intel PRO/1000 MT Desktop” proved to be a good temporary solution, but the bug got squashed in version 3.0.2.
Next on my list was getting the “shared folder“, which I configured in Virtualbox (look ma, no samba), to automount in my Ubuntu-guest with read-write permissions for my non-root user. I ended up adding this line to /etc/fstab (the dmode and fmode-options did the trick eventually):

teleporter /home/frank/Desktop/teleporter vboxsf rw,dmode=777,fmode=777,uid=1000,gid=1000,auto 0 0

And to wrap things up I also installed the Mozilla Labs Weave-plugin, which syncs a.o. bookmarks and passwords in Firefox between my 3 environments. It caused me some headaches at first, synchronizing just seemed to take forever and no error was shown in the frontend. But I found some obscure messages (things like “Exception caught from onComplete handler of CryptoWrap__decrypt-57 generator”) in the verbose log and Google linked those to a post on the Weave Google Group which explained that the problem was with an incorrect “encryption passphrase”. And sure enough Weave was syncing happily after once I re-entered my -too complex- passphrase.

WordPress 2.8 loves your proxy

Up until version 2.7.1, running WordPress on an intranet was a real pain in the ass. It connects to the outside world to look for updates, to check comments for spam (using Akismet) or to fetch RSS-feeds for widgets if you configured those on your blog, … But as you typically don’t have direct internet-access on an intranet and as there was no way of letting WordPress know about a proxy, your blog timed out while it was trying to fsockopen those external sites.
chet bakerBut that was yesterday, because the recently released WordPress 2.8 “Baker” (which is chock-full of new features) has support for internet-connections through a proxy, thanks to its great HTTP API. Don’t bother looking for it in the admin-screens, you’ll need to configure the proxy-settings in your wp-config.php.
Here’s what you’ll have to add (values are examples which you’ll have to replace with settings for your environment off course):

define('WP_PROXY_HOST', '192.168.22.1');
define('WP_PROXY_PORT', '9099');

If you need to authenticate to access the proxy you can add your credentials this way:

define('WP_PROXY_USERNAME', 'frank');
define('WP_PROXY_PASSWORD', 's3cr3t');

You can also exclude requests for specific hosts from going through the proxy:

define('WP_PROXY_BYPASS_HOSTS', 'localhost, blog2.corpintranet');

And finally you can block all outgoing requests by default and add domains to a whitelist to only allow those to connect:

define ('WP_HTTP_BLOCK_EXTERNAL', 'true');
define ('WP_ACCESSIBLE_HOSTS', 'api.wordpress.org, akismet.com');

Off course some WordPress-plugins do not use the HTTP API yet (e.g. Lifestream and wp-security-scan rely on Simplepie, which does not use the proxy-aware wp_remote_get-function), so you might have to be careful when installing plugins that need internet-access.

deredactie.be doet full monty in de feed; applaus!

De nieuwe versie van deredactie.be is een grote stap vooruit. Niet zozeer omwille van wat ge wel, maar eerder om wat ge niet -direct- ziet; ze hebben hun inhoud bevrijd. De atom-feeds lijken nu immers de volledige artikels te bevatten. Ge kunt niet zeggen dat ze stil blijven staan, daar aan de Reyerslaan! Applaus!

Het probleem met Encyclopedia Britannica (en Wikipedia?)

Nostalgie; de kleine larousse. Wie verkoop dat nu?Sinds april vorig jaar heb ik als “regelmatig publicist” gratis toegang tot de Encyclopedia Britannica. Ik vond dat toen fantastisch; encyclopedieën hebben iets magisch, zelfs als ze online staan. Maar die euforie dateert alweer van een jaar geleden en nu blijkt dat ik de encyclopedie der encyclopedieën eigenlijk amper gebruikt heb. Dat ligt niet aan de RIA-achtige interface of aan het feit dat de content eerder onhandig wordt ontsloten. Nee, ik blijf stelselmatig naar het “minderwaardige” Wikipedia surfen omdat ik daar méér informatie vind over méér onderwerpen.
Precies daarom begrijp ik niet goed waarom bepaalde krachten in de Wikipedia-gemeenschap denken dat ze met EB moeten concurreren door

artikels op Wikipedia verwijderen […] uit de één of andere overtuiging dat enkel het meest relevante van het meest relevante daarop moet komen, en dat alleen boeken, kranten en tijdschriften geldige bronnen van objectieve informatie zijn.

Lang leve het Wikipedia-inclusionisme! Dat gezegd zijnde ga ik nu mijn gratis abonnement op EB verlengen.

While waiting for the new Firefox beta

While we”re waiting for the new Firefox 3.1 beta (which will probably be released on march 12th, after which 3.1 will become  3.5), the Mozilla Labs guys announced a prototype “about:tab” plugin. It builds on the ideas they put forward on the labs-blog last august and follows in the footsteps of what Opera and more recently Google Chrome and Safari 4 are doing, taking it up a notch.
about:tab in firefox3.1b by aza raskinAfter installing the plugin, a new tab will show you:

  • the title and favicon of the most recently closed tab, allowing you to reopen it
  • a button containing the text in your copy/paste-buffer with contextual actions;
    • if URL: go to that site
    • if physical address: put it on a map
    • else: search for that text on google
    • more actions might be added and the system will be extensible, taking from Ubiquity
  • a list of six of your most visited sites, with thumbnail and title and with the most recent rss-items of that site

Although the developers claim that it’s “a rough-cut prototype” and that “the visual design isn’t right”, I already prefer this sober and functionally rich new-tab-behavior over the shiny “top sites” implementation in Apple’s Safari4. I sure hope this will slip into Firefox 3.5 in the next few months!

Mijn deredactie-journaalplayer gefixt

Dju, m’n journaalplayer is was kapot!
Dat heb je natuurlijk met spielereien op basis van ongedocumenteerde 3rd party xml-feeds; als de bron wijzigt, dan werkt je webhackje ook niet meer. De atom-feed die ik gebruikte, was sinds de lancering van de videozone (en de stille redesign) van deredactie immers niet meer beschikbaar.
Uit een snel testje bleek dat de nieuwe videozone andere feeds (voor Journaal en Terzake) gebruikt. Die feeds bevatten zowel entries voor de integrale afleveringen van de afgelopen dagen als voor alle individuele fragmenten uit die verschillende edities. Aangezien een entry in de ATOM-file evenwaardig is aan elke andere entry, wordt de relatie tussen die verschillende entries dan maar in de comments in de XML meegegeven. Of hoe XML ook gestructureerde rommel kan zijn.
Maar aangezien er op deredactie nog altijd geen grote knop “Bekijk hier het Journaal” staat, omdat een kat zijn jongen niet terugvindt in de videozone en vooral omdat ik het niet leuk vind als mijn speledingetjes niet meer werken, heb ik één en ander toch aangepast aan de nieuwe feeds (waarbij ik op basis van de titel de individuele fragmenten van de meest recente aflevering uit de ATOM-feed filter).
Hoera, m’n journaalplayer werkt dus terug.