재현 단계
그리고 merge()
함수는 여러 객체를 하나의 새로운 객체로 결합하는 데 사용되는 AngularJS의 함수입니다. 이 높은 수준의 취약점에 취약합니다.. 이 명령은 다음 속성을 추가하거나 수정하는 데 사용할 수 있습니다. Object.prototype
.
자바스크립트를 사용하면 마법 속성을 포함하여 객체의 모든 속성을 병합할 수 있습니다. __proto__
와 생성자 및 프로토타입을 공격할 수 있습니다. 특히 이 익스플로잇을 사용하면 __proto__
속성을 변경하여 Object.prototype
취약점을 노출할 수 있습니다. 왜냐하면 Object.prototype
속성이 모든 자바스크립트 객체에 상속되므로 공격자는 코드 실행에 영향을 줄 수 있는 광범위한 권한을 갖게 됩니다. 이는 원격 코드 실행 또는 자바스크립트 예외 트리거를 통한 서비스 거부로 이어질 수 있습니다.
자세히 알아보기 GitHub.
문제 해결
이 익스플로잇은 버전 1.7.9 이전의 모든 AngularJS 버전에 존재합니다. 업그레이드할 수 없는 경우, HeroDevs 네버엔딩 지원 AngularJS 클라이언트는 Angular 1.5와 호환되는 고정 버전의 AngularJS에 액세스할 수 있습니다. 공격에 취약한 대상은 다음과 같습니다:
- 웹 서버
- 애플리케이션 서버
- 웹 브라우저로 이동합니다.
학습 및 예방
이러한 종류의 공격을 방지하는 데 도움이 되는 몇 가지 방법이 있습니다:
- 프로토타입을 고정합니다. 사용
객체.동결(객체.프로토타입)
는 프로그램의 유연성을 심각하게 제한하는 과감한 조치이지만, 이러한 유형의 공격을 방지할 수 있습니다. - 스키마 유효성 검사가 필요합니다. JSON 입력을 스캔("위생 처리")하여 포함되지 않도록 할 수 있습니다.
__proto__
속성입니다. - 안전하지 않은 재귀 병합 함수를 사용하지 마세요. 이 권장 사항은 유효하지만, 문제는 재귀 병합 함수의 본질에 있는 것이 아니라
merge()
함수를 재귀적이든 아니든, 위험한 속성을 맹목적으로 복사하여Object.prototype
. - 프로토타입 없이 객체를 사용합니다. 고려 사항
Object.create(null)
또는 프록시 객체 또는 사용자 정의 클래스를 사용하여 프로토타입을 사용하지 않는 객체를 만들 수 있습니다. 다음에서 상속하지 않는 객체는Object.prototype
는 오염에 취약하지 않습니다. - 배열과 map()을 사용합니다. 객체를 사용하는 대신
merge()
배열을 사용하고map()
기능을 사용하여 프로토타입 오염 가능성을 완전히 방지할 수 있습니다.
결론
이 취약점에 설명된 수정 사항은 1.7.9에 있으며, 아직 Angular 1.5를 사용 중인 HeroDevs AngularJS 네버엔딩 지원 고객도 즉시 사용할 수 있습니다. 잠재적으로 비용이 많이 드는 공격을 피하기 위한 지원이 필요한 경우, 지금 바로 HeroDevs에 문의하세요.
리소스
NIST BDSA-2019-10768 entry
저희가 지원하는 오픈 소스 소프트웨어에서 새로운 취약점이 수정될 때마다 알림을 받으세요.