51% 공격? 체인 재구성 공격? 이중 지불 공격?
권법이 난무하는 블록체인 생태계
몇 달전 비트코인골드의 51% 공격에 이어 지난 1/6일에 이더리움 클래식에서도 51% 공격이 발생했습니다. 코인 시세도 흉흉한 요즘에 웬 날벼락이랍니까? 무슨 공격법이길래 보안이 완벽하다는 블록체인이 해킹당한다는 것일까요? 체인 재구성(chain reorganization)은 무엇이며, 이중 지불을 방지했다고 한 블록체인들은 왜 번번히 이중 지불이 행해질 수 있는 것 일까요? 중앙 정부가 없는 블록체인 생태계에서 난무하는 이런 공격법을 이해하는 것이 여러분의 자산을 안전하기 지킬 수 있는데 도움이 될 듯하여 이번 시간에는 51% 공격에 대해 파헤쳐 보도록 하겠습니다.
51% 공격은 어떻게 이루어지는가?
51% 공격이란 네트워크 전체 해시 파워의 절반 이상을 확보하여 네트워크를 교란시키는 공격법을 말합니다. 그러면 어떻게 네트워크를 교란시킬 수 있는지 차례차례 알아봅시다. 이 공격을 위해서는 당연히 네트워크 전체 해시 파워의 50% 이상을 확보해야 합니다. 성능 좋은 ASIC 장비 등을 도입하여 이더리움 클래식 네트워크에 접속합니다. 이들은 이 높은 해시 파워로 마이닝을 시작하지만 프로그램을 수정하여 마이닝 한 블록들을 네트워크에 전파(broadcast)하지 않습니다. 혼자서만 블록들을 연이어 생성합니다. 이더리움 클래식 네트워크에서는 정상적으로 블록을 생성하고 있을 것입니다. 하지만 이들의 장비들은 네트워크의 전체 해시 파워보다 높기 때문에 더 빠른 속도로 블록을 생성합니다.
이 상태에서 공격자들은 정상 네트워크에서 트랜잭션을 발생시킵니다. 가령 10,000 ETC를 특정 거래소인 ‘허술해’ 거래소에 입금을 합니다. 이 입금 트랜잭션이 7249346번 블록에 기록되었다고 합시다. 허술해 거래소는 아무것도 모른 채 평소대로 30 컨펌이 되면 입금처리를 해줍니다. 공격자들은 30 컨펌(약 7분 30초)을 기다렸다가 이더리움 클래식을 팝니다. 이 시점에서 그들의 마이닝 장비에서의 블록은 7249380번까지 생성되었고, 정상 네트워크에서는 7249376까지 생성되었다고 하면 이들이 더 긴 체인을 가진 것이 됩니다. 중요한 부분은 본인들이 만든 블럭에는 10,000 ETC 입금 내역이 없다는 점입니다. 이 더 긴 체인을 정상 네트워크에 전파를 하면 마이너들은 7249343 블럭을 조상으로 하는 두 개의 체인을 가지게 되고, 이중 기존의 짧은 체인을 버리게 됩니다(긴 체인을 채택한다는 프로토콜에 의해). 이 과정을 체인 재구성이라 부릅니다. 체인 재구성은 정상 상황에서도 발생할 수 있습니다. 거의 동시에 서로 다른 마이너에 의해 블록이 생성되면, 한 두 블럭 정도는 재구성되는 경우는 빈번히 발생됩니다. 어쨌든 이렇게 체인이 재구성되면 기존 체인에 있던 트랜잭션(10,000 ETC를 비롯한 정상 트랜잭션들)은 무효화됩니다. 그러면 이 허술해 거래소는 입금을 취소해야 하는데, 벌써 공격자들이 코인을 팔아버린 뒤라 취소할 수도 없는 상황입니다. 블록체인 입장에서는 10,000 ETC 거래는 없었던 거래가 됩니다. 즉 공격자들의 계좌인 0x1234에는 다시 10,000 ETC의 잔고가 생기는 것이죠. 여기서 중요한 것은 공격자들이 만든 체인은 악의적인 체인이지만 블록체인 입장에서는 정상적인 체인이라는 점입니다. 블록들에 비정상적인 트랜잭션이 없다면 말이죠. 그런 후 공격자들이 이 정상(공격자들이 만든) 블록체인 위에서 다시 10,000 ETC를 송금하면 공격자들의 입장에서 이중 지불을 하는 샘입니다. 블록 체인 관점에서는 이중 지불이 없이 여전히 정상적인 트랜잭션들로 구성된다는 점에 주목해야 합니다. 왜냐하면 처음 10,000 ETC 전송 트랜잭션은 블록체인 상에서 사라졌기 때문이죠. 결국 손해는 허술해 거래소가 입게 됩니다.
보통 체인 재구성 공격이 발생하면 새로 구성된 체인은 한 마이너에 의해 채굴된 것들입니다. 실제로 이더리움 클래식 익스플로러를 보면, 1/6일부터 수십개에서 백개 이상까지 한 마이너가 연속해서 채굴한 정황을 발견할 수 있는데, 정상적인 네트워크 상황에서는 발생하기 힘든 사례입니다.
그래서 내 돈을 지키려면?
일반 사용자 입장에서는 이럴 경우 어떻게 대처해야 할까요? 입출금을 될 수 있으면 안하는게 최선이지만, 그중에서도 특히 입금 받을 때 주의를 요합니다. 상대방으로부터 코인을 받았더라도 체인 재구성이 힘들 만큼 충분히 시간이 지난 후에 입금 처리를 해야 합니다. 내가 받은 코인이 체인 재구성에 의해 블록체인 상에서 취소가 될 수 있기 때문입니다. 거래소들이 입출금을 막거나 입금 컨펌을 늘리는 것은 이 때문입니다. 그러면 다른 POW 블록체인들도 이런 위험이 있을까요? 비트코인은 이런 공격이 가능하려면 어마어마한 해시 파워가 필요하고 이를 전력 비용으로 환산하면 엄청난 돈이 들기 때문에 일반적으로 안전하다고 믿고 있습니다. 즉, POW 블록체인들은 해시 파워가 안전성을 나타낸다고 볼 수 있습니다. POS 방식의 블록체인이 자산 가치가 낮아지면 네트워크 안정성이 떨어지듯이 POW도 네트워크 해시 파워가 낮으면 이런 공격의 위험성이 커지는 것입니다.
블록 생성 시간에 대해서
51% 공격 사례에서 알 수 있듯이 사실 블록 생성 시간은 큰 의미가 없습니다. 비트코인이 10분이고 이더리움이 15초라고 해서 이더리움이 더 빨리 트랜잭션 처리를 한다고 볼 수는 없습니다. 왜냐하면 이와 같은 체인 재구성 공격에 대비해 일정 컨펌이 지난 후에 입금을 처리해야 하기 때문에 블록체인에 얼마나 빨리 기록되느냐보다는 얼마나 빨리 확정지을 수 있느냐가 더 중요한 문제이기 때문입니다. 이 확정 시간은 블록 생성 시간에 좌우 된다기 보다는 결국 해시 파워가 얼마나 큰가에 영향을 받습니다. 해시 파워가 커서 체인이 안정될 수록 확정 시간을 짧게 잡을 수 있습니다.
분산 네트워크의 숙명
여기까지 51% 공격에 대해 살펴보았습니다. 51% 공격 가능성은 POW 방식의 블록체인이 해시 파워가 낮으면 발생할 수 있는, 태생부터 갖고 있던 취약점입니다. 비트코인캐시와 비트코인 SV가 분리될 때도 이와 같은 공격이 이슈가 되었습니다. 비트코인캐시 진영에서 이 공격에 대한 방어를 하기 위해 어떤 코드를 넣었는데, 포크 직후에 첫 번째로 만든 블럭을 체크포인팅하는 기능이었습니다. 즉 체인 재구성이 발생하더라도 이 포크 직후 첫 번째 블럭이 없는 체인은 정상 체인으로 취급하지 않는다는 코드이죠. 이는 꽤 과격한 방법입니다. 블록체인이 아름다운 건 인위적이지 않은 간결한 프로토콜 덕분입니다. 예외 규칙들이 많을 수록 그 프로토콜은 좋은 프로토콜이 되지 못합니다.
한편 다른 합의 프로토콜을 사용하는 블록체인들은 이런 문제로부터 안전할까요? 형태는 다르지만 네트워크의 안정성은 참여율에 크게 의존한다는 점은 모든 블록체인들이 안고 있는 숙명입니다. POS는 지분이 블록 생성 권한을 가집니다. 당연히 자산 가치가 떨어지면 적은 돈으로 네트워크 교란이 가능해 집니다. 이오스나 트론 같은 위임지분 방식(dPOS)의 체인들도 참여율이 낮아 스테이킹 규모가 작다면 악의적인 블록 생산자(block producer)들이 생겨날 위험이 커집니다. 이런 위험을 인위적인 규칙과 코드로 막는 것은 전혀 탈중앙적이지 않습니다. 모두가 만족할 수 있는 합의 규칙이란게 쉽게 만들어질 수 없기 때문입니다. 반대하는 세력이 생겨나면 블록체인은 또 쪼개지기 마련입니다. 가격을 떠나서 블록체인이 장수하려면 좋은 철학과 탈중앙 가치를 잘 지켜나가야 하는 이유가 여기에 있습니다. 아울러 코인없는 블록체인을 생각할 수 없는 이유도 이 문제로부터 짐작해 볼 수 있을 것입니다.