동적 require를 통한 Eval 주입 취약점
Eval Injection (Dynamic Require)
설명
동적으로 변수 값을 전달하여 require()를 사용할 경우, 사용자 입력이 직접적으로 동적 모듈 로딩에 사용되면 공격자가 의도하지 않은 자바스크립트 파일이나 악성 코드를 로드하여 실행시킬 수 있는 취약점이 발생합니다. 즉, 외부에서 전달되는 값이 파일 경로나 모듈 이름에 영향을 주면 공격자가 임의의 파일을 로드하도록 유도할 수 있습니다.
잠재적 영향
임의 코드 실행 (임의 코드 실행): 공격자가 악의적인 코드를 서버에서 실행할 수 있음
민감 데이터 접근 (민감 데이터 노출): 공격자가 시스템이나 소스코드에 있는 중요한 정보에 접근할 수 있음
서비스 무력화 (서비스 중단): 비정상적인 모듈을 불러와 서비스 장애를 발생시킬 수 있음
해결 방법
require 함수에 인자로 전달되는 값을 반드시 하드코딩(리터럴)하거나, 사용자 입력값이 아닌 안전성이 검증된 값만 사용할 것
동적으로 모듈 또는 파일을 로딩해야 하는 경우, 화이트리스트(허용 목록)를 도입하여 특정 값만 허용
입력값을 검증하거나, 필요하다면 경로 제한 등의 추가 방어 방식을 적용
취약한 코드 및 안전한 코드 예시
취약한 코드
function loadModule(moduleName) {
// 사용자가 입력한 값을 그대로 require에 사용 (취약)
return require(moduleName);
}안전한 코드
설명:
취약한 코드: non_compliant_code에서는 사용자 입력(moduleName)이 그대로 require 함수에 전달되어, 공격자가 악성 자바스크립트 파일을 로드하게 만들 수 있는 취약점이 존재합니다.
안전한 코드: compliant_code는 require 함수에 전달할 모듈 이름을 미리 정의된 안전한 목록(화이트리스트)에서만 선택하도록 하여, 임의의 악성 모듈이나 예기치 않은 파일 로드 시도를 방지합니다.
참조
Last updated