 Setzen jetzt hier eine Editing-Marke und ich würde euch gerne Nathaniel Rubin vorstellen. Er war letztes Jahr schon hier mit einem Vortrag und dieses Jahr zeigt er, dass es die Schuld der Sprache ist und nicht die des Programmierers. Also hier los geht's. Er arbeitet für Parameter X in Tel Aviv. Viel Spaß. Vielen Dank, vielen Dank. Letztes Jahr stand ich hier auf der Bühne und ich habe über sehr viele der nicht wirklich durchdachten Pearl Features geredet. Ich habe Rückmeldungen von der Community gehalten, aber ein Großteil, was die Pearl Community gemacht hat, ist, dass die Kritik wurde zurückgewiesen und dass all die Fehler, die ich gefunden hatte, nur Improvements waren und dass wir das nicht benutzen wollen, sondern deswegen mache ich jetzt hier diesen Vortrag, das Camille Schlag, zurück und diesmal hoffe ich, dass ich besser bei der Community ankomme. Beim letzten Vortrag habe ich gezeigt, dass diese Ausdrücke in sehr komischen Wegen benutzt werden können. Außerdem habe ich gezeigt, wie CGI Parameter man direkt aus UserInput generieren kann. Außerdem habe ich gezeigt, dass wenn man die zwei kombiniert scheiße passiert. Aber das wirklich Interessante war, dass die Antwort der Pearl Monks, die Pearl Community hat sehr lange darüber diskutiert, die Diskussion wurde gestartet mit schlechten Nachrichten aus Deutschland. Nach einer sehr, sehr langen Diskussion kamen sie zu dem Schluss, dass mein Vortrag, dass man auf den Vortrag pissen sollte und dass er scheiße war. Außerdem meinten sie, dass ich nur ein Skriptkiddie bin, der nur zu anderen Skriptkiddies predigt. Und dass diese Skriptkiddies eine heterogen Gruppe angehören, die sich als chaotische Punkz sehen, welche sich gerne in dem Hollywood-Hacker-Image sehen. Über was reden die denn? Wir haben kein Hacker-Image, aber egal, es wurde wirklich surreal, weil sie an einem Punkt haben sie sogar die Benutzung der Kamelbilder kritisiert, also die Propaganda der Kamelbilder. Aber egal, sie haben einfach den ganzen Vortrag abgelehnt, obwohl die technischen Punkte richtig waren. Einfach aufgrund der Witze und der Kamelbilder, aber sie fühlen sich wirklich, wirklich verletzt und brachten schlechte Erklärungen, warum Pearl nicht schlecht ist. Und diese schlechten Ausreden wurden immer und immer wieder holt. Und ich sollte das scheiß Handbuch lesen. Anscheinend war, das ist komisch, weil ich hier wahrscheinlich der einzige, der das getan hat. Und das zweite war, dass ich das alte Pearl benutze und nicht das neue, moderne Pearl. Erinnert euch an diese zwei Punkte, wenn ich sie in der Präsentation erwähne. Fangen wir an mit dem neuen Wahnsinn. Pearl erlaubt es, Variablen zu deklarieren, ohne ihren Datentyp anzugeben. Natürlich existiert diese Funktion in verschiedenen Programmiersprachen, aber wie immer macht Pearl es auf einem ganz anderen Level. Es entfernt die komplette Datentyp-Deklaration von den Argumenten, wie man hier sehen kann. Hier sieht man zwei verschiedene Deklarationen, ohne zu wissen, welchen Datentyp diese haben. Man kann sich nicht aussuchen, welchen Datentyp diese haben sollen. Man kann auch nicht spezifizieren, welchen Datentyp man erwartet. Wenn ich jede Funktion habe, die man mit Strings arbeiten kann, kann ich das aber nicht in der Deklaration definieren. In Pearl ist das sehr normal, zwei komplett verschiedene Blocks Code zu schreiben, damit einer zum Beispiel Strings behandeln kann und der andere Sachen wie Arrays oder Hashes. Das heißt, man soll mehrmals Code schreiben für dieselbe Funktion, weil es in Pearl nicht anders geht und das ist traurig. Man sollte nicht redundantem Code schreiben müssen, weil man sollte nicht entscheiden müssen, welchen Cases man nicht behandeln muss. So traurig das auch ist, ist diese Konvention noch nicht gefährlich. Gefährlich wird es dann, wenn Hashes und Arrays sicher genannt werden, weil sie durch User-Input generiert werden können. Damit entsteht dann derart von Code, wo wenn das Funktionsargument ein Hashes ist, wird es anescape in Funktion benutzt. Vor allem Hashes werden als sehr sicher angesehen. Weil Hashes nicht tainted sein können. Deswegen denkt man, sie können immer noch in secure Functions benutzt werden, anders als andere Datentypen. Diese Art von Code kommt oft in Code vor. Aber diese Art von Code macht ein Code ausnussbar, exploitable. Aber diese Praktis, die man in den Funktionsargument verwendet hat, sind in den Funktionsargumenten und in den Funktionsargumenten und in den Funktionsargumenten. Aber diese Praktis wird nur in redundantem Code verwendet. Sogar heutzutage ist es, dass die normale Art und Weise, wie man Coden soll und das ist ein echtes Problem. Perl ist wie eine Pumpgun mit einem Knopf. So jetzt wissen wir, dass es irgendwie schafft, diese sicheren Datentypen mit unseren Eingaben zu exploiten. Also die einzige Frage, die man in den Funktionsargumenten und in den Funktionsargumenten und in den Funktionsargumenten also die einzige Frage, die übrig bleibt, ist, was können wir, also was wollen wir ausnutzen? Und das ist natürlich mal wieder Bakzela. Wie jedes Bildprojekt benutzt Bakzela, sehr viele Funktionen, die Skalare und nicht Skalare Argumente benutzt. Diese Funktion ist dafür verantwortlich, um Objekte aus der Datenmarkt zu laden. In diesem Fall, es behandelt Skalare, in diesem Fall Hashes, also sehr unterschiedlich. Wenn es an Hashes fügt Bakzela, das ganze in den SQL steht man an, ohne SQL Escaping. Also es, weil Hashes secure sind und und wenn das ganze in Skalare ist, wird das ganze zu einem Integer konvertiert und verwendet das ganze dann in einem SQL Statement. Dass das nicht Skalare, also der Hash, der sicher bewertet wurde, wird nicht Escaped. Also wenn wir jetzt den Parameter kontrollieren könnten, könnten wir den SQL Injection Angriff führen. Aber der CGI Input erlaubt uns nicht einen Hash zu erstellen. Aber das ganze Pearl Sicherheitsmodell ist darauf gebaut, dass das nicht geht. Aber das Problem ist, dass Entwickler davon ausgehen, dass CGI die einzigste Eingabe Methode ist. So wie wir aber, aber CGI ist nicht die einzigste Eingabe Methode. Und weil die Bakzela Entwickler vergessen haben, dass man auch XML und JSON eingeben kann, die beide nicht Skalare Datentype unterstützen. Aber ich sage nicht, dass die Schuld sind, weil sie vergessen haben, dass es mehr Möglichkeiten gibt als nur User Input. Tut dem Leid, ich mache einfach weiter. Wenn wir eine der RPCs benutzen mit unserem gefährlichen Hash, anstatt einem normalen Parameter, wir können SQL Injection machen. Also können wir über die JSON-Schnittstelle einen Angriff führen. Also wenn man so eine Anfrage schickt, anstatt von einem Hash können wir hier alles reinschicken, was wir wollen. Und damit können wir die ganzen Datenbank komprimitieren. Wenn man sich das Ganze anschaut, dann erkennt man, dass das nicht wirkliche Sicherheitslücke ist. Also nicht keine schwierige. Das einzigste, was ich gemacht habe, ist den Eingabendatentyp geändert von Skalare zu einem Hash und das System ist komprimitiert. Es ist so stark auf der Annahme gebaut, dass Hashes sicher sind, dass ich fast ganzen Zugriff hatte. Das Lustige ist, obwohl es so einfach ist, gibt es diesen Angriff seit fünf Jahren. Also damit haben wir gezeigt, dass dieses unknown argument type riesige Fehlerquelle ist. Dass wenn wir im selben Code verschiedene Datentypen handhaben, dass es verschiedene Assecure fragt, fragt einfach Bakzilla. Aber das eigentlich schlimme ist, dass der Perl Standard ist. Man erwartet nicht, dass ihr es benutzt, sondern man muss es benutzen. Das ist einfach nur ein Sicherheitshaufen von Schrott und ist Teil der Sprache. Das Problem ist, dass nicht skalare Datentypen, dass man sich nicht aufs nicht skalare Datentyp verlassen kann. Wir können auch keine Datentypen erstellen mit normalem Nutzer-Input. Naja, wobei. Wir können natürlich das CGI-Modul uns ein bisschen genauer angucken. In diesem Szenario gucken wir uns den Fuhrparameter, der Wertbau übergeben. In diesem Fall wird ein Skalar erstellt in jedem der CGI-Module. Aber was passiert, wenn man anstatt einfach nur einen Wert schickt, dass man anstatt eines Wertes mehrere Werte überträgt? Naja, das ist ein bisschen komplizierter. Im CGI-Parameter wird daraus eine Liste von Skalaren erstellt. Jetzt schauen wir uns aber mal an, was das neue Perl daraus macht. Wir werden sehen, dass beide von denen ergeben Errays zurück. Was? Ich habe gedacht, solche Sachen konnte man nicht mit normalem User-Input erstellen, weil die anscheinend sicher sein sollen. Also, was passiert, wenn wir jetzt versuchen, in diesem Parameter eine Datei hochzuladen? Naja, jetzt passieren wirklich komische Sachen. Jetzt werden Sachen wirklich komisch. Der normalen CGI-Parameter gibt ein Datei-Deskripte zurück und die neuen Perl-Methoden geben. Wir haben gerade das bekannteste Bildprojekt in der Welt exploitet. Nur weil sie davon ausgehen, dass hash ist sicher sind. Und das ganze Sicherheitssystem ist auf diese Annahme gebaut, dass man nicht Skalare-Datentypen nicht erstellen kann. Diese Eigenschaften sind Features, also keine Bugs, sondern Features. Jetzt noch mein Uploit-Request mit mehreren Files in einem Parameter. Jetzt wird es wirklich lächerlich. Jetzt gibt es CGI-PM, eine ganze Liste von Files-Deskripteuren zurück, eine Liste von Hashes, sogar ein Array von Objects. Was? Fast jedes Bildprojekt in der Welt benutzt eines dieser Module, um CGI-Input zu parsen. Denk nur drüber nach, wie viele Entwickler davon ausgingen, die von den gleichen Annahmen ausgingen wie Baksella und dachten, dass sie mit Security-Datatypen zu tun haben. Wenn du also CGI-PM benutzt, dann kriegst du stets die erwarteten Skala-Werte, eine Liste von Deskripteuren oder wenn du Katalyst benutzt, sogar ein Skala, ein Array, ein Hash oder eine Liste. Also im Prinzip eigentlich alles. Also wenn man davon ausgeht, dass ein Funktionsargument einen speziellen Datentyp annimmt, das ist falsch. Es ist ein Fehler anzunehmen, dass Hashes oder Arrays sicher werden. Es ist falsch, davon auszugehen, dass nur Skalers als Input kommen, das ist sehr falsch sogar. Ehrlich gesagt, also überhaupt irgendwas zu erwarten in Pearl ist der Fehler. Man kann einfach sich auf gar nichts verlassen. Sogar die total grundlegenden Dinge, wie den Datentyp aus dem ein Wert gemacht ist, weiß man nicht, kennt man nicht. Ich hatte das Gefühl, dass alle diese Punkte vielleicht unbemerkt bleiben, wenn man nicht ein Beispiel gibt, der Absurdität von Pearl. Hier haben wir jetzt einen extremen Beispiel, was zeigen wird, wie krass kaputt Pearl wirklich ist und das ist es. Und das Einzige, was diese Code macht, ist den Inhalt der Datei anzuzeigen und das Ganze hochzuladen. Um zu zeigen, wie einfach er ist, werde ich jede Zeile erklären. Also die erste Zeile erstellt nur eine neue ZGI Instanz, damit wir die Datei von nur zu bekommen. Die zweite Zeile schaut, ob das Ganze in dem Upload Parameter steht. Die dritte Zeile holt den Descriptor von dem CGI und die vierte geht durch die Detail durch und das fünfte gibt das Ganze aus. Also nochmal, der Code, das Einzige, was er macht, ist das Ganze hochladen und das Ganze anzuzeigen. Also der Nutzer hat eine Datei hochgeladen und der Server gibt nur das Ganze zurück. Es zeigt nur den Inhalt an. Es gibt nichts in dem Code. Es sind halt nur fünf Zeilen, aber trotzdem Demo-Zeit. Glaubt mir, ihr müsst den Text nicht sehen. Wenn ich eine normale Anfrage schick, dann passiert nichts. Und ihr seht nicht, was ich mache, Moment, hier, jetzt. Also, wir müssen nur... Ich schick nun eine normale Anfrage, nichts passiert. Ihr könnt den Text sehen, aber... Und wenn ich jetzt meine bösartige Anfrage schick, was Interessantes wird passieren, schaut genau hin. Fertig? Ja? Ihr habt es nicht gesehen, das ist auf dem anderen Bildschirm. Ich werde euch vergrößern. Also, jetzt. Jetzt schaut genau hin. Was war das? Nochmal. Nur einen Moment. Also, ihr fragt euch jetzt wahrscheinlich, was zum Teufel habe ich gerade gesehen. War das gerade eine Konsole? Und die Antwort darauf ist Ja. Ja. Ja, es war es. Genau, es war der IP-Konfig, die IP-Konfig-Ausgabe. Also, was ihr praktisch gesehen habt, ist, dass ich gerade diese fünf Zeilen mit einer Remote Code Execution ausgenutzen. Ich denke, es ist mal Zeit, euch das zu erklären. Die erste Zeile sollte ja kontrollieren, sollte anstelle von dem, was hochgeladen ist, es schaut genau nach, ob eines der diese Werte einen Datei-Descriptor ist. Anstelle zu schauen, ob es nur eine Datei ist, schaut es stattdessen, ob ein Teil davon eine Datei ist. Also, es funktioniert immer noch, wenn man einen Skala dazu liegt. Und dann schlägt der Check viel. Wirklich kreative Typen. Jetzt geben wir dem File-Parameter sowohl ein normales File als auch ein Skala. Was passiert denn, wenn wir jetzt den File-Parameter uns holen? Normalerweise sollte der abgelodete File-Descriptor zurückgebracht werden. Aber jetzt geben wir einen anderen Wert mit dazu. Und es gibt dann eine ganze Liste zurück mit allen Parameterwerten, inklusive dem Skala. Da könnte es über zwei Werte drinstecken, nicht wahr? Also, jetzt wird die zurückgegebenen Liste nicht in ein Array konvertiert, sondern stattdessen gibt Pearl nur das erste Element zurück. Wenn wir jetzt also unser Skala-Wert als erstes schicken, dann wird dem File unser Scala zugewiesen, statt den File-Descriptor. Das heißt, das File ist jetzt plötzlich ein String. Was passiert also mit diesem Operator, wenn wir einen String statt einem File-Descriptor verwenden? Naja, also der Klammer-Operator funktioniert nur mit File-Descriptoren, nicht mit Strings. Das scheint wahr zu sein, außer, wenn der String Arc-V ist. In diesem Fall wird der Klammer-Operator durch den, natürlich alles Skriptargumente durchgehen, die jetzt alle von einem Curry-String kommen, nicht von der Kommando-Zeite, und gibt die alle in einem Open-Call weiter. Ja, das könnte ja auch mal Sinn machen, vielleicht nicht. Also, was das alles bedeutet ist, dass statt das abgelodete File displayed wird, kann man jetzt einfach jedes File auf dem Server anzeigen lassen. Aber damit hören wir noch nicht auf, denn wir haben noch keinen Code ausgeführt. Um Code auszuführen, müssen wir uns die Open-Function anschauen. Das ist die Funktion, die mit den Argumenten aufgerufen wird, die wir übergeben haben. Open gibt ein, öffnet ein File-Descriptor zu einem bestimmten File. Außer, wenn ein Pipe Buchstab am Ende dran hängt, dann wird das File nämlich nicht geöffnet, sondern ausgeführt und dann wird das Platz hier ein Execute-Call. Also, wenn wir jetzt das machen, dann kriegen wir das hier. Wir haben IP-Konfig ausgeführt, was zum Teufel. Ich weiß schon, es hat mich auch schockiert. Aber ich bin noch nicht fertig. Also in Wirklichkeit habe ich diesen Code gar nicht geschrieben. Erinnert ihr euch, dass die Perl monks mir erzählt haben, ich sollt ihr verdammtes Manual lesen? Da kam der Code her. Das ist in der offiziellen CGI-Dokumentation drin. Aber ich möchte jetzt nicht die Entwickler von CGI-PM blämen. Auch nicht die, die aus den Beispielen kopieren. Ich meine, schließlich, wer hätte das wissen können, dass man diesen Code so ausnutzen kann, dass dieser Code so arbeitet. Es gibt keine Exec-Calls. Das File wird nirgendwo gesaved, wird nirgendwo abgespeichert. Wir würd' es nur print. Das Einzige, was hier das Ganze durcheinander macht, ist die Perl-Sprache selber. Perl ist tot. Perl ist die Sprache, die das Ganze in der Liste expandiert. Es mischt die Datentypen und es führt User-Input aus. Und damit ist Perl gefährlich, schlecht und man sollte aufhören, Perl zu benutzen. Vielen Dank. Aber ich denke mal, wir haben Zeit für Fragen. Vielleicht. Und ich denke mir, dass wir selig Fragen haben werden. Bitte redet in die Mikrofone, sonst kann man euch nicht auf dem Stream hören. Und natürlich haben wir Fragen aus dem Internet. Natürlich haben wir die. Aber bevor wir zu den technischen Fragen kommen, will der Chat wissen, was mit den Kamelen auf sich hat und warum sie überall im Talk waren. Sie wollen wissen, ob es eine Liste von diesen Kamelbildern gibt. Ich denke mal, Google hat es. Sucht einfach Kamele. Als erste Frage, ob Perl wissen, ob man mitnehmen soll, dass die Perl-Benutzer nicht mehr Start-up-Input benutzen sollen, sondern stattdessen etwas anderes benutzen sollen. Das ist eine gute Frage. Was man hier mitnehmen sollte, also was man hier mitnehmen sollte, naja, wie soll ich das denn sagen? Ich denke, ich habe dafür eine Folie. Irgendwo. Jetzt meine Folie weg. Kein Problem. Hier ist sie. Wirklich. Was man eh niemals machen sollte, ist, den Nutzer-Input zu vertrauen. Das Problem ist, dass man von dem, was ich gesehen habe, dass man, von dem Perl-Con, den ich gesehen habe, dass man Hashes und Areas immer als sicher ansieht, weil die anscheinend nicht von Nutzer-Input erstellt werden können. Aber wenn man erwartet, dass der Nutzer-Input ein Scalar oder ein String ist oder ein Hash bekommt, und man bekommt stattdessen und man wird davon verwirrt und man kann immer in der Furcht leben, dass man nicht weiß, welchen Datentipp man versucht, hier zu handhaben. Und deswegen ist das immer gefährlich. Aber nicht sein Areas zu vertrauen oder sein Hashes nicht zu vertrauen. Was ist das nächste? Man vertraut seinem Code nicht. Man kann nicht erwarten, dass man irgendwas vertrauen kann. Und wenn Perl der Code schreibt, wird das Ganze von solchen Sachen angegriffen. Und jedes diese Sachen ist ein Problem. Ich hoffe, das hat die Frage beantwortet. Neben der Folie. Jetzt zum Mikrofon 1. Erst mal danke, dass Sie uns die Augen geöffnet haben. Er benutzt Perl zum Kochen. Er ist erst neu. Er ist nicht schuldig, dass er schon mal hier war. Er denkt, dass Kochen ein bisschen ist wie Kochen mit seiner Mutter. Und manchmal schmeißt er etwas rein. Und manchmal schmeißt seine Mutter etwas rein. Und das Einzige, was man machen kann, ist probieren, was dabei rauskommt. Und vielleicht hat er recht, dass Perl eine Sprache ist, bei der man nicht wirklich weiß, was am Ende rauskommt. Das heißt, wenn man das richtige Ergebnis kommt, dann, wenn man eine professionelle Rap Anwendung hat, dann kann man damit lustige Sachen machen. Und dafür sei es eine perfekte Sprache. Ich denke, also ich gebe dir der Vollkommen recht. Perl ist mit Sicherheit sehr, sehr lustig. Also zum Mikrofon 2. Er wurde bedroht, als er mit Perl Community geredet hat. Also, ob sein Leben bedroht wurde. Ja, auf jeden Fall. Ich bekomme immer noch Hasmails. Ich lebe in Angst. Ich spreche für alle, wenn ich dir für diesen wundervollen Vortrag halte. Danke, vielen Dank. Vielen Dank, vielen Dank. Du sprachst über Perl 5, denke ich. Vielleicht wissen manche von euch, dass dieses Weihnachten, also morgen wird Ingo Blechschmidt eine Rede über Perl 6 halten und wie es alles besser macht und warum wir es alle benutzen sollten. Und es scheißt auch Regenwung. Meine persönliche Meinung dazu ist, dass Perl einen Internet habe ich nicht mitbekommen. Und es sollen sich bitte Perl Entwickler bei ihm melden. Nur kurz zu Perl 6. Das hier ist nur über Perl 5. Also, Perl 6 kam erst vor ein paar Tagen raus. Und erst von dem, was ich gesehen habe, Perl 6 sieht danach aus, als wäre es so zwischen C und C++. Es hat zwar selben Namen, aber es ist auf jeden Fall unterschiedlich und vielleicht sehen wir uns nächstes Jahr mit Perl 6 dann hier. Ja, wir wissen, natürlich hat er sehr viel über CGI geredet. Wie er weiß, wurde das schon von dem Perl Repository entfernt vom Tag letzten Jahr. Und er will jetzt wissen, ob es dafür Ersatz gibt. Keine Ahnung, ich habe das noch nicht nachgeschaut. Ich habe CGI-Perm genommen, weil es das meiste benutzt ist, also bis heute. Und ich habe Catalyst benutzt. Also, ich habe nicht die neuesten Rule genommen, sondern ich habe nur die meist benutzen genommen zum Anschauen. Und ich denke, das ist das Wichtigste, wenn es sich so anschaut. Hallo. Part of the Perl Community. Sie ist ein Teil der Perl Community. Sie hat jetzt mit Perl 5 angefangen. Hast du nicht zugehört? Sie benutzen Perl für fast jedes Modul, das Sie auf Arbeit haben und es funktioniert prächtig. Sie weiß nicht, warum er denkt, dass Perl schlecht ist und warum er es angreift. Jede Sprache, die man sich aussuchen kann, hat Probleme, aber das meint nicht, dass man sie abschaffen sollte, dass sie sterben muss. Sie versteht das nicht, warum er das macht. Das du recht, natürlich. Also du hast da vollkommen recht. Also eine Sprache sollte nicht sterben, sondern es sollte verbessert werden. PRP wurde kritisiert und hat sich verbessert. Warum sollte das nicht mit Perl passieren? Warum sollte man die Sprache nicht verbessern? Es ist echt gefährlich. Hallo. Er ist kein Perl-Entwickler, aber er benutzt sehr viel Ruby und Python und will wissen, ob es limitiert ist, dass diese ganzen Sachen jetzt nur zu Perl zutreffen oder zu allen dynamischen Sprachen. Wie ich gesagt habe in den ersten paar Folien, ein paar diese Sachen enttreffen auch auf Python zu, speziell, wo man nicht angeben kann, was für Datatypen der Funktionen bekommen. Aber was einzigartig an Perl ist, dass man unterschiedliche Codes für verschiedene Datatypen in derselben Funktionen schreibt. Das kann zwar in jede Programme gesprochen, aber das ist sehr, sehr normal in Perl und dass man davon ausgeht, dass hash sich ist. Das ist zum Beispiel nur ein Problem in Perl. Hi. Hast du gesagt, hast du öfters was gesagt, beim Vorbereiten des Talks oder beim Halten? Hast du es mehr während dem Vorbereiten gesagt oder während du es gehalten hast? Ah, was? Haben wir noch einen aus dem Internet? Funktioniert dein Exploit auch in Tainted Note? Nein, es funktioniert nicht. Gibt es eine andere Modul? Gibt es Perler ob Physiocase.code für Catalyst oder den anderen CGI-Parameter? Er hat keine Ahnung. Ich habe das natürlich nicht in jedem Modul gecheckt, aber auf dem CGI-PM hat das funktioniert. Vielleicht gibt es im Internet mehr Exploits. Ich weiß, dass man das kann. Vielen Dank.