서버측 Eval 주입 (Eval Injection)

Server-Side Eval Injection

설명

Eval 주입은 사용자 입력값이 eval() 함수에 전달될 때 발생하는 취약점입니다. eval() 함수는 문자열을 코드로 실행하기 때문에, 공격자가 조작된 입력값을 전달할 경우 의도하지 않은 악성 코드를 실행할 수 있습니다. 이는 시스템 명령어 실행, 데이터 유출, 서비스 장애 등으로 이어질 수 있습니다.

잠재적 영향

  • 임의 코드 실행 (임의 코드 실행): 공격자가 서버에서 악성 JavaScript나 시스템 명령어를 실행할 수 있습니다.
  • 정보 유출 (정보 유출): 내부 데이터나 환경 변수가 노출될 수 있습니다.
  • 서비스 장애 (서비스 중단): 악의적인 코드 실행으로 인해 애플리케이션이 다운되거나 오동작할 수 있습니다.

해결 방법

  • JSON 데이터를 처리하려면 eval() 대신 JSON.parse()를 사용하세요. Function도 문자열을 코드로 실행하므로 안전한 대안이 아닙니다.
  • 사용자 입력을 코드로 실행하지 마세요.
  • 입력으로 동작을 선택해야 한다면 허용 목록에서 미리 구현한 동작만 선택하게 하세요.

예시

변경 전

javascript
app.get("/vuln", function (req, res) {
  const userCode = req.query.code;
  // 위험: 사용자 입력을 코드로 실행
  eval(userCode);
  res.send("Done");
});

변경 후

javascript
app.get("/safe", function (req, res) {
  const userJson = req.query.data;
  // 안전: 입력값을 JSON으로만 파싱함
  try {
    const parsed = JSON.parse(userJson);
    res.json(parsed);
  } catch (e) {
    res.status(400).send("Invalid input");
  }
});

설명:

  • 변경 전: 위험한 코드 예시에서는 req.query.code를 그대로 eval()로 실행하고 있습니다. 이로 인해 공격자가 악의적인 JavaScript 코드를 삽입 및 실행할 수 있어, 시스템 장악이나 데이터 유출이 발생할 수 있습니다.
  • 변경 후: 입력을 JSON.parse()로 데이터로만 해석해 이 경로의 코드 실행을 없앱니다. 이후 사용 목적에 맞는 데이터 형식, 크기와 권한 검증은 별도로 필요합니다.

참조