JEXL 주입 (JEXL Injection)
Expression Language Injection (JEXL)
설명
JEXL(Expression Language)은 문자열로 작성된 식을 런타임에 평가하는 기능을 제공합니다. 신뢰되지 않은 입력으로 JEXL 표현식/스크립트를 생성하고 평가하면, 공격자가 임의 메서드 호출, 객체 생성 등을 통해 시스템 기능을 오용할 수 있습니다. 예를 들어 java.lang.Runtime 등을 호출하여 시스템 명령 실행을 시도하거나, 파일/네트워크 API 호출을 통해 데이터 접근 및 유출을 일으킬 수 있습니다.
잠재적 영향
원격 코드 실행(RCE): 표현식에서 위험 클래스/메서드(Runtime.exec 등)에 접근해 시스템 명령을 실행할 수 있음
민감정보 유출: 파일/환경변수/네트워크 API 접근을 통해 비밀키, 설정값 등을 조회 가능
데이터 변조 및 무단 접근: 애플리케이션 내부 객체에 접근해 상태 변경 또는 권한 우회 시도
서비스 장애(DoS): 무한루프성 표현식 또는 과도한 연산으로 리소스 고갈 유발
해결 방법
외부 입력을 JEXL 표현식/스크립트로 직접 사용하지 않기(가능하면 서버 측에서 고정된 표현식만 사용)
반드시 샌드박스 구성 사용: JexlBuilder().sandbox(new JexlSandbox(false)) 후 sandbox.white("허용클래스")로 필요한 최소 클래스만 화이트리스트
제한적 JexlUberspect 사용 또는 커스텀 구현으로 허용 메서드만 노출
입력 검증 병행: 숫자/연산자/허용된 함수명만 통과시키는 allowlist 기반 정규식 및 토큰 검증
평가 컨텍스트 최소화: MapContext 등 필요한 값만 주입하고 위험 객체(System, Runtime, Class 등) 노출 금지
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 외부 입력(expr)을 그대로 JEXL 엔진에 전달하여 평가합니다. 샌드박스가 없으므로 표현식에서 임의 클래스/메서드 호출이 가능해져 Runtime.exec, 파일/네트워크 접근 등으로 이어질 수 있습니다.
안전한 코드: - 샌드박스(JexlSandbox(false))로 기본 거부 정책을 적용하고, java.lang.Math만 화이트리스트로 허용하여 위험 클래스 접근을 차단했습니다.
정규식과 함수명 화이트리스트로 입력 표현식을 추가 검증해 의도하지 않은 식/식별자를 배제했습니다.
MapContext만 제공하여 불필요한 객체 노출을 피했습니다. 이로써 임의 코드 실행 및 데이터 접근 위험을 크게 줄였습니다.
참조
Last updated