
이 저장소에는 CVE-2023-26136 취약점에 대한 해결책이 포함되어 있습니다.
tough-cookie 패키지 4.1.3 이전 버전은 rejectPublicSuffixes=false 모드에서 CookieJar를 사용할 때 쿠키를 부적절하게 처리하여 프로토타입 오염(Prototype Pollution)에 취약합니다. 이 문제는 객체가 초기화되는 방식에서 발생합니다.
이 프로젝트는 CVE-2023-26136 취약점을 제거하면서 이전 버전과의 호환성을 보장하는 패치된 버전의 [email protected]을 제공하는 것을 목표로 합니다.
취약점을 수정하기 위해 일반 객체 초기화를 Object.create(null)로 대체하여 쿠키가 프로토타입 오염 위험 없이 객체에 저장되도록 memstore.js를 수정했습니다. 이를 통해 악의적으로 조작된 쿠키 이름으로 프로토타입을 조작하는 것을 방지합니다.
tough-cookie/ 디렉토리에는 원본 및 패치된 tough-cookie 버전이 포함된 두 개의 추가 디렉토리가 있습니다:
Original v2.5.0/) – 수정되지 않은 tough-cookie 2.5.0으로, 취약점이 존재합니다.v2.5.0-PATCHED/) – CVE-2023-26136에 대한 수정 사항이 포함된 수정 버전입니다.원본 취약 버전을 설치하려면:
npm install [email protected]
적용된 패치는 쿠키가 저장되는 방식을 변경합니다: this.idx = {};
가 this.idx = Object.create(null);로 변경되었습니다.
이를 통해 공격자가 프로토타입 체인에 속성을 주입하고 취약점을 악용하는 것을 방지합니다.
tough-cookie의 취약점(CVE-2023-26136)은 일반 JavaScript 객체 {}를 사용하여 쿠키를 저장하기 때문에 발생합니다. {}는 Object.prototype을 상속하므로 __proto__와 같은 속성을 주입하여 프로토타입 오염을 일으킬 수 있습니다. 이로 인해 공격자가 애플리케이션 동작을 조작하거나 보안 문제를 유발할 수 있습니다.
이를 완화하기 위해 패치는 {}를 프로토타입이 없는 객체([[Prototype]]: null)를 생성하는 Object.create(null)로 대체합니다. 이렇게 하면 객체가 Object.prototype에서 어떤 속성도 상속하지 않으므로 공격자가 악성 속성을 주입하는 것을 방지할 수 있습니다.
Object.create(null)을 사용함으로써 쿠키 저장소를 의도치 않은 프로토타입 상속으로부터 효과적으로 격리하여 프로토타입 오염 공격에 더 안전하게 만듭니다.
패치된 버전을 로컬에 설치하려면 다음 단계를 따르세요:
tar -tzf tough-cookie-2.5.0.tgz
필요한 경우 압축을 해제합니다:
tar -xzf tough-cookie-2.5.0.tgz
npm install ./tough-cookie-2.5.0.tgz
node index.js
예상 출력:
EXPLOITED SUCCESSFULLY - 원본 버전의 경우
EXPLOIT FAILED - 패치된 버전의 경우
패치된 버전은 최신 안정 런타임 환경과의 호환성을 보장하기 위해 Node.js 20(LTS)에서 테스트되었습니다.
원본 tough-cookie 저장소(Salesforce)는 현재 버전 5.1.1입니다. 버전 2.5.0을 사용하고 있으므로 기본 저장소에서 직접 포크하는 것은 불가능합니다. 대신 원본 버전과 패치된 버전이 모두 포함된 별도의 저장소를 만들었습니다. 여기에서 찾을 수 있습니다:
GitHub 저장소 - 포크된 버전
자세한 내용은 공식 CVE 페이지를 방문하세요: CVE-2023-26136 - NVD