Wormhole은 이더리움과 솔라나를 잇는 가장 바쁜 브리지 중 하나였다. 한쪽에서 ETH를 예치하면 다른 쪽에서 래핑된 ETH(wETH)를 받고, 예치된 코인은 1:1로 에스크로에 보관됐다. 2022년 2월 2일, 공격자는 브리지가 신뢰하는 메시지에 대해 유효한 서명을 위조하고 아무것도 예치하지 않은 채 120,000 wETH(약 3억 2,500만 달러)를 발행한 뒤, 브리지의 담보에서 약 2억 5,000만 달러어치의 실제 이더리움을 인출했다.
서명 검증 버그는 프로젝트 내부에서 알려져 있었고 수정 코드도 작성되어 있었다. 그러나 그 수정은 배포되기 전에 공격 당일 프로젝트의 공개 GitHub 저장소에 올라갔다. 해당 커밋은 일상적인 버전 업데이트로 설명됐지만, 개발자 Matthew Garrett이 지적했듯 그 diff는 그런 설명에 비해 너무 컸고, 지켜보는 누구에게나 취약점이 정확히 어디인지 알려주었다. 몇 시간 뒤 그것은 악용됐다.
Wormhole은 네트워크가 '점검을 위해 중단됐다'고 발표하고 도난을 확인했으며, 온체인 메시지에 담아 공격자에게 1,000만 달러의 현상금을 제안했다. 도둑은 그것을 받지 않았다. 다음 날 Wormhole의 개발자들이 속한 트레이딩 회사 Jump Crypto가 브리지의 지급 능력을 유지하기 위해 120,000 ETH를 대체했으며, 이 구제는 CoinDesk가 보도하고 Jump 자체도 트위터에서 확인했다.
비용은 얼마였나
무에서 발행된 3억 2,500만 달러어치 wETH, 브리지의 이더리움 담보에서 약 2억 5,000만 달러 인출, 같은 날 솔라나 10% 하락
왜 일어났나
패치된 코드는 공개 저장소에 있었지만 운영 환경은 여전히 취약한 버전을 실행하고 있었다. 수정 자체가 익스플로잇의 설명서가 된 것이다.
해당 커밋은 일상적인 업데이트로 표시됐지만 그 규모가 표시와 모순되어, 보안 수정이 진행 중임을 조용히 알리고 있었다.
코드를 공개하는 일과 코드를 실행하는 일이 별개의 행위로 취급됐지만, 공개 블록체인에서는 결코 그럴 수 없다.
브리지의 서명 검증은 아홉 자릿수 금액을 지키는 단일 지점이었다. 몇 달 전의 Neodyme 감사는 그 결함을 잡아내지 못했다.
교훈
공개 저장소는 의도하든 하지 않든 배포 채널이다. 수정이 공격자가 읽을 수 있는 곳에 존재한다면, 커밋과 배포를 함께 하라. 아니면 먼저 배포하고 모든 노드가 패치된 뒤에만 공개하라.
후속 상황
Jump Crypto의 120,000 ETH 투입은 wETH의 1:1 담보를 유지하고, wETH를 담보로 사용하던 솔라나의 많은 DeFi 대출 시장으로의 전염을 막았다. 도둑은 끝내 신원이 밝혀지지 않았고 현상금은 응답이 없었다. 이 침해 사건은 크로스체인 브리지가 보안에 '근본적 한계'를 가진다는 Vitalik Buterin의 경고에 대한 대표적 증거가 됐고, 브리지 팀들이 배포가 완료될 때까지 수정을 공개하지 않는 쪽으로, 그리고 감사를 하한선이 아닌 출발점으로 취급하는 쪽으로 나아가게 했다.
근거 확인하기
출처
- Wormhole cryptocurrency platform hacked for $325 million after error on GitHub The Verge · theverge.com ·
- $320 million stolen from Wormhole, bridge linking solana and ethereum CNBC · cnbc.com ·
- Jump Trading Backstops Wormhole's $320M Exploit Loss CoinDesk · coindesk.com ·