Eval 주입 (Eval Injection)

Eval Injection

설명

Eval 주입(Eval Injection)은 사용자가 입력한 값을 JavaScript의 eval(), new Function() 또는 브라우저의 문자열 기반 setTimeout()·setInterval()에 코드로 전달할 때 발생하는 취약점입니다. 공격자는 악의적인 JavaScript 코드를 삽입하여 크로스 사이트 스크립팅(XSS) 공격과 같은 피해를 유발할 수 있습니다.

잠재적 영향

  • 악성 스크립트 실행 (악성 코드 실행): 공격자가 페이지의 권한으로 악성 JavaScript를 실행하여 사용자 정보를 탈취하거나 사용자 대신 동작을 수행할 수 있습니다.
  • 데이터 유출 (데이터 노출): 악성 스크립트를 통해 사용자의 민감한 데이터가 외부로 전송될 수 있습니다.

해결 방법

  • eval, new Function, 브라우저의 문자열 기반 setTimeout·setInterval을 피하고 함수나 미리 정한 동작을 호출하세요.
  • 꼭 필요한 경우, 사용자 입력을 철저히 검증하고 허용되는 값만 처리하세요.
  • 사용자 입력으로 코드가 직접 실행되는 구조 자체를 피하고, 안전한 비즈니스 로직만을 사용하세요.

예시

변경 전

javascript
// 비취약 예시
eval('alert("hi")'); // 직접 코드, 입력 없음
// 취약 예시
const param = new URLSearchParams(window.location.search).get('cmd');
eval(param); // 사용자가 cmd에 악성 코드를 삽입할 수 있음

변경 후

javascript
const allowed = ['showMessage', 'log']
const param = new URLSearchParams(window.location.search).get('cmd')
if (allowed.includes(param)) {
    if(param === 'showMessage') alert('안녕하세요!')
    if(param === 'log') console.log('로그 처리')
} else {
    // 허용되지 않은 명령 거부
    console.warn('잘못된 명령입니다.')
}

설명:

  • 변경 전: 사용자 입력을 검증 없이 eval에 전달하면 공격자가 악의적인 코드를 삽입하여 실행할 수 있어 매우 위험합니다.
  • 변경 후: 허용된 명령어만 실행하도록 제한하여, 사용자가 임의로 코드를 삽입하여 실행할 수 없게 만듭니다. 동적 실행 함수(eval 등)은 사용하지 않습니다.

참조