Das Thema Sicherheit beim maschinellen Lernen war in letzter Zeit ein ziemlicher Hype, und ich wollte seine praktische Seite ansprechen. Und dann ist der coole Grund
PHDays , wo sich eine Vielzahl von Experten aus der Welt der Informationssicherheit versammeln und die Möglichkeit besteht, auf dieses Thema aufmerksam zu machen.
Im Allgemeinen haben wir eine aufgabenbasierte CTF durchgeführt, deren Aufgaben einen Teil der Sicherheitsrisiken bei der Verwendung von Techniken des maschinellen Lernens betreffen.

Was ist CTF ???Capture The Flag (CTF) ist ein sehr beliebter Wettbewerb für Computersicherheit (beliebt als Kaggle-Wettbewerb für Rechenzentren). Es gibt zwei Formate: Aufgabe (Jeorpady) und Dienst (Angriffsabwehr). Wir haben Aufgabe gemacht.
Klassische Aufgabenwettbewerbe ähneln dem Format „Ihr Spiel“. Wenn es eine Reihe von Aufgaben verschiedener Kategorien gibt, die unterschiedliche Kosten haben.
Die traditionellen Kategorien in CTF sind: Web-Web-Schwachstellen, Reverse-Reverse-Engineering, Krypto-Kryptographie, Stegano-Steganographie, pwn-binäre Ausnutzung.
Teams (von 1 bis n Personen) lösen Aufgaben und wer Aufgaben für eine größere Anzahl von Punkten löst, ist ein guter Kerl.
Unser Wettbewerb dauerte etwas mehr als einen Tag. Es wurde verstanden, dass es individuell ist - Teams von einer Person. Ich wollte, dass die Leute an der Konferenz teilnehmen, um sich persönlich kennenzulernen. Daher müssen die Aufgaben in ein paar Stunden gelöst werden, erfordern nicht viel Rechenressourcen, müssen aber auch schwierige Aufgaben sein - nicht alle müssen gewinnen: D.
Als Ergebnis hatten wir 6 Aufgaben (die siebte hat einfach Spaß gemacht), es scheint, dass für eine Person ein Tag genug ist. Die Aufgaben selbst sind leider nicht mehr verfügbar. Aber vielleicht möchten Sie nach dem Lesen der Analyse das nächste Mal teilnehmen?

Ich möchte den Jungs, ohne die diese CTF nicht
stattgefunden hätte, meinen tiefen Dank
aussprechen :
@groke und
@mostobriv . Die coolsten Ideen, technischen Lösungen und eine Bereitstellungsparty in der Nacht vor dem Start - was könnte schöner sein, wenn es sich in einem großartigen Unternehmen befindet ?! :) :)
Stegano: Aww - 100
tiny.cc/6fj06yDan Datensatz aus 3 391 Bildern von Katzen und Hunden.

Die Quest wurde als "Stegano" markiert. Bei gesteppten Jobs werden einige Informationen ausgeblendet. Es schien leicht zu erraten, dass Katzen und Hunde etwas Binäres sind. Nach einigem Nachdenken können wir annehmen, dass diese Abfolge von Katzen und Hunden eine Art binäre Nachricht sein kann. Angenommen, die Siegel sind 1 und die Hunde - 0. Wenn es plötzlich nicht mehr funktioniert, können Sie sie einfach austauschen. Als nächstes finden wir ein trainiertes Modell, das Katzen und Hunde klassifiziert. Es gibt viele Beispiele für Lektionen zur Klassifizierung von Katzen und Hunden sowie trainierte Modelle nach ihnen - Sie können trainierte Modelle auf dem Github finden. Wir nehmen ein geschultes Modell, in extremen Fällen trainieren wir uns. Wir sagen jedes Bild als 0 oder 1 voraus. Und diese Folge von „Bytes“ wird in eine Zeichenfolge übersetzt.
Die Lösung des Autors finden Sie hier | import time |
| import sys |
| import os |
| |
| import numpy as np |
| |
| from keras.models import load_model |
| from keras.preprocessing import image |
| |
| data_path = "../data/" |
| picture_path = data_path + "{}.jpg" |
| |
| CLASSES = [1, 0] |
| |
| def run(model_path): |
| pictures_names = os.listdir(data_path) |
| pic_num = len(pictures_names) |
| |
| model = load_model(model_path) |
| |
| res = [] |
| for pic in range(pic_num): |
| img = image.load_img(picture_path.format(pic), target_size=(224,224)) |
| x = image.img_to_array(img) |
| x = np.expand_dims(x, axis=0) |
| preds = model.predict(x) |
| |
| y_classes = preds.argmax(axis=-1) |
| res.append(CLASSES[y_classes[0]]) |
| |
| res = ''.join(map(str, res)) |
| |
| n = int("0b" + res, 2) |
| text = n.to_bytes((n.bit_length() + 7) // 8, 'big').decode() |
| |
| print(text) |
| |
| |
| if __name__ == '__main__': |
| if len(sys.argv) < 2: |
| print("path to the model expected") |
| exit(1) |
| |
| run(sys.argv[1]) |
Wir erhalten den Text, der das Flag "AICTF {533m5_y0u_und3r574nd_4n1m4l5}" enthält.
Aus irgendeinem Grund versuchten jedoch mehrere Teilnehmer zu unterschiedlichen Zeiten, eine seltsame Flagge mit dem Wort „Adoptiert“ zu übergeben. Wir wissen nicht, woher sie es haben, wenn die Teilnehmer plötzlich erklären, wird es cool: D.
Anmerkungen

Der Dienst war eine Art „Blog“, in dem jeder Benutzer öffentliche und private Einträge hinterlassen konnte. Da die Funktionalität klein war, war es nicht schwer zu erraten, dass Sie irgendwie eine private Aufzeichnung benötigen.
Es gab tatsächlich nur ein Eingabefeld - die Datensatz-ID.
Was zu tun ist?
Das erste, was einem Sicherheitsbeamten in den Sinn kommt, ist, SQL-Injektionen auszuprobieren. Es wird jedoch gesagt, dass der Dienst durch KI geschützt ist. Und ich konnte keine einfache SQL-Injektion senden. Der Dienst reagierte auf einen solchen Angriff mit "Hacking-Versuch!" Viele versuchten es wie eine Flagge zu passieren, dachten aber wirklich, dass alles so einfach ist?
Unter der Haube des Tests befand sich ein LSTM-Netzwerk, das die ID auf SQL-Injektion analysierte. Die Eingabe in das LSTM muss jedoch eine feste Länge haben. Der Einfachheit halber haben wir es auf 20 Zeichen begrenzt. Das heißt, die Logik war folgende: Wir nehmen die Anfrage an, wenn sie mehr als 20 Zeichen umfasst - wir schneiden sie ab und überprüfen den Rest, wenn weniger, dann addieren wir 0.
Daher funktionierte eine einfache SQL-Injektion daher nicht sofort.
Es bestand jedoch die Möglichkeit, einen Vektor zu finden, den das Netzwerk nicht sehen und für eine gute Anfrage verwenden würde.
Neuer Edge QR Reader

Es war notwendig, den QR-Code zu erkennen:

Dateien zur Aufgabe finden Sie
hierEs wurden mehrere verschlüsselte Dateien angegeben. Unter ihnen befand sich eine Pyc-Datei. Durch Umkehren war es offensichtlich, dass es eine Funktion gab, anhand deren Code verstanden werden konnte, dass alle erforderlichen Dateien auf dem Schlüssel AES-verschlüsselt waren, der vom Bytecode dieser Funktion und einer anderen darin empfangen wurde.
Es gab zwei mögliche Lösungen: Analysieren Sie die pyc-Datei und holen Sie sich die Implementierung der Funktionen, oder erstellen Sie Ihr eigenes Hashlib-Proxy-Modul, das sein Argument ausgibt und ausführt. Sie könnten einen Schlüssel erhalten, dann die Dateien entschlüsseln und den QR-Reader ausführen, der das vorgeschlagene Bild als Flag erkennt.
Eine detaillierte Entscheidung des Teilnehmers, der den 3. Platz belegt hat, finden Sie hier:
Vorhersage Herausforderung

Der Service war eine Art Wettbewerb wie bei Kaggle. Es war möglich, Modelle zu registrieren, herunterzuladen und Modelle hochzuladen, sie wurden an privaten Daten getestet und das Ergebnis wurde auf einem Scorboard aufgezeichnet.
Und das Ziel scheint offensichtlich - eine Genauigkeit von 1,0 zu erreichen.
War es schwierig Unmöglich: D.
Die Daten wurden zufällig generiert und es wurde natürlich impliziert, dass diese Genauigkeit auf andere Weise erreicht werden musste. Der Dienst akzeptierte Modelle im .pickle-Format. Und es scheint, dass jeder es bereits weiß, aber es stellt sich heraus, dass nicht jeder
RCE durch Gurke bekommen kann, aber was könnte schlimmer sein?
Nikitas Entscheidung (konodyuk)
Eigentlich musste das gemacht werden! Nach dem Fernzugriff auf den Server war es möglich, die Daten, auf denen die Lösung getestet wurde, herunterzuladen, das Modell neu zu trainieren und die Genauigkeit 1.0 und damit das Flag zu erhalten.
Fotogramm

Wie der Name schon sagt, macht der Dienst etwas mit Bildern.
Eine beeindruckende Anwendungsoberfläche schlug vor, ein Foto hochzuladen.

Als Antwort wurde Ihnen ein Bild mit einem geänderten Stil und einem Wettbewerbslogo gesendet.

Wo ist die Flagge hier?
Es scheint durchaus üblich zu sein, bei CTF auf alltägliche Schwachstellen zu stoßen - diesmal war es
Image Tragick . Allerdings haben nur wenige erraten oder nicht jeder, der es versucht hat, wurde ausgenutzt.
New Age Antivirus
Diese Aufgabe erwies sich als eine Kirsche auf dem Kuchen und ein ungelöstes Problem. Obwohl sich nach einem Gespräch mit den Teilnehmern herausstellte, dass sie der Antwort sehr nahe waren.

Dateien für Aufgaben können hier angezeigt
werdenDas System empfängt Python-Bytecode und wird zu Hause ausgeführt. Aber natürlich tut sie es nicht nur, weil es eine "KI" gibt. Er überprüft die Version von Python und lässt das "Falsche" nicht zu. Wenn der Code den Test bestanden hat, wurde er auf dem Server gestartet. Dies bedeutet, dass Sie viele Informationen erhalten können.
Der vom Interpreter angegebene Bytecode könnte in Bits verwässert werden, und das überprüfte neuronale Netzwerk würde fehlen (es war auch LSTM), oder Sie könnten am Ende eine Menge Müll hinzufügen.
Wenn Sie wissen, wie Python-Code ausgeführt wird, war es außerdem möglich, die Binärdatei "flag_reader" auf dem Server zu erkennen, die vom Stamm aus gestartet wurde. Die Binärdatei hatte eine Sicherheitsanfälligkeit bezüglich Formatzeichenfolgen, durch die das Flag gelesen werden konnte.
Die Lösung von Nikita (konodyuk) finden Sie auch hier.Zusammenfassung
Am Ende des Wettbewerbs waren 130 registriert, 14 haben mindestens eine Flagge bestanden und 5 von 6 Aufgaben wurden gelöst - das heißt, wir haben es geschafft, die komplexen und einfachen Aufgaben in Einklang zu bringen.
In Anbetracht der Tatsache, dass wir die Informationen nicht wie zum ersten Mal sehr verbreitet haben und nicht für eine schwere Last bereit wären, halten wir den überaus erfolgreichen Wettbewerb dennoch für erfolgreich.
Gewonnene Preise:- 1. Platz - still
- 2. Platz - Kurmur
- 3. Platz - konodyuk
Die Gewinner wurden am Ende des zweiten Tages der PHDays mit Ehrungen und coolen Preisen ausgezeichnet: AWS DeepLens, Coral Dev Board und ein Rucksack mit einem Konferenzlogo.
Die Jungs, die normalerweise klassisches CTF spielen und jetzt gerne maschinell lernen, haben unseren Wettbewerb bewertet. Wir hoffen, dass beim nächsten Mal Rechenzentren hinzukommen, die sich für Sicherheit interessieren.