대량 할당 취약점 (Mass Assignment)

Mass Assignment

설명

대량 할당 취약점(Mass Assignment)은 클라이언트가 전달한 입력값(JSON 등)을 검증 없이 Object.assign과 같은 함수에 직접 넣어 객체에 병합할 때 발생합니다. 이로 인해 공격자가 애플리케이션에서 변경을 허용하지 않은 필드를 덮어쓰거나 민감한 시스템 속성을 조작할 수 있습니다. 공격자는 추가적인 권한, 설정, 데이터 변경을 발생시킬 수 있습니다.

잠재적 영향

  • 잘못된 접근 권한 부여(권한 상승): 공격자가 사용자의 권한 또는 권한 수준을 임의로 조작할 수 있음.
  • 민감 정보 노출 또는 변조: 시스템 내부 속성, 설정 또는 비공개 정보를 덮어써서 서비스 동작이 바뀔 수 있음.

해결 방법

  • Object.assign 등으로 사용자 입력을 병합하기 전에 허용되는 필드만 선택해 병합하세요.
  • 허용 목록을 사용해 서버에서 승인한 속성만 복사하고, 각 값의 형식과 업무 규칙도 검증하세요.
  • 권한처럼 서버가 관리하는 민감한 필드는 클라이언트 입력으로 변경하지 마세요.

예시

변경 전

데이터베이스 조회·저장 함수의 구현은 생략한 예시입니다.

javascript
// 취약한 예시
function updateUser(untrustedInput) {
  let user = getUserFromDB();
  // 검증 없는 입력 병합 (취약)
  Object.assign(user, JSON.parse(untrustedInput));
  saveUserToDB(user);
}

변경 후

javascript
// 안전한 예시
function updateUser(untrustedInput) {
  let user = getUserFromDB();
  const allowed = ['nickname', 'email'];
  const data = JSON.parse(untrustedInput);
  // 화이트리스트 기반으로 병합
  for(const key of allowed) {
    if(data[key] !== undefined) {
      user[key] = data[key];
    }
  }
  saveUserToDB(user);
}

설명:

  • 변경 전: 사용자 입력을 그대로 Object.assign에 넣어 병합하면, 공격자가 관리자 권한 같은 시스템 속성도 마음대로 변경할 수 있기 때문에 매우 위험합니다.
  • 변경 후: 허용 목록 방식으로 실제 변경이 허용된 필드만 골라서 병합하기 때문에, 민감 속성의 무단 변경을 사전에 차단할 수 있습니다.

참조