64바이트 비트코인 거래

이 기사는 기계로 번역되었습니다
원문 표시

저자: BitMEX 리서치

출처: https://www.bitmex.com/blog/64-Byte-Transactions

요약 : 64바이트 비트코인 ​​거래는 블록의 머클 트리 해시 객체와 혼동될 수 있는데, 후자 역시 64바이트이기 때문입니다. 본 연구에서는 이러한 취약점을 이용하여 SPV(간소화된 결제 검증) 클라이언트가 실제로는 거래를 수신하지 않았음에도 수신했다고 오인하게 만드는 방법과 이로 인해 발생할 수 있는 다른 문제점들을 조사했습니다. 이러한 공격을 실행하는 것은 매우 복잡하며, 취약점의 심각성은 높지 않지만, 비교적 간단한 해결책이 있습니다. 소프트 포크 통해 모든 64바이트 거래에서 증인 데이터를 제거하면 됩니다.

진단

개요

이 글은 BIP 54 합의 정리 소프트 포크 에서 수정될 네 가지 보안 취약점에 대해 다루는 시리즈의 일부입니다. 이미 이 중 두 가지 취약점에 대해 설명했습니다.

  1. 타임 워프 어택 ( 중국어 번역 )
  2. 중복 거래 ( 중국어 번역 )

이 글에서는 소위 "64바이트 트랜잭션" 문제에 초점을 맞추겠습니다. 핵심은 비트코인 ​​블록 생성에 사용되는 머클 트리의 중간 노드 해시 객체의 길이 또한 64바이트라는 점입니다.

비트코인 거래의 해시값, 즉 "TXID"는 32바이트입니다. 비트코인 ​​블록의 머클 트리의 끝에서 두 번째 줄은 두 개의 TXID 해시값을 연결한 것으로, 총 64바이트입니다. 보안 취약점은 이 64바이트 데이터(두 해시값의 연결)가 64바이트 거래로 오인될 수 있다는 점에 있습니다. 예를 들어, 공격자는 정확히 64바이트 길이의 비트코인 ​​거래를 생성하여 라이트 노드를 속여 수신 결제를 승인하도록 유도할 수 있습니다. 아래에서는 이러한 공격에 관련된 몇 가지 단계를 살펴보겠습니다.

비트코인 블록의 머클 트리 다이어그램.

오래된

세르지오 레르너 제작 지도 : 사기 거래 발생 위치

세르

전반적으로, 공격의 복잡성을 고려할 때 이 취약점과 관련된 리스크 중간에서 낮음 수준이라고 판단합니다. 이는 더 심각한 것으로 간주되는 "시간 왜곡 공격"과는 대조적입니다. 그럼에도 불구하고, 이 취약점은 흥미로운 발견이며 수정될 필요가 있습니다.

한 거래의 ID를 다른 거래 안에 숨기기

이 취약점을 악용하는 가장 심각한 공격은 SPV(간소화된 결제 검증) 클라이언트를 사용하는 사용자를 속여 유효하지 않은 수신 거래를 확인하도록 유도하는 것입니다. 아래 다이어그램은 이 공격을 요약한 것입니다. 공격 단계는 다음과 같습니다.

  1. 공격자는 정확히 64바이트 길이의 유효한 비트코인 ​​거래를 생성했습니다. 이 수치에는 분리된 증거 데이터는 포함되지 않습니다.
  2. 공격자는 피해자에게 (예를 들어) 1000 BTC를 보내는 가짜 비트코인 ​​거래를 생성합니다. 예를 들어, 이 거래의 1000.002 BTC는 UTXO 세트에 존재하지 않는 가짜 입력값에서 가져온 것입니다.
  3. 공격자는 이 가짜 거래에 변경 주소를 할당한 다음, 변경 주소를 계속해서 바꿔가며 무차별 대입 검색을 수행합니다. 이렇게 하면 가짜 거래의 TXID(32바이트)가 실제 유효한 거래의 마지막 32바이트(64바이트)와 정확히 일치하게 됩니다.
  4. 이러한 연결 고리가 식별되면 공격자는 피해자의 라이트 클라이언트로 SPV 증명을 전송할 수 있는데, 이 증명에는 실제 블록 헤더의 머클 트리 루트에서 가짜 거래까지의 유효한 경로가 포함되어 있습니다. 피해자는 머클 트리의 최하위 계층이 바로 아래 계층이고 그 아래에 또 다른 거래가 있다고 잘못 판단하게 됩니다. 그러면 피해자는 1,000 BTC를 받았다고 믿게 되는데, 이는 공격자가 피해자를 속이기 위해 사용한 채굴자의 작업 증명입니다. 물론 풀 노드는 (여러 가지 이유로) 이런 방식으로 속지 않지만, SPV 노드는 속을 수 있습니다.

예시된 공격에 사용된 두 가지 거래

진단

- 참고: 이 공격에 대한 설명은 각각 2018년 6월 7일 에 발표된 피터 토드의 기사와 2018년 6월 9일 에 발표된 세르지오 레르너의 기사에 나와 있습니다. -

위에서 설명한 공격은 완전한 32바이트 SHA256 충돌 사례를 찾아야 하므로 계산적으로 불가능해 보입니다. 이미 이것이 계산적으로 불가능하다는 것은 알려져 있으며, SPV 클라이언트를 속이기 위해 가짜 블록을 채굴하는 것(현재 2^84번의 검색 필요)이 2^256번의 검색으로 해시 충돌을 찾는 것보다 훨씬 쉽습니다. 하지만 여기서 중요한 점은 64바이트 트랜잭션은 조정 가능하므로 순수한 무차별 대입 방식으로 32바이트를 일치시킬 필요가 없다는 것입니다.

64바이트 트랜잭션의 마지막 32바이트

물체 설명하다 길이 무차별 대입 검색에 필요한 길이
TXID를 입력하세요 이전 비트코인 ​​거래의 해시값입니다. 따라서 무작위로 생성되며 조작할 수 없습니다. 무차별 대입 공격이 필요합니다. 5바이트 (이 필드의 후반부) 5바이트
입력 인덱스 한 가지 방법은 수천 개의 출력을 가진 시작 거래(선행 거래)를 생성하는 것입니다. 이렇게 하면 입력 인덱스를 조작하여 (어느 정도) 가짜 거래와 충돌하도록 만들 수 있습니다. 그러나 이 방법은 비용이 많이 들고 구성하기 어려울 수 있습니다. 실제로는 무차별 대입 검색이 필요할 수도 있습니다. 4바이트 0
입력 길이 거래에 다른 제약 조건이 있기 때문에 조작하기 어렵습니다. 따라서 무차별 대입 검색이 필요합니다. 1바이트 1바이트
출력량 거래는 정확히 하나의 출력만 가질 수 있습니다. 그렇지 않으면 정확히 64바이트가 될 가능성이 낮습니다. 1바이트 1바이트
출력값 공격자는 원하는 만큼의 비트코인을 보낼 수 있습니다. 단, 그만큼의 자금을 보유하고 있고 이를 포기할 준비가 되어 있어야 합니다. 이 거래의 입력값이 1 BTC라면, 가능한 출력값은 1억 가지(1억 사토시 = 1 BTC)입니다. 따라서 이 영역은 (어느 정도) 조작 가능합니다. 하지만 이 영역을 완전히 조작하려면 약 2,100만 BTC를 소각해야 할 수도 있습니다. 8바이트 0
출력 스크립트 길이 거래에 다른 제약 조건이 있기 때문에 조작하기 어렵습니다. 따라서 무차별 대입 검색이 필요합니다. 1바이트 1바이트
출력 스크립트 공개 키 이 거래에 투입된 자금은 회수할 수 없기 때문에 이 분야는 쉽게 조작될 수 있습니다. 8바이트 0
잠금 시간 잠금 시간은 조작 가능하며, 예를 들어 블록 높이로 표현할 수 있고 최대값은 5억입니다. 따라서 여기에는 대량 의 엔트로피가 존재합니다. 4바이트 0
8바이트

따라서 위 표를 기준으로 볼 때, 공격자에게 가장 유리한 조건(조작 가능한 모든 필드를 사용하는 경우)에서 공격자는 단 8바이트의 충돌만 찾으면 됩니다. 8바이트, 즉 2^64번의 검색은 많은 컴퓨팅 자원을 필요로 하지 않으며, 일반적인 노트북 컴퓨터로도 빠르게 완료할 수 있습니다. 실제로 위에서 언급한 필드 중 어느 것도 완전히 조작된 것이 아니기 때문에 2^64번보다 약간 더 많은 검색이 필요할 수도 있습니다.

하지만 이 공격은 겉보기만큼 심각하지는 않습니다. 설정 과정이 매우 복잡하고, 수천 개의 출력을 포함하는 초기 거래가 필요하며, 고작 몇 바이트의 엔트로피를 조작하기 위해 수천 달러를 쏟아부어야 할 수도 있습니다. 게다가 SPV 지갑은 더 이상 널리 사용되지 않습니다. 고액 결제를 받을 것으로 예상되는 사람들은 수신 결제를 검증하기 위해 풀 노드가 필요하다는 것을 알고 있습니다. 그럼에도 불구하고, 특히 쉽게 구할 수 있는 도구들을 고려하면 이 공격은 여전히 ​​실행 가능하며, 따라서 주의를 기울이고 완화 리스크 모색할 필요가 있습니다.

메르클레겐 해시 충돌

이와 관련된 또 다른 비트코인 ​​취약점이 2012년 에 발견되어 수정되었습니다. 이 취약점은 유효한 블록과 무효한 블록, 두 개의 비트코인 ​​블록이 동일한 머클 루트 해시값을 가질 수 있다는 것이었습니다. 이러한 현상은 여러 가지 원인으로 발생할 수 있는데, 그중 하나는 64바이트 중간 해시 단계를 64바이트 트랜잭션과 혼동하는 것이었습니다.

핵심 문제는 비트코인 ​​노드가 무효 블록의 해시값을 저장하여 재검증을 피한다는 점입니다(이는 자원 낭비입니다). 그러나 유효한 블록과 무효한 블록의 해시값이 같을 경우, 무효 블록을 먼저 검증한 비트코인 ​​노드는 유효한 블록을 검증할 수 없게 되어, 작업증명이 더 많은 온체인 버리고 작업증명이 더 적은 경쟁 체인을 따르도록 오도될 수 있습니다. 이 문제는 2012년에 노드가 무효 블록의 해시값을 저장하기 전에 추가적인 검증 절차를 거치도록 함으로써 해결되었습니다.

이와 관련된 취약점은 2019년에 다시 불거졌는데, 비트코인 ​​개발자 수하스 다프투아르가 비트코인 ​​코어 0.13.0(2016년 11월 출시)에 유사한 버그가 의도치 않게 다시 도입된 것을 발견했고 , 해당 버그는 2017년 2월 에 수정되었습니다. 이 글에서 논의된 문제와 관련된 다른 취약점들도 존재하며, 아직 발견되지 않은 악용 사례도 있을 수 있습니다.

제안된 해결책

이 문제를 해결하는 데 소프트 포크 필요하지 않습니다. 적어도 SPV를 사칭하는 공격에는 필요하지 않습니다. SPV 지갑에서 사용하는 방식을 개선하면 됩니다. 예를 들어, 코인베이스에서 거래할 때와 동일한 머클 트리 레벨에서 항상 거래를 확인하는 방식으로 개선할 수 있습니다. 하지만 SPV 지갑들이 이러한 개선을 하지 않았고, 이 문제에 대한 이해도 부족합니다. 따라서 사용자들은 여전히 ​​취약한 상태에 놓여 있습니다.

현재 제안된 소프트 포크 솔루션은 BIP 54로, 증인 데이터가 제거된 후 64바이트 길이의 트랜잭션을 완전히 금지합니다. 이는 매우 간단하고 쉬운 해결책처럼 보입니다. 어쨌든 정확히 64바이트 길이의 트랜잭션을 생성할 이유가 없어 보이기 때문입니다. 예를 들어, 위의 예시에서 64바이트 트랜잭션이 발생한 것은 자금이 블랙홀로 유입되는 상황이었습니다. 수하스 다프투아는 2019년 이메일에서 전체 비트코인 ​​블록체인을 스캔한 결과 정확히 64바이트 길이의 트랜잭션을 발견하지 못했다고 언급했습니다. 이는 이전에는 발생하지 않았던 일을 금지하는 것이므로 리스크 과 논란의 여지가 적어 소프트 포크 더 원활하고 합의에 도달하기 쉽게 만들어 줄 것입니다. 그러나 오늘날에도 64바이트 트랜잭션이 존재할 가능성이 있습니다.

BIP54는 비트코인에 다소 특이한 새로운 규칙을 도입할 예정입니다. 63바이트와 65바이트 크기의 거래는 유효하지만, 64바이트 크기의 거래만 무효화됩니다. 하지만 거래에 대한 제한은 가능한 한 최소화하는 것이 바람직합니다.

출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
즐겨찾기에 추가
코멘트