Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-22980 — [CVE-2022-22980] Spring Data MongoDB SpEL 표현식 주입 | Kitploit
도구/GitHubGitHub/murataydemir/cve-2022-22980
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationLearning & EducationDatabase Security
GitHubmurataydemir/cve-2022-22980

CVE-2022-22980

[CVE-2022-22980] Spring Data MongoDB SpEL 표현식 주입

저장소 보기
51164년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

[CVE-2022-22980] Spring Data MongoDB SpEL 표현식 주입


MongoDB는 대용량 데이터 저장을 위해 확장 가능하고 유연한 문서 지향 NoSQL 데이터베이스입니다. 기존 관계형 데이터베이스에서 테이블과 행을 사용하는 대신 MongoDB는 컬렉션과 문서를 사용합니다. 문서는 MongoDB에서 데이터의 기본 단위인 키-값 쌍으로 구성됩니다.

Spring Data for MongoDB는 포괄적인 Spring Data 프로젝트의 일부로, 저장소 고유의 기능과 역량을 유지하면서 새로운 데이터 저장소를 위해 친숙하고 일관된 Spring 기반 프로그래밍 모델을 제공하는 것을 목표로 합니다. Spring Data MongoDB 프로젝트는 MongoDB 문서 데이터베이스와의 통합을 제공합니다. Spring Data MongoDB의 주요 기능 영역은 MongoDB DBCollection과 상호 작용하기 위한 POJO 중심 모델과 Repository 스타일 데이터 액세스 계층을 쉽게 작성하는 것입니다.

2022년 6월 20일, VMware는 공식 웹사이트에서 Spring Data MongoDB에 영향을 미치는 SpEL 표현식 주입(원격 코드 실행으로 이어짐) 취약점과 관련된 보안 권고를 발표했습니다. 아래에서 CVE-2022-22980 취약점에 대한 자세한 정보를 확인할 수 있습니다.

취약점
Spring Data MongoDB 애플리케이션은 입력이 정화되지 않은 경우 값 바인딩을 위한 쿼리 매개변수 플레이스홀더를 포함하는 SpEL 표현식과 함께 @Query 또는 @Aggregation 주석이 달린 쿼리 메서드를 사용할 때 SpEL 주입에 취약합니다. 또는 추가 애플리케이션 코드를 포함하지 않고 리포지토리 쿼리 메서드를 노출하는 설정(예: Spring Data REST)도 취약합니다.

구체적으로, 다음 조건이 모두 참일 때 애플리케이션이 취약합니다:

  • 리포지토리 쿼리 메서드가 SpEL(Spring Expression Language)을 사용하고 SpEL 표현식 내에서 입력 매개변수 참조(?0, ?1, …)를 사용하는 @Query 또는 @Aggregation으로 주석 처리됨
  • 주석이 달린 쿼리 또는 집계 값/파이프라인이 표현식 내에서 매개변수 플레이스홀더 구문을 사용하는 SpEL 부분을 포함함
  • 사용자가 제공한 입력이 애플리케이션에 의해 정화되지 않음
  • Spring Data MongoDB 3.4.0, 3.3.0 ~ 3.3.4 및 이전 버전

다음 중 하나라도 참이면 애플리케이션이 취약하지 않습니다:

  • 주석이 달린 리포지토리 쿼리 또는 집계 메서드가 표현식을 포함하지 않음
  • 주석이 달린 리포지토리 쿼리 또는 집계 메서드가 표현식 내에서 매개변수 플레이스홀더 구문을 사용하지 않음
  • 사용자가 제공한 입력이 애플리케이션에 의해 정화됨
  • 리포지토리가 SpEL 사용을 제한하는 QueryMethodEvaluationContextProvider를 사용하도록 구성됨

영향받는 버전
Spring Data MongoDB 3.4.0, 3.3.0 ~ 3.3.4 및 이전 버전이 CVE-2022-22980 Spring Data MongoDB SpEL 표현식 주입 취약점의 영향을 받습니다.

상태
수정 사항이 포함된 Spring Data MongoDB 3.4.1 및 3.3.5가 릴리스되었습니다.

완화 및 제안된 해결 방법
권장되는 대응 방법은 Spring Data MongoDB 3.4.1 및 3.3.5 이상으로 업데이트하는 것입니다. 이렇게 하면 해결 방법이 필요하지 않습니다. 그러나 일부 사용자는 업그레이드를 신속하게 수행할 수 없는 상황에 처할 수 있습니다. 이러한 이유로 Spring 팀은 아래에 몇 가지 해결 방법을 제공했습니다.

  • 배열 구문 사용: 애플리케이션에 사용자 입력에 의해 제어되는 동적 SpEL 표현식이 필요한 경우, 표현식 내에서 매개변수 참조(?0 대신 [0])를 사용하도록 쿼리 또는 집계 선언을 다시 작성
  • 사용자 정의 리포지토리 메서드 구현: SpEL 표현식을 사용자 정의 리포지토리 메서드 구현으로 대체하는 것은 애플리케이션 코드 내에서 동적 쿼리를 조합하는 실행 가능한 해결 방법입니다. 자세한 내용은 리포지토리 사용자 정의에 대한 참조 문서를 참조하세요.
  • 쿼리 메서드를 호출하기 전에 매개변수 정화

패치 분석: GitHub 이슈 및 관련 커밋
SpEL 주입 취약점에 대한 GitHub 이슈는 github.com/spring-projects/spring-data-mongodb/issues/4089에서 확인할 수 있습니다.
아래의 두 커밋을 통해 관련 취약점이 수정되었습니다.

  • 7c5ac764b343d45e5d0abbaba4e82395b471b4c4
  • 5e241c6ea55939c9587fad5058a07d7b3f0ccbd3

이 커밋들을 통해 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/EvaluationContextExpressionEvaluator.java 클래스가 추가되었습니다.

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()));

		Object result = expression.getValue(ctx, Object.class);
		return (T) result;
	}
}

Screenshot 2022-06-28 102025

spring-projects/spring-data-mongodb/blob/main/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingContext.java 클래스도 다음과 같이 수정되었습니다:

Screenshot 2022-06-28 105719

spring-projects/spring-data-mongodb/blob/main/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingContext.java 클래스의 최종(수정된) 버전은 다음과 같습니다:

package org.springframework.data.mongodb.util.json;

import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

import org.springframework.data.mapping.model.SpELExpressionEvaluator;
import org.springframework.data.spel.ExpressionDependencies;
import org.springframework.data.util.Lazy;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.lang.Nullable;

/**
 * Reusable context for binding parameters to a placeholder or a SpEL expression within a JSON structure. <br />
 * To be used along with {@link ParameterBindingDocumentCodec#decode(String, ParameterBindingContext)}.
 *
 * @author Christoph Strobl
 * @author Mark Paluch
 * @since 2.2
 */
public class ParameterBindingContext {

	private final ValueProvider valueProvider;
	private final SpELExpressionEvaluator expressionEvaluator;

	/**
	 * @param valueProvider
	 * @param expressionParser
	 * @param evaluationContext
	 */
	public ParameterBindingContext(ValueProvider valueProvider, SpelExpressionParser expressionParser,
			EvaluationContext evaluationContext) {
		this(valueProvider, expressionParser, () -> evaluationContext);
	}
도구 다운로드