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