Etherpad-lite: SQL-Injection-Versuche töten Etherpad lite

Erstellt am 23. Okt. 2018  Â·  13Kommentare  Â·  Quelle: ether/etherpad-lite

Hi,

Auf unserem Server hatten wir einen Etherpad-Ausfall. Wir haben es auf eine böse Abfrage verlassen:

https://pad.bling.org/javascripts/lib/ep_etherpad-lite/static/js/pad.js?callback=require.define&vLtF%3D6904%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E%27%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%2F%2A%2A%2F%3B%20EXEC%20xp_cmdshell%28%27cat%20..%2F..%2F..%2Fetc%2Fpasswd%27%29%23

Ein "minimales" Abfragebeispiel:

https://pad.bling.org/javascripts/lib/ep_etherpad-lite/static/js/pad.js?callback=require.define&vLtF%3D6904%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert(%22XSS%22)%3C%2Fscript%3E%27

Dies provoziert einen sofortigen Absturz:

oct. 23 18:17:19 pad.bling.org run.sh[8976]: [2018-10-23 18:17:19.994] [ERROR] console - Error: ENAMETOOLONG: name too long, open '/var/www/etherpad-lite/var/minified_L2phdmFzY3JpcHRzL2xpYi9lcF9ldGhlcn
oct. 23 18:17:19 pad.bling.org run.sh[8976]:     at Error (native)
oct. 23 18:17:19 pad.bling.org run.sh[8976]: [2018-10-23 18:17:19.995] [INFO] console - graceful shutdown...
oct. 23 18:17:20 pad.bling.org run.sh[8976]: [2018-10-23 18:17:20.091] [INFO] console - db sucessfully closed.

Wir fĂŒhren die Version 1.7.0 auf Debian Stretch mit Knoten v6.14.4 und ohne spezifische Anpassungen aus.
Wir haben das Verhalten bei zwei unabhÀngigen Etherpad-Installationen reproduziert.

Serious Bug security

Alle 13 Kommentare

Das stimmt.
Danke fĂŒr die wertvollen Informationen, @fpoulain , sehr geschĂ€tzt!

Hey Leute, nur eine Erinnerung an die verantwortungsvolle Offenlegung. Öffentlich zu posten, ohne uns die Chance zu geben, etwas auszuwĂ€hlen, kann ziemlich gefĂ€hrlich sein.

Hey Leute, nur eine Erinnerung an die verantwortungsvolle Offenlegung. Öffentlich zu posten, ohne uns die Chance zu geben, etwas auszuwĂ€hlen, kann ziemlich gefĂ€hrlich sein.

Hm...eigentlich wurde es schon bekannt gegeben, weil es von einigen fiesen Typen benutzt wird.

Außerdem sehe ich nicht, wie ich es auf nicht öffentliche Weise melden soll. Die Projektbeschreibung erwĂ€hnt sowieso keine private Feedbackschleife fĂŒr Sicherheitsprobleme. Wie denkst du hĂ€tte ich es gemeldet?

Afaik haben wir eine verantwortungsvolle Offenlegungsrichtlinie. Ich dachte, es wÀre auf etherpad.org und der Github-Readme.


Von: François Poulain [email protected]
Gesendet: Montag, 21. Januar 2019 11:16 Uhr
An: ether/etherpad-lite
CC: John McLear; Kommentar
Betreff: Re: [ether/etherpad-lite] SQL-Injection-Versuche töten Etherpad lite (#3502)

Hey Leute, nur eine Erinnerung an die verantwortungsvolle Offenlegung. Öffentlich zu posten, ohne uns die Chance zu geben, etwas auszuwĂ€hlen, kann ziemlich gefĂ€hrlich sein.

Hm...eigentlich wurde es schon bekannt gegeben, weil es von einigen fiesen Typen benutzt wird.

Außerdem sehe ich nicht, wie ich es auf nicht öffentliche Weise melden soll. Die Projektbeschreibung erwĂ€hnt sowieso keine private Feedbackschleife fĂŒr Sicherheitsprobleme. Wie denkst du hĂ€tte ich es gemeldet?

-
Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/ether/etherpad-lite/issues/3502#issuecomment-456039980 an oder schalten Sie den Thread stumm https://github.com/notifications/unsubscribe-auth/ AANewII6dbcPV2hlcP4uA5c4OHESwQJuks5vFaK4gaJpZM4X1_tz .

Es könnte eine gute Idee sein, eine Einladung hinzuzufĂŒgen "Sicherheitsproblem gefunden? Informieren Sie uns ĂŒber ...". Bevor ich diese Ausgabe geöffnet habe, habe ich einige Minuten in der Readme-Datei von github und auf etherpad.org verbracht, ohne eine solche Einladung zu finden. Auch als nicht muttersprachlicher englischer Leser hĂ€tte ich die guten Begriffe verpassen können, nach denen ich suchen musste.

Bemerkt. Tnx


Von: François Poulain [email protected]
Gesendet: Montag, 21. Januar 2019 14:35 Uhr
An: ether/etherpad-lite
CC: John McLear; Kommentar
Betreff: Re: [ether/etherpad-lite] SQL-Injection-Versuche töten Etherpad lite (#3502)

Es könnte eine gute Idee sein, eine Einladung hinzuzufĂŒgen "Sicherheitsproblem gefunden? Informieren Sie uns ĂŒber ...". Bevor ich diese Ausgabe geöffnet habe, habe ich einige Minuten auf github und auf etherpad.org verbracht, ohne eine solche Einladung zu finden. Auch als nicht muttersprachlicher englischer Leser hĂ€tte ich die guten Begriffe verpassen können, nach denen ich suchen musste.

-
Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub https://github.com/ether/etherpad-lite/issues/3502#issuecomment-456096384 an oder schalten Sie den Thread stumm https://github.com/notifications/unsubscribe-auth/ AANewFZlv6xtuszRP2CCBwWoDHGgTrFwks5vFdGEgaJpZM4X1_tz .

Ich konnte auch keinen finden, aber ich habe festgestellt, dass Sie einen PR angefordert haben, um einen hinzuzufĂŒgen https://github.com/ether/etherpad-lite/issues/2499.

Vielleicht erwÀgen Sie einfach, als schnelle Lösung ein https://securitytxt.org/ zu erstellen?

AnstĂ¶ĂŸiger Code ist irgendwo hier drin: https://github.com/ether/yajsml/blob/master/server.js#L98

Haftungsausschluss: Ich bin nicht schlau genug, um dieses Problem zu lösen. Ich brauche jemanden, der sich auskennt!

Hey! Werde das jetzt mal untersuchen.

ZunĂ€chst einmal: um alle Ängste vor SQLi abzuwehren: Das hat nichts mit SQL-Injection zu tun, wie diese alternative Nutzlast beweist, die auch den gleichen Absturz verursacht:

/javascripts/lib/ep_etherpad-lite/static/js/pad.js?callback=require.define&footlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootlefootle

Dies ist ein Problem mit der DateinamenlÀnge in der Caching-Middleware.

Derzeit wird der Cache-SchlĂŒssel wie folgt generiert:

var cacheKey = Buffer.from(path).toString('base64').replace(/[/+=]/g, '');

Dies bewirkt, dass die LĂ€nge des Cache-SchlĂŒssels durch die LĂ€nge des Pfads gesteuert wird.

Dies ist ein Problem, wenn der Cache-SchlĂŒssel als Dateiname auf der Festplatte verwendet wird, da viele Dateisysteme die DateinamenlĂ€nge auf 255 Zeichen beschrĂ€nken. Aus diesem Grund gibt es einen ENAMETOOLONG Fehler im Protokoll.

Um dies zu beheben, schlage ich vor, den Cache-SchlĂŒssel zu einem Hash des Pfads anstelle der base64-codierten Version zu machen. Dadurch wird ein Dateiname mit fester LĂ€nge sichergestellt.

Ich werde in KĂŒrze eine PR einreichen, die dies tut.

Hallo, @tomnomnom , das ist clever. Es ist durchaus sinnvoll, dass Cache-SchlĂŒssel eine feste LĂ€nge haben. Auf diese Weise bleiben sie abhĂ€ngig vom Inhalt, mit praktisch keiner Kollisionsgefahr.

Ich schau heute Abend mal nach.
Gut erledigt!

Die PR zusammengefĂŒhrt, vielen Dank!

Ein weiterer Hinweis dazu: Aus den nodejs-Dokumenten mĂŒssen wir möglicherweise die Möglichkeit in Betracht ziehen, dass das Modul crypto nicht verfĂŒgbar ist :

Es ist möglich, dass Node.js ohne UnterstĂŒtzung fĂŒr das Kryptomodul erstellt wird. In solchen FĂ€llen fĂŒhrt der Aufruf von require('crypto') dazu, dass ein Fehler ausgegeben wird

Vielleicht haben eingebettete Plattformen es nicht (zB: ARM, MIPS, Raspberry PIs & Ă€hnliches)? Ich weiß nicht. Eine Beschreibung solcher Szenarien finden Sie hier :

  • AusfĂŒhren eines Nicht-Standard-Knotens in einer Umgebung mit eingeschrĂ€nkten Ressourcen oder Sicherheit (siehe Knoten Nr. 5611 fĂŒr die explizite UnterstĂŒtzung dieses Szenarios)
  • lĂ€uft in emulierter Umgebung (browserify, webpack etc.)
  • Knoten aus der Quelle erstellen und openssl/crypto aus zufĂ€lligen GrĂŒnden weglassen (siehe StackOverflow-Frage oder einen anderen nodejs-Beitrag )

Wie auch immer, die TypeScript-Leute haben sich mit demselben Problem in https://github.com/microsoft/TypeScript/issues/19100 befasst und es auf elegante Weise in https://github.com/microsoft/TypeScript/commit/ gelöst.

Wenn das Importieren von Krypto zur Laufzeit fehlschlĂ€gt, ersetzen sie den Hash-Algorithmus durch den djb2-Algorithmus , der viel schwĂ€cher ist, aber fĂŒr ihren Fall funktioniert.

Ein fĂŒr unseren Fall angepasstes Beispiel könnte sein:

function djb2Hash(data) {
    const chars = data.split("").map(str => str.charCodeAt(0));
    return `${chars.reduce((prev, curr) => ((prev << 5) + prev) + curr, 5381)}`;
}

console.log(Buffer.from(djb2Hash('This is a 😎 test of the djb2 hash function')).toString('hex'));
// prints 36373536373437333033

Ich bitte Sie nicht, dies zu tun, aber die Geschichte von djb2 macht Spaß: siehe hier , und den originalen Mailinglisten-Post von Daniel Bernstein von 1991. Er war damals 20 Jahre alt.

Follow-up, das djb2 wenn keine Krypto-UnterstĂŒtzung vorhanden ist: #3797.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen