Softwäjhrentwicklung des tages

Die programmierer der beliebten skriptsprache python kriegen es tatsächlich hin, beim parsen einer fließkommazahl in einer zeichenkette einen bufferüberlauf zu haben, den man unter umständen zum unterjubeln von beliebigem kohd nutzen könnte. Haben die das tatsächlich selbst geproggt? Ich meine: selbst wenn man es nicht weiß, könnte man sich doch vorstellen, dass das parsen von fließkommazahlen eine derartig häufige standardaufgabe ist, dass das schon die standardbibliotek können müsste. Und in der tat, sie kann das auch. strtod (const char *, char **endptr) liefert schön die zahl als double (gibts natürlich auch in einer versjon für float und long double), und wenn ein pointer auf einen char * übergeben wurde, wird darin abgelegt, an welcher stelle in der zeichenkette das parsen abbrach. Wenn man anständigen kohd schreibt, setzt man vorher errno auf 0 und schaut hinterher nach, ob bei der umwandlung ein fehler aufgetreten ist, den man dann besser behandelt. Aber das ist heutigen proggern einer skriptsprache wohl zu altmodisch, dass man einfach bewährten und vermutlich vollständig entfehlerten bibliotekskohd benutzt, wenn er schon da ist. Vermutlich habe sie gerade an der uni gelernt, wie man das macht, und da wollten sie sich gleich mal dran probieren, obwohl das deutlich mehr als vier zeilen wurden… 🤦‍♂️️

Oder hat python etwa ein anderes zahlenformat als C? Das wäre mir jedenfalls noch nicht aufgefallen. (Nein, ich habe nicht die ganze referenz durchgelesen, als ich zwischendurch mal ein paar sachen in python geproggt habe…)

„Cyber cyber“ des tages

Wie fährt man einen angriff gegen päjpäll, ama-zone, äppel, meikrosoft, schoppifeist oder ubel? An sich war das ganz einfach: Wenn man wusste oder erraten konnte, wie die verwendeten biblioteken heißen, legte man einfach in den üblichen bibliotekslagerstätten im internetz gleichnamige, aber mit höherer versjonsnummer an, und schon werden die in der den lokalen entwicklungsumgebungen vorgezogen — und man konnte dort beliebigen kohd ausführen lassen. Weia!

Auch weiterhin viel spaß mit dem aufgeblähten blähkohd des 21. jahrhunderts mit seinen paarhundert abhängigkeiten zu externem kohd! Egal, ob maven, pip oder npm, die damit hereingeholte komplexität kann ein echtes security-problem werden. Und nein, cpan ist auch nicht besser. Gruß auch an die ganzen javascript-entwickler, die lieber ein ganzes paket aus einer nicht kontrollierten kwelle (mit möglicherweise zunächst halb unsichtbaren, aber monströsen abhängigkeiten, die dann für jahrzehnte im projekt bleiben, weil niemand laufenden kohd anfassen will) dazuladen, bevor sie eine eigene zeile kohd schreiben. Ja, es geht gar nicht so selten nur um eine einzige verdammte zeile, die nicht einmal schwierig zu tippen wäre…

Ich bin zu erwaxen für diese scheiße!

„Mit linux bist du sicher“ des tages

Es ist durchaus möglich, dass in naher Zukunft neue Ransomware-Varianten in Python oder anderen Scriptsprachen geschrieben werden um Plattform (Linux, MacOS usw.) unabhängig zu sein

Auch, wenn man ein weniger gegen unmittelbare nutzerdummheit anfälliges betrübssystem hat, muss man eben an kompjutersicherheit denken. Das größte problem für einen linuxangreifer ist es, sein opfer zum ausführen von programmkohd zu bringen — unter windohs reicht ein entsprechender dateiname und ein dummer doppelklick des opfers. Deshalb wird die meiste windohs-schadsoftwäjhr zurzeit über spämm der marke „öffne das dokument im anhang, um zu erfahren, was ich dir überhaupt sagen will“ verteilt. Die linux-varianten werden sicherlich über werbebanner mit schadsoftwäjhr unter ausbeutung von brauser- und addonfehlern verteilt werden… da freut man sich doch gleich doppelt, dass adblocker nach meinung von EU-lobbyisten mit jornalismus- und presseverlagshintergrund und nach meinung von kommissar Oettinger demnächst kriminalisiert werden sollen! 😦

Security des tages

Endlich gibt es plattformunabhängige schadsoftwäjhr, komplett in python geschrieben.

The underlying code is cross-platform, so the nasty might easily be ported over to the Linux and OS X operating systems. That fact, coupled with a modular design, makes PWOBot a potentially significant threat

Dies nur als kurzer hinweis an jene linuxer, die sich sicher fühlen, weil sie meinen, dass es keine schadsoftwäjhr für linux gäbe. Euer dummes sicherheitsgefühl macht euch zu attraktiven zielen für die verbrecher! Lasst euch nicht in spämms zu irgendwelchen dummheiten überreden, öffnet keine mäjhlanhänge, die nicht vorher explizit verabredet wurden und habt immer schön eurer ublock origin und euer noscript an, wenn ihr euren webbrauser benutzt!

Im spämmblog habe ich übrigens einen anteil von rd. 1,5 prozent linuxnutzern unter den lesern¹. Weil die meisten leser mit guhgell kommen und frasen aus einer spämm suchen, und weil jeder mensch spämm kriegt, halte ich das für eine halbwegs repräsentative zahl. Wenn ich im spämmblog die spämms zitiere, zitiere ich auch links, nur, dass ich das linkziel auf eine warnseite lege, die in klaren worten mitteilt, dass jeder klick in eine spämm immer eine sehr dumme idee ist. Und jetzt der kleine witz nach diesem scheinbar völlig kontextlosen vorspann: diese links werden zurzeit zu 33,2 prozent von leuten geklickt, die linux verwenden¹. Linux-anwender sind also signifikant „risikofreudiger“ als nutzer anderer betrübssysteme, weil sie sich sicherer fühlen. Deshalb klicken sie auch mal auf einen link, der durch seinen kontext eigentlich deutlich davor warnt, dass man darauf klickt. Genau diese „risikofreudigkeit“ macht menschen zu leichten opfern für kriminelle.

Dummheit ist eben dumm, ihr dummen. Also legt sie ab!

¹Beide zahlen stimmen nur insoweit, wie die menschen nicht ihren user-agent modifizieren. Die meisten menschen tun dies nicht. Einige (zum beispiel ich) tun es. (Mein proxy sieht wie ein aktueller firefox unter windows 7 aus.) Dass die, die es tun, eine minderheit sind, ist eine vermutung, die ich nur darauf begründen kann, dass der user-agent in typischen texten der marke „wie schütze ich mich vor träcking und überwachung im web“ praktisch nie erwähnt wird. Wer keinen proxy aufsetzen und konfigurieren möchte: es gibt natürlich auch praktische addons für den feierfox.

Nachtrag: natürlich meinte ich von anfang an „ublock origin“, aber ich tippte erstmal „adblock edge“. Der fehler ist korrigiert, danke für den hinweis. 😉

Das ist die lösung jeder softwäjhr-krise!!!elf!

PyPy.js is an experiment in building a fast and compliant python environment for the web.

It uses the PyPy python interpreter, compiled for the web via emscripten, with a custom JIT backend that emits asm.js code at runtime.

Die erwartungsgemäße performanz kann man gleich auf der verlinkten webseite erahnen, wenn man javascript zulässt. Bei mir hat dieses python mehrere sekunden zum initialisieren gebraucht. Der import des moduls datetime wiederum so drei sekunden, das ist eine menge text zum parsen. Immerhin, eine instanz von datetime.date mit d = datetime.date.today() zu erzeugen, ging dann aber recht schnell, und sämtliche 35660 ziffern der fakultät von 10000 waren in rd. drei sekunden berechnet. Gut, bei mir direkt in python2 ausgeführt, geht das in weniger als einer zehntel sekunde, aber das ist ja auch kein in python geschriebener python-interpreter, der nach javascript portiert wurde…

Einen ackermann(4, 1) habe ich mir erspart.

Liebe „webentwickler“, damit solltet ihr jetzt alle arbeiten! Dann gibts endlich wieder einen grund dafür, dass leute ihre rechner wegwerfen, weil moderne webseits darauf so langsam sind! Und danach schreibt ihr einen javascript-interpreter in python, bitte bitte, die welt ist doch so reif! :mrgreen:

Bitte nicht falsch verstehen, ich finde den häck wirklich beeindruckend!

Schlangenöl des tages

Antivirus-schlangenöl des tages ist kaspersky internet security 2014, ein tolles programm, das seinem benutzer sagt, dass der kompjuter sicher ist, wenn nur jemand eine standard-schadsoftwäjhr in ein python-skript eingebettet hat.

Auch weiterhin viel spaß mit dem ganzen schlangenöl auf euren kompjutern!

pydoc re

Das hier nennt man dann wohl kwalitätssicherung:

Screenshot pydoc re in einem Terminal -- The following documentation is automatically generated from the Python source files.  It may be incomplete, incorrect or include features that are considered implementation detail and may vary between Python implementations.  When in doubt, consult the module reference at the location listed above.

Kurze übersetzung für nicht-techniker: Wir dokumentieren unsere standardbibliotek zwar im kwelltext und wir haben ein tolles progrämmchen, mit dem man sich diese dokumentazjon bekwem anschauen kann, aber was da drinsteht, kann völlig falsch, irreführend, veraltet und unbrauchbar sein. Großes kino!

Übrigens: wenn ihr jemals ein CGI-skript in python schreibt und euch wundert, dass das bei der ausgabe mit print() komische exceptions für unicode-fehler schmeißt — das liegt daran, dass dieses depperte python in den umgebungsvariablen für die eingestellte locale nachschaut, was für ein zeichensatz verwendet wird und seine interne unicode-darstellung dorthin konvertiert. In einer shell funkzjoniert das wunderbar. In der umgebung, die so ein websörver beim aufruf eines CGI-programmes setzt, steht so etwas aber natürlich nicht drin. Und wenn man dann nur ein einziges zeichen ausgibt, das über 7-bit-ASCII hinausgeht, weiß dieses python nicht, was es damit machen soll und behandelt das als fehler.

Es gibt mehrere möglichkeiten, diesen fehler zu umschiffen. Die möglichkeit, die ich empfehle, ist, einfach bytestrings auszugeben und nicht-ascii-zeichen in XML-entitäten umzuwandeln. Wenn in der variablen output drinsteht, was ausgegeben werden soll, könnte das ungefähr so aussehen:

sys.stdout.flush()
sys.stdout.buffer.write(output.encode('ascii', 'xmlcharrefreplace'))

Ja, das ist ein bisschen stupide. Der flush() steht da übrigens für den fall, dass schon etwas „ganz normal“ mit print() ausgegeben wurde, etwa ein paar HTTP-kopfzeilen — print() ist aus den üblichen fiesheitsgründen gebuffert. Die meldung „malformed headers“ im log des websörvers ist dann auch nicht wirklich hilfreich.

MAME history.dat lesen

Und heute mal wieder ein kleines skript, welches wohl der größte teil der menschheit überflüssig wie einen kropf finden wird. Wer MAME unter windohs benutzt, der hat meist ein gutes frontend und kann die texte in der history.dat komfortabel lesen. Und auch die meisten linuxer werden MAME wohl mit einem frontend benutzen und eine entsprechende möglichkeit haben. (Letzteres weiß ich allerdings nicht so genau, da ich eben kein MAME-frontend benutze.) Nur ich bin wie immer ein wackerer streiter an der kommandozeile und tippe lieber in einer komfortablen bash herum, bevor ich zur maus greife.

Deshalb hatte ich ein leichtes bedürfnis, mir ein kleines programm zu schreiben, das mir gewünschte informationen aus der history.dat an der kommandozeile verfügbar macht. Weil es (in dieser form) ein programm für einen eher engen anwenderkreis ist, ist es ein flüchtiger häck geblieben. Wie beinahe alle meine flüchtigen häcks habe ich das schnell in Python gemacht. Das program setzt übrigens kein installiertes MAME voraus, kann also auch allein mit der history.dat verwendet werden, um informatzjonen zu einer vielzahl von älteren arcarde-spielen schnell zur hand zu haben.


import sys
import os
import re
import locale
from codecs import EncodedFile
from formatter import AbstractFormatter, DumbWriter
from subprocess import Popen, PIPE

locale.setlocale(locale.LC_ALL, "")

PAGER = os.getenv("PAGER", "less")
DATFILE = os.getenv("HISTORYDAT", "/usr/share/games/xmame/history.dat")
LOCALENC = locale.getpreferredencoding()

if len(sys.argv)  2:
    exit("Too many arguments")
else:
    term = sys.argv[1]

inf_re = re.compile(r"\$info\=([0-9a-z]*)", re.I)
bio_re = re.compile(r"\$bio", re.I)
end_re = re.compile(r"\$end", re.I)

state = 0
hfh = open(DATFILE, "rU")
pro = None
of = None
af = None

for line in hfh:
    if state == 0:
        m = inf_re.match(line)
        if m:
            found = m.group(1)
            games = found.split(",")
            if term in games:
                state = 1
    elif state == 1:
        if bio_re.match(line):
            state = 2
            pro = Popen(PAGER, stdin=PIPE, shell=True)
            of = EncodedFile(pro.stdin, "iso-8859-1", LOCALENC)
            af = AbstractFormatter(DumbWriter(of))
    elif state == 2:
        if end_re.match(line):
            break
        line = line.strip()
        if len(line) == 0:
            af.end_paragraph(1)
        else:
            af.add_flowing_data(line)

if pro:
    of.close()
    pro.wait()
else:
    sys.exit("No %s in the history.dat\n" % (term,))

Wie man das mit den beiden variablen PAGER und DATFILE an die eigene arbeitsumgebung anpasst, beschreibe ich hier nicht weiter — und wohl jeder an dieses skript interessierte wird wohl wissen, wie man eine umgebungsvariable in seiner lieblingsshell definiert. Dieses skript einfach irgendwo in den $PATH legen, ausführbar machen und mit dem ROM-namen als parameter aufrufen.

Zusammen getäggt

Ich habe mir heute eine dieser ganz simplen fragen gestellt. Seit das blah-blog läuft, verwendet es ja kaum das kategorien-system von wordpress, sondern die meist kurzen texte werden mit täggs ausgezeichnet. Und weil das so schön einfach geht und weil man sich dabei keine strukturellen gedanken machen muss, werden an so einem text gern mehrere täggs gehängt. Das ist nur natürlich.

Die frage, die ich mir stellte, lautete nun: Welche täggs tauchen oft gemeinsam zu einem text auf. In dieser kleinigkeit könnte sich, so meine idee, doch einiges von der geisteshaltung kristallisieren, die jeden tag zu den kurzen hinweisen antreibt — und die sehr subjektive geisteshaltung ist wieder eine reakzjon auf den oft wenig erkwicklichen zeitgeist.

Es gibt nun für so ziemlich jeden mist irgendwelche statistiken, die schon einmal jemand fertig programmiert hat, aber diese frage musste ich mir denn doch selbst beantworten — mit einem kleinen python-skript und einem bisschen SQL. (Niemand erwarte hier ein wunder der eleganz, ich habe das schnell hingestrokelt.)

Das skript steht zusammen mit seiner ausgabe für den nachtwächter-blah zum freien daunlohd zur verfügung. damit sich auch niemand anders mehr diese mühe machen muss. Auf hinweise, wie man das ding zum laufen kriegt, verzichte ich hier, wer python kann, wird sofort damit klar kommen. Allerdings muss das skript auf einem rechner laufen, der die möglichkeit zu einer direkten verbindung zur wördpress-datenbank bietet, da es seine informazjonen unmittelbar aus der datenbank gewinnt.

Ein paar kleine anmerkungen zur täggbenutzung im blah-blog

Glotzrepublik — Es ist schon interessant zu sehen, dass das tag „BRD“ in mehr als zehn prozent seiner benutzungen zusammen mit „propaganda“, „dämonkratie“ und „kotzreiz“ gefallen ist, aber das entspricht durchaus meinen eigenen erwartungen. Dass ich „ARD“ aber vergleichbar oft zusammen mit „BRD“ benutze, ist mir nicht ganz so klar gewesen.

Netzweg — In mehr als 10 prozent der fälle habe ich die täggs „internet“ und „zensur“ gleichzeitig benutzt.

Werbewahn — Ähnlich stark korrelliert sind „werbung“ und „wahnsinn“. Dabei habe ich doch gar keinen fernseher und sehe die autowerbung, die so manifest irre geworden ist, nur sehr sporadisch. Das „werbung“ und „bullshit“ gut zusammen passen, ist aber für mich kein wunder.

Müllblogger — Wenn ich das tägg „bloggen“ in einem fünftel der fälle zusammen mit dem tägg „spam“ verwende, sagt es wohl einiges darüber, womit man sich beim bloggen so herumschlagen muss.

Propaganda — Was sich so richtig spitzenmäßig zum tägg „propaganda“ gesellt hat, das sind die täggs „link“ (gut, im blah-blog werden viele links gesetzt), „hirnfick“, „brd“, „lüge“, „journaille“, „krieg“, „kotzreiz“. Und das ist eine prächtige zusammenfassung, warum ich beim besten willen keine zeitung mehr aufschlagen werde.

Geglaubtes — Ach, ich lasse zum tägg „religion“ einfach mal den spitzenreiter „link“ weg und zähle auf, was sich sonst dazu gesellt, denn es spricht für sich: „christentum“, „wahnsinn“, „bibel“, „bullshit“,  „katholizismus“, „hirnfick“, „dummes“, „papst“, „bild“, „islam“, „jesus“, „kirche“, „mord“… es klingt fast wie ein zynisches synonym-wörterbuch. Aber es ist nicht so mörderisch und menschenverachtend zynisch wie die wirklichkeit der religjon, die sich darin abbildet.

Guglhupf — Wie sich doch die ehemalige suchmaschine guhgell in den letzten monaten darum bemüht, dass eine alternative zu diesem datensammler mit angeschlossener suchmaschine entsteht: „chrome“, „internet“, „datensammlung“, „google is evil“, „überwachung“, „kotzreiz“, „schrott“, „wahnsinn“, „werbung“, „adsense“, „weltherrschaft“, „zensur“… wenn das ein fragment eines entstehenden synonym-wörterbuches ist, denn sollte sich guhgell ernsthaft geganken um die außenwirkung machen.

Dosenfleisch — In mehr als zwanzig prozent der fälle ist das tägg „spam“ mit dem tägg „seo“ verknüpft. So sieht es aus mit der handgeschriebenen SEO-spämm in einem harmlosen, kleinen blog, das jetzt weg ist. Na ja, es ist nicht richtig weg, nur aus der juristischen schusslinie gezogen ist es.

Dämonenherrschaft — Das schon seltene tägg „dämonkratie“ verbindet sich mit „brd“, „hirnfick“, „propaganda“ und „überwachung“, direkt gefolgt von der „spd“. Ja, die sind im hochbeschwören dämonischer ängste offenbar viel aktiver als ihr politische mitbewerb. Oder liegt es daran, dass leute wie Wolfgang Schäuble und Porno-Ursel von der Leyen nur noch geisteskrank wirken?

Brägenficker — Das tägg „medien“ erscheint in einem viertel der fälle zusammen mit dem tägg „hirnfick“. Das kommt mir fast ein bisschen zu wenig vor…

Käferplage — Wenn ich das tägg „bug“ verwende, steht jedes zweite mal „wordpress“ dahinter. Das lässt ziemlich tief blicken.

Alles in allem hätte ich mir etwas mehr aufschluss und auch ein paar überraschungen von einer solchen analyse erwartet, aber davon gab es nur wenig. Vielleicht werde ich diese analyse in einem jahr noch einmal über das blah-blog laufen lassen, das kleine skript dafür ist ja schon fertig.