CVE-2019-10768

리도스 취약점
영향
AngularJS
<1.7.9
in
AngularJS
패치 사용 가능
이 취약점은 HeroDevs에서 제공하는 네버엔딩 지원(NES) 버전에서 수정되었습니다.

재현 단계

여러 개의 객체를 하나의 새로운 객체로 결합하는 데 사용되는 AngularJS의 merge() 함수는 이 상위 수준 취약점에 취약합니다. 이 명령은 Object.prototype의 속성을 추가하거나 수정하는 데 사용할 수 있습니다. 

자바스크립트에서는 마법 속성인 __proto__, 생성자 및 프로토타입을 포함하여 객체의 모든 속성을 병합할 수 있습니다. 특히 이 익스플로잇을 사용하면 __proto__ 속성을 병합하여 Object.prototype을 변경하고 취약점을 노출시킬 수 있습니다. Object.prototype 속성은 모든 자바스크립트 객체에 의해 상속되기 때문에 공격자는 코드 실행에 영향을 미칠 수 있는 광범위한 권한을 가집니다. 이는 원격 코드 실행 또는 자바스크립트 예외 트리거를 통한 서비스 거부로 이어질 수 있습니다.

GitHub에서 자세히 알아보세요.

문제 해결

이 익스플로잇은 버전 1.7.9 이전의 모든 AngularJS 버전에 존재합니다. 업그레이드할 수 없는 경우, HeroDevs 네버엔딩 지원 AngularJS 클라이언트는 Angular 1.5와 호환되는 고정 버전의 AngularJS에 액세스할 수 있습니다. 공격에 취약한 대상은 다음과 같습니다:

  • 웹 서버
  • 애플리케이션 서버
  • 웹 브라우저로 이동합니다.

학습 및 예방

이러한 종류의 공격을 방지하는 데 도움이 되는 몇 가지 방법이 있습니다:

  1. 프로토타입을 고정합니다. Object.freeze(Object.prototype)를 사용하는 것은 프로그램의 유연성을 심각하게 제한하는 과감한 조치이지만, 이러한 유형의 공격을 방지할 수 있습니다.
  2. 스키마 유효성 검사가 필요합니다. JSON 입력이 __proto__ 속성을 포함하지 않도록 스캔("위생 처리")할 수 있습니다.
  3. 안전하지 않은 재귀적 병합 함수를 사용하지 마세요. 이 권장 사항은 유효하지만 재귀적 병합 함수의 특성에 문제가 있는 것이 아니라, 재귀적이든 아니든 merge() 함수가 위험한 속성을 Object.prototype에 맹목적으로 복사하는 데 문제가 있기 때문에 적용에 한계가 있습니다.
  4. 프로토타입 없이 객체를 사용하세요. 프로토타입을 사용하지 않는 객체를 만들려면 Object.create(null) 또는 프록시 객체 또는 사용자 정의 클래스를 사용하세요. Object.prototype에서 상속하지 않는 객체는 오염에 취약하지 않습니다.
  5. 배열과 map() 사용. 객체와 merge()를 사용하는 대신 배열과 map() 함수를 사용하면 프로토타입 오염 가능성을 완전히 피할 수 있습니다.

결론

이 취약점에 설명된 수정 사항은 1.7.9에 있으며, 아직 Angular 1.5를 사용 중인 HeroDevs AngularJS 네버엔딩 지원 고객도 즉시 사용할 수 있습니다. 잠재적으로 비용이 많이 드는 공격을 피하기 위한 지원을 받으려면 지금 바로 HeroDevs에 문의하세요.

리소스

NIST BDSA-2019-10768 항목