
비트코인 ECDSA 구현의 CVE-2025-29774 및 SIGHASH_SINGLE 결함에 대한 암호해독적 연구로, nonce 재사용 및 서명 위조를 통해 개인 키 복구가 가능하여 분실된 지갑 접근을 가능하게 합니다.
이 연구 논문은 비트코인 프로토콜의 디지털 서명 구현에서 발견된 주요 취약점, 즉 Phantom Signature Attack (CVE-2025-29774) 및 근본적인 SIGHASH_SINGLE 처리 오류에 대한 포괄적인 암호학적 분석을 제시합니다. 본 연구는 트랜잭션 서명 메커니즘에서 암호화 프리미티브의 잘못된 처리로 인해 암호화폐 지갑 소유자의 개인 키가 사용자 모르게 완전히 노출될 수 있는 조건이 발생함을 보여줍니다. 이 공격은 원래 Satoshi 클라이언트의 레거시 버그를 악용합니다. 이 버그는 트랜잭션 입력과 출력의 수가 일치하지 않을 때 서명을 거부하는 대신 시스템이 "1"(uint256)의 범용 해시 값을 반환하는 결함입니다.
연구의 실제 부분에서는 KeyFuzzMaster 암호화 도구를 사용하여 서명 검증 코드, 타원 곡선 연산 및 트랜잭션 해싱 함수의 취약점을 체계적으로 식별합니다. secp256k1 곡선에서 ECDSA 알고리즘의 nonce(k-파라미터) 재사용을 통한 개인 키 복구를 위한 수학적 공식이 제시됩니다. ECDSA(Elliptic Curve Digital Signature Algorithm) 알고리즘의 암호화 프리미티브가 secp256k1 타원 곡선 위에서 논의됩니다. 비트코인의 디지털 서명은 지출 승인, 부인 방지 및 트랜잭션 무결성 보장의 세 가지 기능을 수행합니다.
그러나 하위 호환성을 유지하기 위한 레거시 아키텍처 결정을 고수한 결과, 잠재적으로 치명적인 결과를 초래할 수 있는 미묘한 암호화 취약점이 발생했습니다. 그중에서도 SIGHASH_SINGLE 버그 가 두드러집니다 — 이는 원래 Bitcoin Core 구현에서 상속되어 네트워크 합의에 통합된 서명 해시 생성 메커니즘의 근본적인 결함입니다.
| CVE 식별자 | 구성 요소 | CVSS 점수 | 심각도 |
|---|---|---|---|
| CVE-2025-29774 | xml-crypto / SIGHASH_SINGLE | 9.3 | 심각 |
| CVE-2025-29775 | xml-crypto DigestValue 우회 | 9.3 | 심각 |
| CVE-2025-48102 | GoUrl Bitcoin Payment Gateway (저장형 XSS) | 5.9 | 보통 |
| CVE-2025-26541 | CodeSolz WooCommerce Gateway (반사형 XSS) | 6.1 | 보통 |
비트코인은 SECG(Standards for Efficient Cryptography Group) 표준에 의해 정의된 secp256k1 타원 곡선을 사용합니다. 이 곡선은 유한체 위의 Weierstrass 방정식으로 정의됩니다:
곡선 방정식:
y² ≡ x³ + ax + b (mod p)
secp256k1의 경우:
y² ≡ x³ + 7 (mod p), 여기서 a = 0, b = 7
secp256k1 곡선의 매개변수는 튜플 T = (p, a, b, G, n, h)로 결정됩니다:
secp256k1 매개변수:
p = 2²⁵⁶ − 2³² − 977 (유한체를 정의하는 소수)
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
(곡선 점 그룹의 위수, 생성자 G의 정수 위수)
G = (Gₓ, Gᵧ) — 고정된 기준점(생성자)
ECDSA 알고리즘은 개인 키 d 를 사용하여 메시지 M에 대한 서명을 생성합니다. 서명 과정은 다음과 같은 수학적 연산을 포함합니다:
1단계: 임의의 nonce k 생성
암호학적으로 강력한 난수 k ∈ [1, n-1] 선택
2단계: R 점 계산
R = k × G (생성자 점의 스칼라 곱셈)
3단계: 매개변수 r 계산
r = Rₓ mod n (점 R의 x-좌표를 n으로 모듈로 연산)
4단계: 매개변수 s 계산
s = k⁻¹ × (H(M) + r × d) mod n
결과: 서명 (r, s)
여기서 H(M)은 메시지 M의 해시(비트코인에서는 이중 SHA-256 사용), d는 소유자의 개인 키입니다.
공개 키와 개인 키 간의 관계는 다음 관계식으로 결정됩니다:
Q A = d A × G
여기서 는 공개 키(곡선 위의 점), 는 개인 키 (256비트 정수), 는 곡선 생성자입니다.QAdAG
비트코인 프로토콜은 서명된 해시에 포함될 트랜잭션 구성 요소를 결정하는 여러 SIGHASH 유형 (서명 해시 유형)을 제공합니다: