
CVE-2025-65945에 대한 PoC (node-jws의 암호화 서명의 부적절한 검증)
이 문서는 node-jws 라이브러리의 서명 검증 우회에 대한 개념 증명(PoC)입니다. 이 버그로 인해 서버가 사용자 제어 데이터에서 HMAC 시크릿을 파생할 때 공격자가 유효한 JWT를 위조할 수 있습니다.
jws.createVerify() 함수는 HMAC 알고리즘을 사용할 때 시크릿이 실제로 제공되었는지 검증하지 않습니다. 앱이 JWT의 특정 값(예: kid 헤더)을 기반으로 시크릿을 조회하고 해당 조회가 실패하면, 빈 시크릿으로 검증하게 될 수 있습니다.
공격자는 다음과 같이 이 버그를 악용할 수 있습니다:
undefined를 반환하고, 이는 빈 문자열로 강제 변환됨이제 공격자는 누구든 사칭하거나 자신에게 관리자 권한을 부여할 수 있습니다.
이 문제를 해결하려면 3.2.3+ 또는 4.0.1+로 업그레이드하세요.
Bun이 설치되어 있는지 확인한 후 다음을 실행하세요:
# Install the vulnerable version
bun install [email protected]
# Run the exploit
bun run exploit.js
위조된 관리자 토큰이 유효한 것으로 승인되는 출력이 표시될 것입니다.
PoC는 다음을 수행하는 서버를 시뮬레이션합니다:
kid(키 ID) 헤더를 기반으로 시크릿 조회createVerify() 사용공격자는 kid: "non-existent-key"가 포함된 JWT를 생성하고 빈 시크릿으로 서명합니다. 서버가 이 키를 조회하려고 하면 undefined를 얻고 검증 스트림에 빈 문자열을 쓰게 되며, 위조된 토큰이 검증을 통과합니다.
# Upgrade to patched version
bun install [email protected]
# Run again - should fail now
bun run exploit.js
패치된 버전에서는 secret must be a string or buffer or a KeyObject 오류가 표시됩니다. 이 수정 사항은 HMAC 작업을 진행하기 전에 적절한 시크릿이 있는지 검증합니다.
코드가 다음과 유사하다면 영향을 받을 수 있습니다:
const decoded = jws.decode(token);
const secret = lookupSecret(decoded.header.kid); // might return undefined!
const verifier = jws.createVerify({
algorithm: "HS256",
signature: token,
});
verifier.secret.write(secret); // oops
verifier.secret.end();