HTML, chmod, Container und Cron
Die Argumentation hinter vier Dienstprogrammen: Warum ein HTML-Editor eine Zulassungsliste und eine Sandbox benötigt, warum das große S in einer chmod-Zeichenfolge wichtig ist, was ein Docker-Run-Befehl in Compose nicht ausdrücken kann und die beiden Cron-Regeln, die alle abfangen.
Der HTML-Editor: eine Zulassungsliste, kein Filter
Der Editor erzeugt HTML, und HTML, das aus einem Textfeld stammt, ist der älteste Injektionsvektor, den es gibt. Hier vermischen sich zwei unterschiedliche Fragen, daher lohnt es sich, sie zu trennen. Die erste lautet: „Kann dieser Editor dazu verleitet werden, Markup auszugeben, das Code auf der Seite ausführt, auf der es angezeigt wird?“ Die zweite Frage lautet: „Ist dies eine sichere Möglichkeit, feindliches HTML aus einer nicht vertrauenswürdigen Quelle zu entfernen?“ Dieses Tool antwortet auf die erste Frage mit „Ja“ und auf die zweite Frage mit „Nein“ und zeigt dies auf dem Bedienfeld an, sodass Sie nichts anderes vermuten können.
Der Mechanismus ist eine Zulassungsliste. Eine Liste von Elementen ist zulässig; Jedes andere Element wird ausgepackt, sodass sein Text erhalten bleibt, sein Tag jedoch nicht. Pro Element ist eine Liste von Attributen zulässig; alles andere wird gelöscht, was jeden Event-Handler unmöglich macht und nicht nur blockiert. Attributnamen werden vor diesem Test in Kleinbuchstaben geschrieben, sodass oNeRrOr und ONERROR denselben abgelehnten Namen wie onerror haben. Elemente, deren Inhalte der HTML-Parser als Rohtext behandelt – Skript, Stil, Textbereich, Iframe, Titel – werden zusammen mit ihren Inhalten entfernt, da beim Entpacken die Skriptquelle als Markup in das Dokument eingefügt würde.
Linkadressen erhalten eine eigene Prüfung. Der Wert ist entity-decoded und wird von Leerzeichen und Steuerzeichen befreit, bevor sein Schema gelesen wird, denn genau das macht ein Browser, wenn er navigiert: javascript:alert(1) und jav ascript:alert(1) erreichen beide die gleiche Stelle. Es bleiben nur http-, https-, mailto-, tel-, ftp- und relative Adressen erhalten. Eine Zeichenreferenz, die das Tool nicht auflösen kann – : ist der Klassiker – führt dazu, dass die gesamte Adresse abgelehnt und nicht weitergeleitet wird, da ein Filter, der weniger von der Eingabe versteht als der Browser, ein Filter mit einer Lücke ist.
Es gibt keine Bildschaltfläche und img steht nicht auf der Zulassungsliste. Ein zulässiges Bild-Tag ist eine ausgehende Anfrage von der Stelle, an der das Dokument landet, und eine On-Error-Oberfläche. Für einen Redakteur, der Prosa produziert, lohnt es sich auch nicht.
Die Verteidigung, die nicht davon abhängt, dass irgendetwas perfekt ist, ist die Vorschau. Es wird in einem Iframe mit einem Sandbox-Attribut gerendert, das überhaupt nichts gewährt – keine Skripte, keine Formulare, keinen Same-Origin-Zugriff. Sollte eine Nutzlast jemals die Zulassungsliste überleben, würde der Browser die Ausführung dort trotzdem verweigern. Das ist eher eine strukturelle Garantie als ein Versprechen für unseren Code.
Die ehrliche Einschränkung: Dies ist ein stringbasierter Sanitiser, kein vollständiger HTML5-Parser. Parser-Differentiale – Eingaben, bei denen ein Browser einen anderen Baum erstellt als dieser Tokenisierer – sind die bekannte Schwäche jedes auf diese Weise erstellten Sanitisierers. Für die Ausgabe generieren Sie sich selbst in diesem Editor, das ist in Ordnung. Um HTML zu bereinigen, das von einem Fremden eingegangen ist, verwenden Sie einen Sanitiser, der gegen einen echten Parser auf einem von Ihnen kontrollierten Server läuft.
Chmod: Der Großbuchstabe ist die ganze Nachricht
Ein Unix-Dateimodus besteht aus zwölf Bits: jeweils drei Berechtigungsbits für Besitzer, Gruppe und andere, plus Setuid, Setgid und das Sticky-Bit. Die oktale Form ist ein direktes Lesen dieser Bits, weshalb 4 + 2 + 1 = 7 Lesen, Schreiben und Ausführen bedeutet.
In der symbolischen Form, die ls ausgibt, werden die Sonderbits interessant, da sie keine eigene Spalte erhalten. setuid ersetzt das Ausführungszeichen des Eigentümers, setgid ersetzt das Ausführungszeichen der Gruppe und sticky ersetzt das andere Ausführungszeichen. Der Buchstabe wird in Kleinbuchstaben geschrieben, wenn das zugrunde liegende Ausführungsbit ebenfalls gesetzt ist, und in GROSSBUCHSTABEN, wenn dies nicht der Fall ist.
Also ist 4755 rwsr-xr-x – ein Setuid-Programm, das ausgeführt werden kann – während 4644 rwSr--r-- ist, eine Setuid-Datei, die niemand ausführen kann. Das große S gibt an, dass das System Ihnen sagt, dass das Bit träge ist, und dass es sich fast immer eher um einen Fehler als um eine Entscheidung handelt. Dasselbe gilt für 1644, das rw-r--r-T zeigt: ein Sticky-Bit in einer regulären Datei, bei dem das other-execute-Bit klar ist, was auf einem modernen Kernel genau nichts bewirkt.
Zwei weitere Unterscheidungen, die es zu beachten gilt. Die neunstellige Zeichenfolge, die ls ausgibt, ist nicht das Argument, das chmod akzeptiert: chmod möchte eine Zuweisungsliste wie u=rwx,g=rx,o=rx,u+s. Und die gleichen Bits bedeuten in einem Verzeichnis etwas anderes als in einer Datei – „execute“ bedeutet „darf eintreten und durchlaufen“, setgid bedeutet „neue Dateien erben diese Gruppe“ und das Sticky-Bit bedeutet „jeder darf erstellen, nur der Eigentümer darf löschen“, weshalb /tmp 1777 ist.
Docker zum Komponieren ausführen: Parsen und was nicht konvertiert wird
Der Konverter teilt den Befehl mit einem für dieses Tool geschriebenen Anführungszeichen-fähigen Tokenisierer auf. Nichts wird ausgeführt, ausgewertet oder an eine Shell übergeben. Ein Befehl, der Backticks, $(...) oder ein Semikolon enthält, wird als Literalzeichen gelesen, da dieses Tool Ihre Eingabe nur liest.
Die meisten Flags werden sauber zugeordnet: Ports, Volumes, Umgebung, Labels, Neustartrichtlinien, Funktionen, Gesundheitsprüfungen, Ressourcenlimits, DNS und zusätzliche Hosts haben alle Compose-Schlüssel mit derselben Bedeutung. Benannte Volumes und benutzerdefinierte Netzwerke benötigen eine Top-Level-Deklaration sowie die Dienstreferenz, sodass die Ausgabe eine solche enthält – mit external: true für Netzwerke, da ein Netzwerk-Docker-Lauf einem bereits vorhandenen Netzwerk beitreten konnte.
Für einige Flags gibt es kein Compose-Äquivalent, und hier scheitern Konverter normalerweise stillschweigend. --rm ist keine Diensteigenschaft: Ein Compose-Dienst wird nicht entfernt, wenn er beendet wird. -d beschreibt, wie Sie die CLI aufgerufen haben, nicht um den Dienst. --link ist veraltet, --mount benötigt eine lange Form, die dieses Tool nicht schreibt, --gpus hängt von Ihrem Treiber ab. Jedes davon erzeugt eine benannte Warnung, anstatt zu verschwinden. Ein unbekanntes Flag erzeugt ebenfalls eine Warnung und wird so behandelt, als ob es keinen Wert annimmt, da die Vermutung, dass es einen Wert angenommen hat, Ihren Bildnamen in ein Argument verwandeln und eine mit Sicherheit falsche Datei erzeugen würde.
Die Ausgabe enthält keinen Versionsschlüssel der obersten Ebene. Compose v2 ignoriert es und aktuelle Versionen warnen davor; Es ist veraltet, seit die Compose-Spezifikation die alten Dateiformatversionen ersetzt hat.
Zitate sind nicht kosmetisch. Eine Portzuordnung, die als 8080:80 ohne Anführungszeichen geschrieben ist, wird von YAML 1.1-Parsern als Zahl gelesen, und ja, nein, on und off sind boolesche Werte im selben Dialekt. Alles, was falsch verstanden werden könnte, wird zitiert; Alles, was sauber als Zeichenfolge gelesen werden kann, wird in Ruhe gelassen, sodass die Datei lesbar bleibt.
Cron: zwei Regeln, die jeden erwischen
Die erste ist die Tagesregel. Wenn sowohl der Tag des Monats als auch der Wochentag auf etwas anderes als * eingestellt sind, führt cron den Job aus, wenn ENTWEDER übereinstimmt – nicht, wenn beide übereinstimmen. Also ist 0 0 13 * 5 „Mitternacht am 13. und Mitternacht jeden Freitag“, also etwa fünfmal im Monat, und nicht „Freitag, der 13.“, was ein- oder zweimal im Jahr der Fall ist. Der Generator warnt immer dann, wenn beide Felder eingeschränkt sind und der Satz, den er schreibt, „oder“ statt „und“ lautet.
Die zweite ist die Zeitzone. Cron verwendet die Zone des Computers, auf dem es läuft, was auf einem Server häufig UTC ist, und fast nie die Zone der Person, die die Crontab schreibt. Die nächste Vorschau fragt daher, welche Zone verwendet werden soll, anstatt Ihre eigene anzunehmen. Die Zeiten werden in dieser Zone als Wanduhrzeiten berechnet, sodass ein täglicher Job über einen Sommerzeitwechsel hinweg zur gleichen Ortszeit bleibt und nicht um eine Stunde schwankt – und eine Ortszeit, die es nicht gibt, in der Stunde, die jeden Frühling übersprungen wird, wird aus der Liste ausgeschlossen, da cron dann auch nicht ausgeführt wird.
Die Syntax selbst ist klein: ein Stern, eine Zahl, ein Bereich a-b, eine Liste a,b,c, ein Schritt */n oder a-b/n, und die Monats- und Tagesnamen JAN-DEC und SUN-SAT. Sowohl 0 als auch 7 bedeuten Sonntag. Ein bloßer Wert mit einem Schritt, wie etwa 5/15 im Minutenfeld, bedeutet „von 5 bis zum Ende des Bereichs, alle 15“, also Minuten 5, 20, 35 und 50.
Die Validierung ist absichtlich streng. 60 * * * * wird abgelehnt, da die Minuten bei 59 enden; * * * * 8 wird abgelehnt, da das Tagesfeld bei 7 stoppt; */0 * * * * wird abgelehnt, da ein Schritt von Null mit nichts übereinstimmt. Sechs Felder bedeuten normalerweise einen Quartz- oder Systemd-Ausdruck, dessen erstes Feld Sekunden ist, sodass der Fehler besagt, dass nicht nur gezählt wird. Ein Zeitplan, der syntaktisch gültig ist, aber niemals ausgeführt werden kann – 0 0 30 2 * fragt nach dem 30. Februar – wird akzeptiert und markiert, da es falsch wäre, ihn abzulehnen, und Schweigen schlimmer wäre.
Was passiert mit dem, was Sie einfügen?
- Jede Konvertierung, jeder Hash, jede Dekodierung und jeder Diff wird in Ihrem Browser-Tab ausgeführt. Es werden keine Eingaben hochgeladen, protokolliert oder auf einem Server gespeichert, da nach dem Laden der Seite kein Server beteiligt ist.
- Hashes stammen von der browsereigenen Web Crypto-Implementierung und UUIDs von seinem kryptografisch sicheren Zufallsgenerator. Bei beiden handelt es sich nicht um einen Netzwerkanruf.
- Nichts, was Sie eingeben, wird in den lokalen Speicher oder in ein Cookie geschrieben. Beim Neuladen der Seite wird diese verworfen; Wenn Sie die Registerkarte schließen, wird sie verworfen.
- Siteweite Analysen laufen nur auf dem konfigurierten kanonischen Produktionshost und werden in der Datenschutzrichtlinie offengelegt; Lokale und Vorschau-Hosts lehnen dies ab. Eingefügte Werte, Token, URLs und Dateiinhalte sind von den eigenen Analyseereignissen von ToolAcre ausgeschlossen. Werbung ist in der aktuellen Konfiguration deaktiviert.
- Das heißt: Ein JWT oder ein API-Schlüssel ist ein Live-Zugangsdatensatz. Es ist eine sichere Angewohnheit, niemals etwas in eine Webseite einzufügen, die Sie nicht geschrieben haben, egal wie vertrauenswürdig die Behauptungen sind – auch diese hier.
Fragen
Kann ich schädliches HTML in den Editor einfügen, um es zu bereinigen?
Sie können es einfügen, und es wird nichts ausgeführt: Der Einfügehandler bereinigt die Nutzlast der Zwischenablage, bevor etwas eingefügt wird, und die Vorschau ist ein Sandbox-Iframe ohne Zulassungsskripte. Verwenden Sie das Ergebnis jedoch nicht als Sicherheitskontrolle für nicht vertrauenswürdige Eingaben. Dabei handelt es sich um eine stringbasierte Zulassungsliste für die eigene Ausgabe eines Editors, nicht um einen Allzweck-XSS-Filter, und der Parser eines Browsers kann einen anderen Baum erreichen als ein Tokenisierer wie dieser. Bereinigen Sie nicht vertrauenswürdige Inhalte auf einem Server mit einem echten HTML5-Parser.
Warum löscht der Editor meine Bilder und Tabellen?
Weil sie nicht auf der Zulassungsliste stehen. Bilder sind eine ausgehende Anfrage und eine Fehleroberfläche; Tabellen liegen einfach außerhalb des Aufgabenbereichs dieses Editors. Ihr Textinhalt bleibt erhalten, die Tags jedoch nicht. Das ist kein Fehler, sondern die Funktionsfähigkeit der Zulassungsliste – aber es bedeutet, dass dies nicht das richtige Werkzeug zum Bearbeiten eines komplexen vorhandenen Dokuments ist.
Warum zeigt chmod 4644 ein großes S an?
Weil setuid gesetzt ist und das Owner-Execute-Bit nicht. Der Großbuchstabe bedeutet, dass das Sonderbit nichts zu tun hat: Es handelt sich um eine Setuid-Datei, die nicht ausgeführt werden kann. Kleinbuchstaben bedeuten, dass beide Bits gesetzt sind. Die gleiche Regel gibt Ihnen S für setgid und T für das Sticky-Bit, und das Rückwärtsrechnen ist der häufigste Fehler in Modusrechnern.
Führt der Docker-Konverter meinen Befehl aus?
Nein, und das kann es auch nicht. Der Befehl wird von einem Tokenizer aufgeteilt, der sich nur auf Zitieren versteht. Es gibt keine Auswertung, keine Shell, keinen untergeordneten Prozess – die Seite hat keine Möglichkeit, einen zu starten. Alles, was Sie einfügen, bleibt im Tab.
Warum gibt der Konverter eine Warnung aus, anstatt einfach ein Flag zu löschen, das er nicht verarbeiten kann?
Denn eine Compose-Datei, die stillschweigend weniger ausführt als der Befehl, von dem sie kam, ist schlimmer als gar keine Ausgabe: Das erfahren Sie in der Produktion. Jede Flagge, die nicht vertreten ist, wird benannt und erklärt, was damit zu tun ist. Wenn Sie keine Warnungen sehen, ist nichts verloren gegangen.
Warum unterscheiden sich die nächsten Cron-Ausführungen von denen meines Servers?
Fast immer die Zeitzone. Cron nutzt die Zone der Maschine, auf der es läuft; Die Vorschau verwendet die Zone, die Sie im Dropdown-Menü ausgewählt haben. Stellen Sie es auf die Zone Ihres Servers ein – häufig UTC – und sie sollten zustimmen. Der andere Kandidat ist die Tagesregel: Wenn sowohl der Monatstag als auch der Wochentag festgelegt sind, läuft cron auf beiden, was häufiger vorkommt, als die meisten Leute beabsichtigen.
Einschränkungen
- Der HTML-Sanitierer ist eine Zulassungsliste für die eigene Ausgabe dieses Editors und wird als String-Tokenisierer und nicht als vollständiger HTML5-Parser implementiert. Es handelt sich nicht um einen Allzweck-XSS-Filter und darf nicht als solcher verwendet werden.
- Der Editor verfügt über keine Bilder, Tabellen, Farben oder Schriftsteuerelemente und auch keine Möglichkeit, diese hinzuzufügen: Alles außerhalb der Zulassungsliste wird entfernt.
- Die Bearbeitungsoberfläche verwendet document.execCommand, das veraltet ist und für das kein Ersatz implementiert ist. Browser unterstützen es immer noch; Das Verhalten unterscheidet sich geringfügig zwischen ihnen, insbesondere im Hinblick auf die Listenverschachtelung.
- Der chmod-Rechner deckt nur die zwölf Berechtigungsbits ab. Zugriffskontrolllisten, erweiterte Attribute, SELinux-Kontexte, umask-Arithmetik und Windows-ACLs liegen alle außerhalb des Gültigkeitsbereichs.
- Der Docker-Konverter übersetzt einen einzelnen Docker-Ausführungsbefehl in einen einzelnen Dienst. Es liest keine Docker-Dateien, löst keine Bilder auf und kann nicht --mount, --gpus, --device, --link oder --volumes-from ausdrücken; Jede davon erzeugt stattdessen eine benannte Warnung.
- Flags, die der Konverter nicht erkennt, werden so behandelt, als hätten sie keinen Wert. Wenn ein solches Flag eines angenommen hat, wird der Wert falsch gelesen – die Warnung besagt dies, und das Entfernen des Flags ist die Lösung.
- Der Cron-Generator liest nur das Crontab-Format mit fünf Feldern. Quarz- und systemd-Ausdrücke mit sechs Feldern, @reboot und die nicht standardmäßigen L, W, # und ? Betreiber werden eher abgelehnt als erraten.
- Die Zeiten für die nächste Ausführung stammen aus der browsereigenen Zeitzonendatenbank über Intl. Es handelt sich hierbei um eine Vorschau und nicht um eine Garantie: Der Computer, auf dem cron läuft, verfügt möglicherweise über eine andere Zone, eine andere Datenbankversion oder einen Daemon, der zu diesem Zeitpunkt nicht ausgeführt wurde.