
Verwundbare Apache Commons Text in Java-JAR/WAR-Artefakten erkennen und patchen; Klassen fingerprinten und Bytecode nach CVE-2022-42889 (Text4Shell)-Aufrufstellen durchsuchen.
Zum Finden anklicken:
CVE-2022-42889 kann eine ernsthafte Bedrohung für eine breite Palette Java-basierter Anwendungen darstellen. Die wichtigen Fragen, die sich ein Entwickler in diesem Zusammenhang stellen kann, sind:
commons-text? Welche Versionen?Enthält der veröffentlichte Code commons-text? Welche Version der Bibliothek ist darin enthalten? Die Beantwortung dieser Fragen ist möglicherweise nicht unmittelbar möglich, was an zwei Faktoren liegt:
Transitive Abhängigkeiten: Auch wenn commons-text nicht in der direkten Abhängigkeitsliste des Projekts steht, kann es indirekt über eine andere Abhängigkeit verwendet werden.
Der Code dieser Bibliothek erscheint möglicherweise nicht direkt als separate Datei, sondern ist in einer anderen Code-JAR-Datei gebündelt.
JFrog veröffentlicht ein Tool, um bei der Lösung dieses Problems zu helfen: scan_commons_text_versions. Das Tool sucht nach dem Klassencode von StringLookupFactory (unabhängig von den Namen der enthaltenen .jar-Dateien und dem Inhalt von pom.xml-Dateien) und versucht, die Versionen der Objekte per Fingerprinting zu identifizieren, um zu melden, ob die enthaltene Version von commons-text verwundbar ist.
commons-text-Funktionen?Diese Frage ist für die Fälle relevant, in denen der Entwickler überprüfen möchte, ob die Aufrufe von commons-text in der Codebasis möglicherweise potenziell angreiferkontrollierte Daten durchreichen. Während der sicherste Weg zur Behebung der Schwachstelle – wie in den Sicherheitshinweisen erörtert – darin besteht, die entsprechenden Patches anzuwenden, kann die Kontrolle und Verifizierung der potenziellen Auswirkungen unter der Annahme eines ungepatchten commons-text in vielen Situationen wertvoll sein.
scan_commons_text_calls_jar.py lokalisiert die Aufrufe der verwundbaren Funktionen in kompilierten .jar-Dateien und meldet die Ergebnisse als Klassen- und Methodennamen, in denen jeder Aufruf erscheint.
commons-text-JAR-Dateien in meinem System. Wie kann ich das gefährliche Verhalten schnell deaktivieren?Aktualisieren bleibt die beste Lösung – diese Lösung ist für schnelles Hot-Patching gedacht.
Im Zusammenhang mit der Schwachstelle CVE-2022-42889 ermöglicht die Klasse org/apache/commons/text/lookup/ScriptStringLookup in commons-text die Ausführung von Skripten, die über ${script} in einem String eingebettet sein können, der von einer angreiferkontrollierten Quelle stammt. Daher deuten Aufrufe der Funktion ScriptStringLookup.lookup darauf hin, dass die Funktionalität aktiviert ist.
Wir stellen ein Tool namens Text4ShellPatch bereit, mit dem dieser spezifische Aufruf gepatcht werden kann, sodass die Skriptausführungsfunktion nicht genutzt werden kann. Nach dem Anwenden des Patches führt die Bibliothek stets ein Skript aus, das eine Warnmeldung zurückgibt (anstelle des potenziell angreiferkontrollierten Codes).
In ähnlicher Weise können DNS- und URL-Lookups nicht vertrauenswürdige Inhalte laden, wenn sie von einem Angreifer über ${dns} und ${url} kontrolliert werden; daher können die jeweiligen Lookups DnsStringLookup bzw. UrlStringLookup per Patch deaktiviert werden, sodass sie eine Warnmeldung zurückgeben.
Der Patch kann auf eine bestimmte JAR-Datei angewendet werden, entweder nur für das script-Lookup oder für script, dns und url für einen besseren Schutz, falls diese in der Anwendung nicht verwendet werden sollen.
Am selben Speicherort wie die ursprüngliche JAR-Datei wird ein Backup erstellt, bevor diese durch die gepatchte Datei ersetzt wird. Der Backup-Dateiname folgt dem folgenden Muster: <original_jar_name>_YYYY.MM.DD_HH.mm.ss.orig.jar, wobei YYYY, MM, DD jeweils das Jahr, den Monat und den Tag und HH, mm, ss jeweils die Stunde, die Minuten und die Sekunde darstellen.
Es ist auch möglich, verwundbare Versionen von commons-text zu lokalisieren und automatisch zu patchen – die nächste Frage beantwortet dies.
commons-text-JAR-Dateien automatisieren?Zwei unserer Tools bieten zusammen die Möglichkeit, die verwundbaren commons-text-JAR-Dateien zu scannen und zu patchen.
In diesem Github-Repository ist ein Beispiel-Bash-Skript unter dem Namen scan_and_patch.sh vorhanden. Im Wesentlichen verwendet es das Skript scan_commons_text_versions.py, um unter einem bestimmten root-folder die verwundbaren commons-text-JAR-Dateien mit einer verwundbaren Version zu finden und das Tool Text4ShellPatch wie folgt darauf anzuwenden.

scan_commons_text_versions.pypython scan_commons_text_versions.py root-folder [-quiet] [-exclude folder1 folder2 ..]
Das Tool scannt root_folder rekursiv nach .jar- und .war-Dateien; in jeder gefundenen Datei sucht das Tool nach einer StringLookupFactory.class (rekursiv in jeder .jar-Datei). Wenn mindestens eine der Klassen gefunden wird, versucht das Tool, deren Version per Fingerprinting zu identifizieren (einschließlich einiger Variationen, die in Patches und Backport-Patches gefunden wurden), um zu melden, ob der Code verwundbar ist.
Mit dem Flag -quiet werden nur Versionsschlussfolgerungen ausgegeben und andere Meldungen (Dateien nicht gefunden / Archive konnten nicht geöffnet werden / passwortgeschützte Archive) werden unterdrückt.
Verzeichnisse, die nach -exclude (optional) angegeben werden, werden übersprungen.
scan_commons_text_calls_jar.pyDas Tool erfordert Python 3 und die folgenden Drittanbieter-Bibliotheken: jawa, tqdm, easyargs, colorama
pip install -r requirements.txt
Der Standard-Anwendungsfall:
python scan_commons_text_calls_jar.py root-folder
scannt rekursiv alle .jar-Dateien in root-folder und gibt für jede Datei die Stellen (Klassenname und Methodenname) der Aufrufe der Methoden lookup/replace/replaceIn von StringSubstitutor/StringLookup aus.
Das Tool kann mit den folgenden Befehlszeilenoptionen für weitere Anwendungsfälle konfiguriert werden.