You’re a smart cookie. You have a neat little virus checker, you avoid the most disreputable websites (especially on your work PC) and you’re pretty clued up when it comes to downloading software.
All is good, life is great. Until one day, you notice something wrong. Something… virusy… on your PC. How could this happen? You did everything right!
Well, this time, maybe it’s not your fault. Maybe it’s MALVERTISING (thunder crashes, lightning flashes, wolf howls, etc.)
What the F is malvertising?
MAL*icious ad*VERTISING. Snappy!
Malvertising is what happens when ads mutate. No longer merely irritating, annoying and user-experience destroying, they can now become dangerous…
The unscrupulous folks who design viruses and malware know that most of you know the common ways of getting a computer virus (except Steve in accounts, that guy is always downloading dodgy stuff). So, they need a way to get past your anti-virus, malware checker and propensity to visit only the most trustworthy websites.
A fun way of doing this is buying real, actual ad space on real, actual websites. This ad space is then used to fire all kinds of horrible crap into your PC. The worst part? The websites themselves don’t even know they are carrying this horror, and even the ad providers are unaware. This means that by the time anyone realises… IT’S TOO LATE.
Your defenses aren’t good enough
Yeah yeah, we know. You’re the type of person who would never, ever, click on an ad, right? We know that because you’re reading an article from Adblock Plus, purveyors of high-quality ad-blocking software.
Malvertising is designed to get around your defenses. Even if you don’t click on an ad, malvertising can still get you. Just opening a page is sufficient in some cases.
Throw your laptop into the sea
Ha, just kidding. Before you get all “woe is me” and “will this nightmare never end?” remember – YOU CAN’T HAVE MALICIOUS ADS IF YOU DON’T HAVE ANY ADS.
That’s right. Adblock Plus destroys not only the irritating ads, but also the infectious ones. It’s like antiseptic cream! Rub Adblock Plus all over your web browser and you’ll reduce the risk of malvertising.*
It’s been a little over two months since I’ve joined eyeo, the lesser-known German company behind the much talked-about Adblock Plus, Adblock Browser, Acceptable Ads and Flattr Plus.
Many of you reacted to this update at some point last month, once I made it public on my LinkedIn profile. I thought long and hard before turning the “Notify your network?” switch to “Yes”; eventually, I decided that I did want to find out what my peers thought of the first major career move I made in 6 years. Your comments and questions distilled down to three recurring topics.
You can look at this whole “giving up independence” through many different glasses, some rosy and some in shades of gray. For nearly six years, ever since I left Ireland and my job at Facebook, I worked as an independent consultant helping monetize web properties. This was a [long] breath of fresh air after several years in big companies (prior to Facebook, I worked at Google) where, while I loved my work and the opportunities I was given, I simply could not see myself going on forever and retiring from.
Life as a consultant was great: I could handpick the clients and projects I worked on, I could make my own schedule and could work from anywhere as long as I could hop online. Whoever said “home is where the WiFi connects automatically” was not mistaken one binary digit (see what I did there?) However, something was missing and it was only earlier this year that I fully understood what it was. I yearned to be, once more, part of a team. I wanted to work on something bigger and more important, and be able to do so while advancing causes that I came to deeply care about: user choices, privacy and security.
For all these reasons, eyeo seemed like the improbable yet obvious choice. My role – which sees me primarily supporting the Acceptable Ads initiative – allows me to do all that I wanted, in a way that alleviates the downsides of traditional office jobs. I still get to choose what I work on, still pretty much make my own schedule and can still work from wherever I get good WiFi.
If that’s what you’d like to call it, then yes, I most certainly have. My only regret is that I couldn’t time it to start on May the 4th!
Joke aside, although many fanciful talking heads would have it otherwise, ad blocking is a user-generated and user-sustained phenomenon that can and should lead us to a better ads ecosystem. If eyeo provides a path to that better ecosystem (which I of course hope!) that’s fine; if it doesn’t, someone else will. What eyeo is trying to build is a holistic solution that looks at how digital advertising and content monetization can progress while respecting users, their rights and their choices:
- Adblock Plus gives users control over their browsing and content consumption experience, particularly when one takes the time to look under the hood and customize settings to meet their needs. I, for example, use other filter lists in addition to the basic blocklist provided by EasyList (Malware Domains, Adware filter); I allow some non-intrusive advertising; and I have a pretty extensive list of whitelisted domains and might even write my own filters when needed.
- Acceptable Ads (and soon the Acceptable Ads Committee) provide a way to reward good advertising (ads that are non-intrusive and follow a few basic criteria).
- Flattr Plus completes the eyeo portfolio by offering an alternative to advertising, helping publishers monetize their content via micropayments from readers instead.
Ad blocking, user rights and content monetization can only be looked at holistically, in an environment that has the means and tools to cater to all. Our industry is in a bit of a pickle right now and this is a natural consequence of us all having failed to see the larger picture, choosing to chase the quick wins instead: advertisers, publishers and ad tech vendors all share the blame.
An ad blocker comes into this narrative from the detached and unique position of placing user interests first, while conciliating the often-conflicting interests of publishers and advertisers. This is why I wanted to work at an ad blocker rather than only be able to serve the industry from a narrower perspective. I’m happy to further this discussion with any of you, particularly around the use and adoption of Acceptable Ads, which is where my focus is right now.
Pretty, pretty, pretty, pretty good.
I had been following eyeo for quite some time, as the company’s been in the media mostly due to the trials and tribulations of Adblock Plus and the Acceptable Ads initiative. I was aware of the challenges but also of all the opportunities that lay ahead. Most importantly, I’ve been an Adblock Plus user for many years, and I know I understand the plight of both users (such as myself when in a private capacity) and publishers (such as my former clients).
What I found once I checked into the Cologne office for my month-long introduction confirmed that all work and resources directly support the company’s mantra to put users in control of a fair, profitable web. I’ve worked in distributed or remote teams before but the cohesion and the openness I’ve met at eyeo is off the charts. That was the first thing that showed me I’d made the right choice.
Last but not least, I’m very fortunate to have basically been given a carte blanche as to what projects to work on, greatly soothing the transition from my previously free-range, unstructured role.
That’s all, for now. I’ll happily go back to the hamster wheel, which at eyeo has no other connotation than a pretty useful (and used!) standing desk. Or sitting, in my case.
]]>Pros:
Cons:
Having considered all this I decided to close my LinkedIn account. Has been fun eight years ago when I opened it, not any more. If you need to get in touch with me — there are still plenty of ways.
]]>When discussing whether an election was fair and democratic most people tend to focus on vote counting. This election shows however that distortions of election results start much earlier than that, e.g. when the candidates are registered — two candidates were excluded for bureaucratic reasons. Even more importantly, the equal opportunity rule was severely violated here. There is little to none independent press or television in Russia, so the news were as usually following Putin closely and uncritically. The opposition candidates on the other hand got far less attention and were presented in an unfavorable light.
The rhetoric used by Putin and his staff in the election campaign is worth mentioning. He did his best to badmouth the opposition, insinuate criminal and anti-Russian motives. Most remarkably however, he revived the old foreign intervention stories: the opposition was directly or indirectly accused of serving US interests. In best Soviet tradition no proof of US involvement was given nor any reason why the US would be interested in a leadership change in Russia. But it seems to have worked: there is apparently still a large population in Russia that buys such primitive stories about external sources of internal problems.
Given the massive pre-election propaganda, nobody was seriously doubting Putin’s victory. So while an unprecedented number of people enlisted as election monitors it was doubtful that they would find anything — with the preparations already done Putin could simply lean back and let people enjoy “fair” elections. Yet the web today is full of well-documented reports describing a wide range of falsifications. Often the issue can even be easily seen in the official results, e.g. the anomalously high absentee ballot counts for some of the polling stations with similarly anomalously high Putin vote counts. While such irregularities cannot be entirely prevented of course, the important factor is that in many cases the same falsification approach was taken for a large area which quite certainly means that it has been dictated from above (e.g. while election monitors reported relatively few manipulations of vote count protocols this issue is strikingly prevalent in St. Petersburg). The issues are obvious enough that heads should rolls — in a democratic country. This won’t happen in Russia of course as the aftermath of the legislative election in December has shown. The courts will cover up and reject the complains with bogus reasoning, independent courts don’t exist in Russia.
One question appears quite frequently in the discussions: Why were these falsifications necessary? Putin would have won either way given his unfair advantage over all other candidates. One theory is that Putin absolutely needed to demonstrate his superiority over the opposition. The other is that he needed to know which governors were loyal to him and the governors went out of their way to provide the best vote counts. Personally, I feel that both theories get it wrong. For example, they don’t explain why Putin suggested putting up web cams on all election stations (quite a remarkable feat given the limited time). One can consider these cameras security theater of course as they recorded extremely few manipulations, avoiding two cameras with a fixed viewing angle wasn’t hard. But they did make manipulations harder and they did make it simpler for election monitors to prove that the videos they recorded are real.
It appears to me that Putin doesn’t really controls the governors, their relationship being rather one of mutual dependency. Putin’s power is based on the loyalty of the governors he appointed (Putin disposed of governor elections in 2005), he rewards them by overlooking their corruption involvement. The governors on the other hand depend on Putin because a new president might stop their illegal income. In fact, the idea of Putin losing the election must be horrifying for them — enough to falsify election results just to be on the safe side, no matter what Putin himself thinks about that. And they have nothing to be afraid of, Putin wouldn’t undermine his power by moving against them, at most he would sacrifice a pawn — somebody on the lower levels would take the blame.
What does this all mean for the democracy we are living in? In my opinion, having Germany in mind:
I’ve seen people bashing Mozilla this way regularly recently (I am probably not without guilt myself), I can only imagine how hard it is to be a Firefox developer these days. Same thing happened with the Adblock Plus project a number of times and is happening again right now. Sure, the new “acceptable ads” feature is highly controversial in a community that is dedicated to blocking ads. Still, after putting countless hours into this project (unpaid until relatively recently) it is very disappointing to see how lots of people out there don’t want to believe that I possess some basic intelligence and integrity. It’s a good thing that we founded Eyeo — otherwise I might just give up and let them do it instead.
One thing shows very clearly in these discussions: there are two different groups of people coming to our forums/blog/whatever. Some people want to improve things. They listen to arguments, propose improvements, often they stay around and help. This was how the discussion went on “acceptable ads” before a “helpful” soul unleashed the power of Reddit upon us. There was much criticism but it was presented in a constructive way and some changes were implemented. Other changes were rejected, with good reason I think. And some changes were deferred because we couldn’t realistically fix every possible issue before even starting the experiment.
What happened later was entirely different: the other group of people arrived en masse. They didn’t listen to arguments, they didn’t bother to ask if something was unclear, they didn’t try to understand other people’s point of view — they already “knew” everything and so they ranted. Experience of previous encounters tells me that they will disappear after this incident and we will not see them again. Unless they find something else to rant about of course.
What is the conclusion from all that? First of all it is the experience many other projects made before: a successful project cannot be a democracy, it needs to be a meritocracy. People who want that their voice counts have to prove that they are willing to contribute in a constructive way. People who merely complain have to be ignored in a healthy project (yes, I am still learning but I am getting better at that). Ever wondered why the Mozilla project seems so unwilling to accept “feedback”? Now you know why.
The other conclusion: you shouldn’t focus on the negative feedback. It is an easy mistake to make because the negative feedback is so vocal and often more numerous (happy users have far less reason to come and say “thanks”). Still, we got quite a considerable number of users approving of this recent change and it is important to remember that they stand for a much larger group that didn’t bother telling us.
]]>Русская версия этой статьи ниже.
Das ist jetzt mal ein Blog-Post, das rein gar nichts mit Adblock Plus zu tun hat. Sinn und Zweck ist lediglich, diese Informationen besser auffindbar zu machen.
Da meine Frau ukrainische Staatsbürgerin war, habe ich schon die Erfahrung gemacht, dass es extrem schwierig ist, irgendwelche Informationen von der ukrainischen Botschaft oder deren zahlreichen Konsulaten in Deutschland zu bekommen. Die Informationen auf der offiziellen Webseite sind extrem veraltet, man sollte sich tunlichst davor hüten, sich nach diesen Angaben zu richten. In der Botschaft weiß man das natürlich, aber man habe keine Möglichkeit, die Inhalte der Webseite zu ändern (ja, das hat man uns tatsächlich gesagt). Jemanden telefonisch zu erreichen ist ein Ding der Unmöglichkeit, auf Emails wird nicht geantwortet. Bleibt also nur noch, persönlich hinzufahren, die Warteschlange auszusitzen und nach einem zweiminutigen Gespräch wieder nach Hause zu fahren — aber immerhin mit den notwendigen Informationen.
Da wir jetzt für die Schwester meiner Frau wieder die Liste der Anforderungen für den Austritt aus der ukrainischen Staatsbürgerschaft brauchen, habe ich nach einer aktuellen Version gesucht und dabei eher zufällig etwas ganz erstaunliches entdeckt. Anscheinend hat es die Botschaft aufgegeben, auf ihre Webpräsenz auf dem Webserver des ukrainischen Außenministeriums Einfluss zu nehmen. Da das Budget anscheinend für eine eigene Webpräsenz nicht ausgereicht hat, hat sich die Bonner Außenstelle der Botschaft im Februar 2011 einfach einen kostenlosen Blog bei Blogspot besorgt und benutzt diesen als ihre “offizielle” Webseite. Hier findet man aktuelle Informationen über wichtige Änderungen für ukrainische Staatsbürger. Und auf scribd.com findet man sogar die offiziellen Dokumente der Botschaft (wie zum Beispiel die Informationen zum Austritt aus der Staatsbürgerschaft).
Das ist natürlich ein großer Fortschritt, immerhin kommt man jetzt an die Informationen heran. Es hat dennoch einen seltsamen Beigeschmack, wenn die Botschaft eines Staates zur Veröffentlichung dieser Informationen auf kostenlose Dienste angewiesen ist. Und dabei führen die meisten Google-Treffer natürlich auf die alte Webseite, die nach wie vor falsche Informationen verbreitet. Das gilt übrigens nicht nur für die Botschaft in Deutschland, sondern auch für die Webseiten der Botschaften in anderen Ländern — dem Anschein nach sind auch diese Webseiten allesamt extrem veraltet.
Nachtrag: Wie sich herausgestellt hat, hat die Veröffentlichung auf scribd.com einige “interessante” Nebeneffekte. Zum Herunterladen oder Drucken der Dokumente muss man sich nämlich mit einem Facebook-Account anmelden, wobei man der Webseite weitreichende Rechte einräumen muss. Danach wird aber noch verlangt, dass man entweder für das Privileg, etwas herunterzuladen, zahlt oder selber irgendein Dokument hochlädt. Nun haben zum Glück die meisten Leute genug Müll auf der Festplatte, das sie scribd.com zur Verfügung stellen können. Aber das Ausdrucken eines offiziellen Formulars könnte sicherlich einfacher gestaltet werden.
Эта статья, в виде исключения, абсолютно не связана с Adblock Plus. Основной смысл ее публикации в том, чтобы эту информацию было немного проще найти.
Так как моя жена была гражданкой Украины, я уже узнал, насколько тяжело получить какую-либо информацию от украинского посольства в Германии или его многочисленных консульств. Все данные на официальном сайте жутко устаревшие и ориентироваться по ним не стоит. В посольстве об этом, конечно же, знают, но изменить информацию на сайте они якобы не могут (да, нам это действительно так сказали). Дозвониться до посольства практически невозможно, а на электронные письма они принципиально не отвечают. Остается лишь ехать туда лично, сидеть в очереди и после двухминутного разговора возвращаться домой — но уже с нужной информацией.
Поскольку сейчас для сестры моей жены опять нужен список требований для выхода из украинского гражданства, я решил поискать в сети актуальную версию этого списка. То, что я обнаружил, меня поразило. Как оказалось, украинскому посольству надоело пытаться изменить свой официальный сайт. Поскольку бюджета на настоящий сайт видимо было недостаточно, боннское отделение посольства просто создало в феврале 2011-го бесплатный блог на blogspot.com и использует его теперь в качестве своего “официального” сайта. Здесь действительно публикуется актуальная информация и важные изменения для украинских граждан за границей. А на scribd.com даже есть официальные документы посольства (включая, к примеру, информацию о процедуре выхода из гражданства).
Конечно, нынешнее положение дел является явным прогрессом, теперь все-таки информацию найти можно. Тем не менее тот факт, что посольству независимого государства для публикации этой информации приходится пользоваться бесплатными сайтами, по меньшей мере странен. Не радует и то, что поиск на Google по прежнему чаще всего приводит на старый сайт посольства, который продолжает распространять устаревшую информацию. Это, кстати, касается не только страницы посольства в Германии, но и страниц украинских посольств в других странах — судя по всему, информация на всех этих сайтах очень устарела.
Дополнение: Как выяснилось, у публикации на scribd.com есть весьма “интересные” побочные эффекты. Для скачивания или печати документов требуется войти со своим аккаунтом на Фейсбуке и при этом дать scribd.com весьма обширные полномочия. После этого еще требуется решить: либо платить за привилегию скачивания документов, либо закачать самому что-либо на этот сайт. К счастью, у большинства людей достаточно мусора на диске, которым можно порадовать scribd.com. Тем не менее, процедура печати официальных формуляров явно может быть реализована и проще.
]]>Das ist jetzt mal ein Blog-Post, das rein gar nichts mit Adblock Plus zu tun hat. Sinn und Zweck ist lediglich, diese Informationen besser auffindbar zu machen.
Эта статья, в виде исключения, абсолютно не связана с Adblock Plus. Основной смысл ее публикации в том, чтобы эту информацию было немного проще найти.
]]>In reality, as an author of an extension that relies on binary code you should start looking at js-ctypes. If the point of a binary component was simply calling some platform functions — js-ctypes can do that for you. If you require some native code (e.g. for cryptography functions that would be too slow in JavaScript) — you can move it into a regular native library and ship that library with your extension. If you do that, don’t forget adding <em:unpack>true</em:unpack>
to your extension’s install manifest, the library can only be loaded if it is unpacked into a file on disk. Use AddonManager.getAddonByID() and then Addon.getResourceURI() to locate the library on disk and open it with js-ctypes.
Update: I am closing comments because I won’t be able to follow the discussion. Jorge wrote a pretty thorough reply and you might just as well reply there.
]]>It is also really fast, booting up takes 7 seconds in Firefox 4 for me, and all the other operations don’t take much longer than they would on a real system. Supposedly, Chrome 11 is also supported but for me it hangs up near the end of the boot process. Also, Chrome 11 is noticeably slower (Fabrice Bellard himself made this observation as well). There are plenty of command line tools available, including a compiler. I first had my doubts — but they all work as you expect them to. I can even ping 127.0.0.1 (pinging other addresses or using wget fails because the emulated hardware lacks a network interface). Update: Even better: run telnetd
, change root password with passwd
, then telnet to 127.0.0.1 and log in as root — it actually works.
Talk about desktop applications moving to the web…
]]>Diese Woche gab es hier ein wichtiges Ereignis: meine Frau hat endlich die deutsche Staatsbürgerschaft bekommen. Ich konnte den Prozess von Anfang an miterleben und sehen, wie das heutzutage abläuft. Da es aber kaum deutschsprachige Beschreibungen dazu gibt, denke ich nicht, dass sich allzu viele meiner deutschen Mitbürger damit auskennen. Ich schreibe es einfach hier auf, vielleicht gibt es dann bei der nächsten Debatte um die Einbürgerung weniger schlecht informierte Meinungen.
Es ging los vor fast genau zwei Jahren, im Februar 2009. Wir sind zu der obligatorischen Beratung gekommen (ohne Termin und wider Erwarten ohne jegliche Warteschlangen), bekamen bestätigt, dass meine Frau Anspruch auf Einbürgerung hat, und kamen mit einer Liste der benötigten Unterlagen zurück, die wir auch schon im Internet gesehen haben. Zum Glück haben wir die Legalisierung der Geburtsurkunde bereits bei einer anderen Gelegenheit erledigt. Auch bei meinen niederländischen Gehaltsabrechnungen haben sich die Beamten erstaunlich kulant gezeigt (“wenn ich sie verstehen kann, dann brauchen sie nicht übersetzt zu werden”). Also haben wir kurz darauf alle Unterlagen abgegeben und durften warten. Nebenbei wurde uns erklärt, dass meine Frau wahrscheinlich später noch den Einbürgerungstest ablegen muss — ein netter Witz für jemanden, der ein deutsches Gymnasium besucht hat. Später hat sich an den Test aber doch niemand erinnert, hat sich da womöglich die Politik doch eines Besseren besonnen?
Nach einem halben Jahr kam die übliche Anforderung aktueller Gehaltsabrechnungen, die ich auch gleich eingeschickt habe. Aber schon im September 2009 war es soweit, wir bekamen eine Einbürgerungszusicherung und durften jubeln. Der Begleitbrief machte uns darauf aufmerksam, dass nach aktuellem Recht zuerst der Austritt aus der bisherigen (ukrainischen) Staatsbürgerschaft vollzogen werden muss. Das wussten wir natürlich. Noch nicht klar war uns allerdings, dass es sich hierbei um keine Kleinigkeit handelt. Das wurde erst nach einer Recherche im Internet offensichtlich.
Alle wichtigen Informationen sind im Prinzip auf der Webseite der ukrainischen Botschaft zu finden. Allerdings sind sie nur in Ukrainisch verfügbar (in deutscher Sprache werden ganz andere Informationen bereitgestellt, und Russisch als Muttersprache eines großen Teils der ukrainischen Bevölkerung wird traditionell ignoriert), zudem ist die Webseite sehr unübersichtlich. Mit etwas Mühe konnten wir die richtige Seite trotzdem finden und entziffern. Einige Stellen waren unklar, damit musste man aber einfach leben — die Telefonnummer des ukrainischen Konsulats ist rund um die Uhr besetzt und auf Emails wird grundsätzlich nicht geantwortet. Also haben wir einfach die notwendigen Unterlagen gesammelt, etliche Kopien gemacht, Formulare ausgefüllt. Nebenbei durften wir noch eine Legalisierung der Einbürgerungsurkunde bei der Bezirksregierung einholen (hierbei revanchieren sich die Ukrainer bei den deutschen Kollegen und vertrauen keinen deutschen Dokumenten). Einzig auf die verlangte Vorauszahlung der Gebühren haben wir verzichtet, da es nicht wirklich klar war, dass der gesammelte Stapel an Unterlagen den Wünschen der ukrainischen Behörden entsprach (wie sich später herausgestellt hat: eine gute Entscheidung). Anfang Oktober ist meine Frau damit ins nächstgelegene Konsulat in Remagen bei Bonn gefahren.
Nach dem Aussitzen einer mehrstündigen Warteschlange teilte man ihr schließlich mit, dass die Informationen auf der Webseite nicht korrekt seien. Stattdessen wurde ihr eine Liste der benötigten Unterlagen ausgegeben, die sich in etlichen Punkten unterschieden hat (nicht zuletzt sind die Gebühren deutlich angestiegen). Nebenbei hat man erklärt, dass die Legalisierung deutscher Unterlagen nicht in der Bezirksregierung endet, sondern auch noch eine Legalisierung des Konsulats selber erforderlich ist (Kosten dieser zweifelhaften Leistung: €48). Also: wieder zurück nach Köln, Unterlagen vervollständigen und diesmal auch die Gebühren überweisen. Dann nochmal nach Remagen, wieder dieselbe Warteschlange. Beim zweiten Mal hat die Abgabe der Dokumente geklappt.
Woher die falschen Informationen auf der Webseite kommen, die übrigens immer noch dort verbleiben? Gute Frage, an der ihr euch gerne in den Kommentaren versuchen könnt. Zumindest die Liste, die wir in der Botschaft bekommen haben, ist mit März 2001 datiert — wenn also die Webseite einfach veraltet ist, dann hat sich in 10 (zehn!) Jahren niemand bereit erklärt, diese Informationen zu aktualisieren.
Das, war wir im Internet gefunden haben, hat uns nicht sehr zuversichtlich gestimmt. Zwar versichert das ukrainische Gesetz, dass Austritte aus der Staatsbürgerschaft nach höchstens einem Jahr abgehandelt werden müssen. Die Wirklichkeit sieht aber anders aus: viele Leute beklagten sich, dass sie auch nach fast zwei Jahren noch keinerlei Antwort bekommen haben. Die ukrainische Botschaft und Konsulate antworten nicht einmal auf Einschreiben, geschweige denn Email oder Telefon. Eigentlich können sie aber auch nichts sagen, denn Austritte aus der Staatsbürgerschaft sind in der Ukraine Präsidentensache. Und wie wir erfahren haben, weigert sich der Präsident einfach, irgendwelche Austritte zu unterzeichnen.
Also haben wir brav den Rat der deutschen Behörden befolgt und alle sechs Monate eine Erinnerung per Einschreiben an das ukrainische Konsulat geschickt. Zwar war es klar, dass diese Erinnerungen direkt in die Mülltonne wandern und wir nie eine Antwort erhalten, jedoch könnten wir mit den entsprechenden Nachweisen nach zwei Jahren auf eine Einbürgerung “unter Hinnahme von Mehrstaatigkeit” hoffen. Allerdings lässt sich der deutsche Staat hier anscheinend viel Zeit, um alles gründlich zu prüfen.
Wir hatten aber großes Glück. In der Ukraine wurde ein neuer Präsident gewählt, der offenbar eine andere Einstellung zu den “Heimatverrätern” hatte. Im Oktober 2010 haben wir in Internetforen erste Meldungen von Leuten gesehen, die einen Austritt erhalten haben. Anfang November war dann auch meine Frau dran, insgesamt hat es also nur ein wenig länger als ein Jahr gedauert.
Was wir aber erhalten haben, war lediglich eine Benachrichtigung, dass jetzt der Reisepass an das Konsulat geschickt werden soll (sowie ein Foto — wir haben ja bei der letzten Gelegenheit nur fünf Stück abgegeben). Eine andere Wahl, als sich auf die Post zu verlassen, hat man nicht — andere Leute haben berichtet, dass sich das Konsulat in Remagen strikt weigert, die Papiere persönlich anzunehmen. Dazu kommt, dass man sich bis zum Erhalt der deutschen Staatsbürgerschaft überhaupt nicht ausweisen kann. Aus einem Internetforum wussten wir aber, dass die deutschen Behörden ein Ersatzdokument ausstellen können. Vor dem Abschicken des Passes haben wir also in der Ausländerbehörde nachgefragt und erfahren, dass dieses Ersatzdokument erst nach der Bestätigung, dass meine Frau wirklich keine Ukrainerin mehr ist, ausgestellt werden kann. Immerhin hat man uns eine Statusbescheinigung mit Foto ausgedruckt — zumindest die Deutsche Post hat sich damit zufrieden gegeben, als wir ein Einschreiben abholen mussten.
Zwei Wochen später hat das ukrainische Konsulat geantwortet, mit einer Bescheinigung über den Verlust der ukrainischen Staatsbürgerschaft. Eine Übersetzung der Bescheinigung war schnell angefertigt und Ende November haben wir sie eingereicht, damit die Einbürgerung endlich stattfinden kann. Nebenbei wurden wieder einmal Gehaltsabrechnungen verlangt — ob meine Frau wohl trotz “Zusicherung” ohne Staatsbürgerschaft geblieben wäre, wenn ich vorübergehend meine Arbeit verloren hätte?
Anscheinend mussten die Unterlagen wieder gründlich auf ihre Richtigkeit überprüft werden. Da wir aber gegen Neujahr noch ins (europäische) Ausland verreisen wollten, sind wir nochmal zur Ausländerbehörde, um doch noch ein Ersatzdokument zu bekommen. Das war dann auf einmal kompliziert. Zuerst wurden Belege verlangt, dass ein Dokument wirklich benötigt wird. Buchungsbelege? Ich habe natürlich noch nichts gebucht, wenn doch nicht klar ist, ob meine Frau verreisen kann. Dann hat sich der Beamte doch mit einem formlosen Antrag zufrieden gegeben, den ich ihm gleich handschriftlich niedergeschrieben habe. Nach einer langen Beratung mit dem Vorgesetzten kam dann ein “richtiger” Antrag zutage, der ausgefüllt werden musste. Und außerdem mussten wir die Statusbescheinigung zurückgeben, denn diese sei ja auch ein Dokument. Letztlich hatten wir aber innerhalb von drei Tagen ein Reisedokument.
Anfang Februar kam schließlich der lang ersehnte Brief, dass die Einbürgerungsbescheinigung der Meldebehörde vorliegt. Diese müsse nur noch feierlich überreicht werden, ein Termin dafür fand sich am 22. Februar. Am Morgen dieses Tages haben wir also die Formalitäten erledigt und einen Ausweis beantragt. Dabei wurde das Reisedokument meiner Frau abermals eingezogen, da sie ja nicht mehr staatenlos ist und dieses somit ungültig wurde. Immerhin wurde ihr ein neues Ersatzdokument in Aussicht gestellt, wenn sie in den nächsten vier Wochen verreisen will (so lange dauert es ja, bis ein “richtiger” Ausweis oder Reisepass fertig ist). Zum Glück konnten wir diesmal darauf verzichten. Und am Nachmittag wurde ihr dann die Einbürgerungsbescheinigung vom stellvertretenden Bezirksbürgermeister überreicht. Jetzt warten wir nur noch darauf, dass die Ausweispapiere fertig sind.
Man mag von der deutschen Bürokratie halten, was man will, aber es fällt doch auf, dass die deutschen Behörden hier wirklich nicht das große Problem waren. Man muss auch sagen, dass die deutschen Beamten bei dieser Gelegenheit fast ausnahmslos hilfsbereit und zuvorkommend waren (das gibt es leider auch ganz anders). Andererseits verursacht die Forderung, zuerst die alte Staatsbürgerschaft abzulegen, jedoch massive Probleme, da zumindest einige GUS-Staaten das als ihre Chance sehen, den “Heimatverrätern” eins auszuwischen und nebenbei noch abzukassieren. Während es sich in der Ukraine jetzt etwas gebessert hat, blockieren andere Staaten weiterhin gezielt die Annahme der deutschen Staatsbürgerschaft durch ihre Bürger. Da sie jedoch nicht offiziell zugeben, dass eine Ausbürgerung nicht stattfinden wird, müssen die deutschen Behörden darauf bestehen, dass man viel Zeit, Geld und Nerven in die Ausbürgerung investiert.
Ich selber habe die deutsche Staatsbürgerschaft im Jahr 2000 erhalten, als mit der “Hinnahme von Mehrstaatigkeit” deutlich liberaler umgegangen wurde. Deswegen durfte ich die moldawische Staatsbürgerschaft behalten. Was hat es mir gebracht? Vor allem eines — ich durfte meine Einbürgerungsurkunde schon nach einem halben Jahr in den Händen halten. Und ich musste nicht zur moldawischen Botschaft reisen, durfte also auf einige extrem unangenehme Erfahrungen verzichten. Nebenbei stand ich auch zu keinem Zeitpunkt ohne Staatsbürgerschaft oder Ausweispapiere da. Und das war es. Mein moldawischer Pass ist schon 2002 abgelaufen, und auch sonst habe ich durch meine doppelte Staatsbürgerschaft keinerlei “Privilegien”.
Wenn also wieder einmal eine Debatte zur doppelten Staatsbürgerschaft aufflammt, bedenkt bitte folgendes. Eine Einbürgerung in einem fremden Land ist in der Regel ein drastischer Schritt. Die Leute, die ich kenne, tun das vor allem deswegen, weil man hier lebt und davon ausgeht, dass man hier auch bleibt. Nach so vielen Jahren in Deutschland will man einfach nicht mehr Bürger zweiter Klasse sein. Man will sich nicht mehr mit der Botschaft des Heimatlandes herumschlagen, die einen zu oft nur schikaniert. Man will nicht mehr zum Ausländeramt, wo einige Beamte anscheinend mit der Grundannahme arbeiten, dass alle Ausländer Schmarotzer seien. Und man will auch wählen gehen, um die Zukunft des Landes, in dem man lebt, mitbestimmen zu können.
Ich denke, dass es sehr im Sinne der viel zitierten Integration ist, dass den Ausländern, die sich für Deutschland entschieden haben, keine Steine in den Weg gelegt werden. Teilweise scheint es da die versteckte Hoffnung zu geben, dass sich die Ausländer und die damit verbundenen Integrationsprobleme einfach in Luft auflösen, wenn man nur die Einbürgerung verweigert. Die Wahrheit ist: das werden sie ganz bestimmt nicht. Leute, die schon seit acht oder mehr Jahren in Deutschland leben, werden in der Regel auch hier bleiben. So oder so, der deutsche Staat wird sich mit ihnen beschäftigen müssen. Wenn Menschen jedoch die gleichberechtigte Teilnahme am deutschen Staat systematisch erschwert wird, führt das zur Verbitterung und damit erst recht zu Integrationsproblemen.
]]>Diese Woche gab es hier ein wichtiges Ereignis: meine Frau hat endlich die deutsche Staatsbürgerschaft bekommen. Ich konnte den Prozess von Anfang an miterleben und sehen, wie das heutzutage abläuft. Da es aber kaum deutschsprachige Beschreibungen dazu gibt, denke ich nicht, dass sich allzu viele meiner deutschen Mitbürger damit auskennen. Ich schreibe es einfach hier auf, vielleicht gibt es dann bei der nächsten Debatte um die Einbürgerung weniger schlecht informierte Meinungen.
]]>Now to make this clear: Google has a very capable security team with great response times (yes, Yahoo!, I am looking at you). They have proper security review processes in place and generally the security of their web applications is pretty good. If you go after their popular applications like search or Gmail or YouTube you will pretty soon discover that you need to invest more time than the bug bounty justifies. However, if you look around on google.com you will notice that it is home to many more web applications, most of which are rarely looked at. And guess what: finding vulnerabilities in these moldy corners is a lot easier. It probably won’t stay this way but right now Google seems to be overpaying for the vulnerabilities found.
And that is the first lesson of web security: you cannot invest into securing one application but ignore others. If you know that one application is less secure, at least move it to a different domain where it cannot be used to compromise other applications (at least as XSS goes). Which still might turn out badly if a security vulnerability in that application allows an attacker to compromise the server.
It so happened that each of the four vulnerabilities I found is different but each is typical in some way. I’ll describe them here as an example of what can go wrong in web development. Who knows, maybe it helps somebody to prevent making the same mistake.
Imagine for a moment that you opened up a website and want to get an idea about whether it was built with security in mind. How do you check that? Right, you go for the search field and type something like test<>"'
into it. Check the source code of the result page, did the website turn your input into test<>"'
or did it leave the “dangerous” characters unchanged? Chances are pretty good that it will be the latter and then your next input might be something like <script>alert("I am evil")</script>
. Yes, that webmaster is a noob and XSS’ing the site is trivial.
Now Google has been in the search business long enough and I would have imagined that they learned securing (and testing) search fields as the very first thing. So when I entered a search string into YouTube Help I didn’t really expect an XSS vulnerability, I was rather interested in seeing how the application works. But — the “Results in YouTube Help for …” message quoted my input unescaped. I don’t know how this passed security reviews, the only explanation I have: somehow this didn’t affect the English variant of the page, so maybe only the English variant was tested. Anyway, that issue was too obvious and someone managed to find it before me — this is the only report I didn’t get any money for.
The usual advise to deal with XSS is to escape dangerous characters (<, >, ", ') every time when you insert user input into HTML code. However, doing this “manually” isn’t a good idea, it is much too easy to forget calling the escaping function somewhere. Which is why some template frameworks (I would even say: every good template framework) allow to do the escaping automatically every time a variable is inserted into the template. Jinja2 for example allows you to turn on autoescaping by default and then only turn it off for some variables which contain HTML code but have been verified as safe.
The second vulnerability was also found in help search though in a different area. When searching for privacy<>"'
some links on the resulting page had an attribute like onclick="RecordResultClick('privacy<>"'')"
. At the first glance this looks correct. All dangerous characters have been escaped, so you cannot use your input to break out of the attribute or the JavaScript string. That is, until you remember that in HTML the entities are evaluated first to get the attribute value, and that attribute value is the JavaScript code that will run. In the case above the attribute value is RecordResultClick('privacy<>"'')
so clicking the link will result in a syntax error — the string has two single quotation marks at the end. And with input like '+alert(/evil/)+'
you can actually run your JavaScript code when the link is clicked.
How does one protect against something like this? In this case you insert text into a JavaScript string that is inside an HTML attribute, so you first have to escape characters that are dangerous inside a JavaScript string (', backslash, newline need to be replaced by \', \\, \n respectively) and then additionally escape HTML entities. Which is complicated enough that people often get it wrong. So I would generally advise against generating JavaScript attributes dynamically, just don’t do it. Here is an alternative that is much easier to secure: _query="privacy<>"'" onclick="RecordResultClick(this.getAttribute('_query'))"
.
HTTP Response Splitting is a very common and frequently underestimated issue. Max Kanat-Alexander blogged about it recently so I don’t need to explain it all over again. However, he failed to mention that this issue is most commonly found in scripts doing HTTP redirects. So when I noticed that a survey script on services.google.com was redirecting back to the survey page the first question was: where does it get the redirect target from?
Turns out there were two POST parameters determining the redirect target: one was the actual URL and the other was an additional parameter that would be added to it. There was some code validating the URL, anything that used unusual characters or non-Google URLs would simply be ignored, so far so good (it did think that http://www.google.qwe.de is a Google URL however). But that additional parameter would be unescaped and then simply appended to the URL. So one could use "foo\nSet-Cookie: MyCookie=Hello, Google\n"
as parameter value which would produce the output:
HTTP/1.1 302 Found
Location: http://www.google.qwe.de/something/?foo
Set-Cookie: MyCookie=Hello, Google
Yes, that would set a cookie on the Google domain. And no, I didn’t bother to check whether Google is vulnerable to session fixation. It is more interesting to turn this into XSS vulnerability but this wasn’t as trivial as in Max’ example — this is a redirect after all and the browser would normally not display the content following the headers. It is possible to exploit persistent connections by specifying a too small Content-Length
header, this tricks the browser into believing that the following content is the response to the next request on the same connection. But this option was prevented by some header validation mechanism on the server.
The other option is to make the redirect fail, the browser will then display the HTML content following the headers. This is usually done by inserting a second Location
header with an invalid value like javascript:
. The browser will only consider the last header found and won’t redirect. But this was prevented by the same header validation mechanism which “helpfully” concatenated the values of all Location
headers. And then I noticed one more feature of that header validation — if the header contained invalid characters (like a tab character) it would remove the entire header. Which was very convenient in this case because removing the Location header was exactly what I wanted. So the parameter value "foo\t\n\n<script>alert("Got you!")</script>"
produced the output:
HTTP/1.1 302 Found
<script>alert("Got you!")</script>
And that resulted in JavaScript executed in almost all browsers (with Internet Explorer being the only exception, it displayed a generic error page instead).
So what can you do to prevent this from happening in your own web applications? It is actually quite easy, always send headers through a framework that won’t let you send more than one header at once (typically by checking for CR and LF characters, like PHP header()
function starting with PHP 4.4.2/5.1.2). If your framework doesn’t do it, write your own helper function — it is easy. And I think that the best policy for potentially dangerous headers is not removing them but failing. Yes, really. Throw an exception and don’t show anything but a 500 Internal Server Error response, this way you cannot do anything wrong.
People who are doing security reviews often concentrate on the main functionality of the application, things like error handling are typically less tested. Which is why somebody looking for security vulnerabilities will always try to make the application show an error to see whether this message is somehow exploitable. For example, I noticed that the site optimizer tooltip script will simply show a link if the answer
parameter is missing. What did strike me about this link was the empty hl
parameter. Could it be taking over the hl
parameter from the query string? Turns out it did — and it forgot to escape dangerous characters while doing so. Yep, another XSS vulnerability.
To state the obvious lesson here: unexpected conditions do happen, especially if your web application is being attacked. Very often a website is vulnerable simply because it quotes the requested URL in error messages. But you already know that you should always escape user input when it is inserted into HTML, and it is better to escape too much than too little. So I am concluding my already too long blog post.
]]>