Expression Language (EL) 삽입

Expression Language (EL) Injection

설명

외부 입력값을 받아들여 코드의 구성에 영향을 미치는 경우, 입력값 중 예상치 못한 특수 요소가 포함되어 코드의 동작이 변경될 수 있습니다. EL(Expression Language) 삽입 취약점은 createValueExpression, createMethodExpression, ELProcessor.eval 등의 메서드에 사용자 입력이 직접 전달될 경우 발생할 수 있습니다. 이러한 메서드는 전달된 표현식을 실행할 수 있으며, 공격자가 악의적인 EL 표현식을 삽입하면 임의의 Java 코드 실행 및 OS 명령 실행이 가능해집니다.

잠재적 영향

  • 무단 코드 실행: 공격자가 서버에서 임의의 Java 코드 실행할 수 있습니다. 이를 통해 OS 명령 실행을 통한 서버 장악 가능성도 존재합니다.

  • 데이터 손상: 공격자가 애플리케이션 데이터를 무단으로 읽거나 수정할 수 있습니다.

  • 서비스 거부(DoS): 악성 명령어를 통해 애플리케이션을 중단시키거나 다운시킬 수 있습니다.

해결 방법

  • 사용자 입력을 EL 표현식으로 직접 평가하지 않도록 적용합니다.

  • 미리 정의된 값만 사용할 수 있도록 Whitelist 기반 검증을 적용합니다.

  • 표현식 실행을 제한하는 보안 정책 적용합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

import jakarta.el.ExpressionFactory;
import jakarta.el.ValueExpression;
import jakarta.el.VariableMapper;
import jakarta.el.ELContext;
import jakarta.el.StandardELContext;

@RequestMapping("/runCommand")
public class UnsafeELInjection {
    public String runCommand(@RequestParam String commandParam) throws IOException {
        ExpressionFactory factory = ExpressionFactory.newInstance();
        ELContext context = new StandardELContext(factory);
        ValueExpression expression = factory.createValueExpression(context, commandParam, Object.class);

        Object result = expression.getValue(context); // EL 실행
        return result;
    }
}

안전한 코드

설명:

  • 취약한 코드: 외부 입력값을 검증하지 않고 createValueExpression을 통해 사용자 입력을 직접 실행하여 EL 표현식 삽입 공격이 가능합니다.

  • 안전한 코드: Whitelist를 작성하여 EL 실행하기 전 검증하여 지정된 값으로 실행 가능하도록 설계해 안전성을 확보합니다.

관련 CVE

참조

Last updated