Skip to main content

Beliebige Codeausführung in Grunt

Artikel von
Blog illustrations vul profile feature

21. September 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 diesem gemeldet wurden. Wir wählen eine bemerkenswerte Schwachstelle aus dem vergangenen Monat aus und erzählen die Geschichte ihrer Entdeckung, Untersuchung und Offenlegung. Dabei stellen wir die Forschenden, Entwickler und Nutzer vor, die dazu beitragen, Schwachstellen in der Open-Source-Community zu erkennen und zu beheben.

Diesen Monat beschäftigen wir uns mit einer Schwachstelle zur beliebigen Codeausführung, die im beliebten JavaScript-Paket Grunt entdeckt wurde.


Schwachstelle: beliebige Codeausführung in js-grunt

Zugewiesene CVEs: CVE-2020-7729

Snyk-Analyst: George Gkitsas

Entdeckt von: Snyk Research Team

Das Snyk Research Team entdeckte und meldete eine Schwachstelle zur beliebigen Codeausführung im beliebten JavaScript-Paket Grunt.

Im Rahmen seiner kontinuierlichen Bemühungen, Open-Source-Software sicherer zu machen, identifiziert das Team Muster unsicherer Programmierpraktiken, die zu Schwachstellen führen können. Sobald bestimmte Muster erkannt sind, lassen sich Regeln erstellen, mit denen Tools wie Linter beliebte Pakete auf solche Schwachstellen untersuchen können.

Auf diese Weise wurde die Schwachstelle zur beliebigen Codeausführung im Grunt-Paket identifiziert. Sehen wir uns die Details der Schwachstelle, ihre Entdeckung und die Zusammenarbeit des Research-Teams mit dem Paketbetreuer an, durch die sichergestellt wurde, dass die Schwachstelle behoben wurde.

Ein genauer Blick auf die Schwachstelle zur beliebigen Codeausführung

George Gkitsas arbeitete daran, neue Linter-Regeln zu entwickeln, mit denen Schwachstellen im JavaScript-Ökosystem entdeckt werden können. In diesem Fall wollte George erkennen, wenn Pakete die anfällige Funktion load() aus dem Paket js-yaml verwenden, um ein yaml-Dokument aus einer Zeichenfolge zu parsen. Für das Parsen solcher Zeichenfolgen wird eine neuere, sichere Version der Methode namens safeLoad() empfohlen.

George testete eine Linter-Regel, mit der sich dieses Muster in JavaScript-Paketen erkennen lässt. Durch die Auswertung der Ergebnisse und die Überarbeitung der Regel konnte er die Zahl der falsch positiven Erkennungen auf ein akzeptables Maß senken. So konnte die Regel in die automatisierten Prozesse aufgenommen werden, die Snyk regelmäßig ausführt, um potenziell anfällige Pakete im Open-Source-Ökosystem zu identifizieren.

Snyk wählt regelmäßig die 1.000 beliebtesten Pakete anhand der Gesamtzahl ihrer Downloads aus und scannt sie auf Hinweise zu verschiedenen Schwachstellen. In diesem Fall wurde das Grunt-Paket aufgrund der Verwendung der Funktion load() als anfällig eingestuft. Ein Paket jedoch lediglich mit einem automatisierten Linter zu identifizieren, reicht natürlich nicht aus.

Im nächsten Schritt wird der Fund untersucht und bestätigt, dass der Code tatsächlich anfällig ist und es sich nicht um einen falsch positiven Treffer handelt. George konnte den identifizierten Code problemlos untersuchen und bestätigen, dass er tatsächlich anfällig war. Doch das Research-Team geht noch weiter: Es muss auch geprüft werden, ob die Schwachstelle in tatsächlich erreichbarem und somit ausnutzbarem Code steckt. Anfälliger Code, der sich nicht wirksam ausnutzen lässt, stellt ein deutlich geringeres Risiko dar. Deshalb erstellte George einen einfachen Proof of Concept und bestätigte damit, dass der Code tatsächlich anfällig war.

Codeausschnitt mit einer JavaScript-Funktion, die eine YAML-Datei mit grunt.util.warn einliest und verarbeitet sowie Fehler behandelt.

Bestätigt: CVE-2020-7729

Nachdem George bestätigt hatte, dass sich der anfällige Code tatsächlich ausnutzen ließ, wies er CVE-2020-7729 zu, um die Schwachstelle zu dokumentieren, und kontaktierte den Paketbetreuer per E-Mail. Dieser antwortete innerhalb einer Stunde und bekundete Interesse daran, mehr über Snyks Entdeckung zu erfahren. Er bat um weitere Informationen und bestätigte später, dass es sich tatsächlich um eine Schwachstelle handelte.

Ein Aspekt, der diese Situation von anderen typischen Schwachstellenentdeckungen unterschied, war, dass es sich bei Grunt um ein Entwickler-Tool handelt. Es ist ein Task-Runner, mit dem Entwickler wiederkehrende Aufgaben in ihren Entwicklungsprozessen automatisieren können. Daher musste das Research-Team prüfen, ob es einen Anwendungsfall gab, in dem jemand den Code tatsächlich im Rahmen eines Angriffs ausnutzen könnte. Nachdem George untersucht hatte, wie Entwickler Grunt einsetzen, konnte er dem Paketbetreuer bestätigen, dass ein realistischer Angriffsvektor bestand.

Weniger als eine Woche später veröffentlichte der Paketbetreuer eine Fehlerbehebung für das Grunt-Paket. Version 1.3.0 wurde am 17. August 2020 auf GitHub eingecheckt. Der neue Code bietet Entwicklern die Möglichkeit, je nach Situation und benötigter Funktionalität entweder die bisherige Methode load() oder die Methode safeLoad() zu verwenden.

Nachdem die aktualisierte Version verfügbar war, veröffentlichte Snyk die CVE und nahm sie in die Snyk Vulnerability Database auf. Snyk identifizierte über 2.000 überwachte Projekte, die von der Schwachstelle betroffen waren, und benachrichtigte deren Verantwortliche.

Code-Diff mit Änderungen an einer JavaScript-Funktion, die YAML-Dateien einliest und deren Inhalt analysiert.

Snyks Engagement für Sicherheit

Letztlich zeigen die Entdeckung und Offenlegung dieser Schwachstelle, wie das Snyk Research Team dazu beiträgt, Sicherheitsprobleme in Open-Source-Paketen schneller und effektiver zu finden. Die Forschenden konnten nicht nur die Schwachstelle und ihre Ausnutzbarkeit erkennen und bestätigen, sondern auch einen plausiblen Angriffsvektor aufzeigen, der das tatsächliche Risiko der Schwachstelle verdeutlichte. Das ist ein Teil von Snyks Engagement dafür, Entwickler dabei zu unterstützen, sicher zu bleiben und gleichzeitig Open Source in ihrer Entwicklung zu nutzen.

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.