
tough-cookie v2.5.0 패치: MemoryCookieStore에서 Object.create(null)을 사용하여 CVE-2023-26136 프로토타입 오염 취약점 수정, 익스플로잇 데모 및 단위 테스트 포함.
이 저장소는 tough-cookie 패키지 v2.5.0의 패치 버전으로, 심각한 프로토타입 오염(Prototype Pollution) 취약점(CVE-2023-26136)을 해결합니다. 이 취약점은 공격자가 JavaScript 객체에 속성을 주입하여 프로토타입 체인을 조작할 수 있게 합니다. 이로 인해 예상치 못한 동작, 원격 코드 실행과 같은 보안 위험, 이 패키지에 의존하는 애플리케이션에서의 호환성 문제가 발생할 수 있습니다.
tough-cookie 패키지의 v4.1.3 미만 버전은 rejectPublicSuffixes=false 모드에서 CookieJar를 사용할 때 프로토타입 오염에 취약합니다. 이 취약점은 특히 cookie.domain이 __proto__로 설정된 경우 쿠키를 부적절하게 처리하는 데서 발생합니다. 이를 통해 공격자는 핵심 Object.prototype 객체를 수정하여 애플리케이션 전반에 걸쳐 광범위한 문제를 일으킬 수 있습니다.
CVE-2023-26136에 대한 자세한 내용은 다음을 참조하십시오:
프로토타입 오염은 다음과 같은 여러 심각한 위험을 초래할 수 있습니다.
보안 취약점: 기본 Object.prototype을 수정함으로써 공격자는 객체의 동작을 조작하여 권한 상승, 민감한 데이터 접근 또는 애플리케이션의 보안 메커니즘 우회가 가능해집니다.
서비스 거부(DoS): 프로토타입 체인을 오염시키면 시스템에서 예상치 못한 동작을 유발하여 충돌, 무한 루프 또는 리소스 고갈을 일으켜 정상 사용자가 애플리케이션을 사용할 수 없게 만들 수 있습니다.
호환성 문제: Object.prototype을 변경하면 다른 라이브러리나 프레임워크와 상호작용할 때 오류 및 예기치 않은 동작이 발생할 수 있습니다. 프로토타입 체인에 의존하는 종속성이 손상되어 업데이트 중 통합 문제나 결함 있는 애플리케이션 동작이 발생할 수 있습니다.
예기치 않은 애플리케이션 동작: 프로토타입 오염은 데이터 손상, 보안 침해 등 불규칙한 프로그램 동작을 유발할 수 있으며, 추가적인 악용 가능성이 생길 수 있습니다.
이 패치는 MemoryCookieStore 클래스, 특히 putCookie 메서드를 수정하여 프로토타입이 없는 객체를 생성함으로써 프로토타입 오염을 방지합니다. 주요 변경 사항은 다음과 같습니다.
{} 대신 Object.create(null) 사용.cookie.domain = __proto__로 쿠키를 설정할 수 있는 취약점 수정.패치된 tough-cookie 버전을 설치하려면 다음 명령어를 사용하십시오:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
이 저장소에는 프로토타입 오염 취약점이 성공적으로 해결되었는지 확인하기 위한 단위 테스트가 포함되어 있습니다.
prototype_pollution_test라는 이 테스트는 도메인이 __proto__인 쿠키를 설정해도 JavaScript 프로토타입 체인에 영향을 미치지 않는지 구체적으로 확인합니다. 이를 통해 프로토타입 오염이 방지되어 애플리케이션의 무결성이 유지됩니다.
테스트를 실행하고 수정 사항을 확인하려면 다음 명령어를 실행하십시오:
npm test
원본 버전과 패치된 버전 모두에서 익스플로잇을 시연하려면 아래 단계를 따르십시오.
취약한 버전의 tough-cookie를 설치합니다:
npm install [email protected] && node index.js
예상 출력:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
이는 객체의 프로토타입이 오염되었음을 나타내며, 원본 버전에 취약점이 존재함을 확인합니다.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
예상 출력:
EXPLOIT FAILED
이는 익스플로잇이 성공적으로 차단되었음을 보여주며, 프로토타입 오염 취약점이 수정되었음을 확인합니다.
tough-cookie v2.5.0의 프로토타입 오염 취약점을 해결하는 과정은 체계적인 단계를 거쳐 수정이 철저하고 효과적이도록 진행되었습니다. 아래는 제가 따른 접근 방식에 대한 개요입니다.
프로토타입 오염(CVE-2023-26136)을 조사하여 그 영향을 이해하는 것부터 시작했습니다. 이 취약점은 cookie.domain 속성을 통해 프로토타입 체인에 속성을 주입할 수 있게 하여 원격 코드 실행과 같은 보안 위험을 초래할 수 있습니다.
취약점 관련 GitHub 이슈와 토론을 탐색했습니다. 여기에는 프로토타입 오염을 방지하기 위해 Object.create(null)을 사용하는 tough-cookie v4.1.3의 수정 사항이 포함됩니다. 이를 통해 v2.5.0을 수정하는 데 필요한 변경 사항을 식별하는 데 도움이 되었습니다.
v2.5.0과 v4.1.3을 비교하여 차이점을 이해하고 필요한 변경 사항을 정확히 파악했습니다. 주요 수정 사항은 악용을 방지하기 위해 프로토타입이 없는 객체를 사용하는 것이었습니다.
MemoryCookieStore 클래스를 업데이트하여 {} 대신 Object.create(null)을 사용하도록 하여 프로토타입 오염이 발생하지 않도록 했습니다.
수정 사항을 확인하기 위해 단위 테스트를 작성하고, 패치된 버전에서 취약점이 어떻게 방지되는지 보여주는 익스플로잇 시연 스크립트(index.js)를 만들었습니다.
마지막으로 설치 및 테스트 지침을 포함한 수정 사항을 문서화하고, 패치된 버전(tough-cookie-2.5.0-PATCHED.tgz)을 쉽게 배포할 수 있도록 패키징했습니다.
v2.5.0에서 추가/수정된 파일
index.js: 취약점 및 수정 사항을 시연하는 메인 스크립트.lib/memstore.js: 프로토타입 오염을 방지하기 위해 수정된 MemoryCookieStore 클래스.test/ietf_data/parser.json: 테스트 데이터의 날짜를 업데이트하기 위해 수정됨.test/prototype_pollution_test.js: 프로토타입 오염이 수정되었는지 확인하는 단위 테스트.tough-cookie-2.5.0-PATCHED.tgz: tough-cookie 패키지의 패치된 버전.