
[CVE-2022-22980] SpEL-Expression-Injection in Spring Data MongoDB
[CVE-2022-22980] Spring Data MongoDB SpEL-Ausdrucks-Injektion
MongoDB ist eine dokumentenorientierte NoSQL-Datenbank, die skalierbar und flexibel ist und für die Speicherung großer Datenmengen verwendet wird. Anstatt wie bei den traditionellen relationalen Datenbanken Tabellen und Zeilen zu verwenden, nutzt MongoDB Sammlungen (Collections) und Dokumente. Dokumente bestehen aus Schlüssel-Wert-Paaren, die die grundlegende Dateneinheit in MongoDB darstellen.
Spring Data for MongoDB ist Teil des Dachprojekts Spring Data, das ein vertrautes und konsistentes, auf Spring basierendes Programmiermodell für neue Datenspeicher bereitstellen soll, während die speicherspezifischen Funktionen und Fähigkeiten erhalten bleiben. Das Spring Data MongoDB-Projekt bietet die Integration in die MongoDB-Dokumentendatenbank. Zu den wichtigsten funktionalen Bereichen von Spring Data MongoDB gehören ein POJO-zentriertes Modell für die Interaktion mit einer MongoDB-DBCollection und das einfache Erstellen einer Datenzugriffsschicht im Repository-Stil.
Am 20. Juni 2022 veröffentlichte VMware auf seiner offiziellen Website einen Sicherheitshinweis, der sich auf die Schwachstelle der SpEL-Ausdrucks-Injektion (führt zu Remote-Codeausführung) bezieht, die Spring Data MongoDB betrifft. Detaillierte Informationen über die Schwachstelle CVE-2022-22980 finden Sie weiter unten.
Schwachstelle
Eine Spring Data MongoDB-Anwendung ist anfällig für SpEL-Injektion, wenn mit @Query oder @Aggregation annotierte Abfragemethoden mit SpEL-Ausdrücken verwendet werden, die Platzhalter für Abfrageparameter zur Wertbindung enthalten, sofern die Eingabe nicht bereinigt wird. Alternativ sind auch Szenarien anfällig, die Repository-Abfragemethoden ohne zusätzlichen Anwendungscode bereitstellen (wie etwa Spring Data REST).
Insbesondere ist eine Anwendung anfällig, wenn alle der folgenden Punkte zutreffen:
@Query oder @Aggregation annotiert, die SpEL (Spring Expression Language) verwenden und Eingabeparameter-Referenzen (?0, ?1, …) innerhalb des SpEL-Ausdrucks nutzenEine Anwendung ist nicht anfällig, wenn einer der folgenden Punkte zutrifft:
QueryMethodEvaluationContextProvider verwendet, der die SpEL-Nutzung einschränktBetroffene Versionen
Spring Data MongoDB 3.4.0, 3.3.0 bis 3.3.4 und ältere Versionen sind von der Schwachstelle CVE-2022-22980 Spring Data MongoDB SpEL Expression Injection betroffen.
Status
Spring Data MongoDB 3.4.1 und 3.3.5, die die Korrekturen enthalten, wurden veröffentlicht.
Abhilfe und empfohlene Umgehungslösungen
Die bevorzugte Maßnahme ist die Aktualisierung auf Spring Data MongoDB 3.4.1 und 3.3.5 oder höher. Wenn Sie dies getan haben, sind keine Umgehungslösungen erforderlich. Einige befinden sich jedoch möglicherweise in einer Situation, in der ein Upgrade nicht schnell durchgeführt werden kann. Aus diesem Grund hat das Spring-Team im Folgenden einige Umgehungslösungen bereitgestellt.
Verwendung der Array-Syntax: Wenn die Anwendung dynamische SpEL-Ausdrücke erfordert, die durch Benutzereingaben gesteuert werden, schreiben Sie die Abfrage- oder Aggregationsdeklarationen so um, dass innerhalb des Ausdrucks Parameterreferenzen ([0] anstelle von ?0) verwendet werdenImplementieren einer benutzerdefinierten Repository-Methode: Das Ersetzen des SpEL-Ausdrucks durch eine Implementierung einer benutzerdefinierten Repository-Methode ist eine praktikable Umgehungslösung, um Ihre dynamische Abfrage innerhalb des Anwendungscodes zusammenzustellen. Weitere Einzelheiten finden Sie in der Referenzdokumentation zur Repository-Anpassung.Patch-Analyse: GitHub Issue und zugehörige Commits
Das GitHub Issue zur SpEL-Injektions-Schwachstelle ist unter github.com/spring-projects/spring-data-mongodb/issues/4089 abrufbar.
Mit Hilfe der beiden unten aufgeführten Commits wurde die zugehörige Schwachstelle behoben.
Mit diesen Commits wurde die Klasse spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/EvaluationContextExpressionEvaluator.java hinzugefügt.
class EvaluationContextExpressionEvaluator implements SpELExpressionEvaluator {
ValueProvider valueProvider;
ExpressionParser expressionParser;
Supplier<EvaluationContext> evaluationContext;
public EvaluationContextExpressionEvaluator(ValueProvider valueProvider, ExpressionParser expressionParser,
Supplier<EvaluationContext> evaluationContext) {
this.valueProvider = valueProvider;
this.expressionParser = expressionParser;
this.evaluationContext = evaluationContext;
}
@Nullable
@Override
public <T> T evaluate(String expression) {
return evaluateExpression(expression, Collections.emptyMap());
}
public EvaluationContext getEvaluationContext(String expressionString) {
return evaluationContext != null ? evaluationContext.get() : new StandardEvaluationContext();
}
public SpelExpression getParsedExpression(String expressionString) {
return (SpelExpression) (expressionParser != null ? expressionParser : new SpelExpressionParser())
.parseExpression(expressionString);
}
public <T> T evaluateExpression(String expressionString, Map<String, Object> variables) {
SpelExpression expression = getParsedExpression(expressionString);
EvaluationContext ctx = getEvaluationContext(expressionString);
variables.entrySet().forEach(entry -> ctx.setVariable(entry.getKey(), entry.getValue()));