13.04.2017

Die Cyberwehr - Leserbrief

In letzter Zeit wird die Vorsilbe "cyber" immer wieder ge- und mißbraucht. Niemand weiß so richtig, was damit ausgedrückt werden soll. Erfunden hat diesen Begriff William Gibson für seine Bücher über virtuelle Realitäten und hat damit Kinofilme wie "Matrix" inspiriert. Echte Programmierer(tm) machen sich seit langem über diesen Begriff lustig und verwenden ihn mittlerweile massiv satirisch überzeichnet selbst für reale Ereignisse ("hacker terror cyber cyber") oder als Hinweis auf überschießende politische oder mediale Berichterstattung.

In letzter Zeit wird dieser Begriff immer mehr verwendet, wenn der Autor keine Ahnung von Computern hat, aber trotzdem modern wirken will. Leider schließt sich die Wetterauer Zeitung diesem Trend an und veröffentlicht Glossen über die geplante Bundeswehrtruppe zur digitalen Kampfführung und Abwehr, die etwas spöttisch als "Cyberwehr" bezeichnet wird. Ich habe meine Zweifel, dass daraus irgend etwas werden wird.
Leserbrief zu Glossen Hr. Junginger, 06.04.17, und Fr. Spiller, 12.04.17

Fr. Spiller macht sich lustig und packt alle Vorurteile über Computerspezialisten aus, die ihr einfallen. Leider ist kein einziges davon witzig oder auch nur ansatzweise in der Lage, das Thema zu streifen. Im Gegenteil sorgt Fr. Spiller mit ihren hämischen Bemerkungen dafür, dass sich die Vorurteile über "Nerds" weiter verfestigen. Hr. Junginger zitiert ominöse "Experten", die angeblich seit Jahren vor den Gefahren des Internets warnen. Leider liefert er keinerlei Belege, welche Experten welche Gefahren befürchten.

"Hacker dringen in Atomkraftwerk ein", befürchtet Hr. Junginger. Und dagegen soll uns die neue Cybertruppe der Bundeswehr schützen? Wie wäre es, wenn man ganz einfach die kritische Infrastruktur nicht ans öffentliche Internet anschließt? Oder wenn man es doch tut – warum auch immer – dann wenigstens richtig Geld für Fachleute in die Hand nimmt, um eine solche Verbindung abzusichern? Dazu braucht es keine Bundeswehr - das BSI hat eigentlich schon genug Empfehlungen auf Lager. Man sollte nur anfangen, sie fachkundig umzusetzen.

Die "Gefahren" im Internet entstehen nach meiner Meinung gerade und hauptsächlich durch die "nation-grade attackers", also die staatlich gut finanzierten Hacker der Geheimdienste und Behörden, die den Markt für unveröffentlichte Sicherheitslücken befeuern, indem sie Umsummen zahlen, die Hersteller aber nicht informieren. Dadurch wird die Zivilgesellschaft als Ganzes unsicherer. Das FBI zog kürzlich sogar eine Anklage gegen einen mutmaßlichen Pädophilen zurück, um nicht vor Gericht das Abhörwerkzeug offenlegen zu müssen. An diesem Beispiel sieht man besonders krass, dass es definitiv nicht um den Schutz der Gesellschaft vor Verbrechern und Hackern geht, sondern um Macht und darum, sie nicht aufzugeben.

Aber hauptsächlich das Geld ist das Problem. Die Industrie zahlt vernünftige Gehälter für gute Leute. Die "Cyberwehr" bezahlt vermutlich stur nach Bundesbesoldungsordnung, für einen Leutnant also A9 mit ca. 2.800 € brutto pro Monat. Das ist vergleichbar mit einem Lehrer. Das Anfangsgehalt in der Industrie für einen Informatiker direkt nach Ende des Studiums liegt bei ca. 4.000 € mit extrem guten Entwicklungsmöglichkeiten.

Seit kurzem wird es auch immer moderner, Alltagsgegenstände mit Internetanschluss zu versehen, vom Kühlschrank über Stromzähler bis hin zu Fernsehern, Autos und Vibratoren (kein Scherz!). Diese Geräte werden unter massivem Kostendruck produziert und der Hersteller kümmert sich nach der Markteinführung nicht mehr um Software-Updates. Hier ist die Gesetzgebung gefragt, den Firmen eine Pflicht zu Updates oder ein einprogrammiertes Verfallsdatum aufzugeben, um unsichere Produkte zu verhindern. Die Selbstregulierung funktioniert nicht. Die meisten Konsumenten wollen das billigste Gerät kaufen und verstehen die Notwendigkeit von Software-Updates nicht. Die Hersteller in China kümmern sich nicht um Sicherheitslücken, weil sie keinerlei Nachteile zu befürchten haben oder diese Lücken sogar gewollt oder geduldet werden. Wenn hier der Gesetzgeber nicht eingreift, wird das Desaster noch eine Größenordnung schlimmer als bei den billigen Android-Smartphones ohne Updatemöglichkeit.

Ursprünglich wurde das Internet dezentral entworfen, um einen Atomkrieg zu überstehen. Aber jedes Netz hat Kapazitätsgrenzen, und wenn jetzt mit Macht Milliarden Geräte der Kategorie "Internet of Things" auf den Markt kommen, wird das Internet demnächst von intelligenten Toastern zerstört, die jemand gehackt hat. Aber bei alldem hilft uns keine unterbezahlte Cyberwehr, die freitags um 14.00 Uhr nach Hause geht. Hier hilft nur ein Paradigmenwechsel in der gesamten Software-Industrie hin zum "Security by Design" mit rigorosen Tests und Zulassungsvorschriften inklusive Zwang zur Update-Garantie. Und da muss die Gesetzgebung schneller werden. Eine unterbezahlte Cyberwehr ist nicht die Lösung, sondern nur zielloses Herumdoktern an den Symptomen.

07.04.2017

Selbstmodifizierender Code

Heute zeige ich mal ein kleines Stück Skriptcode, das eine eigentlich verpönte Programmiertechnik zeigt, nämlich "selbstmodifizierenden Code". Das bedeutet, dass zur Laufzeit erst Programmcode erzeugt und dann direkt ausgeführt wird.

Am besten funktioniert das natürlich in Skriptsprachen, und es muss auch eine Möglichkeit geben, das ausführende Organ, also den Skript-Interpreter, darauf hinzuweisen, dass es neuen Code gibt.

Das Beispiel, das ich vorstellen möchte, ist eher harmlos. Generell sollte man aber bedenken, dass es gefährlich sein kann, wenn man einem Programm die Möglichkeit gibt, sich selbst zu verändern. Diese Technik darf man also insbesondere nicht verwenden, wenn man keine oder wenig Kontrolle über die "Zulieferung" hat, also z.B. bloß nicht in Software für's Web wie CGI-Skripte oder so was.

Mein Artikel beschreibt die Abfrage des Tintenstands eines Druckers. Auf dem Display bzw. im Webinterface zeigt der Drucker sehr schön an, zu wieviel Prozent die Patronen gefüllt sind. Es gibt noch eine weitere Technik: nämlich die Abfrage mit SNMP ("simple network management protocol"). SNMP an sich ist erst mal ziemlich dämlich: es beschreibt nur, wie Geräte Informationen liefern. Welcher Art die gelieferten Informationen sind, kann aber total unterschiedlich sein. SNMP wird von Routern, Switches, Servern, PCs, Druckern, Firewalls, NAS, SAN, Monitoring und vielen anderen Geräten gesprochen, und jedes davon hat ein anderes Spektrum an Parametern.

Deshalb gibt es zu Geräten der diversen Kategorien Beschreibungsdateien, in denen niedergelegt ist, welche Daten ein Gerät liefern kann. Diese Beschreibungen werden gesammelt in MIBs ("Management Information Base"). Es gibt standardisierte MIBs, und manchmal liefern Hersteller, wenn sie nett sind, auch eigene MIBs mit den spezifischen Erweiterungen, z.B. für ein bestimmtes Druckermodell. MIBs werden in einer syntaktisch festgelegten Grammatik geschrieben, in ASN.1.

Zur Abfrage eines Geräts benötigt man ein Hilfsprogramm, das SNMP spricht und eine Netzwerkverbindung zum Ziel aufbauen kann. Für Linux installiert man dazu "net-snmp", das es als fertiges Paket (sourceforge binaries download) oder zum Selbstbauen gibt.

Für die Abfrage muss man ein paar merkwürdige, sehr lange Zahlen wissen. Manchmal kann es trickreich sein, genau herauszufinden, was man braucht. Man kann die MIB-Datei lesen (braucht etwas Übung) oder man versucht es mit einer Suchmaschine (so wie ich, wenn ich faul bin).

Weiter unten stelle ich das komplette Skript vor, aber ich zerlege einzelne Zeilen in ihre Einzelteile und zeige, wie sie funktionieren.

Das Skript zum Abfragen der Tintenstände verwendet sogar zwei verschiedene Techniken aus der Kategorie "selbstmodifizierender Code". Zum Einen verwende ich den "eval"-Befehl der Linux-Shell (die /bin/sh ist bei mir bash), und zum anderen baue ich ein winziges Perl-Skript mit Inhalten zusammen, die ich mir gerade vorher erst im Shellskript aus einem snmp-Befehl zusammengesammelt habe.

Die eigentliche Abfrage des Tintenstands funktioniert so wie im folgenden Schnipsel gezeigt. Zuerst der Befehl, dann die Ergebnisse mit meinem speziellen Drucker. Der Befehl "snmpwalk" liefert mir mehrere Ergebnisse mit einer Abfrage; dazu "wandert" der Befehl durch alle Unter-Ergebnisse der angegebenen Nummer 1.3.6.1.2.1.43.11.1.1.6.0, also .6.0.1, .6.0.2 usw.
Diese spezielle Abfrage liefert mir die Zuordnung, welche Nummer zu welcher Farbpatrone gehört.

# snmpwalk -v1 -c public 192.168.100.173 1.3.6.1.2.1.43.11.1.1.6.0
SNMPv2-SMI::mib-2.43.11.1.1.6.0.1 = STRING: "black ink"
SNMPv2-SMI::mib-2.43.11.1.1.6.0.2 = STRING: "yellow ink"
SNMPv2-SMI::mib-2.43.11.1.1.6.0.3 = STRING: "cyan ink"
SNMPv2-SMI::mib-2.43.11.1.1.6.0.4 = STRING: "magenta ink"

Als nächstes beschaffe ich mir die Tintenstände und den Maximalwert, damit ich prozentual berechnen kann, wie voll jede Patrone noch ist.

# snmpwalk -v1 -c public 192.168.100.173 1.3.6.1.2.1.43.11.1.1.9.0
SNMPv2-SMI::mib-2.43.11.1.1.9.0.1 = INTEGER: 231
SNMPv2-SMI::mib-2.43.11.1.1.9.0.2 = INTEGER: 94
SNMPv2-SMI::mib-2.43.11.1.1.9.0.3 = INTEGER: 210
SNMPv2-SMI::mib-2.43.11.1.1.9.0.4 = INTEGER: 174

# snmpwalk -v1 -c praxis 192.168.100.173 1.3.6.1.2.1.43.11.1.1.8.0
SNMPv2-SMI::mib-2.43.11.1.1.8.0.1 = INTEGER: 674
SNMPv2-SMI::mib-2.43.11.1.1.8.0.2 = INTEGER: 240
SNMPv2-SMI::mib-2.43.11.1.1.8.0.3 = INTEGER: 226
SNMPv2-SMI::mib-2.43.11.1.1.8.0.4 = INTEGER: 241
"black" ist also noch zu 231/674 voll, umgerechnet ca. 34 %.

So, damit haben wir das Werkzeug, um Dinge zu tun. Wäre schön, wenn das noch mit etwas mehr Bequemlichkeit verbunden wäre. Also packen wir all das in ein Skript.

Dieses Skript muss also mehrere SNMP-Abfragen durchführen, sich die Werte merken, Prozente ausrechnen und den ganzen Spaß dann wieder ausgeben.

Die Technik der folgenden Zeile verwendet den bash-Befehl "eval", um Shell-Befehle in diesem Moment auszuführen.
eval $(snmpwalk -v1 -c praxis 192.168.100.173 \
  1.3.6.1.2.1.43.11.1.1.6.0 | perl -ne 'print "c[$1]=$2\n" \
if(m!SNMPv2-SMI::mib-2.43.11.1.1.6.0.(\d) = STRING:\s+"(\w+) ink"!i);')

Der Shell-Befehl, den das perl-Skript zusammenbaut, nimmt die Zahlenwerte aus der SNMP-Abfrage und erzeugt daraus die Zuweisung der Abfragewerte zu Shellvariablen in einem Array. Dazu nimmt der perl-Interpreter die Ausgabe des snmpwalk-Befehls zeilenweise und untersucht jede dieser Zeilen, ob sie einem vorgegebenen Textmuster entsprechen (regular expression). perl baut also ungefähr so etwas

c[1]=black
c[2]=yellow
c[3]=cyan
c[4]=magenta
Der "eval" in der Shell sorgt nun dafür, dass diese Zuweisung im bash-Skript zu diesem Zeitpunkt ausgeführt wird, als hätte ich es vorher in den Code geschrieben. Hier greift also der Begriff "selbstmodifizierend", weil im Skript etwas passiert, was das Skript selbst vorher zusammengebaut hat (mit Hilfe von perl).

Auf dieselbe Weise werden die Maximalwerte jeder Patrone vom Drucker geholt; durch den "eval"-Befehl erhält die Shell dann noch das Array "max" mit folgendem Inhalt:

max[1]=674
max[2]=240
max[3]=226
max[4]=241
Und im nächsten Schritt wird es noch trickreicher: mit den eben gerade gelernten Arrays wird ein perl-Skript dynamisch zusammengebaut, in dem diese Zahlenwerte von einem bash-Array in ein perl-Array umgebaut werden, und ich lasse dann die Prozentwerte in perl ausrechnen. Da die Arrays in perl bei 0 anfangen zu zählen, ist in jedem Array das nullte Element ein leerer Text, also "". Das perl-Skript erhält die Tintennamen und die Maximalwerte als fest einprogrammierte Werte, und die aktuellen Zahlenwerte liest es direkt aus der Standardausgabe von snmpwalk.

Wie funktioniert dieser Trick nun genau?

Üblicherweise ruft man den Skriptinterpreter (perl, awk, sed oder irgendwas anderes) so auf: perl -e 'bla mein programm usw.'. Die Apostrophe teilen der Shell mit, dass alles dazwischen unverändert an perl weitergegeben werden soll. Man kann allerdings diese '...' unterbrechen, und an dieser Unterbrechung setzt die Shell ihre Arbeit fort. Wenn ich also perl -e '...bla(' ${variable} ')...' schreibe, besteht das Programm für perl also an dieser Stelle aus dem aktuellen Inhalt der Shell-Variablen ${variable} (z.B. 5) und das ganze wird effektiv zu perl -e '...bla(5)...'! Das ganze muss natürlich syntaktisch korrekter perl-Code werden, also muss man auf Anführungszeichen für Strings usw. achten.
#!/bin/sh

PATH=/opt/bin${PATH:+:$PATH}

# get current ink levels
eval $(snmpwalk -v1 -c praxis 192.168.100.173 \
  1.3.6.1.2.1.43.11.1.1.6.0 |
perl -ne 'print "c[$1]=$2\n" \
  if(m!SNMPv2-SMI::mib-2.43.11.1.1.6.0.(\d) = STRING:\s+"(\w+) ink"!i);')

# get max ink level per cartridge
eval $(snmpwalk -v1 -c praxis 192.168.100.173 \
  1.3.6.1.2.1.43.11.1.1.8.0 |
perl -ne 'print "max[$1]=$2\n" \
  if(m!SNMPv2-SMI::mib-2.43.11.1.1.8.0.(\d) = INTEGER:\s+(\d+)!i);')

snmpwalk -v1 -c praxis 192.168.100.173 1.3.6.1.2.1.43.11.1.1.9.0 |
perl -ne '
    my @c=("","'${c[1]}'","'${c[2]}'","'${c[3]}'","'${c[4]}'");
    my @max=("","'${max[1]}'","'${max[2]}'","'${max[3]}'","'${max[4]}'");
    printf"# $c[$1]=$2 (%.0f)\n",$2/$max[$1]*100
        if(m!SNMPv2-SMI::mib-2.43.11.1.1.9.0.(\d) = INTEGER:\s+(\d+)!i);'
 Das Ergebnis sieht dann ungefähr so aus:
$ sh ./ink.sh
# black=247 (38)
# yellow=218 (95)
# cyan=127 (59)
# magenta=195 (85)

06.04.2017

Logan

Tja, das war's also mit Hugh Jackman als Wolverine. Wie angekündigt und im Film auch ziemlich deutlich dargestellt, wird er den Charakter nicht mehr spielen.

Der Film lässt mich ein wenig ratlos zurück. Ich halte es mit Doctor Who - ich mag eigentlich keine finalen Enden mit toten Hauptcharakteren. Genauso wie in Star Wars Rogue. Der Schluss dort war absolut logisch und nachvollziehbar, aber für mich halt doch ziemlich traurig.

Kurze Übersicht: der Film spielt 2029; die Zukunft unterscheidet sich nicht wesentlich von unserer heutigen Zeit. Es gibt Autos und Straßen und den üblichen amerikanischen Way of Life. Logan lebt mit Charles X. Xavier und einem Albino namens Caliban in Mexiko auf einer entlegenen Farm; Charles hat seine Kräfte nicht mehr unter Kontrolle und nimmt Medikamente, die immer schlechter funktionieren. Logan arbeitet als Chauffeur mit eigener Stretchlimousine, quasi Uber. Auch Logan altert beträchtlich, seine Selbstheilungskräfte sind fast erloschen, und im Widerspruch zu "Der Weg des Kriegers" hat er wieder Krallen aus Adamantium.

Seit 25 Jahren wurden keine Mutanten mehr geboren, im Verlauf des Films wird angedeutet, warum das so ist - Zucker aus genmanipuliertem Mais in nahezu allen Nahrungsmitteln. Stattdessen gibt es eine Firma Alkali Transigen, die Mutanten züchtet und zu tödlichen Soldaten dressieren will. Als das neueste Forschungsprojekt ("24") erfolgreich ist, sollen alle anderen gezüchteten Kinder getötet werden. Pfleger können mit einigen der Kinder flüchten, eine Pflegerin bittet Logan um Hilfe, das Mädchen Laura in Sicherheit zu bringen in ein angebliches Paradies, das sich als Fiktion aus einem X-Men-Comic herausstellt ("Eden"). Die Helferin hat mit ihrem Handy Videoaufnahmen im Forschungslabor machen können - nicht sehr glaubwürdig. Die Kinder sind genetisch alle von Logans Erbmaterial gezeugt worden - am Ende von "Days of future past" sieht man, wie jemand Logans Blutproben in einen Koffer packt.

Der Rest ist eine Art Roadmovie und berichtet von der Flucht der drei Mutanten vor den Alkali-Söldnern. Logan und Laura bringen sehr blutig und explizit viele der Söldner bei verschiedenen Gelegenheiten um. Dabei gibt es auch viele Kollateralschäden. Beim großen Showdown überleben nur die Kinder, und Laura sagt erstmals "Daddy" zum sterbenden Logan. Dann fliehen die Kinder über die Grenze nach Kanada, wobei nicht klar wird, warum sie dort sicherer sein sollen.

Der Film war technisch gut gemacht, viel Action, gute Tricks. Die Martial Arts-Darbietung von Laura war beeindruckend; Jackman hat den gealterten Logan auch sehr glaubwürdig gespielt - ich finde den Schauspieler toll. Die FSK-16-Einstufung war mehr als gerechtfertigt, ich als Zuschauer hätte vielleicht sogar 18 vergeben.

Trotzdem bin ich irgendwie unzufrieden. Ich kann's nicht genau auf den Punkt bringen. Vielleicht liegt es wirklich nur daran, dass ich Hauptpersonen nicht sterben sehen will. Keiner von den "alten" Mutanten überlebt. Der Widerspruch zu den vorherigen Wolverine-Filmen erklären sich eingefleischte Fans vermutlich am ehesten mit der Zeitreise und der geänderten Vergangenheit in "Days of future past". Andere Mutanten wie Storm, Magneto, Jean Grey, Cyclops etc. werden gar nicht erwähnt. Was mir auf jeden Fall aufgestoßen ist: die Firma hat anscheinend beliebig viel Adamantium-Rohmaterial, und mir ist außerdem nicht klar, warum man ein Kind, das noch im Wachstum ist, schon mit einem Adamantium-Skelett ausstattet. Das würde doch nicht mehr mitwachsen?

Fazit: eingefleischte Marvel- und Comic-Fans werden sich den Film anschauen, es lohnt sich, wenn man mit drastischen Einschnitten ins Comic-Universum leben kann.

Achja: es gibt nach dem Abspann nix mehr zu sehen - ziemliche Enttäuschung für professionelle Marvel-Kinogänger.