비트코인 네트워크 공격
합의 메커니즘 공격하기 (Attacking the Consensus Mechanism)
비트코인을 훔치는 것이 가능한가? 불가능함
이유: UTXO(미사용 트랜잭션 출력)는 사용자의 공개 키 해시로 보호된다.
공격자는 UTXO를 소유하지 않으면 해당 트랜잭션을 유효하게 생성할 수 없다.
따라서, 비트코인을 도난하는 것은 기술적으로 불가능하다.
블록체인 네트워크에서 특정 참여자(지갑 소유자)를 차단하는 것이 가능한가? 완전한 차단은 거의 불가능하다.
상황 가정:
악의적인 노드가 Bob의 모든 트랜잭션을 차단하려고 시도한다고 가정하자.
악의적인 노드가 채굴 퍼즐을 해결하고 블록을 생성하는 경우 해당 노드는 Bob의 트랜잭션을 자신의 블록에 포함하지 않을 수 있다. 그러나 다음 블록을 생성하는 랜덤한 노드(정직한 노드라면)가 Bob의 트랜잭션을 포함할 가능성이 높다.
따라서, 특정 사용자를 네트워크에서 완전히 검열(censorship)하는 것은 거의 불가능하다. >> 모든 블록을 소유해야함.
Double Spending (이중 지출)
이중 지출이란?
디지털 화폐의 개념은 동일한 Txout(트랜잭션 출력)을 두 번 사용하는 문제를 방지해야 한다는 아이디어를 바탕으로 발전했다.
두 개의 트랜잭션이 동일한 Txout을 사용하려는 시도는 어렵지만, 완전히 불가능한 것은 아니다.
두 사람이 거래를 한다고 하자.
Alice: 비트코인 소유자.
Bob: 온라인 상점 운영자(음악 파일 판매).
상황:
Alice는 Bob의 온라인 상점에서 음악 파일을 구매하려고 한다.
Alice는 비트코인을 Bob에게 보내는 트랜잭션을 생성한다.
정직한 노드가 이 트랜잭션을 확인하고 자신의 블록에 포함시킨다.
Bob은 이 트랜잭션을 블록체인에서 확인하고, Alice에게 음악 파일을 전송한다.
현재 상황: 지금까지는 문제가 없다. 그러나 Alice는 Bob에게 보낸 비트코인을 이중 소비(Double Spend)시키려고 할 수도 있다.
Alice가 보낸 비트코인을 이중 지출하려면 어떤 옵션이 있을까?
파랑 블럭에는 Alice가 Bob에게 보낸 유효한 트랜잭션을 포함되어 있다.
정직한 노드가 이 블록을 제안한 후, Alice가 다음 블록을 제안할 차례가 됨.
Alice가 할 수 있는 옵션:
옵션 1: Block 3a 위에 새로운 블록 생성
Alice는 Block 3a 위에 새로운 블록을 쌓는다.
이 경우, Bob에게 보낸 트랜잭션이 이미 발생했음을 인정.
하지만 이는 Alice의 목표인 이중 지출(double spend)을 이끌어내지 못한다.
옵션 2: Block 2 위에 새로운 블록(Block 3b, 보라색 블록) 생성
Alice는 Block 2 위에 새로운 블록(Block 3b)을 제안한다.
이 블록에는 Bob에게 보낸 트랜잭션이 포함되지 않는다.
대신, 동일한 비트코인(Bob에게 보냈어야할)을 자신에게 보내는 트랜잭션을 포함한다.
이를 포킹(forking)이라고 부른다
이렇게 하면 이중 지출이 가능한가?
불가능하다.
동일한 UTXO를 사용하는 두 트랜잭션으로 유효한 블록이나 블록체인을 생성하는 것은 불가능하다.
이 경우 두 개의 현실(reality)이 만들어진다:
- Block 3a (파란색): Bob이 비트코인을 받았다는 현실.
- Block 3b (보라색): Alice가 동일한 비트코인을 자신에게 보냈다는 현실.
이 충돌은 어떻게 해결되는가?
다음 블록을 제안하는 노드가 결정:(51퍼 이상)
다음으로 선택된 노드가 새로운 블록을 생성하면서 문제를 해결할 수 있다.
새로운 노드는 어느 블록(Block 3a 또는 Block 3b) 위에 블록을 생성할지 선택해야 한다.
Longest Chain Rule: 모든 노드는 가장 긴 체인을 채택한다.
결과적으로, 하나의 현실(예: Block 3a 또는 Block 3b)만 유효하게 유지된다.
다른 블록(예: Block 3b)은 고아 블록(Orphan Block)이 되어 네트워크에서 무의미한 상태가 된다.
그러면 공격은 언제 성공시킬 수 있냐?
공격은 Alice가 네트워크를 설득하여 자신의 블록(Block 3b, 보라색 블록)이 유효한 블록이며, 가장 긴 블록체인에 포함되어야 한다고 믿게 만들면 성공한다. 즉 블록 4가 보라색 블록을 선택해야함.
스토리 상에서:
Block 3a(파란색 블록)은 Bob이 비트코인을 받은 트랜잭션을 포함한다.
하지만 개별 노드의 관점에서는 Block 3a와 Block 3b 둘 다 동일하게 유효(valid)하다고 간주될 수 있다.
그러면 Bob이 이중 지출 공격을 방지하기 위해 무엇을 해야 하는가?
Bob은 다음을 통해 자신이 공격당하지 않도록 해야 한다:
Alice가 보낸 트랜잭션이 포함된 블록(Block 3a)이 가장 긴 체인에 속하는지 확인해야 한다.
이상적으로는, Block 3a 위에 여러 개의 추가 블록(예: Block 4)이 쌓이는 것을 기다린 후, Alice에게 파일을 전송해야 한다.
요약
공격 성공 조건:
Alice가 자신의 블록(3b, 보라색)을 가장 긴 체인으로 만들면 공격 성공.
방어 방법:
Bob은 트랜잭션이 포함된 블록이 네트워크 상에서 가장 긴 체인에 속하며 여러 확인을 받았는지 확인해야 한다.
이러한 방식은 비트코인 네트워크의 6-Confirmation Rule(6번의 확인 후 트랜잭션이 최종적으로 확정됨)의 기초가 된다. 이는 이중 지출 공격의 성공 가능성을 낮추는 데 중요한 역할을 한다.
Replay Attack
Replay attack은 공격자가 동일한 트랜잭션을 네트워크에 여러 번 제출하여 매번 실행되도록 하는 공격이다.
상황:
Alice는 일정량의 비트코인을 보유하고 있다.
블록체인이 하드 포크를 통해 레거시 체인(Legacy Blockchain)과 새로운 체인(New Blockchain)으로 분리된다.
하드 포크 이후, Alice는 두 체인 모두에서 동일한 수량의 암호화폐를 보유하게 된다.
Alice의 트랜잭션:
Alice는 레거시 체인에서 Bob에게 5 비트코인을 전송하여 자신의 빚을 갚는다.
이 트랜잭션은 레거시 체인에 포함되고, Bob은 비트코인을 받는다.
Bob의 악용:
Bob은 이 트랜잭션을 새로운 체인에서도 복사하여 제출한다.
주소가 두 체인에서 동일하기 때문에, 새로운 체인의 채굴자들은 이 트랜잭션을 유효하다고 검증하게 된다.
결과적으로, Bob은 새로운 체인에서도 동일한 5 비트코인을 받게 된다.
공격 결과 Bob은 동일한 트랜잭션을 두 체인에 복사하여 Alice의 비트코인을 두 번 받는 데 성공한다.(개꿀)
이는 Replay Attack(재생 공격)의 전형적인 사례이다.
참고:
하드 포크 이후 네트워크에 새로 참여한 사용자는 이 공격에 취약하지 않다.
하드 포크 이후 생성된 주소는 트랜잭션 기록이 없으므로 재생 공격의 대상이 되지 않기 때문.
해결책:
하드 포크 시 새로운 체인과 레거시 체인 간의 트랜잭션 서명 분리: 새 체인에서만 유효한 트랜잭션 서명 방식을 도입하여, 공격을 막는다.
고유한 주소 생성: 하드 포크 이후 두 체인에서 동일한 주소를 사용하지 않도록 설계한다.
51% Attack
51% 공격은 블록체인에서 발생할 수 있는 가장 최악의 시나리오이다.
이는 네트워크의 해시파워의 50% 이상을 단일 엔티티가 장악하고 이를 악의적으로 사용할 때 발생한다.
51% 공격으로 가능한 일:
- 히스토리 재작성 (History rewriting): 공격자는 가장 높은 누적 작업량을 가진 블록체인을 생성하여 내용을 정의할 수 있다.
- 특정 주소나 사용자의 차단/DoS 공격 수행.
- 모든 채굴 보상 수집.
- 성공적인 이중 지출(double spending) 공격 수행.
- 이 과정에서 많은 블록이 고아 블록이 된다.
51% 공격의 한계:
- 새로운 코인을 생성할 수 없음: 새로운 비트코인을 발명하거나 존재하지 않는 돈을 만들 수는 없다.
- 유효하지 않은 블록 또는 트랜잭션 제안 불가: 유효하지 않은 트랜잭션은 네트워크에서 거부된다.
- 공격자의 경제적 동기:높은 해시파워를 장악한 공격자는 네트워크에 막대한 투자를 했기 때문에, 네트워크를 파괴할 경제적 동기가 없다.(=대주주가 숏치는 상황)
Selfish-mining Attack
이기적 채굴 공격은 공격자가 두 개의 블록을 연속으로 제안할 확률을 악용하여 네트워크의 자원을 낭비시키고 자신의 이익을 극대화하려는 공격이다.
공격 방법:
공격 노드가 새로운 Block 3A를 발견하지만, 이를 네트워크에 제안하지 않는다.
이후 두 가지 가능성이 발생한다:
Possibility A: 공격 노드가 Block 4A를 발견, 공격자는 Block 3A 위에 Block 4A를 생성한다.
그러나 네트워크는 여전히 Block 2에서 작업 중이다.
이후 네트워크가 Block 3B를 발견했을 때: 공격자는 Block 3A와 Block 4A를 동시에 공개한다.
그 결과로 Block 3B는 고아 블록(orphan block)이 된다.(가장 긴 체인을 연결하니까)
네트워크는 낡은 체인에서 작업한 것이 되어 연산 자원이 낭비된다.
Possibility B: 네트워크가 Block 3B를 제안한 경우
네트워크가 Block 3B를 먼저 제안하고, 공격자가 Block 4A를 찾지 못한 상황.
이 경우, 공격자는 즉시 Block 3A를 공개하여 네트워크가 Block 3A를 선택할 확률(α)에 의존한다.
만약 네트워크가 Block 3A를 채택하면 공격자가 이익을 얻고 그렇지 않으면 실패한다.
해시파워의 최소치: 공격이 성공하려면 공격자가 α=50%인경우 해시파워 25퍼, α=0%인 경우 33퍼의 해시 파워가 필요하다.
실제로 관찰되지는 않았지만, 이론적으로 실행 가능하다.
만약 α=100%라면?
공격자는 네트워크를 완전히 통제하므로 해시파워가 최소 50% 이상 필요하다.(51퍼 어택)