Anthropic의 Claude Code, 요청 서명 원리 파헤치기

by DD
2개월 전
조회수 10

Anthropic의 Claude Code가 요청에 사용하는 CCH 해시(Hash) 메커니즘을 분석하여, Fast Mode 활성화를 위한 핵심 요소임을 밝힘.

Bun 런타임(Runtime) 내에서 실행되는 xxHash64 알고리즘을 사용하여 요청 본문의 무결성을 검증하며, JavaScript 문자열 불변성(Immutability)을 위반하는 방식으로 구현됨.

난독화(Obscurity)를 보안 모델로 채택하여, 알고리즘을 숨기고, 시드(Seed) 및 솔트(Salt) 값을 변경하는 방식으로 보안을 유지함.

오픈소스화(Open Source)된 Claude Code의 소스 코드를 통해 CCH 해시의 동작 방식을 파악하고, 호환 가능한 툴링(Tooling) 개발을 위한 정보를 제공함.

CCH 해시(Hash)의 동작 원리

Anthropic의 Claude Code는 요청 무결성(Request Integrity)을 위해 CCH 해시를 사용하며, 이는 Fast Mode와 같은 기능을 활성화하는 데 필수적이다. 특히, Bun 런타임(Runtime) 내에서 실행되는 xxHash64 알고리즘을 활용하여 요청 본문을 해싱(Hashing)한다. 이 알고리즘은 Zig로 작성되었으며, 컴파일된 바이너리 내에 직접 포함되어 있어, JavaScript 레벨에서 추적이 어렵다. 또한, CCH 해시는 요청 본문의 모든 부분을 포함하며, JSON 직렬화 시 키(Key) 순서에 따라 결과가 달라지는 점을 주의해야 한다.

Bun 런타임(Runtime)에서의 문자열 변조

Bun 런타임(Runtime)은 JavaScript의 문자열 불변성(Immutability) 원칙을 위반하여, 요청 본문의 문자열을 직접 수정한다. 이는 fetch() 함수 호출 후에도 원래의 body 변수가 변경되는 결과를 초래한다. 기술적으로 보면, JavaScriptCore(JSC) 엔진은 문자열 백킹 스토어를 공유하므로, const alias = body와 같이 참조를 생성하면 두 변수가 동일한 메모리를 가리키게 된다. 이로 인해, CCH 해시가 포함된 문자열이 예기치 않게 변조될 수 있다.

보안 모델로서의 난독화(Obscurity)

Anthropic은 CCH 해시 알고리즘을 숨기는 방식으로 보안을 유지하며, 이는 난독화(Obscurity) 기반의 보안 모델을 의미한다. 구체적으로, 알고리즘은 컴파일된 Zig 코드 내에 숨겨져 있으며, 시드(Seed) 및 솔트(Salt) 값은 문서화되지 않고, Claude Code 버전마다 변경될 수 있다. 이러한 접근 방식은 알고리즘 자체를 분석하기 어렵게 만들지만, 일단 알고리즘과 상수를 알게 되면, 재구현은 비교적 간단하다는 단점이 있다.

PoC 코드(Code)를 통한 이해

본 분석에서는 CCH 해시를 계산하고, Fast Mode 요청을 전송하는 PoC 코드(Code)를 제공하여, 실제 구현 방식을 보여준다. 이 코드는 OAuth 인증을 사용하며, CCH 해시를 계산하기 위해 xxhash 라이브러리를 활용한다. 또한, 요청 본문을 구성하고, 필요한 헤더(Header)를 설정하여, Anthropic API에 요청을 전송한다. 이 PoC 코드를 통해, 개발자들은 CCH 해시의 동작 방식을 직접 확인하고, 호환 가능한 툴링(Tooling)을 개발할 수 있다.

What's cch? Reverse Engineering Claude Code's Request Signing