재현 단계
버전이 1.7.0 이상인 AngularJS 패키지는 이 정규식 서비스 거부(ReDoS) 익스플로잇에 취약합니다. 앱에서 사용자가 제공한 값을 $locale.NUMBER_FORMATS.PATTERNS[1].posPre에 할당하는 경우, 공격자는 ' '.repeat(1000000)과 같이 매우 많은 수의 공백으로 구성된 값을 제공하여 서비스 거부를 유발할 수 있습니다. 이 익스플로잇을 시연하는 개념 증명은 StackBlitz에서 확인할 수 있습니다.
문제 해결
이 문제는 1.7.0 이상의 모든 AngularJS 버전에 존재하며, 수정 사항이 포함된 라이브러리 버전은 없습니다. 그러나 개발자는 사용자가 제공한 값이 $locale.NUMBER_FORMATS.PATTERNS[1].posPre에 할당되지 않거나 값의 길이가 몇 자로 제한되어 있는지 확인할 수 있습니다.
학습 및 예방
서비스 거부 공격은 시스템의 합법적인 사용자에게 리소스를 남기지 않는 방식으로 표적 시스템의 리소스를 사용하도록 설계되었습니다. 이 익스플로잇은 정규 표현식 서비스 거부(ReDoS) 유형으로, 대상 시스템이 오랜 시간이 걸리는 정규 표현식 패턴 일치를 해결하도록 시도합니다.
정규식 엔진은 일치하는 항목을 찾으려고 시도하면서 일련의 단계를 실행합니다. 이러한 단계 중 일부는 빠르게 완료될 수 있지만 다른 단계, 특히 실패하는 단계는 훨씬 더 오래 걸립니다. 1000000개의 공백과 같이 매우 많은 수의 공백으로 구성된 문자열 값이 주어지면 브라우저는 결과를 반환하는 데 엄청난 시간을 소비할 수 있습니다.
일부 일치하는 단계가 실패하여 정규식 엔진이 대안을 실행하기 위해 백업을 해야 하는 경우 특히 그렇습니다. 이러한 경우 1,000,000의 공백 수는 기만적입니다. 엔진이 실행하려고 시도하는 실제 단계 수는 1,000,000의 기하급수적 값이 될 수 있으므로 대상 시스템을 독점할 수 있습니다.
결론
이 익스플로잇에는 수정 사항이 없지만, 이 익스플로잇이 공개되었을 때 HeroDevs 네버엔딩 서포트 for AngularJS의 고객에게 익스플로잇에 대한 알림이 전달되었습니다. 고객이 아니면서 구독에 관심이 있는 경우 지금 바로 영업팀에 문의하세요.
리소스
저희가 지원하는 오픈 소스 소프트웨어에서 새로운 취약점이 수정될 때마다 알림을 받으세요.