Sicherheitsforscher von JFrog deckt Code-Injection-Problem in Yamale, einem beliebten Schema-Validator für YAML, der von über 200 Repositories verwendet wird, auf. Die Schwachstelle wurde mit CVE-2021-38305 bezeichnet. Ein Angreifer muss allerdings in der Lage sein, den Inhalt der Schemadatei zu spezifizieren, um Python-Code einspeisen zu können. Dies kann allerdings auch aus der Ferne geschehen und der Eval-Schutz kann umgangen werden.
Potenzielle Angreifer, die den Inhalt der Schema-Datei, die an Yamale übergeben wird (-s/–schema Kommandozeilenparameter), können eine scheinbar gültige Schema-Datei bereitstellen, die beliebigen Python-Code ausführt. Die Schema-Datei ist einer der beiden obligatorischen Parameter für Yamale (der andere ist die zu validierende YAML-Datei). Das Problem liegt in der Funktion parser.parse. Ein Angreifer kann allerdings nicht einfach bösartigen Code ausführen, da Code wie __import__(‚os‘).system(‚evil_command‘) fehlschlägt, weil das __import__-Builtin nicht verfügbar ist. Wie JFrog wir weiter erklärt, gibt es jedoch immer noch eine Schwachstelle. Das zugrundeliegende Problem ist nämlich, dass ein Angreifer durch Python-Reflection jedes benötigte Builtin zurückholen und beliebigen Code ausführen kann.
Die Verantwortlichen von Yamale haben sich dafür entschieden, die Eingabezeichenfolge zu bereinigen, bevor sie über eine Whitelist an Eval übergeben wird. Wenn die ausgewertete Zeichenkette eine Teilzeichenkette enthält, die nicht auf der Whitelist steht, schlägt die Operation fehl. Dies ist eine durchaus akzeptable Lösung, solange die Whitelist restriktiv genug ist. Zu beachten ist, dass die Verwendung einer schwarzen Liste nicht zu empfehlen ist, da Angreifer in der Regel eine Kombination von Werten finden können, die die schwarze Liste umgehen und schließlich trotzdem etwas Bösartiges ausführen. Wenn möglich, wird dringend die Verwendung von ast.literal_eval anstelle von Eval geraten. literal_eval kann nur einfache Ausdrücke verarbeiten, sollte aber für viele einfache Anwendungsfälle ausreichen, ohne den Code angreifbar zu machen.
Fazit
Abschließend empfehlen die Sicherheitsforscher, eine der genannten Methoden zu verwenden, um Eval zu säubern, und wenn möglich, die Verwendung von Eval ganz zu vermeiden. Dies gelingt, indem man es durch eine spezifischere API für die gewünschte Aufgabe ersetzt. Yamale hat das Problem in Rekordzeit validiert und behoben. JFrog hat nach dem Responsable-Disclosure-Prozess eine CVE für das Problem erstellt, nachdem die behobene Version verfügbar war.
Mehr Details llassen sich im JFrog-Blog nachlesen: https://jfrog.com/blog/23andmes-yamale-python-code-injection-and-properly-sanitizing-eval/