Dev News Daily ENDE

Crystal 1.21.1: HTTP-Server entpackt Anfragekörper nicht mehr selbst

Crystal 1.21.1 ist am 26. September erschienen. Es ist ein Patch-Release, doch drei Einträge sind als Sicherheitskorrekturen markiert, und alle drei betreffen den HTTP-Server der Standardbibliothek - den Code, der läuft, wenn eine Crystal-Anwendung ohne vorgeschaltetes Framework Anfragen annimmt.

Die erste sorgt dafür, dass der Server HTTP-Anfragekörper nicht mehr automatisch dekomprimiert (#17476). Die zweite verhindert, dass HTTP::Request::Processor eine Keep-alive-Verbindung fortsetzt, wenn der Körper der vorherigen Anfrage nie gelesen wurde (#17434). Die dritte lässt HTTP::Server::RequestProcessor den Anfragekörper vollständig lesen, bevor eine Verbindung hochgestuft wird, etwa zu einem WebSocket (#17466). Angriffsszenarien beschreiben die Release-Notizen nicht; die Pull-Requests sind dort verlinkt.

Der Rest ist gewöhnliche Wartung: Channel#tap(&) wird überschrieben, um nach einer Regression das ursprüngliche Verhalten wiederherzustellen, nicht blockierendes Socket#connect unter Unix ist repariert, XML::Node#namespace kommt mit Knotentypen ohne Namensraum zurecht, und YAML::Any#hash scheitert nicht mehr an Containern, die sich selbst enthalten.

Crystal 1.21.1: HTTP-Server entpackt Anfragekörper nicht mehr selbst
Crystal 1.21.1: HTTP-Server entpackt Anfragekörper nicht mehr selbst — Dev News Daily

Was das bedeutet

Die drei Korrekturen haben ein Thema, das HTTP-Server in jeder Sprache kennen: Was geschieht mit den Bytes einer Anfrage, die die Anwendung nicht gelesen hat? Kehrt ein Handler früh zurück, liegt der restliche Körper noch auf der Verbindung, und ein Server, der einfach weiterliest, kann diese Bytes als Beginn der nächsten Anfrage deuten. Das Hochstufen einer Verbindung hat dasselbe Problem an anderer Stelle. Den Körper vorher zu leeren oder zu verwerfen, ist die defensive Antwort - und genau das tun die Änderungen.

Die automatische Dekompression ist die andere Hälfte. Ein Server, der Anfragekörper selbstständig entpackt, verbraucht Speicher und Rechenzeit für Daten, nach denen die Anwendung vielleicht nie fragt, und ein kleiner komprimierter Körper kann sehr groß werden. Macht man die Dekompression zur Entscheidung der Anwendung, liegt sie dort, wo die Grenzen bekannt sind. Wer den eingebauten Server von Crystal direkt betreibt, sollte das Update einspielen; Anwendungen, die sich auf transparente Dekompression verlassen haben, müssen komprimierte Körper künftig selbst behandeln.

Primärquelle
crystal-lang/crystal - release 1.21.1
https://github.com/crystal-lang/crystal/releases/tag/1.21.1