여러 다리 이야기
전정호 (DSRV, Blockchain Data Team) 2022-02-25
작년부터 다양한 L1 체인과 L2가 등장하고, BTC, ETH, ERC20 토큰을 가지고 DeFi 유동성을 채웠습니다. 어느샌가 브리지는 우리의 일상이 되었습니다. 오늘은 최근 해킹 사례와 함께 브리지가 어떻게 동작하는지 알아보겠습니다.
먼저 a) 보내는 체인의 토큰을 브리지 주소로 전송합니다. 이 브리지 주소는 보통 스마트 컨트랙트 주소입니다. 브리지 주소로 전송한 토큰은 잠겨서 당분간 풀리지 않습니다. b) 토큰이 잠겼는지 확인한 후 c) 받는 체인에서 동일한 양의 토큰을 새로 발행합니다(mint). 이더리움에서 100 테더를 브리지 주소로 전송하여 잠그면, 솔라나에서 100 테더를 새로 발행하는 셈입니다.
브리지로 이동한 토큰을 반대로 가져올 수도 있습니다. d) 받은 체인에서 토큰을 브리지 주소로 다시 전송하면, 토큰을 소각합니다(burn). e) 토큰을 소각했는지 확인한 후 f) 보내는 체인에 잠긴 토큰을 동일한 양만큼 풉니다. 솔라나에서 50 테더를 반환하면 토큰을 소각하고, 이더리움에 잠김 50 테더를 인출할 수 있게 됩니다.
여기서 보내는 체인의 토큰과 받는 체인의 토큰이 다르다는 점이 중요합니다. 우리는 이더리움의 테더와 솔라나의 테더가 같다고 생각하지만, 둘은 엄연히 주소와 스마트 컨트랙트가 다릅니다. 브리지가 이 둘이 같다는 환상을 만들었을 뿐입니다. 브리지를 사용한다는 말은 브리지로 이동한 토큰을 원래 토큰으로 1:1 교환할 수 있다고 브리지를 신뢰한다는 말입니다. 최근 고의(스캠)로 혹은 실수(버그와 해킹)로 믿음이 깨진 사례를 보면, 사용자들은 위험을 인지해야 합니다.
브리지로 이동한 토큰은 원래 토큰과 다르며 브리지가 만든 토큰입니다. 그래서 브리지가 여러개인 경우 브리지마다 다른 토큰이 생깁니다. 테더가 A 브리지판 테더A와 B 브리지판 테더B로 나뉩니다. 그러면 DEX 풀이 테더A-SOL와 테더B-SOL과 같이 파편화되는 문제가 생깁니다. 그래서 테더와 USDC 같은 유명한 토큰은 토큰을 새로 발행하는 대신 토큰 발행회사가 미리 양쪽 체인에 토큰을 미리 만들어두고 푸는 식으로 공급하기도 합니다. 브리지가 여러개가 아니라도 다양한 체인을 지원하는 경우 어떤 체인에서 어느 체인으로 이동했냐에 따라 토큰이 달라지는 경우도 있습니다. Wormhole의 경우 wavUSDC, wbUSDC, weUSDC, wpUSDC, wpoUSDC, wsoUSDC, USDCet, USDCpo, USDCso, USDCwp 같은 다양한 USDC 변종을 만듭니다.
다양한 맛
블록체인 세상에는 다양한 브리지가 있고 각자 다른 특징이 있습니다. 앞에서 “b) 토큰이 잠겼는지 확인한 후 c) 받는 체인에서 토큰을 새로 발행한다”를 보면 보내는 체인에서 토큰이 잠긴 사실을 어떻게 받는 체인에게 알려줄지 궁금합니다. 반대로 “토큰을 소각했는지 확인한 후 …”도 방향만 반대이지 마찬가지입니다. 상대편 체인 입장에서 오라클 문제입니다. 브리지들은 이 부분을 서로 다르게 처리합니다.
한 극단에서 바이낸스 같은 중앙화 거래소가 있습니다. 중앙화 거래소는 ETH와 테더 등을 여러 체인에서 입출금할 수 있습니다. 보내는 체인의 거래소 주소로 송금하여 입금하고, 받는 체인의 사용자 주소를 입력하면 출금할 수 있습니다. 사용자는 중앙화 거래소를 신뢰하고 브리지 역할로 활용할 수 있습니다. 거래소 유동성 범위 내에서 출금이 가능하기 때문에 원하는 시점에 원하는 금액을 출금하지 못하는 경우가 있습니다.
다른 극단에는 NEAR 레인보우 브리지 같은 무신뢰(trustless) 브리지가 있습니다. 토큰이 잠긴 사실을 토큰을 송금한 트랜잭션이 존재한다는 머클 증명(Merkle proof)을 가지고 입증합니다. 머클 증명은 암호학적으로 속이기 불가능하기 때문에 실제 토큰을 송금하지 않고 송금했다는 증명을 만들 수 없습니다. 받는 체인의 스마트 컨트랙트에게 아무나 (심지어 제삼자라도) 머클 증명을 제시하면, 스마트 컨트랙트는 토큰을 발행합니다. 누구도 신뢰할 필요가 없는 점이 장점이지만, 머클 증명을 처리하기위해 부담이 큰 (그래서 유지 비용이 많은) 단점이 있습니다.
나머지 브리지들은 양 극단 사이에 있습니다. 솔라나 Wormhole 브리지처럼 다수의 검증자를 두는 경우가 흔합니다. 일정수 이상 검증자가 토큰을 송금한 트랜잭션을 확인하면 함께 서명하고(multisig), 받는 체인의 스마트 컨트랙트는 이 서명을 보고 토큰을 발행합니다. 중앙화 거래소처럼 한 주체가 아니라, 일정수 이상 검증자가 담합을 하지 않는다면 브리지가 올바로 동작합니다. 악의적인 행동을 하면 검증자가 걸어둔 지분이 사라질 수 있기 때문에 검증자들을 어느정도 신뢰할 수 있습니다.
비트코인 같은 PoW 체인은 송금 트랜잭션이 취소되는 위험도 있습니다. 송금 트랜잭션을 확인하고 상대편 체인에서 토큰을 발행한 이후 원래 체인의 다른 포크가 인정을 받을 수 있습니다. 거래소 입금 때와 마찬가지로 블록이 추가로 누적될 때까지 기다려서 트랜잭션을 담고 있는 블록이 취소될 확률을 줄이는 경우가 흔합니다.
기타 다른 차이는,
아무 토큰이라도 이동할 수 있는지 아니면 미리 정한 몇가지 토큰만 이동할 수 있는지
양쪽 체인의 수수료를 누가 부담하는지. 맨해튼 다리 처럼 한쪽 방향은 무료이고 다른쪽 방향은 두배로 받는 경우가 있고, 재단이 수수료를 전액 대납하는 경우도 있습니다.
브리지가 바로 송금해주는지 아니면 사용자가 직접 추가로 출금 트랜잭션을 보내야 하는지
(PoW와 Optimistic Rollup 처럼) 트랜잭션을 바로 완결하지 않는 경우 급행수수료를 내고 빠르게 출금하는 기능
브리지에 문제가 발견된 경우 비상정지가 가능한지. 가능하다면 어떻게 정지하는지.
브리지가 자체 토큰과 자체 체인을 가지는 경우
사건 사고
브리지 사고는 토큰을 송금한 것처럼 속이고 (즉, 토큰을 소모하지 않고) 반대편 체인에서 토큰을 발행하는 경우가 흔합니다. 인터체인과 DeFi가 서로 얽혀있기 때문에 브리지 사고가 여러 체인과 여러 토큰으로 퍼져가기 쉽습니다. 실제 해커도 Tornado Cash 같은 믹서와 DEX를 사용하여 해킹한 토큰을 바꾸는 경우가 많습니다.
ChainSwap
2021년 7월 2일 $0.8m 그리고 11일 $4m 규모의 해킹이 발생했습니다. 브리지 공식 계정만 출금을 집행할 수 있어야 하는데 모든 계정에서 가능한 버그가 있었습니다. 브리지에 묶였던 자체 토큰을 포함한 십여개 토큰 전액이 PancakeSwap에서 거래되어 99% 급락하는 사태가 벌어졌습니다.
Anyswap
2021년 7월 10일 $8m 토큰이 해킹당했습니다. Anyswap의 실수로 해커는 V3 브리지를 관리하는 MPC 계정의 개인키를 알아낼 수 있었습니다. 플레이스테이션3 해킹으로 유명해진 서명 R값 재사용이 문제였습니다. 타원곡선 암호의 문제가 아니라 매번 임의의 R값을 사용해야 하는 규칙을 지키지 못했습니다. 개발자가 암호학자일 필요는 없지만 최소한 암호학 지식이 필요하다는 교훈을 알려줍니다.
THORChain
2021년 7월 16일 인터체인 DEX인 THORChain에서 $7.4m을 탈취한 해킹이 발생했습니다. 브리지에 토큰을 전송하면, 브리지는 토큰 전송 트랜잭션의 금액을 보고 넘어갈 액수를 판단합니다. 해커는 자신과 브리지 사이에 스마트 컨트랙트를 만들었습니다. 해커가 트랜잭션에 금액을 담아 스마트 컨트랙트로 보내면, 이 스마트 컨트랙트는 브리지를 호출할 때 브리지로 금액을 넘기지 않았습니다. 브리지는 자신에게 금액이 넘어오지 않았다는 사실은 모른채 원래 트랙잭션의 금액만 보고 동작을 했습니다. 그래서 해커는 브리지로 토큰을 소모하지 않고도 반대편 체인에서 토큰을 얻을 수 있었습니다.
일부 문제를 고친 후 계속 운영하기로 결정한 THORChain은 몇일 후인 23일 다시 $8m 규모의 해킹을 당합니다. 해커는 자신이 만든 스마트 컨트랙트가 브리지의 일부인 것처럼 속이고, 토큰을 실제 적립하지 않고 적립한 것처럼 브리지를 동작시켰습니다. 그후 브리지에 적립된 토큰을 인출할 수 있었습니다. 이번에 해커는 더 큰 액수를 가져갈 수 있었지만 큰 돈을 다루는 코드를 서둘러 개발하면 안된다는 교훈을 주기위해 규모를 줄였다는 메시지를 트랜잭션에 기록했습니다.
PolyNetwork PolyBridge
2021년 8월 10일 $1b 토큰이 적립된 PolyNetwork 브리지가 $610m 대규모 해킹을 당했습니다. 입금 트랜잭션을 수행하는 코드가 트랜잭션을 충분히 검사하지 않아서 해커는 토큰이 묶인 스마트 컨트랙트의 소유자를 변경하는 트랜잭션을 수행할 수 있었습니다. 해커는 (아마도 거래소들의 빠른 대처로 쉽게 현금화할 수 없음을 파악하고) $0.5m 현상금을 받는 조건으로 토큰을 돌려주었습니다.
Celo Optics
2021년 11월 22일 Celo 브리지가 갑자기 복구 모드로 들어갔습니다. 시기는 공교롭게도 이더리움 전문가이자 Celo가 인수한 Suma의 대표였던 James Prestwich가 불분명한 사유로 퇴사한(해고?) 직후였지만, James는 본인이 아니라고 부인했습니다. 복구 모드는 브리지에 심각한 문제가 발생했을 때 추가 피해를 막기위한 방화벽이고, Celo는 결국 새로 브리지를 만들어야 했습니다. 이전 브리지 토큰과 이후 브리지 토큰으로 주요 토큰들이 파편화되고, Celo 내 DeFi 프로젝트들이 불편을 겪었습니다. 사용자 안내 외에는 재단이라고 강제로 토큰을 합치거나 이전할 수 없기 때문에 이전 브리지 토큰이 사라지는데 시간이 걸렸습니다.
Multichain
2022년 1월 10일 Multichain는 한 보안 회사의 경고를 받았습니다. ERC20의 확장 기능을 충분히 검사하지 않고 사용하여 사용자 서명 없이 출금이 가능한 버그였습니다. 작년에 브리지 해킹을 당한 Anyswap이 개명한 Multichain은 즉시 V5 브리지의 문제를 고쳤지만, 기존 사용자들은 스마트 컨트랙트의 송금 허가를 거둬야 했습니다. 1월 18일부터 Multichain은 사람들이 자주 방문하는 주요 이더리움 서비스의 도움을 받아 송금 허가를 거두라는 공지를 올렸습니다. 그러나 해커도 공지를 보고 허점을 찾기 시작했고, 16시간 후부터 공격이 시작하여 누적 $4.6m 토큰을 탈취했습니다. $0.96m 토큰을 해킹당한 한 사용자는 해커에게 공개 제안하여 $0.15m을 제외한 금액을 돌려받기도 했습니다. 애초에 공지를 올리는 대신 Multichain이 직접 사용자들의 토큰을 해킹한 후 문제를 해결하고 돌려주는 방식이 바람직하지 않았나 생각합니다.
Wormhole
2022년 2월 2일 솔라나와 이더리움을 연결하는 Wormhole에서 $325m 해당하는 ETH가 탈취되었습니다. Wormhole은 2/3 이상 검증자(guardian)가 입금을 확인하면 서명(VAA)을 만들고, 반대편 체인은 서명을 확인하고 토큰을 발행합니다. 서명을 검사하는 기본 코드의 주소를 검사하지 않아서 해커는 서명 검사를 우회할 수 있었습니다. 사실 이 헛점은 1월 13일 수정하여 공격 당일 소스코드가 공개되었지만, 공격 당시 아직 브리지에 반영되지 않았습니다. 소스코드 변경을 공개할 때 “Update Solana to 1.9.4” 제목으로 아무 설명이 없었습니다. 중요하지 않은 변화처럼 잠재적인 공격자를 속이려는 의도일 수 있지만, 실제 브리지에 반영하지 않은 것을 보면 보안상 위험을 인지하지 못했을 수도 있습니다. 공격 트랜잭션을 보면 놀랍게도 해커는 소스코드가 공개된 후 한시간 반이 채 지나기 전에 행동에 나섰습니다. 해커에게 $10m을 제시했지만, 결국 Wormhole를 개발한 Certus One의 모회사 (그제 공동으로 $1b 규모의 테라 투자를 발표한) Jump Crypto가 손해를 메웠습니다.
Meter Passport
2022년 2월 5일 EVM 호환 Meter Network 체인이 운영하는 Meter Passport 브리지가 해킹되어 $4.4m 자산이 털렸습니다. 브리지에 토큰을 전송할 수 있는 경로 중 한 곳에서 토큰을 잠그거나 소각하지 않은 허점이 있었습니다. 해커는 허점을 활용하여 토큰 소모 없이 토큰을 브리지에 반복해서 전송하고, 반대편 체인(BSC와 이더리움)에 잠긴 토큰을 찾아갔습니다. 해커는 토큰을 DEX를 통해 ETH, 스테이블 코인, WBTC 등으로 교환했습니다. Meter Passport는 ChainSafe의 ChainBridge를 기반으로 만들었지만, Meter측이 추가한 코드 때문에 허점이 생겼습니다.
인터체인 세상에서 브리지 해킹 사건의 여파는 다른 체인으로 퍼져갑니다. 해커가 팔아치워서 가치가 폭락한 토큰을 담보로 대출한 사건이 이어집니다. Polkadot Moonriver 체인의 Hundred Finance는 Chainlink 오라클에서 가격 정보를 가져왔고, Chainlink 오라클이 폭락한 가격이 아직 반영하지 않은 틈을 이용하여 몇명이 총 $3.3m를 대출했습니다.
Optimism
브리지 해킹은 아니지만, Wormhole 해킹이 벌어진 날 이더리움 L2 Optimisim에 심각한 버그가 보고되었습니다. Optimism은 이더리움 노드 소프트웨어 geth를 사용하는데 내부적으로 사용자 잔액을 관리하는 방식을 변경했습니다. 이 변경에 따라 다른 코드 부분들도 수정해야 했는데 드물게 사용하는 코드를 빼먹어서 잔액을 두배씩 복사할 수 있는 버그가 생겼습니다. 이 버그를 보고한 분은 역대 보안 문제 보고로 가장 큰 $2.1m 현상금을 받았습니다. Optimism을 기반으로 만든 다른 프로젝트의 현상금 $0.1m을 포함한 금액입니다. EVM 호환 체인들이 사실 100% 동일하게 동작하지 않고, 사소한 차이가 큰 사고로 이어질 수 있다는 교훈을 줍니다.
마무리
비탈릭은 지난달 미래는 “multi-chain”이지 “cross-chain”이 아닐 것이라고 트윗을 날렸습니다. 브리지가 토큰을 옮긴 후 원래 체인의 블록이 취소되더라도(reorg) 상대편 체인은 그대로이기 때문입니다. 물론 현실적으로 블록을 취소하는 공격은 쉽지 않지만, 비탈릭은 체인이 천문학적인 자산을 가질 미래에 가능성을 염려합니다. 심지어 비탈릭은 앞에서 훑어본 브리지 버그나 운영 사고는 고려하지도 않았습니다. 마찬가지로 NFT 브리지가 이론상 가능하지만 (한쪽에서 잠그고 다른 쪽에서 새로 발행), 사람들이 브리지가 새로 만든 NFT를 특히 NFT의 가치가 어마한 경우 신뢰할지는 지켜볼 문제입니다.