Johannes Mittendorfer

Die komische Geschichte mit der "privaten Vorratsdatenspeicherung"

Seit kurzer Zeit gibt es Berichte darüber, dass Android-Telefone bei jedem Anruf Daten an Google-Server übertragen. Die Redakteure der Seite mobilsicher.de haben dies festgestellt und schüren jetzt Angst vor Überwachung.
Johannes Mittendorfer am 03.07.2016
Die komische Geschichte mit der \

mobilsicher.de hat einen Artikel veröffentlicht, über den auch heise online berichtet. Darin wird berichtet, dass Mobiltelefone mit dem Android Betriebssystem von Google bei Anrufen Daten an einen Google-Server übertragen.

Sogleich wird darüber spekuliert, ob Google eine Art “private Vorratsdatenspeicherung” durchführt, also speichert wer wen wann anruft. In der Datenschutzerklärung weißt Google zwar darauf hin, dass das Unternehmen diese Daten speichern kann, die Redakteure konnten jedoch nicht überprüfen, ob eine solche Übertragung auch tatsächlich stattfindet.

Dann mache ich das eben.

Dazu brauchen wir die Android-App Packet capture aus dem Play store. Diese baut ein virtuelles VPN-Netz auf, das nur dazu dient, TLS geschützte Verbindungen auszulesen. Diese App wird einfach gestartet und ein Telefongespräch aufgebaut. Und schon sehen wir die Verbindung in Klartext, die von den Experten von mobilsicher.de (und wie es aussieht auch von denen von heise.de) nicht gelesen werden konnte.

Bei mir ging die Verbindung an die IP 216.58.214.232, die augenscheinlich zu Google gehört. Eine HTTP-Post Anfrage an den Pfad /batch schickt dabei eine gzip komprimierte Nachricht an den Server hinter der Adresse. Der User-Agent enthält übrigens “GoogleAnalytics”. Es handelt sich nämlich einfach um ein Event, das durch das Google Analytics SDK für Android ausgelöst wird.

Die Nachricht
Die Nachricht an den Google-Server

Wie man im Bild sehen kann, ist keine Ziel-Nummer enthalten und andere Informationen zum Gespräch kommen auch nicht vor. Google erfährt nur, dass ich eine Schnellwahl-Schaltfläche betätigt habe.

Also kein Grund zur Aufregung, aber anscheinend forschen manche Redakteure nicht so gerne nach.

TensorFlow im Browser ausprobieren

Wem neuronale Netzwerke immer zu kompliziert und abstrakt waren, der kann jetzt auch im Browser damit spielen.
Johannes Mittendorfer am 17.04.2016
TensorFlow im Browser ausprobieren

TensorFlow, die machine learning Bibliothek von Google kann man jetzt auch direkt im Browser probieren. Ohne Expertenwissen ist es möglich mit mehreren Beispielen zu experimentieren und dabei die Parameter des Netzwerkes zu ändern oder Features hinzuzufügen oder wegzulassen.

Die Seite steht zudem als Open Source auf github bereit.

Was die NSA im HTTP/2 connection preface macht

Beim Verbindungsaufbau in HTTP/2 gibt es einen Hinweis auf die National Security Agency und ihre Tätigkeiten
Johannes Mittendorfer am 08.12.2015
Was die NSA im HTTP/2 connection preface macht

Der Verbindungaufbau mit HTTP/2 unterscheidet sich in großen Teilen von dem bisher mit HTTP/1.1 verwendeten Vorgang. Bei cleartext Verbindungen wird das HTTP upgrade Verfahren benutzt und bei verschlüsselten Verbindungen werden bestimmte Werte innerhalb des TLS Handshakes übertragen.

Was beide Arten der Verbindung gemeinsam haben: Bevor wirklich Anwendungsdaten fließen können, muss von jedem der Teilnehmer ein sogenannter Preface verschickt werden. Ein kleines Datenpaket, das Parameter für die Verbindung festlegt. Und genau in diesem Preface findet sich Kritik an den Überwachungsprogrammen der NSA.

In HTTP/2, each endpoint is required to send a connection preface as a final confirmation of the protocol in use and to establish the initial settings for the HTTP/2 connection. The client and server each send a different connection preface.

The client connection preface starts with a sequence of 24 octets, which in hex notation is:

0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

That is, the connection preface starts with the string “PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n”). This sequence MUST be followed by a SETTINGS frame (Section 6.5), which MAY be empty. The client sends the client connection preface immediately upon receipt of a 101 (Switching Protocols) response (indicating a successful upgrade) or as the first application data octets of a TLS connection. If starting an HTTP/2 connection with prior knowledge of server support for the protocol, the client connection preface is sent upon connection establishment.

Ich habe zwar erst kürzlich ein Paper zu HTTP/2 geschrieben, mir ist aber auch nicht aufgefallen, dass da “Prism” steht. Der commit ist von 14. Juni 2013 und hat anscheinend auch den Autoren viel Spaß gemacht.

Gefunden wurde dieser kleine Spaß von John Graham-Cumming und dann auf Hackernews bekannt gemacht.

Wieso mein Feedreader jetzt selbst denken kann

Nach dem Ende der Prüfungsphase an der Uni habe ich jetzt endlich Zeit gefunden die angesammelten Artikel in meinem Feedreader nachzulesen. Das würde sogar Spaß machen, wären da nicht inzwischen zu viele davon und dabei nur etwa ein Viertel oder die Hälfte, die mich auch wirklich interessiert.
Johannes Mittendorfer am 20.07.2015
Wieso mein Feedreader jetzt selbst denken kann

Will ich mir das wirklich antun? Aber was, wenn ich die interessanten Dinge dabei verpasse? Könnte nicht ein Computer die Themen auswählen, die ich lesen will? - Kann er.

Möglich ist das zum Beispiel mit einem Filter, der nach dem Satz von Bayes arbeitet und mit statistischen Methoden die Wahrscheinlichkeit berechnet. Das klingt aber nicht sehr aufregend. Deshalb habe ich mich für den derzeitigen Super-Star des Computerlernens entschieden: Einem künstlichen neuronalen Netzwerk.

Künstliche Neuronale Netzwerke

Neuronales Netzwerk
Aufbau eines künstlichen neuronalen Netzwerkes (Dake, Mysid [CC BY 1.0], via Wikimedia Commons)

Dabei werden Neuroen verwendet, also Nervenzellen, wie sie auch bei uns im Gehirn vorkommen. Diese werden eingeteilt in eine Eingabeschicht, eine Ausgabeschicht und verdeckte Schichten (engl. hidden layers) dazwischen.

Die Verbindungen zwischen den Schichten sind gewichtet und beschreiben die Weiterleitung eines Reizes bzw. eines Signals, wodurch dann das Ergebnis entsteht. Diese Werte werden anschließend durch eine Funktion in den Bereich zwischen 0 und 1 gemappt.

Durch das Vergleiches mit den Ergebnissen aus den Trainingsdaten kann sich das Netzwerk mit dem Backpropagation-Algorithmus selbst ständig verbessern.

Wer sich noch weiter mit der Theorie beschäftigen möchte, der findet im zugehörigen Wikipedia-Artikel alles, was er braucht: Künstliches neuronales Netz

pybrain

Um das Netzwerk umzusetzen, habe ich Python verwendet und die pybrain Bibliothek. Darin sind bereits alle Algorithmen enthalten und der Aufbau fällt relativ leicht. Mit der folgenden Zeile lässt sich zum Beispiel ein Netzwerk mit fünf Eingabeneuronen und 2 Ausgabeneuronen erzeugen:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import SoftmaxLayer

net = buildNetwork(5, 2, outclass=SoftmaxLayer)

Als nächstes lädt man die Trainingsdaten in einer Form, die vom Netzwerk gelernt werden kann:

from pybrain.datasets import SupervisedDataSet

ds = SupervisedDataSet(5, 2)

Wichtig ist dabei, die gleiche Anzahl an Neuronen wie beim Aufbau des Netzes zu verwenden!

Mit der addSample Methoden werden anschließend die Beispiele hinzugefügt.

ds.addSample([0,1,1,0,0], (0, 1))  # nur ein dummes Beispiel

Trainiert wird dann so:

from pybrain.supervised.trainers import BackpropTrainer

trainer = BackpropTrainer(net)

for i in range(0, 100):   # so viel man will
  trainer.train()

Und schon bekommt man mit etwas Glück ein zufriedenstellendes Ergebnis:

print net.activate([0,0,0,0,1]);

Meine Artikel

Ich möchte also den Titel eines Artikels als Eingabe definieren und dann einen Wert erhalten, der angibt, wie wahrscheinlich mich der Artikel interessiert. Das erste Problem ist, Trainingsdaten zu bekommen. Dazu habe ich ein Plugin für meinen Feedreader geschrieben, der durch Drücken auf den Knopf “Interessant” oder “Langweilig” den Titel und die Berwertung protokolliert.

Leider erwartet so ein Netzwerk aber immer die gleiche Anzahl von Eingaben und diese sollten zudem Zahlen sein. Beides erfüllen Titel von Artikeln eher selten. Die Lösung ist ein Wörterbuch aufzubauen, in dem jedes Wort mit einem Index verbunden ist. Dann wird für jedes Wort im Wörterbuch die Häufigkeit des Vorkommens im Titel angegeben. Ich brauche also so viele Eingabeneuronen, wie ich Wörter im Wörterbuch habe. Füllwörter habe ich vorher entfernt.

So sollte es also gehen. Tut es aber nicht, denn das Netzwerk will einfach nicht lernen.

Total error: 0.32
Total error: 0.32
Total error: 0.32
Total error: 0.32
Total error: 0.32
Total error: 0.32
[...]

Das liegt daran, dass ich zuerst nur ein Ausgabeneuron verwendet habe. Es ist aber so, dass für jede Klasse der Klassifizierung ein eigenes Ausgabeneuron vorhanden sein muss. Also brauch ich davon zwei. Und schon geht es.

Noch schnell alles in eine flask-Anwendung verpacken und per fastcgi deployen, dann ist es einsatzbereit.

Eingabefeld des Netzwerkes
Eine Überschrift eingeben...
Ausgabe des Netzwerks
...und ein Ergebnis erhalten. Aktienkurse interessieren mich nicht wirklich.

Manchmal liegt die AI noch ziemlich daneben, aber das liegt vermutlich daran, dass ich oft selbst nicht so genau weiß, was mich interessiert. Zurzeit zeigt mein Feedreader dieses Ergebnis nur unter dem Artikel an, aber in Zukunft hoffe ich dadurch die Feeds filtern oder zumindest sortieren zu können.

Eines ist es auf jeden Fall: Faszinierend. Faszinierend, wie es möglich ist, Computern etwas beizubringen, ohne sich einen Algorithmus zu überlegen, der nach genauen Regeln vorgeht, denn mit Neuronalen Netzwerken geht es fast von selbst!

PS: Auf das Thema gestoßen, bin ich aufgrund der Bachelorarbeit eines Freundes. Der geneigte Leser möge sich diese hier durchlesen: Recognizing Musical Notation using Artificial Neural Networks

PPS: Ich werde die entsprechende Vorlesung erst im nächsten Semester besuchen. Wenn Sie hier im Theorieteil auf Fehler oder Ungenauigkeiten stoßen: Lassen Sie es mich wissen!

Die Verschwörung der Woche: Curiosity hat Wasser gefunden

In meiner Serie Die Verschwörung der Woche sammle ich in unregelmäßigen Abständen Links zu Inhalten, die offensichtlich haarsträubenden Irrsinn in Verbindung mit Verschwörungstheorien enthalten, aber gleichzeitig ungemein unterhaltsam sind.
Johannes Mittendorfer am 07.05.2015
Die Verschwörung der Woche: Curiosity hat Wasser gefunden

Curiosity hat Wasser gefunden aber die Nasa verschweigt es!!11!!!

Und ist zudem zu blöd dazu, das entsprechende Bild verschwinden zu lassen. Oder so. Das behauptet zumindest der Autor dieses höchst seriösen Videos.

Der Uploader schreibt, er habe viele Bilder von Bohrungen am Mars angeschaut, aber dieses Mal ist es wirklich Wasser, das aus dem Loch geflossen ist. Es geht um folgendes Bild:

Nasa-Bild
Volle Auflösung (Courtesy NASA/JPL-Caltech)

Davon abgesehen, dass man schon auf diesem Bild sieht, dass es sich um Staub aus der Bohrung handelt, räumt dieses Bild alle Verschwörungstheorien sofort aus der Welt:

Zweites Nasa-Bild
Volle Auflösung (Courtesy NASA/JPL-Caltech)

Natürlich wünsche ich mir, dass flüssiges Wasser auf dem Mars gefunden wird, aber nur durch Bohren eines kleines Lochs werden auf keinen Fall große Mengen Wasser, zumindest für den Mars, austreten. Eine Geheimhaltung macht auch nicht sehr viel Sinn. Also leider weiterhin kein Wasser.

PS: Vielleicht aber tiefer.