Stranger Than Usual

MathGPT

Ich habe ja letztes Jahr schon einmal etwas über ChatGPT geschrieben. Der „AI“-Hype hat seitdem nur zugenommen (aber darüber rante ich jetzt nicht großartig), und aus gegebenem Anlass schreibe ich jetzt noch mal etwas dazu.

Ich habe ChatGPT bisher hauptsächlich aus Neugier verwendet. Häufig, um die Grenzen auszuloten und die „Denkweise“ (nein, ChatGPT denkt nicht wirklich) zu verstehen. Berufliche Neugier und so. Ich bin da nicht der Einzige, ich habe einige Vorträte, Texte und Paper von Leuten gesehen, die so etwas viel besser und gründlicher gemacht haben. Manchmal nutze ich es aber auch, um mir ein bisschen Inspiration zu geben.

Ein Zahlenrätsel auf Anfrage

Letztes Jahr zum Beispiel hat ein Doktorand bei uns ein Rätsel in Gedichtform herumgeschickt. Irgendwer hatte gemeint, dieser Kollege müsse zu seinem Geburtstag sein Alter nicht direkt nennen, sondern in einem Rätsel verpacken oder so.

Das hat bei mir die Frage aufgeworfen: Könnte ich so etwas vielleicht auch machen? Mein Geburtstag war zwar noch eine Weile entfernt, aber ich kann ja aus Spaß mal ChatGPT fragen.

Das erste Gedicht war langweilig und war im Prinzip nur „Was ist sieben mal fünf“ in Gedichtform. Ich habe dann ein komplizierteres Rätsel verlangt. Daraufhin kam diese Antwort:

I'm odd and even, quite the mix,
Divisible by five and by six.
My digits sum up to eight,
A number not so easy to relate.
I am prime, but not alone,
With cousins, twins, and numbers unknown.
What am I?

Answer: Thirty-five (35)

Explanation:

  • "Odd and even, quite the mix" refers to the fact that 35 is an odd number but also divisible by 5 (an odd number is usually not divisible by 5).
  • "Divisible by five and by six" is a more complicated clue that leads to the solution since 35 is divisible by 5 and 7, and 5 x 7 = 35, which is also divisible by 5 and 6.
  • "My digits sum up to eight" means that the digits of 35, 3 and 5, add up to 8.
  • "I am prime, but not alone, with cousins, twins, and numbers unknown" refers to the fact that 35 is a prime number (divisible only by 1 and itself), but it is not alone in this group since it has other "cousin" primes nearby, such as 31 and 37, as well as twin primes (pairs of primes that differ by 2), such as 37 and 41, and numbers unknown, meaning other primes that are not yet discovered or named.

Diese Begründung ist natürlich Bullshit. 35 ist nicht „Divisible by six“. Es ist auch keine Primzahl. Das ist ein klassisches ChatGPT-Ding: Wenn man nicht mehr weiter weiß, bullshitten was das Zeug hält. Ist ja auch fair. ChatGPT ist ein Sprachmodell, kein Mathematikmodell, keine Intelligenz, kein Lexikon und auch kein Computer. Computer müssen rechnen können. Sprachmodelle müssen nicht rechnen können. Sie müssen Sprache verarbeiten.

Ein Mathematiklehrerchatbot

Dass das viele noch nicht verstanden haben, ist meiner Ansicht nach das Hauptproblem mit dem aktuellen „KI“-Hype. Und wie das mit Hypes nun mal so ist, muss jetzt halt überall „AI“ oder „KI“ rein (es gibt einen Grund, warum ich das immer in Anführungszeichen setze, aber ich habe mir vorgenommen, heute mal nicht zu ranten, deswegen gehe ich jetzt nicht näher darauf ein.

Jedenfalls gab es jetzt einen Versuch, eine Art auf ChatGPT basierenden Mathe-Nachhilfelehrer anzubieten. TL;DR: Dieser Chatbot kann nicht rechnen, und nimmt 320 als richtiges Ergebnis für 343 - 17 an.

Was sagt denn ChatGPT dazu?

Das musste ich natürlich mal selber ausprobieren. Nicht mit dem Mathelehrer-Chatbot, sondern mit ChatGPT selbst. Die erste Aufgabe hat es noch gut gelöst:

You: What is the square root of 15610401

ChatGPT: The square root of 15,610,401 is 3,951.

Soweit korrekt. Aber wie funktioniert das? Hat ChatGPT Zugriff auf Rechenfunktionen?

You: How do you calculate this? I mean you (ChatGPT) specifically. Do you have access to calculation routines or is this part of your learned behaviour?

ChatGPT: As an AI language model, I don't have direct access to external calculation routines or databases. Instead, I use algorithms and mathematical principles that I've been trained on during my development. My ability to perform calculations, including computing square roots, comes from the patterns and relationships learned from the vast amount of text data I've been trained on. When you ask me to compute something like a square root, I'm essentially applying learned mathematical concepts and algorithms to provide you with the answer.

Diese Antwort sieht sehr danach aus, als ob sie mehr oder weniger fest vorgegeben ist. Aber gut. 3951 zum Quadrat hätte ChatGPT auch irgendwo in den Trainingsdaten haben können. Also probieren wir mal größere Zahlen.

You: Interesting. What is the square root of 12464663264089?

ChatGPT: The square root of 12,464,663,264,089 is 11,160,601.

You: What is 11160601 times 11160601?

ChatGPT: 11160601 times 11160601 equals 1,244,663,264,089.

Ok, mit den Zahlen kommt es nicht mehr klar. Nur zur Referenz: Die gesuchte Wurzel ist 3530533 ChatGPT liegt also um eine Größenordnung darüber. Deswegen habe ich mal geschaut, was es macht, wenn man dieses falsche Ergebnis wieder quadrieren möchte. Eigentlich müsste dann ja wieder die ursprüngliche Eingabe herauskommen. Oder vielleicht das richtige Ergebnis für diese Multiplikation. Vielleicht merkt ChatGPT sogar, dass es einen Fehler gemacht hat. Tut es aber nicht. Stattdessen kommt ein Ergebnis, dass um Größenordnungen unter dem wirklichen Ergebnis (124559014681201) liegt.

Bei anderen Sachen schafft es ChatGPT manchmal, mit einem Hinweis auf einen Fehler diesen zu korrigieren. Oft genug macht es die Sache aber nur noch schlimmer:

You: Are you sure?

ChatGPT: Let me double-check that calculation for you.

11,160,601×11,160,601=124,646,632,640,801 Apologies for the error in my previous response. The correct result is 124,646,632,640,801. Thank you for bringing it to my attention.

ChatGPT hat sich wirklich Mühe gegeben, die Antwort brauchte auch deutlich länger. sie ist auch deutlich näher dran, aber immer noch komplett falsch. Naja, eine Chance gebe ich ihm noch:

You: Knowing that, can you redo the calculation for the square root of 12464663264089?

ChatGPT: Of course. Let's calculate the square root of 12,464,663,264,089.

The square root of 12,464,663,264,089 is approximately 3,527,081.

Auch hier: deutlich näher dran, aber immer noch falsch. Also einmal hinter die Ohren schreiben: ChatGPT ist ein Sprachmodell. Es kann nicht rechnen. Es kann dir korrekte Auskunft über Flugrabatte geben. Es kann dir keine korrekten Quellen für wissenschaftliche Erkenntnisse nennen. Es kann dir keine Präzedenzurteile nennen. Oder vielmehr: Es kann das, aber genausogut kann es sich auch einfach Dinge aus dem Arsch ziehen. Also auf keinen Fall darauf verlassen, was ChatGPT sagt! Immer überprüfen! Und woch ich gerade darüber nachdenke: Quellen auch dann überprüfen, wenn sie nicht von ChatGPT stammen.

CSU: Die Verbotspartei

Jetzt ist es soweit: in Bayern sind jetzt genderneutrale Bezeichnungen für Beamtinnen verboten. Die Diskussion darum brodelt ja schon eine Weile. Interessanterweise geht es meist darum, dass angeblich überall genderneutrale Sprache (also Konstrukte wie InformatikerInnen, Informatiker*innen oder Informatiker_innen) vorgeschrieben sei, und dass es ja viel zu unterdrückend sei, wenn man versucht, sich neutral auszudrücken.

Ich möchte hier nicht über die Sinnhaftigkeit dieser genderneutralen Konstrukte sprechen. Ich haben von Linguisten und Psychologen einige gute Argumente gehört, warum es sinnvoll ist, sie zu benutzen, aber ich selber habe da mangels Expertise keine starke Meinung.

Was mich aber wirklich anpisst in dieser Diskussion ist das oben beschriebene Framing. In der Realität beobachte ich nämlich von den Verfechtern der genderneutralen Sprache schlimmstensfalls ein „es wäre schön, wenn ihr das machen würdet“, in den meisten Fällen beobachte ich aber nur einfach, dass sie es machen. Es wird ein Politikum, aber kein großes, ein kleines Detail, um in die Gesellschaft ein kleines bisschen in die richtige Richtung zu bewegen.

Die Gegner dieser Sprachkonstrukte hingegen sind laut, beschweren sich über bevormundung, beschimpfen Leute, die diese Konstrukte benutzen, und so weiter. Tatsache ist aber: niemand zwingt sie, diese Konstrukte zu verwenden.

Und jetzt dieses neue Gesetz in Bayern. Aus dem oben verlinkten Artikel:

Es gehe darum, "die Diskursräume in einer liberalen offenen Gesellschaft tatsächlich offenzuhalten und nicht weiter zu verdrängen", sagte der CSU-Politiker.

Interessant. Um Diskursräume in einer liberalen offenen Gesellschaft offenzuhalten muss neutrale Sprache in öffentlichen Einrichtungen verboten werden? Den Gedankengang verstehe ich nicht.

Es sei "häufig zu erleben", dass Teile der Bevölkerung mit "großem missionarischen Eifer" unterwegs seien und es in bestimmten Milieus "faktisch zu einem Zwang" komme und ein "moralischer Druck" zum Gendern entstehe.

Ach ja. Und um diesem moralischen Druck etwas entgegenzusetzen verbieten wir das jetzt einfach? Und wie gesagt, den „missionarischen Eifer“ sehe ich eher bei denen, die immer gegen diese Sprache wettern.

Und woran erkennt man, dass das Gesetz wirklich, wirklich Scheiße ist? Ganz einfach: der AfD gefällt es:

"Linksgrüne, genderideologische Schreib- und Sprechvorgaben" seien eine Bevormundung der Bürger.

Das klingt ja schon einmal wieder voll nach AfD-Rhetorik. Ist es ja auch. Übersieht nur praktischerweise, dass es erstens keine Sprachvorgaben gab und zweitens dieses Gesetzt selber eine Sprachvorgabe und eine Bevormundung der Bürger ist. Aber naja, was soll man von den Rechtsextremen schon erwarten?

Auch wirklich ärgerlich finde ich in diesem Zusammenhang, dass z.B. den Grünen immer vorgeworfen wird eine „Verbotspartei“ zu sein, die immer nue Spielverderber seien und allen ihren Spaß nehmen wollen, und die außerdem viel zu viel Zeit damit verbringen, sich um unwichtige Dinge wie zum Beispiel genderneutrale Sprache zu kümmern. In Wirklichkeit sind aber eher die C-Parteien die Verbotsparteien, die sich so sehr an den angeblich so unwichtigen Dingen wie genderneutraler Sprache festbeißen.

So genug gerantet, ab ins Bett. Gute Nacht an alle Leser_innen.

Update 2024-03-20:

Der Volksverpetzer hat dazu auch einen Artikel, in dem insbesonders noch einmal schön dargestellt wird, warum die C-Parteien die „Verbotsparteien“ sind.

Nicht nur die DB hat eine Scheißwebsite

Ich war im Urlaub in Frankreich. Da meine Mitreisenden eine Woche länger als ich bleiben wollten, musste ich auf einem anderen Weg zurück. Die üblichen Verdächtigen konnten mich alle aus verschiedenen Gründen nicht mitnehmen, also musste ich die Bahn nehmen.

Ich bin bisher schon ein paar Mal mit der Bahn von dort zurückgefahren. Bis zum nächsten Bahnhof (Valence TGV) sind es zwar knapp zwei Stunden fahrt mit dem Auto, aber das ist noch machbar. Von da aus ist die Verbindung eigentlich ganz gut, ich kann von Valence mit dem Zug z.B. nach Paris fahren, von dort aus nach Köln, und von Köln aus kommt man gut weiter.

Buchung eines Zugtickets

Nur die Buchungswebsite der SNCF, also der französischen Eisenbahngesellschaft steht der Website der Deutschen Bahn in nichts nach… was Unbedienbarkeit angeht. Züge in ein anderes Land zu buchen ist ganz schlimm.

Also eine halbstündige Fahrt nach Aubenas, um dort in der örtlichen Niederlassung der Verkehrsbetriebe ein Ticket zu kaufen. Der Herr dort sprach auch Englisch, was die Kommunikation bei meinem gebrochenen Französisch sehr erleichtert hat.

Der Typ konnte mit auch kein Ticket irgendwo nach Deutschland verkaufen, nur in bestimmte Städte. Mit dem alten System hätte er das gekonnt, beteuerte er, aber mit dem neuen System ginge das nicht mehr. Immerhin konnte er mit mit diesem kaputtverbesserten System (ich frage mich, was die Entwickler von diesen Buchungssystemen eigentlich beruflich machen) ein Ticket nach Köln verkaufen. Ich war mir sicher, sobald ich erst einmal in Köln wäre, würde ich den Rest der Strecke schon irgendwie schaffen. Das war am Dienstag, die Abreise war am Samstagmorgen.

Falsch gebuchte Karten

Am Freitagnachmittag musste ich dann feststellen, dass mir der Typ keine Tickets für den 6. April, sondern für den 13. April, also eine Woche später verkauft hat. Auf den Tickets war sogar ein Hinweis, dass der ursprüngliche gewählte Termin nicht verfügbar war. Hat mir der Typ das gesagt? Nein.

Nun gab es zwei Probleme: Zum einen musste ich die fehlerhaften Tickets stornieren. Zum Anderen musste ich irgendwie nach Hause kommen. Für das zweite Problem gab es keine gute Lösung. Züge: Alle ausgebucht. Flixbus: Fährt von Lyon aus (vier Stunden Fahrr entfernt), fährt gegen 00:00 ab, braucht mindestens 26 Stunden, ist auch ausgebucht. Am Ende haben meine Mitreisenden dann ihren Urlaub abgebrochen (!) und sind eine Woche früher nach Hause gefahren. Statt am Samstagabend bin ich dann erst am Sonntagabend zu Hause angekommen und habe es nicht geschafft, die ganzen Kleinigkeiten zu erledigen, die ich bei der Urlaubsrückkehr eigentlich schaffen wollte.

Die Stornierung

Dann blieb das zweite Problem: Die Stornierung der Tickets. Die Tickets waren wirklich teuer, selbst im Vergleich zur deutschen Bahn. Ich hätte das Geld schon gerne zurück, zumal es ja nicht mein Fehler war, dass sie falsch gebucht wurden.

Ich wollte die Tickets unbedingt noch am Freitag stornieren, weil man sie bis zu eine Woche vorher kostenlos stornieren kann. Da sie mir fehlerhaft verkauft wurden könnte ich sie meinem Rechtsempfinden nach vermutlich auch später stornieren, aber einfacher sollte es eigentlich sein, sie zu den normalen Bedingungen zu stornieren.

Man kann Tickets über die SNCF-Website stornieren. Das geht aber nicht über sncf.com, sondern nur über sncf-connect.com. Wir haben eine Dreiviertelstunde gebraucht, um es überhaupt zu schaffen, die richtige Stelle zu finden, wo man das Ticket stornieren kann, die richtige Nummer zu finden, die man braucht, um das Ticket zu finden (man konnte sich die Nummern auch per Mail zuschicken lassen, diese Mail ist aber nie bei mir angekommen), das Eingabefeld umgehen, in dem man meinen Nachnamen eingeben musste (den das System nicht angenommen hat, obwohl er auf dem Ticket steht) und stattdessen die Zugnummer anzugeben, allerdings nur einen Teil der Zugnummer, denn den anderen Teil konnte man nicht eingeben, weil er aus Buchstaben bestand (habe ich schon einmal gesagt, dass die Seite furchtbar schlecht gebaut war?), nur um dann folgende Nachricht zu sehen:

Screenshot der SNCF-Website. In orange steht dort „Die Reise kann nicht umgetauscht order storniert werden“. Darunter steht „Die Online-Hilfe konsultieren“.

Warum ich das Ticket nicht stornieren konnte, stand dort nicht. Nach den auf dem Ticket aufgedruckten Infos hätte ich es stornieren können müssen. Support? Schwer zu finden. Telefonsupport? 7 Tage die Woche, bis 20:00 Uhr abends. Also dort angerufen, aber dort ging nur der Automat dran, der entgegen der Information auf der Website behauptete, die Hotline sei an diesem Tag nicht besetzt. Webformular? Wird frühestens am Montag bearbeitet. Am Ende habe ich das Webformular genommen, damit ich wenigstens offiziell rechtzeitig versucht habe, eine Stornierung einzuleiten.

Oh, aber ich hatte ja zwei Tickets. Eins von Valence nach Paris, eins von Paris nach Köln. Letzteres ließ sich nicht über das Onlinedingsbums stornieren. Das erste, wie ich dann herausfinden musste, aber schon. Allerdings bekam ich dann diese Meldung:

Screenshot einer Fehlermeldung: „Es ist ein technischer Fehler aufgetreten. Bitte kontaktieren Sie unseren Kundendienst über die Rubrik Hilfe, um den Status Ihrer Stornierung zu überprüfen.“

Naja, immerhin trudelte kurz darauf eine Stornobestätigung per Mail ein, also wird das wohl funktioniert haben. Da drin stand u.a.:

Um die Erstattung Ihrer Fahrkarten in Höhe von [vielzuviel Geld] zu erhalten, stellen Sie sicher, dass diese in Ihrem Besitz sind, und geben Sie sie über ein spezielles Verfahren, das über unsere Online-Hilfe zugänglich ist, zurück.

Ich muss also noch irgendwelche Rituale vollführen, um auch wirklich an mein Geld zu kommen. Immerhin: In der Mail war auch ein Link zu genau der richtigen Onlinehilfseite… dachte ich. Stattdessen führe der Link auf diese Seite:

Screenshot einer SNCF-Fehlermeldung: „Seite nich[sic] gefunden“

An diesem Punkt war ich völlig fertig mit den Nerven. Immerhin hatte ich meine Stornobestätigung, an das Geld werde ich dann ja wohl noch später kommen.

Fazit

Fassen wir zusammen:

  1. Tickets, die ich extra von Fachpersonal habe buchen lassen, weil ich mit dem Buchungssystem nicht klarkomme, wurden vom Fachpersonal für den falschen Tag gebucht.
  2. Kurzfristig richtige Tickets buchen war nicht möglich, meine Mitreisenden haben für mich ihren Urlaub abgebrochen
  3. Versuch, ein Teilticket über die Website zu stornieren scheiterte ohne Angabe von Gründen
  4. Versuch, das andere Ticket zu stornieren war trotz Fehlermeldung erfolgreich, aber um mein Geld zurückzubekommen muss ich etwas tun, was nicht näher beschrieben ist, und der Link auf die entsprechenden Hilfeseiten ist tot.
  5. Die SNCF-Website ist ein Haufen Mist, getarnt in einer modern aussehenden Oberfläche.

Warum versuche ich das mit dem Verreisen eigentlich noch? Ist es das wirklich wert? Sollte ich vielleicht einfach zu Hause bleiben?

Die SSH-Backdoor

So, nachdem ich vorgestern erst einmal meinem Ärger Luft lassen musste habe ich jetzt mal ein bisschen geschaut, was während meines Urlaubs so alles in der IT-Sicherheit passiert ist.

Ross Anderson

Zum Einen wäre da natürlich der Tod von Ross Anderson, Informatiker, Sicherheitsforscher, Kryptologe und Autor u.a. von Security Engineering. Sein Tod wurde auch von anderen Sicherheitsexperten wie Bruce Schneier und Fefe betrauert.

Zerforschung und CanGuard

Dann hat Zerforschung mal wieder eine Bombe platzen lassen. Aufgrund irgendwelcher Regulierungen bezüglich der Cannabis-Legalisierung kann man „Cannabis Social Clubs“ gründen, für die es erforderlich ist, Daten von allen Mitgliedern zu erfassen.

Neue Bürokratie, neue Software, die man verkaufen kann. So hat ein Hersteller die Software „CanGuard“ beworben, mit der man Mitglieder, Satzung und Lagerbestände verwalten kann. Laut Werbung sicher und Datenschutzkonform. Sollte man ja wohl auch erwarten, immerhin geht es hier um persönliche Daten, Name, Anschrift und natürlich implizite Informationen über (legalen) Drogenkonsum.

Dann haben sich ein paar Leute gewundert, warum sie plötzlich viel Spam bekommen, und beim CanGuard-Anbieter gefragt, ob es bei denen ein Leck gab. Die Antwort: Nein, unsere Software ist total sicher.

Zerforschung hat sich das dann angeschaut, und ich kann nur empfehlen, den Artikel zu lesen. Kurz zusammengefasst: Die Software ist nicht sicher, die Fehler, die gemacht wurden, sind absolute Anfängerfehler, und die Daten von über 1000 Nutzer_innen standen für jeden lesbar im Netz.

Wieder einmal kann ich nur bekräftigen: Zusicherungen von Firmen, dass ihre Software sicher seit ist nicht zu trauen! In diesem Fall waren die Sicherheitslücken wieder so eklatant, dass offensichtlich kein Gedanke an Sicherheit verschwendet wurde. Naja, immerhin waren die Passwörter mit bcrypt gehashed. Herausreichen sollte man sie trotzdem nicht.

Die XZ Utils / SSH-Backdoor

Aber Platz 1 hat auf jeden Fall die SSH-Backdoor erhalten. Da hat jemand sich über drei Jahre hinweg in die Entwicklung von XZ Utils (einer Bibliothek, die von SSH verwendet wird) eingeschlichen, mithilfe mutmaßlich gefälschter Accounts sozialen Druck auf den Maintainer der Bibliothek ausgeübt, doch bitte als Maintainer abzutreten und dann ein paar subtile Änderungen gemacht, die während des Buildprozesses eine Backdoor einfügten. Aufgefallen ist das nur durch Zufall (ein Entwickler hat sich über hohe Latenzen gewundert oder so), und zwar kurz bevor die größeren Linuxdistributionen die korrupte Version in ihre Repos übernommen haben.

Kurz: Da steckt eine ganze Menge kriminelle Energie und Zeit (und damit vermutlich auch Geld) hinter, und es wird viel spekuliert, wer dahinter stecken könnte und welche Probleme dahinterstecken, dass das überhaupt möglich war. So oder so sicher das Security-Thema des Jahres, ungefähr auf dem Niveau der log4shell-Lücke, nur dass das hier absichtlich war, dafür aber nicht weit verbreitet, als es entdeckt wurde. Natürlich gibt es dazu auch einiges an Informationen, die die Sache genauer erklären als ich hier.

PDF-Unterschriften

Die Verwaltung sollte wegkommen von diesem PDF-Fetisch.

Casey Kreer

Für einen aktuellen Antrag an der Uni muss ich eine PDF-Datei „digital unterschreiben“. Und mit „digital unterschreiben“ meinen sie keine digitale Signatur, also eine kryptographisches Verfahren, um sicherzustellen, dass tatsächlich ich es war, der das Dokument bearbeitet/erstellt hat. PDF unterstützt das zwar, aber kaum jemand nutzt es, und es gibt (gab?) damit auch gewisse Probleme.

Nein, gemeint ist, dass ich ein Bild meiner Unterschrift in eine PDF-Datei einfüge. Das erste Problem ist: PDF ist nicht dafür gemacht, bearbeitet zu werden. Es ist dazu da, ein Dokument, das gedruckt werden soll genau so darzustellen, wie es gedruckt aussehen wird (inkl. aller Resourcen wie z.B. Schriftarten), so dass man das Dokument zwischen verschiedenen Systemen hin- und herschicken kann, und es überall gleich aussieht. Diese Aufgabe löst PDF ziemlich gut.

Nun hat aber der Erfolg von PDF Adobe dazu gebracht, noch einen Haufen weiterer Features hinzuzufügen. Zum Beispiel Formularfelder, oder allgemein: Annotationen, mit denen man Inhalt über PDF-Dokumente drüberlegen kann. Unterschriften zum Beispiel, aber auch Textmarkierungen, etc.

Damit kommen wir zum zweiten Problem: PDF ist kein freier Standard, und ein sehr komplexes Format noch dazu. So finden sich zwar ein Haufen PDF-Reader für verschiedene Systeme, die die meisten PDF-Dateien korrekt anzeigen können. Es finden sich auch viele Programme, die ihr Format in PDF exportieren können. Auch das funktioniert gut, zumal ja nur eine Untermenge der PDF-Features verwendet wird.

Problematisch wird es, wenn man Inhalte hinzufügen will. evince zum Beispiel, ein PDF-Reader, der in Gnome standardmäßig verwendet wird, kann Formulare ausfüllen. Mehr oder weniger. In diesem Fall konnte ich die Formulare ausfüllen, aber der Inhalt der Felder wurde mir nicht angezeigt, es sei denn, ich hatte das entsprechende Feld markiert. Beim Einfügen von Bildern (der Unterschrift zum Beispiel) konnte mir evince aber nicht weiterhelfen.

Normalerweise nehme ich an dieser Stelle Xournal, ein Annotationsprogramm für PDFs. Das ging hier leider nicht, denn weder wurde das ausgefüllte Formular in Xournal angezeigt, noch wird nach dem Abspeichern der Inhalt des Forumlars behalten. Schlimmer noch, das Formular selbst wird unbrauchbar gemacht, so dass ich es nicht einmal neu ausfüllen kann.

Ich musste mir am Ende von meiner Professorin helfen lassen, die ein Programm hat, mit dem das geht. Das ist schon ein bisschen peinlich, weil ich ein erfahrener Informatiker bin, aber ich war am Ende echt am Rand eines Nervenzusammenbruchs.

Können wir bitte aufhören, für diesen Bürokratiekrams ein Format zu verwenden, das einfach nicht dafür geeignet ist? Ein Format, dass Benutzer praktisch dazu zwingt, die Software eines bestimmten Herstellers (Adobe) zu verwenden? Ein Format, das nicht barrierefrei ist (dazu gerne den Artikel auf netzpolitik.org lesen, den ich oben verlinkt habe)?

Ich habe die Schnauze voll von dem Scheiß. Die Digitalisierung in Deutschland (oh, in den Niederlanden hatte ich denselben Ärger) geht in die falsche Richtung. Digitalisierung bedeutet nicht, die analogen Vorgänge 1:1 in einen Computer zu übertragen. Automatische Datenverarbeitung kriegen wir so auch nicht hin, PDF ist kein maschinenlesbares Format. Das heißt, am Ende muss doch wieder jemand manuell die Daten aus dem PDF in ein anderes System eintragen. Dann kann man auch lieber beim Papier bleiben, da ist es einfacher, Unterschriften drunterzusetzen.

Voyager 1 lebt!

Man muss ja auch mal die positiven Sachen sehen: Diese Woche kriegt die NASA endlich wieder brauchbare Daten von Voyager 1. Seit November 2023 kamen nur noch Nonsensdaten, und viele hatten die Sonde schon abgeschrieben. Stattdessen konnten die Leute bei der NASA das Problem beheben. Und das ist echt eine Leistung, auch weil die Sonde mittlerweile 22,5 Lichtstunden von der Erde entfernt ist. Damit ist sie das am weitesten von der Erde entfernte von Menschen geschaffene Objekt.

Zum Vergleich: Ich selber kriege ja kaum meine eigenen Computer unter Kontrolle, und das, obwohl sie direkt vor mir stehen.

Ach ja, und ein Fun Fact: Voyager 2 ist zwei Wochen vor Voyager 1 gestartet.

I hope this email finds you

Hier hat jemand Spaß gehabt, einen Bot zu schreiben, der aus einem Textkorpus Sätze heraussucht, die „finds you“ enthalten, den Teil davor durch „I hope this email“ ersetzt, aber den Teil danach behält und das ganze auf Mastodon posted. Zwei Mal am Tag.

Dabei kommen zum Teil relativ offensichtliche Ergebnisse heraus, wie zum Beispiel:

I hope this email finds you in good spirits and health.

Manche Posts scheinen aus einem wissenschaftlichen Journal zu kommen:

I hope this email finds you well and in this issue, our lead feature describes the exciting results of the first clinical trials conducted using a new drug called Fosamax for osteoporosis.

Andere klingen einfach nur bedrohlich:

I hope this email finds you no matter where you're hiding.

So oder so, es ist ein netter kleiner Bot und es lohnt sich, den mal anzuschauen. Der Quellcode ist freie Software und recht einfach, da kann man also auch mal reinschauen.

Update 5.5.2024

Natürlich hat sich innerhalb von kürzester Zeit der Mastodon-Account geändert. Ich habe den Link oben angepasst. Der alte Account ist hier zu finden. Wenn man dem alten auf Mastodon gefolgt ist, sollte das aber auch auf den neuen Account übertragen worden sein.

Noch mehr link-rot

Letzte Woche habe ich erst einen Post über einen lustigen Mastodon-Bot geschrieben. Jetzt schon hat sich der Account verändert, damit die URL, und ich musste sie anpassen. Immerhin, die alten URLs finden weiterhin ihr Ziel, aber es kommen halt keine neuen Toots hinzu.

Im Gegensatz zu den Links in meinem Blogpost zu Laschets Rede gegen Rechts. im Februar. Dort ist mir schon vor ein paar Wochen aufgefallen, dass die wichtigsten Links nicht mehr funktionieren.

Der eine Link ging zu einem Artikel auf focus.de über diese Rede. Dieser Artikel war schon kurz nach dem Erscheinen nicht mehr auffindbar, zumindest nicht unter derselben URL. Dieser Artikel ist immerhin im Internet-Archiv zu finden.

Schwieriger wird es mit der Videoaufzeichnung zu der Rede. Der Toot, auf den ich verlinkt habe, war nicht mehr zu finden. Vielleicht ein Mastodon-Problem, ich weiß es nicht. Ich habe ein Video der gleichen Rede gefunden, aber der Wortlaut war nicht identisch, vermutlich war das auf einer anderen Veranstaltung.

Barriereunfreiheit

Ich hatte einen Wegeunfall von meinem Arbeitsort nach Hause. Bruch irgendwo im linken Arm, der ist im Gips, die rechte Hand ist verstaucht und nur begrenzt einsetzbar (ich schreibe diesen Artikel mit einer Hand, das macht keinen Spaß).

Weil es ein Wegeunfall war, muss der natürlich anders gemeldet werden. Das bedeutet: ein PDF-Formular ausfüllen. Nun hatte ich mich ja neulich schon über PDF-Formulare geärgert. Dieses hier setzt aber noch eins drauf: ich muss ein Datum eingeben. Und zwar jede Ziffer in einem eigenen Eingabefeld. Also so: 0 <tab> 1 <tab> 0 <tab> 1 <tab> 1 <tab> 9 <tab> 7 <tab> 0 <tab>.

Normal schon eine Tortur. Einhändig? Genug Ärger, um wütend genug zu sein um auch noch diesen Blogpost einhändig zu schreiben. Und wenn ich daran denke, dass ich nur temporär und nur leicht (also ich kann alles bedienen, es dauert nur viel länger) eingeschränkt in meiner Computernutzung bin, dann wird es für mich um so klarer, mit welchem Ärger andere Leute zu kämpfen haben.

Die Digitalisierung bietet viele Chancen, das Leben einfacher zu machen. Für Menschen mit Behinderung, aber auch für alle anderen. Warum also müssen wir uns stattdessen mit PDF-Formularen herumschlagen?

Die CDU und das Verbrennerausaus

Gestern Nachmittag hat die CDU groß dafür propagiert, das Verbot von Neuzulassungen von Autos mit Verbrennermotoren ab 2035 wieder abzuschaffen. Sie nennen es „Verbrennerauto-Verbot“, aber es bestehende Verbrennerautos werden nicht verboten. Ingesamt ist das Gesetzt absolut notwendig, ein sehr abgeschwächter Kompromiss und mehr oder weniger das Einzige, was in letzter Zeit überhaupt zum Klimaschutz verabschiedet wurde. Das Heizungsgesetzt zu Beispiel haben CDU und FDP ja ordentlich kaputt gemacht.

Dazu hat die CDU auch publikumswirksam eine Umfrage gestartet. So eine Umfrage auf der CDU-Website ist natürlich erst einmal Bullshit, weil sie nicht repräsentativ ist. Nur ist das in diesem Fall nach hinten losgegangen. Denn auf Mastodon wurde groß dafür geworben, bei dieser Abstimmung gegen ein Verbrennerausaus zu stimmen. Ergebnis: 86% der Leute wollen beim Verbrenneraus bleiben.

Was das jetzt repräsentativ? Nein, natürlich nicht. Wäre sie aber so oder so nicht geworden. Die CDU hat halt gedacht, dass sie damit ein schönes Argument für ihre Forderung in der Hand zu haben. Haben sie jetzt nicht, also machen sie das, was Klimawandelleugner am besten können: Leugnen. Zitat:

Diese Umfrage ist massiv manipuliert worden. Zehntausende Stimmen sind automatisiert abgegeben worden.

Das stimmt aller wahrscheinlichkeit nicht. Diese Stimmen sind nicht automatisiert abgegeben worden (wäre ein bisschen umständlich, weil nach drei Anfragen die IP-Adresse gesperrt wird), es hat sich einfach ein digitaler Flashmob gebildet und abgestimmt. Das ist im Internet ein alter Hut, so wurde zum Beispiel ein britisches Forschungsschiff fast einmal Boaty McBoatface genannt.

Aber die CDU muss sich natürlich wieder als Opfer darstellen:

Das ist völlig inakzeptabel. Die Umfrage ist daher abgeschaltet worden. Wir stehen als CDU für einen fairen Wahlkampf.

Bullshit. Ihr habt versucht, mit einer nichtrepräsentativen Umfrage den Eindruck zu erwecken, dass alle bei den Verbrennern bleiben wollen. Ihr behauptet Bullshit, wie dass wir ohne Autoindustrie alle arm werden (obwohl die Autoindustrie ja den Ersatz für die Verbrennerautos, also Elektroautos produzieren würde, denn von einer verünftigen Verkehrswende steht nichts in dem Gesetzt). Ihr verbreitet implizit den Bullshit, dass der Klimawandel die Wirtschaft nicht viel mehr kosten wird als ein Verbrenneraus. Und ihr behauptet, für einen fairen Wahlkampf zu stehen?

Eine gute Zusammenfassung des ganzen Bullshits kann man beim Volksverpetzer finden. Eine weitere Zusammenfassung gibt es bei der Süddeutschen Zeitung.

Auf der anderen Seite war es ganz nett zu beobachten, wie sich das Ganze entwickelt. Als ich gestern Abend den aktuellen Umfragestand gesehen habe, habe ich mir schon gedacht, dass die CDU behaupten wird, wir seien alle Bots.

Br-Br-Br-Brotli!

Ich habe ja schon einmal erwähnt, dass ich einen gewissen Kompressionsfetisch habe. Nein, nicht wie in diesem xkcd-Comic. Mehr so wie in diesem xkcd-Comic: There is no actual porn in there, I'm just turned on by data compression.

Als ich 2020 dieses Blog überarbeitet und auf statische Seiten umgestellt habe, habe ich auch gut optimierte, statische Kompression eingebaut: Zopfli als gzip-kompatible, langsame aber effektive Kompression und Brotli als die neuere Variante, die insbesondere HTML besser komprimiert und auch deutlich schneller als Zopfli ist (von der Geschwindigkeit eher mit herkömmlicher gzip-Kompression vergleichbar).

Nun habe ich damals angemerkt, dass Brotli noch nicht mit nginx funktioniert. Grund dafür war, dass ich das nginx-Brotli-Modul manuell hätte kompilieren müssen, mit Zugriff auf den nginx-Quellcode in der richtigen Version, das heißt ich hätte jedes Mal, wenn nginx oder das Brotli-mod ein Update bekommen hätten, den ganzen Murks noch einmal machen müssen. Das ist nicht low-maintenance, und so hätte ich wichtige Sicherheitsupdates vielleicht aufgeschoben. Nein danke.

Vor Kurzem bin ich aber auf Debian 12 Bookworm (Debian-Distributionen sind nach Toy Story-Charakteren benannt) umgestiegen. Und da gibt es jetzt endlich ein Paket namens libnginx-mod-http-brotli-static. Von da an war alles ganz einfach: Paket installiert, brotli_static: on; in die nginx-Konfiguration gehängt, nginx neu geladen. Fertig.

Was macht das mit den Dateigrößen? Schauen wir uns doch zum Beispiel mal die HTML-Datei der Homepage dieses Blogs an, und zwar die bevor dieser Post hier veröffentlicht wurde:

  • home.html: 44900 byte
  • home.html.gz: 16550 byte
  • home.html.br: 15322 byte

Durch die Kompression allgemein kann die Größe also auf knapp 37% reduziert werden. Brotli verbessert die Kompression im Vergleich zu Zopfli noch einmal um mehr als ein kiB oder etwa 8%, und es läuft dabei deutlich schneller.

Alle modernen Browser unterstützen das. Ich überlege echt, ob ich nicht die Zopfli-Kompression komplett herausnehmen soll, das würde die Buildzeiten für mein Blog drastisch verkürzen, denn Zopfli ist momentan mit Abstand der zeitaufwändigste Teil. Als Fallback gäbe es ja immer noch die unkomprimierte Version. Aber erst einmal lasse ich es wie gehabt laufen, nur dass jetzt Brotli auch tatsächlich benutzt wird.

IPv6

Vor ein paar Wochen habe ich für den Server, auf dem dieses Blog läuft endlich eine IPv6-Adresse eingerichtet. Das hätte ich schon vor Jahren machen sollen. Und mein Hoster hatmir nicht nur eine, sondern einen ganzen Haufen IPv6-Adressen zu Verfügung gestellt. Aber Netzwerkkrams ist immer so fummelig…

Naja, der Server ist ein Debian-System, dort habe ich dann die in /etc/network/interfaces folgende Zeilen hinzugefügt:

iface eth0 inet6 static
	address 2a03:4000:2a:200:42:42:42:42
	netmask 64
	gateway fe80::1

Das war schon Mitte März. Damit war der Server schon unter der IPv6-Adresse erreichbar, aber ich musste noch die DNS-Einstellungen machen, damit man diese Adresse auch findet. Das hatte ich dann gemacht, aber auch Tage danach ergab die Anfrage host strangerthanusual.de nur die folgende Zeilen:

strangerthanusual.de has address 193.30.121.255
strangerthanusual.de mail is handled by 10 mail.strangerthanusual.de.

Komisch. Naja, keine Zeit, zu viele andere Dinge zu tun. Irgendwann später ist mir dann aufgefallen, dass mein Browser die Blogseite sehr wohl via IPv6 aufruft. Es stellte sich heraus: Ich habe den DNS-Eintrag nur für Subdomains (*) von strangerthanusual.de eingerichtet, nicht für strangerthanusual.de selbst (@). Das ist korrigiert, aber das Blog selber war ohnehin schon seit über zwei Monaten über IPv6 erreichbar. Endlich.

Cyber Demokratische Union

Die CDU jammert gerade über den „[schwersten] Angriff, den jemals eine politische Partei in Deutschland erlebt hat“. Mit „Angriff“ ist hier ein Angriff auf deren IT-Struktur gemeint.

Nun kommt das ja nicht von ungefähr. Zuerst einmal trägt die CDU Mitschuld am Hackerparagraphen, der Sicherheitsforschern in Deutschland das Leben schwer macht. Dann fordern sie jahrelang Schwächungen der IT-Sicherheit in Deutschland, angefangen bei der Vorratsdatenspeicherung über das Schwächen von Kryptographie bis hin zur Möglichkeit eines staatlichen „Hack-Backs“ (was im Prinzip bedeutet, dass der Staat bekannte Sicherheitslücken zurückhalten muss, so dass sie nicht behoben werden können, damit er sie später zum Angriff nutzen kann).

Am Ende gehen sie (zusammen mit der CSU) dann natürlich so weit, dass sie Sicherheitsforscher_innen, die ihnen Sicherheitslücken melden, verklagen. Der CCC meldet seitdem keine Sicherheitslücken mehr an die CDU. Das war 2021. Ich habe damals auch darüber geschrieben. Meine Hypothese ist: IT-Sicherheit ist uns als Gesellschaft (und insbesondere auch der CDU/CSU) nicht wichtig genug, um darin Zeit, Gedanken und Geld zu investieren. Und dafür bezahlt die CDU jetzt halt den Preis.

Das ist ungefähr so, als würde man sich gegen Hochwasserschutz stellen und sich dann über massive Hochwasserschäden beschweren. Oh warte, genau das ist ja passiert.

Insofern: Kein Mitleid mit der CDU/CSU.

Update 2024-06-04

Da ja der CCC keine Sicherheitslücken mehr an die CDU meldet, muss Heise das machen. Dieser Fall hier ist aber kein Angriff irgendeiner Form von außen, sondern einfach nur klassische Inkompetenz.

Wie viel bringt die Brotli-Kompression bei mir insgesamt?

Ich hatte ja vor ein paar Tagen groß angekündigt, dass dieser Server hier endlich Brotli unterstützt. Da hatte ich auch ein Beispiel angegeben, um wieviel sich die Homepage verkleinert hat.

Das ist natürlich nicht ganz repräsentativ, also habe ich mal alles zusammengerechnet, was hier komrpimiert ausgeliefert wird. Das geht recht kompakt mit folgendem Befehl:

du -cB1 --apparent-size $(find dist/ \( -iname "*.html.br" -o -name "*.css.br" -o -name "*.svg.br" \) )

Kurz aufgeschlüsselt: der find-Befehl sucht nach allen Dateien, die auf .html.br, .css.br oder .svg.br enden. Analog dazu kann man natürlich auch andere Dateiendungen nehmen oder ganz andere Suchschemata. du -cB1 summiert die Dateigrößen der Eingabedateien auf und gibt sie mir in bytes an.

Ich habe hier mal das atom-feed außen vor gelassen, ebenso Bildateien, die ohnehin schon komprimiert sind und die ich eh nicht mit Brotli oder gz komprimiere (JPEG, PNG und WebP).

Das Ergebnis

  • keine Kompression: 10024688B oder ≈9,6MiB
  • gz (mit Zopfli): 4170752B oder ≈4MiB (≈42% der unkomprimierten Daten)
  • Brotli: 3488654B oder ≈3,4MiB (≈35% der unkomprimierten Daten oder ≈84% der Zopfli-komprimierten Daten

Im Verhältnis zur Homepage also ein bisschen schlechter, dafür macht sich der Unterschied zwischen Brotli und Zopfli noch einmal deutlich besser bemerkbar.

Ein Problem erzeugt die Kompression natürlich: Ich muss alles mehrfach hochladen. So lange deutlich mehr Leute die Dateien herunter- als hochladen, sollte das aber trotzdem besser sein. Und wie gesagt: Die gz-komprimierten Dateien entferne ich vielleicht früher oder später. Das erspart mir das Hochladen, vor allem aber auch das Komprimieren selber. Aber das drängt nicht.

WiFi sniffing on a Raspberry Pi 5

Note: I usually write stuff in German here, but people who are interested in this may not speak German, so I'll do this one in English.

The Problem

For my current research project I need to do some WiFi sniffing. So I just set up a Raspberry Pi and run airodump-ng (part of the aircrach-ng project) on it, right?

Wrong. The basic idea is simple: put the WiFi card into monitor mode, then run airodump-ng. For the first part, aircrack-ng provides a tool that does this for me. It even kills other processes that use the card (important: You won't be able to use your WiFi on that device until you undo this, so make sure you have a separate network connection if you need one):

sudo airmon-ng start wlan0 

wlan0 is the WiFi interface in this case. Usually, it looks something like this:

PHY     Interface       Driver          Chipset

phy0    wlan0           brcmfmac        Broadcom 43455
        wlan0 is soft blocked, please run "rfkill unblock 1" to use this interface.
rfkill error, unable to start wlan0

Would you like to try and automatically resolve this? [y/n] y

After that, the interface is in monitor mode. On my Raspberry Pi 5 with Debian 12 however, the above output was followd by this:

ERROR adding monitor mode interface: command failed: Operation not supported (-95)

Searching for a solution

This was a bit surprising. That seriously won't work? Let's take a look at the aircrack-docs:

Even though dmesg says the interface is already in monitor mode and “iw dev wlan0 info” confirms it is, airodump-ng will fail and report the interface data linktype is Ethernet. This is a bug in the driver and/or firmware, and the workaround is to reboot the system or to reload the driver:

rmmod brcmfmac
modprobe brcmfmac

The Problem persists, however. Reloading the modules does not work. Rebooting does not work. Firmware updates do not work. Then I stumbles upon this thread in the Raspberry Pi forums. Someone has the same problem that I have and suggeted to rebuild “nexmon”. But what is “nexmon”?

Nexmon to the rescue!

Nexmon is:

our C-based firmware patching framework for Broadcom/Cypress WiFi chips that enables you to write your own firmware patches, for example, to enable monitor mode with radiotap headers and frame injection.

Sounds like this is exactly what I need. They even have a detailed review on how to build and use it! So let's go!

Unfortunately, it's not that easy. The Raspberry Pi's WiFi chipset is mentioned, but only in the context of a Raspberry Pi 3 or 4. Also: kernel versions 4.x and 5.* are supported, but I'm running 6.6.31. Oh wait. There is also an entry for a Raspberry Pi 5. But that one does not support monitor mode. Whatever. I'll just try the version for the Raspberry Pi 4 with kernel 5.4.

In the following, I'll post a modified version of the Readme. There will be comments on where I strayed from the original version and why I did it. I tested the stuff below with commit c381091d679993a0535082943d9b74a20f92b9f1 in the nexmon projecton a 64 bit system.

How to build and install nexmon on a Raspberry Pi 5

First, add this to your /boot/firmware/config.txt (and then reboot to load the kernel with the correct parameters):

kernel=kernel8.img
reboot

This is not mentioned in the tutorial, but I got the following error message:

libm.so.6: ELF load command address/offset not page-aligned

Turns out: there are different memory alignments and nexmon cannot deal with that. Ok, now on to the actual installation guide

  • Make sure the following commands are executed as root: sudo su
  • upgrade your Raspbian installation: apt-get update && apt-get upgrade
  • Install the kernel headers to build the driver and some dependencies: sudo apt install raspberrypi-kernel-headers git libgmp3-dev gawk qpdf bison flex make autoconf libtool texinfo xxd
  • Clone our repository: git clone https://github.com/seemoo-lab/nexmon.git
  • Go into the root directory of our repository: cd nexmon

Notes: I added xxd to the list of dependencies, because it was not installed on my newly installed Raspberry Pi. Also: It is not necessary to run everything as root, just the installation stuff. However, since the build process requires some messing with environment variables, it is probably easier to just run everything as root. Next come some library installations:

  • sudo dpkg --add-architecture armhf
  • sudo apt-get update
  • sudo apt-get install libc6:armhf libisl23:armhf libmpfr6:armhf libmpc3:armhf libstdc++6:armhf

And then some symbolic links. Important: Don't run these command just like that. I for example had different (but compatible) versions installed, i.e. libisl.so.23.2.0 and libmpfr.so.6.2.0. So check your library versions and adjust the commands below accordingly. If you don't, you will get the error ERR: ram file empty or unavailable. when you run make.

  • sudo ln -s /usr/lib/arm-linux-gnueabihf/libisl.so.23.0.0 /usr/lib/arm-linux-gnueabihf/libisl.so.10
  • sudo ln -s /usr/lib/arm-linux-gnueabihf/libmpfr.so.6.1.0 /usr/lib/arm-linux-gnueabihf/libmpfr.so.4

Then you can setup the build environment for compiling firmware patches

  • Setup the build environment: source setup_env.sh
  • Compile some build tools and extract the ucode and flashpatches from the original firmware files: make

In the following part, the readme gives you some options. In my case, only the one I present below works:

Go to the patches folder for the bcm43455c0 chipset: cd patches/bcm43455c0/7_45_206/nexmon

  • Compile a patched firmware: make
  • Generate a backup of your original firmware file: make backup-firmware
  • Install the patched firmware on your RPI3: make install-firmware

It says “RPI3”, but in this case it is the RPI5, obivously. Also: if you ran most of these parameters as non-root and used sudo to execute the ones that required root access: make install-firmware required the setup environment, so use sudo -E make install-firmware.

From here on, you can continue with the official nexmon readme file (it continues with “Install nexutil: from the root directory of our repository switch to the nexutil folder”). It explains you how to set up a separate network interface that is in monitor mode and so on, all of that worked for me more or less without problems. I think.

Conclusions

This is a setup that worked for me, but I have not tested it thouroughly yet. I can capture WiFi data over the air, but I have not let it run for a long time, so I do not know how stable it is. When I find some more issues (and solutions), I will post that here.