검증되지 않은 동적 메서드 호출

검증되지 않은 동적 메서드 호출

설명

사용자 입력으로 선택한 객체 프로퍼티를 함수로 호출하면 존재하지 않는 메서드나 프로토타입 메서드가 호출되어 런타임 예외가 발생할 수 있습니다. 요청 처리 중 예외가 잡히지 않으면 서비스 거부로 이어질 수 있으며, 의도하지 않은 메서드가 실행될 위험도 있습니다.

잠재적 영향

  • 존재하지 않는 함수 호출로 요청 처리기가 예외를 던지고 서비스 가용성이 저하될 수 있습니다.
  • 공격자가 허용되지 않은 액션 이름을 전달해 내부 메서드 호출을 유도할 수 있습니다.
  • 프로토타입 체인에 있는 속성이 호출 대상이 되면 의도하지 않은 동작이 발생할 수 있습니다.

해결 방법

  • 사용자 입력으로 메서드를 직접 선택하지 말고 명시적인 switch 또는 허용 목록을 사용하세요.
  • 동적 조회가 필요하면 Object.hasOwn 또는 hasOwnProperty로 own property인지 확인하고 typeof value === "function"인지 검증하세요.
  • 허용되지 않은 action은 기본 거부 응답으로 처리하세요.

예시

변경 전

javascript
const actions = {
  play(data) {
    return data;
  },
};

app.get("/perform/:action", (req, res) => {
  res.send(actions[req.params.action](req.query.payload));
});

변경 후

javascript
const actions = Object.freeze({
  play(data) {
    return data;
  },
});

app.get("/perform/:action", (req, res) => {
  const action = actions[req.params.action];
  if (!Object.hasOwn(actions, req.params.action) || typeof action !== "function") {
    return res.status(400).send("Unsupported action");
  }
  return res.send(action(req.query.payload));
});

설명:

  • 변경 전: 사용자 입력을 그대로 객체 키로 사용해 함수를 호출하므로 잘못된 키가 들어오면 예외가 발생하거나 의도하지 않은 속성을 호출할 수 있습니다.
  • 변경 후: 허용된 own property인지 확인하고 함수 타입인지 검증한 뒤에만 호출합니다.

참조