Groovy 코드 주입
Code Injection (Groovy)
설명
Groovy 코드 주입은 신뢰할 수 없는 문자열을 Groovy의 동적 실행/컴파일 API(Eval.me/xy/xyz, GroovyShell.evaluate/parse, GroovyClassLoader.parseClass 등)에 전달할 때 발생합니다. 공격자는 입력값에 악성 Groovy 코드를 삽입하여 파일 접근, 네트워크 호출, 프로세스 실행 등 임의의 동작을 수행할 수 있어 원격 코드 실행(RCE)로 이어집니다. 흔한 공격 방식은 Runtime.getRuntime().exec 호출, new File(...).text 읽기, URL을 통한 외부 통신, 리플렉션/메타프로그래밍 악용 등입니다. SecureASTCustomizer만으로는 우회가 가능하므로 별도 샌드박스 및 런타임 차단이 필요합니다.
잠재적 영향
원격 코드 실행(RCE): 공격자가 서버에서 임의의 시스템 명령이나 Java 코드를 실행할 수 있습니다.
민감정보 유출: 파일 시스템, 환경변수, 데이터베이스 자격증명 등이 스크립트를 통해 노출될 수 있습니다.
권한 상승: 애플리케이션 권한 범위에서 시스템 자원과 내부 네트워크에 접근해 추가 공격을 시도할 수 있습니다.
서비스 거부(DoS): 무한 루프, 과도한 리소스 사용 코드로 서비스 중단을 유발할 수 있습니다.
해결 방법
사용자 입력을 스크립트로 실행하지 않기: 신뢰할 수 없는 문자열을 Eval/GroovyShell/GroovyClassLoader에 절대 전달하지 않습니다.
기능 대체: 가능한 경우 Groovy 스크립트 기능을 비활성화하고, 정적 로직(자바 코드)이나 미리 검증된 사전 정의 DSL만 사용합니다.
허용 목록(Allowlist) 기반 설계: 필요한 동작만 선택적으로 제공(예: 사전 등록된 연산 키워드 -> 자바 함수 매핑)하고 임의의 코드 실행 경로를 제거합니다.
샌드박스(ClassLoader 격리): 커스텀 ClassLoader로 java.lang.Runtime, ProcessBuilder, java.io, java.net 등 위험 클래스를 로드 차단하고, 보안 매니저 대체 기법(컨테이너/OS 격리, seccomp 등)으로 프로세스 권한을 최소화합니다.
AST/컴파일 제한: SecureASTCustomizer, CompilerConfiguration으로 import/스타틱 import/메타프로그래밍/메서드 포인터/시스템 접근을 제한하되, 이 방법만으로는 충분하지 않음을 인지하고 추가 방어를 병행합니다.
런타임 제어: 실행 시간/메모리 제한, 스레드 수 제한, 네트워크/파일 접근 차단 등 리소스 한도를 적용합니다.
운영 보안: 별도 컨테이너에서 실행, 최소 권한 계정 사용, 로깅/모니터링으로 이상 징후 탐지, 서명된 스크립트만 허용 등 운영 통제를 적용합니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 사용자 입력이 Groovy 소스로 간주되어 parse/run으로 그대로 실행됩니다. 공격자는 Runtime.getRuntime().exec("...") 호출, 파일/네트워크 접근, 리플렉션 등 임의의 동작을 수행할 수 있어 즉시 RCE로 이어집니다.
안전한 코드: 임의의 스크립트를 실행하지 않고, 사전에 정의된 안전한 연산만 Allowlist로 선택하게 했습니다. 사용자 입력은 단순 값으로만 사용되며 코드로 해석되지 않으므로 Groovy 코드 주입 경로가 제거됩니다. 필요 시(불가피한 스크립트 기능)에도 샌드박스 ClassLoader, AST 제한, 리소스 한도 등 추가 방어를 병행해야 합니다.
참조
Last updated