[비트코인 시리즈 칼럼] (2) 첫 번째 약점, 거래의 변동성

in #kr7 years ago (edited)

비트코인은 지금 아주 중요한 갈림길에 서있습니다.

최근 비트코인은 하드/소프트 포크에 대한 걱정이 확산되며 가격 급등락을 반복하고 있습니다.

본 시리즈 칼럼은 이 이야기가 어디서 나온 것인지, 포크(Fork)가 왜 필요 것인지를 다룹니다.

궁극적으로 이것이 제 2의 '이더리움 클래식 사태'를 발생시킬지에 대해 논합니다.


(*내용 수정 관련. 코멘트를 주신 덕분에 3-A를 다소 수정했습니다)
안녕하세요, 원작자입니다.
일단, 혼란을 야기한 것 같아 대단히 죄송합니다. 
글에서 설명한 OpenSSL의 취약점은 현재 해결된 것이 맞으나, 전자서명의 변동성 관련 문제는 특수/예외 상황에 대해 100% 해결되지 않은 상태라 크게 상관 없을 것이라 판단하고 글을 쓰다보니 잘못 전달될 여지가 있었을 것이라 생각됩니다.
원래는 보다 큰 문제인 스케일링 문제와 변동성 문제를 함께 배치하려 했습니다.
상대적으로 작은 버그와 좀 더 심각한 가상화폐 전체의 고민의 형태로 글을 작성했었는데, 너무 길어져 마이너한 문제인 변동성을 따로 떼어내다보니 오히려 그 심각성이 쓸데없이 과장되는 역효과가 난 것 같네요.
혼란을 줄이기 위해 내용을 수정하도록 하겠습니다. 
언급될 문제는 100% 해결된 것은 아니고, SegWit에서 고치려고 하는 점이기에 문제에 대한 설명은 유효합니다.
하지만 예방이 불가능한 문제는 아니며, 글의 초점 또한 취약점을 다소 과하게 강조하고 있을 수 있음에 유의해주시기 바랍니다.

0.

안녕하세요. 저는 현재 서울대학교에서 경영학과 컴퓨터 공학을 복수전공하고 있습니다.

CoinPresso의 영미권 서비스를 담당하고 있는 동시에, 해외 토픽들을 최대한 빠르게 수집하고 정리해 배포하는 일을 하고 있습니다.

이번에는 코앞으로 다가온 비트코인의 포크(Fork) 문제에 관한 칼럼을 작성합니다.

시장에서 굉장히 뜨거운 논란거리이지만, 기술적 어려움에 가려져 온갖 유언비어가 난무하고 있는 상황입니다.

이해하지 못할 어렵고, 주관적인 정보는 일반 투자자분들께 독이 될 수 있습니다.

두번째, 다음 세번째 칼럼에서는 비트코인이 가지고 있는 두 가지 버그들에 대해서 논해보려 합니다.

작성자 : 김현빈 (CoinPresso VP / hbk960709@naver.com) 

최종 편집 : 정동건 (CoinPresso CEO / ceo.jdg@gmail.com)

1. 지난 이야기

지난 칼럼에서 저희는 비트코인이 화폐성을 가지기 위해선 어떤 성질을 지녀야 하는지, 그리고 이를 달성함에 있어 블록체인과 해싱 알고리즘이 어떻게 작동하는지 알아봤습니다.

(https://steemit.com/kr/@coinpressokr/1)

요약하자면 이렇습니다.

비트코인은 모두가 볼 수 있되 아무도 건드릴 수 없는 시스템을 만들기 위해 블록체인이라는 개념을 도입했습니다.

블록과 이 블록들의 연결상태인 체인을 만들고 확인하는 사람들을 채굴자라 부릅니다.

채굴작업은 컴퓨터 연산 능력을 보유한 채굴자들이 조건에 맞는 블록의 해시 값을 찾아내는 것입니다.

가장 먼저 올바른 해시값을 계산해낸 채굴자는 거래 수수료와 새로 발행된 비트코인을 모두 얻게 됩니다.

이 모든 과정은 톱니바퀴처럼 맞물려 있으며, 어느 하나라도 무너지면 연쇄적으로 시스템 전체가 작동을 멈추고, 사용자들의 신뢰를 잃게 됩니다.

하늘에서 황금 비가 내리면 더 이상 금이 귀중하지 않듯, 비트코인도 희소성이 붕괴할 여지가 있다면 몰락하겠죠.

그리고, 성장한 비트코인은 이 문제들에 대해서 이제 진지하게 고민해야만 합니다.

2. 문제는 어디에서?

최초의 가상화폐인 비트코인은 참조할 선례가 없었기 때문인지 완벽하지 않습니다.

안타깝게도 비트코인의 근간이 되는 두 기술 (블록체인, 해싱) 모두에서 문제가 발생할 수 있습니다.

우선 특정 화폐가 많은 사람들에 의해 사용되는 경우 블록체인이 점점 증가하는 거래량을 감당하지 못해 ‘스케일링 문제’가 발생합니다.

비트코인의 전송 속도가 점차 느려지고 있다는 얘기는 들어보셨거나, 직접 경험해보셨을 겁니다.

또한 해싱 알고리즘은 결과의 유일성이 보장되지 않아 ‘거래의 변동성(Transaction Malleability)’이 발생할 수 있습니다.

다시 말해, 아주 작은 확률이지만 발생한 거래를 일어나지 않은 일로 변조할 수 있습니다. 

이 둘 중 거래의 변동성은 비트코인의 알고리즘 결함에 의해 발생한 좀 더 지엽적인 문제입니다.

하지만 스케일링 문제는 비트코인 뿐만 아니라 모든 블록체인이 자리잡기 위해서 반드시 해결돼야 할 보편적 이슈입니다.

실제로 이더리움도 최근 ICO 열기, 사용자 급증 등으로 거래가 불안정해지는 몸살을 겪고 있으며, 다른 코인들 또한 이 문제에서 자유롭지 못합니다.

오늘은 그 중 좀 더 작은 문제인 거래의 변동성에 대해 설명해보려고 합니다.

어떤 원리로 발생하는지, 영향은 무엇인지, 해결책으로는 어떤 것들이 제시되고 있는지 살펴보겠습니다.

3. 거래의 변동성 : 발생하는 원리

거래의 변동성 공격은 해시값 연산 알고리즘의 빈틈을 악용해 거래의 해시값을 바꿔 거래가 일어나지 않은 것처럼 보이게 할 수 있는 일종의 버그입니다.

비트코인 또한 사람이 설계했고, 이 정도의 파급력을 가질 것이라고 개발자조차 생각하지 못했기 때문에 치밀하게 만들어지지 못한 부분이 있죠. 

A. 큰 위협은 아니지만…

거래의 변동성에는 수많은 형태가 존재할 수 있습니다.

사실상 한 거래가 여러 형태의 해시를 가질 가능성이 조금이라도 있다면 악용할 여지가 생깁니다.

이러한 현상이 나타날 수 있는 대부분의 상황은 굉장히 특수합니다.

비트코인 코어 개발자들은 이런 상황들을 "edge cases"라 부르죠.

본 칼럼에서는 이러한 edge case들 중 가장 널리 알려져 있고, 가장 논란이 되었던 디지털 서명의 조작 가능성을 악용한 변동성 사례를 다루도록 하겠습니다.

유의할 점은, 본 취약점은 비트코인 레퍼런스 클라이언트 0.8버전에서 재확인 과정을 추가하면서 해결되었고, BIP66 소프트 포크에 의해 블록체인 내에서도 막혔다는 점입니다.

그럼에도 불구하고 해당 예시를 쓰는 것은, 관련 정보가 가장 많으며, 이해하기에도 가장 쉽다고 생각하기 때문입니다.

또한 해당 취약점이 막혔다고 거래의 변동성이 완전히 해결된 것은 아닙니다.

아직도 작은 버그들은 존재하고, 아무리 특수한 상황에 제한될지라도 문제가 생길 여지는 있기에 원천 차단이 필요한 상황입니다.

치명적인 구조의 오류가 아닙니다.

비트코인의 근본적인 개념에 영향을 주는 사안은 절대 아니죠.

소프트웨어 상의 작은 버그들, 그리고 그로 인해 발생하는 귀찮음에 가깝습니다.

대신 교훈은 줄 수 있습니다.

아주 작은, 특수한 문제들조차 악용될 수 있다는 점. 그러기에 언제나 조심해야 한다는 점.

이 공격 방식은 굉장히 기술적인 이야기가 많이 들어가기 때문에 직관적으로 받아들이시기 어려울 수 있습니다.

그러기에 최대한 기술적인 부분을 배제하며 간단하게 비유와 함께 설명해드리겠습니다.

B. 기본적 원리

지난 칼럼에서 알아보았듯이, 블록체인의 해시는 여러 변수를 이용한 연산을 수반합니다.

이전 블록의 해시값, 거래의 대상이 되는 두 지갑, 거래 금액, 시간, PoW의 난이도 상향을 위한 무의미한 데이터(X라는 변수로 이전 칼럼에서 소개되었습니다) 등의 다양한 input들을 이용해 output을 뽑아냅니다.

거래 해시의 유일성을 보장하기 위해 블록체인은 거래를 차별화(다시 말해, 해시 값이 중복되지 않게)할 수 있는 데이터를 최대한 많이 사용하는거죠.

(input이 다양해 질 수록 output이 다양해지죠) 

그런데 이 값들이 전부는 아닙니다.

해싱 알고리즘은 디지털 서명이라는 또 다른 input값도 받아들여 연산을 합니다.

우리가 일상 생활에서 영수증이나 문서에 서명을 하듯이 디지털 거래에 ‘전자 서명’을 하기 위해 포함된 데이터죠.

아마 웹사이트 등에 로그인 하실 때 얼핏 본 적이 있으실 겁니다.

여기서 문제가 발생합니다.

원래대로라면 전자서명은 상식적으로 하나의 형태만을 가지고 있어야 합니다.

그러나 이 서명을 승인하기 위해 블록체인이 사용하고 있는 OpenSSL이라는 수단은 전자서명을 엄밀하게 체크하지 않습니다.

쉽게 말하면 너무 이상한 형태의 서명이 들어오지만 않는다면 문제가 없다고 판단하는 것이죠. 

한 거래에 대해 '전자서명'이라는 input을 교묘하게 바꿔가며 여러 해시값을 생성할 수 있게 되버립니다.

대충 검사하는 OpenSSL 때문에 발생하는 문제이죠.

이렇게 대충 통과된 각기 다른 서명들로 인해 해시의 가장 큰 특성 중 하나인 유일성이 깨져버리는 것이죠.

어떻게 이게 치명적일 수 있는지 의문이 생기실 겁니다.

그리고 과연 현실적인 얘기일까요?

이제 이 취약점이 구체적으로 악용되는 사례에 대해 얘기해보겠습니다.

4. 거래의 변동성 : 구체적 사례

구체적 사례를 다루기에 앞서, 위의 그림에서 생소한 걸 발견하셨을 겁니다.

바로 'TxID' 입니다.

거래의 변동성이 문제를 일으킬 시나리오는 크게 세 가지를 생각해보기에 앞서 이에 대한 개념을 잠시 짚고 넘어가겠습니다.

거래의 정보들을 통해 해시값이 만들어지게 됩니다.

이와는 별도로, 거래 자체를 쉽게 검색하기 위해 Transaction ID라는 값이 만들어지죠.

뒤에 나올 내용을 요약하자면, TxID가 만들어지기 위해 필요한 변수들을 교란시켜, 거래의 정체성(identity)가 망가질 수 있다는 내용입니다.

세 상황 모두 원래 의도한 거래의 해시값이 변형되어 거래의 정상적인 진행 여부가 불분명해진다는 점이 핵심입니다.

예시를 보며 그림과 함께 자세히 설명해드리겠습니다.

A. 악의없는 개인의 실수

JDG는 대형 투자자입니다.

그는 사업 규모가 커지면서 자산관리 프로그램 BitPresso를 만들어 간편하게 거래합니다.

그런데, 그가 코딩을 하면서 실수를 저질렀습니다.

BitPresso는 비트코인 네트워크에 거래 정보를 전송할 때 전자서명을 검증하지 않습니다.

이 오류에 의해 그가 직원 HBK의 월급 1.01 비트코인을 전달할 때 잘못된 전자서명이 입력되었습니다.

그러나 블록체인 네트워크로 올라간 이후에는 이 곳에서 잘못된 형태의 서명을 바로잡는 알고리즘이 작동합니다.

BitPresso가 전달한 JDG의 잘못된 서명은 올바른 형태로 고쳐집니다.

문제는, JDG가 원래 작성한 거래와 네트워크 위에서 수정된 서명에 의해 만들어진 거래는 전자서명이라는 input이 엄연히 다릅니다.

따라서, 같은 거래임에도 불구하고 다른 TxID가 생성되고, 따라서 BitPresso는 네트워크 상에서 실제로 발생한 실제 거래의 TxID를 인식하지 못합니다.

1.01개의 비트코인이 인출되지 않았다고 착각하죠.

그러나 실제로 네트워크 상에서는 거래가 이뤄졌습니다.

JDG는 BitPresso의 장부를 확인하고 봉급을 다시 또 전송하거나, 아니면 프로그램만 믿고 자신의 잔액이 생각보다 많다고 착각할 수도 있습니다.

이러한 일이 반복된다면, 사용자에게는 악몽일 것입니다.

비트코인을 비롯한 블록체인은 탈중앙화적인 성향을 띄고 있습니다.

그렇기 때문에 많은 자율성을 누릴 수 있습니다.

예를 들면, 본인이 작성한 컴퓨터 코드로 어떤 거래를 하더라도 괜찮습니다.

하지만, 자유는 책임을 필요로 하죠.

저런 실수들은 되돌리기 힘들고, 고스란히 본인이 감당해야합니다.

B. 개별 거래에 대한 악의적 공격

JDG는 거래소를 운영합니다. 

HBK는 거래소 사용자입니다.

HBK는 쉽게 돈 벌 궁리를 하던 중, JDG가 운영하는 거래소를 노립니다.

HBK는 10 비트코인을 거래소에서 구매하고, 비트코인 출금을 요청합니다.

이에 JDG는 요청된 수량의 비트코인을 HBK의 개인 지갑으로 전송합니다.

이 거래는 채굴자들이 마이닝할 수 있게 비트코인 네트워크 상으로 올려지죠.

핵심은, 채굴이 완료되어 거래가 확정되기 전까지는 JDG와 HBK 양측 모두 거래의 성립 여부를 확인할 수 없다는 점입니다.

2017.7.1 / 13:52:17 / JDG의 거래소 지갑 주소 / HBK의 지갑 주소 / 10 BTC / JDG의 전자서명

생성 TxID : JDG10B-1

이 때, HBK는 비트코인을 받은 적이 없다고 주장하기로 합니다.

HBK는 거래가 블록체인 상에서 확정되기 이전에, 동일한 거래 정보를 포함하되, 전자서명을 살짝 바꾼, 조작된 임의의 거래 정보를 비트코인 네트워크에 전송합니다.

2017.7.1 / 13:52:17 / JDG의 거래소 지갑 주소 / HBK의 지갑 주소 / 10 BTC / 위조한 JDG의 전자서명

생성 TxID : JDG10B-2

이 때부터는 확률싸움입니다.

두 거래 모두 블록체인의 입장에서는 타당한 거래이고, 해시가 유일하지 않은 이상 어떤 거래가 진짜 JDG가 등록한 맞는 거래인지 채굴자들은 알 방법이 없기 때문에 두 거래 모두에 대해 채굴이 시작됩니다.

비록 HBK의 조작된 거래 정보는 JDG의 전송내역보다 늦은 시간에 블록체인으로 전송되었지만, 이 것이 채굴되어 인증될 가능성을 배제할 수 없습니다.

이렇게 되면, JDG의 송금은 무효화되고, HBK가 위조한 내역만 인정됩니다.

HBK는 JDG에게 비트코인이 들어오지 않았다고 항의합니다.

JDG는 자신이 만든 TxID를 확인해봅니다.

JDG10B-2에 의해 JDG가 만든 JDG10B-1거래는 사라졌습니다.

하지만  JDG10B-2 거래에 의해 비트코인은 HBK에게 전송되었습니다.

그러나 TxID만 살펴본다면, 네트워크 상에 JDG10B-1이라는 TxID가 없으니 일단 고객에게 다시 출금을 해줍니다.

HBK는 거래 하나를 가로채면서 순식간에 비트코인을 두 배로 늘렸습니다.

물론 이는 충분히 예방이 가능합니다.

JDG가 운영하는 거래소에서는 TxID 이외의 부분들도 꼼꼼하게 검토합니다.

예를 들면 자신들의 비트코인이 보관되는 핫월렛의 입출금 내역을 관리하는 프로그램을 운영하는 것이 가능하죠.

블록체인은 오픈되어 있기 때문에, HBK에게 (다른 TxID로) 전송된 내역을 찾을 수 있을 겁니다.

(물론, 서명의 손상을 HBK의 위조라고 단정지을 수는 없겠지만요)

C. 네트워크에 대한 광역 공격

 사실상 거래의 변동성 공격에 대한 우려 중 가장 중요한 시나리오입니다. 

실제로 2014년 마운트 곡스를 포함한 다수의 거래소들이 이 공격을 받아 출금이 지연되고, 불안감에 의한 투자자들의 패닉셀로 인해 가격이 폭락하는 사태가 발생했었습니다. 

거래소를 망가뜨리려 하는 사람, 혹은 비트코인 네트워크를 파괴하려는 세력은 다수의 거래소를 대상으로 조작된 거래정보를 대량생산, 비트코인 네트워크에 주입합니다. 

첫 번째 시나리오와 같은 소규모의 공격은 대부분 거래소 내부에서 돌아가고 있는 회계 솔루션 등에 잡혀 처리가 되겠지만, 이런 거대한 공격은 꽤 긴 시간동안 거래소의 시스템에 과부하를 일으킬 가능성이 있습니다. 

입출금 오류로 투자자 불만 심화, 개인간 거래의 신뢰도 파괴, 부정출금의 반복으로 인한 거래소의 파산. 

실제로 있었던 일이고, 앞으로도 결코 간과할 문제는 아닙니다. 

이러한 불확실성은 단순히 거래 시스템적인 측면 뿐만 아니라 비트코인 네트워크 전체의 신뢰도를 저하시킬 가능성이 있기에, 앞의 두 시나리오에 비해 훨씬 더 위협적입니다.  

5. 넘어야 할 더 큰 산

위에서 말했던 문제들은 꽤나 심각해보입니다.

전부 실제로 발생했던 일들이고, 아직까지 근본적인 해결책도 나오지 않은 상황이기 때문이죠.

하지만, 비트코인이 겪어야 할 성장통은 여기서 끝이 아닙니다.

여기까지 발생했던 문제들은 단순히 보안 수준에서의 허점이고, 상대적으로 확률도 적습니다.

그렇기 때문에, 이 것이 화폐로서의 비트코인의 지위를 완전히 흔들만큼 치명적인 문제라고 보여지지는 않습니다.

어찌 보면, 초기 원로 화폐인 비트코인만의 문제일 수도 있구요.

하지만, 2017년 여름맞이 공포영화는 오프닝에 불과합니다.


이더리움의 6월 말 급락을 견인했던 그 결함.

비트코인은 어쩌면 그보다 더 난처한 입장에 놓여있습니다.

정말로 투자자들을 패닉에 빠뜨릴 수 있는 문제,다음 칼럼에서 살펴보겠습니다.

Sort:  

좋은 글 감사드립니다.

중간에 저에게는 아직 어렵네요 좋은글 잘봤습니다!
제목도 너무깔끔하고 좋네요!

다음 칼럼이 굉장히 기대되네요

식견이 대단하시네요~ 천천히 읽어봐야겠습니다^^ 감사합니다

Coin Marketplace

STEEM 0.20
TRX 0.12
JST 0.029
BTC 60132.86
ETH 3383.12
USDT 1.00
SBD 2.51