Water reflections on a roof

Blog

Miniatur-Wunderland

If you visit Hamburg and have a few hours to spare, make sure to visit the Miniatur Wunderland in the Speicherstadt. It is the world’s largest model railway, covering an area of more than 1,300 m².

The construction easily degrades your home model railway to a few chipboards with rails attached. Besides model trains, also cars and even planes move there. For example, a fire breaks out in a model palace, and the fire trucks are immediately rushing to the place with blaring sirens. The perfection and the love even for tiniest details is just breathtaking.

The next pictures show just a small extract. There is much more to discover. You could easily spend hours, and wouldn’t have seen everything yet. Make sure to reserve your tickets online, to avoid waiting in a long line.

But enough... It’s picture time!

Continue reading...
PHP 5.3.7, eine Analyse

Das PHP-Entwicklerteam veröffentlichte vor wenigen Tagen die Version 5.3.7, nur um schon wenige Tage später vor deren Verwendung zu warnen. Der Grund dafür war ein Fehler in der Funktion crypt(), welche bei bestimmten Hash-Verfahren lediglich das Salt zurückliefert. Das kann dazu führen, dass nach einem Update auf PHP 5.3.7 keine Benutzer sich mehr auf einem Webauftritt einloggen können oder sich bei einer Passwortänderung nach einem Update auf eine spätere PHP-Version nicht mehr einloggen können. In PHP 5.3.8 wurde der Fehler wieder behoben.

Dieser Artikel ist der Versuch einer Analyse, wie es zu dem Fehler kam und warum er erst nach der Release bemerkt wurde.

Die PHP-Funktion crypt() ist in der Datei php_crypt_r.c implementiert. Folgender Codeausschnitt baut dort den Passwort-Hash zusammen:

memcpy(passwd, MD5_MAGIC, MD5_MAGIC_LEN);
strlcpy(passwd + MD5_MAGIC_LEN, sp, sl + 1);
strcat(passwd, "$");

strcat() fügt eine Zeichenkette an das Ende eines Puffers. Die Funktion gilt als unsicher, da sie nicht prüft, ob der Zielpuffer genügend Speicherplatz zur Verfügung stellt. Wird die Zeichenkette zu lang, wird der nachfolgende Speicherbereich beschädigt – ein typisches Problem bei C-Sprachen.

Aus dem Grund wurde der Aufruf durch eine sicherere Funktion ersetzt. Leider ist aber gut gemeint das Gegenteil von gut gemacht.

memcpy(passwd, MD5_MAGIC, MD5_MAGIC_LEN);
strlcpy(passwd + MD5_MAGIC_LEN, sp, sl + 1);
strlcat(passwd, "$", 1);

strlcat() stellt sicher, dass der Puffer nicht über sein Ende hinaus beschrieben wird. Dazu wird dessen Größe übergeben. Und genau hier lag das Problem, denn statt der Größe von passwd wurde anscheinend die Größe des zu kopierenden Textes übergeben, nämlich 1. Da passwd zu dem Zeitpunkt bereits deutlich mehr als ein Zeichen enthält, tut strlcat() genau das, was es tun soll, nämlich gar nichts. Das “$”-Zeichen wird nicht angehängt, das tatsächliche Ergebnis weicht damit von dem gewünschten Ergebnis ab.

Solch ein Fehler ist eigentlich ein Lehrbuchbeispiel für Unit-Tests, und der Kommentar zum Bugfix (Revision 315218) deutet auch an, dass ein solcher existiert:

Unbreak crypt() (fix bug #55439)
# If you want to remove static analyser messages, be my guest,
# but please run unit tests after

Tatsächlich gibt es einen Test, der die crypt()-Funktion mit bestimmten Werten aufruft und das Ergebnis mit einem erwarteten Ergebnis vergleicht. Dieser Test schlägt Alarm, wenn er ausgeführt wird.

Dass PHP 5.3.7 dennoch veröffentlicht wurde, lässt eigentlich nur einen Schluss zu: Der Unit-Test wurde nicht ausgeführt oder der Alarm wurde schlichtweg ignoriert. Spätestens beim Bau der finalen Version unmitelbar vor der Veröffentlichung hätte dies aber stattfinden müssen. Alles andere wäre grob fahrlässig.

Zusammengefasst hatte der Fehler also folgende Ursachen:

  • die für C-Sprachen üblichen Probleme bei der sicheren Verarbeitung von Zeichenketten
  • eine missverständliche oder nicht verstandene Dokumentation der Funktion strlcat()
  • keine verbindlich vorgeschriebene fehlerfreie Ausführung der Unit-Tests vor der Freigabe einer Release

Insbesondere der letzte Punkt wiegt schwer und wirft ein schlechtes Licht auf die verantwortlichen PHP-Entwickler.

Die CSU und die Sperrklausel des Grauens

Der Artikel ist von 2010 und bezieht sich auf die Bundestagswahl von 2009. Die grundsätzliche Problematik gilt natürlich generell, auch wenn die konkreten Zahlen von der jeweiligen Wahlbeteiligung abhängen. Interessant ist übrigens, dass der Artikel eine Partei rechts von der Union bereits damals vorhergesagt hat.

Wie funktioniert das eigentlich mit der CDU und CSU? Wie kann es sein, dass eine der beiden Parteien nicht auf dem Stimmzettel zu finden ist, sie dann aber doch gemeinsam im Koalitionsboot sitzen? Auch wenn man nicht immer diesen Eindruck hat: Es handelt sich tatsächlich um zwei eigenständige Parteien. Die CDU kann man allerdings nicht in Bayern wählen, die CSU nicht außerhalb. Beide Parteien müssen (wie jede andere Partei in Deutschland auch) bei einer Bundestagswahl jeweils die fünf-Prozent-Hürde knacken, um in den Bundestag einziehen zu dürfen. Für die CSU haben dafür bisher alleine die Stimmen aus Bayern ausgereicht, um die Partei deutschlandweit komfortabel über die 5% zu heben.

Aber wie komfortabel ist diese Stimmenzahl wirklich, oder anders gefragt: Wie schlecht müsste die CSU in Bayern abschneiden, um gerade noch in den Bundestag einziehen zu können? Wagen wir also ein Gedankenexperiment und fragen uns, wie viele gültige Wählerstimmen bei der Bundestagswahl 2009 in Bayern mindestens notwendig gewesen wären.

Erst einmal die Fakten. In dem offiziellen Wahlergebnis heißt es, bundesweit entfielen auf die CSU 2.830.238 Zweitstimmen. Bei 6.720.532 gültigen Wählerstimmen in Bayern kam die CSU damit auf komfortable 42,5%. Bei einer Bundestagswahl müssen die Zahlen allerdings deutschlandweit betrachtet werden. Bei 43.371.190 gültigen Wählerstimmen in ganz Deutschland entfielen damit tatsächlich nur 6,5% der Stimmen auf die CSU.

Um bei 43.371.190 gültigen Wählerstimmen die fünf-Prozent-Hürde zu nehmen, benötigt eine Partei mindestens 2.168.560 Stimmen. Die CSU muss diese alleine in Bayern aufbringen. Bei den dortigen 6.720.532 gültigen Wählerstimmen sind das mindestens 32,3%, die die CSU im eigenen Land mindestens erreichen musste, um in den Bundestag ziehen zu können. Natürlich ist das keine statische Grenze. Sie hängt von der Zahl der gültigen Wählerstimmen bundesweit und in Bayern ab, und damit auch direkt von der Wahlbeteiligung.

Je mehr Wähler bundesweit überhaupt eine gültige Stimme abgeben, desto mehr Wähler muss die CSU im eigenen Land aufbringen, um es über diese Hürde zu schaffen.

Mit diesen Zahlen im Hinterkopf ist es gut zu verstehen, warum bei der CSU im August 2010 die Nerven blank lagen, nachdem eine unveröffentlichte Umfrage ergab, dass sie derzeit nur noch auf rund 38% der Stimmen käme. Wenn sich dieser Abwärtstrend fortsetzt, wird die nächste Bundestagswahl erstmalig eine Zitterpartie für die Christsozialen. Und damit auch für die CDU, denn scheitert die CSU an der fünf-Prozent-Hürde, fehlen der gesamten Union schlagartig ebendiese Prozentpunkte.

Die Schuld sieht die CSU in der mieserablen Koalitionsarbeit und darin, dass die große Schwester den rechten Flügel zu stark vernachlässige. Sollte die Stimmenerosion so weitergehen, könnte es die CSU zu einem drastischen Schritt zwingen, um sich zu retten: das Aufkündigen der Union und die Umorganisation in eine eigenständige, stärker rechtsorientierte und bundesweit wählbare Partei. Sie würde das Vakuum rechts der Union füllen und dürfte der CDU einige Stimmen kosten. Stehen wir also vor einer weiteren Zersplitterung einer ehemaligen Volkspartei, so wie es die SPD mit den Linken erfuhr?

Bild Nummer 37

Das Wochenende verbrachte ich mit dem Sortieren der Fotonegative, die sich als Relikt aus meiner Analogfilmära seit 1996 angesammelt hatten. Dabei fiel mir auf, dass im Labor Negativstreifen aneinander geklebt werden, vermutlich damit sie als ein langer Film durch die Maschine gezogen werden können. Nach dem Entwickeln werden die Negative dann in kurze Abschnitte aufgeteilt und eingetütet. Das Filmende wird jedoch nicht am Klebestreifen durchtrennt, sondern kurz davor. Man findet in seiner Negativtasche also stets noch ein paar Millimeter vom benachbarten Filmstreifen.

An sich ist das kein Thema, wenn da nicht manche Kameras wären, die auf einen 36-er Film noch ein 37. Bild quetschen. Meistens geht das gut, und man findet dann tatsächlich 37 Abzüge in der Fototasche. Manchmal wird der Film aber auch am Bild 37 jäh mit dem nächsten Film verklebt, und schon wandern ein paar Millimeter jenes Bildes in die Negativtasche eines Fremden.

Das hier sind die Bilder, die ich auf diese Weise gefunden habe:

Ein großer Teil des Bildes wird vom Klebestreifen verborgen. Wenn man den Kleber rückstandslos entfernen könnte, könnte man sogar noch deutlich mehr sehen.