
Nomad 1.9억 달러 도난 사건 분석: 한 번의 업그레이드로 촉발된 비극
작성: Samczsun
번역: TechFlow 인턴
TL;DR
업그레이드 과정에서 계약이 0x00을 유효한 루트로 표시하게 되었고, 이로 인해 Nomad에 허위 메시지가 넘쳐났습니다. 공격자들은 이를 이용해 유효한 거래 주소를 복사/붙여넣기 하여 혼란 속에서 크로스체인 브릿지의 자산을 급속도로 탈취했습니다.
최근 발생한 Nomad 사건은 제가 Web3에서 본 가장 혼란스러운 해킹 중 하나였으며, 1.5억 달러 이상의 자산이 유출되었습니다. 어떻게 이런 일이 벌어졌을까요? 근본 원인은 무엇일까요? 제가 그 배경 상황을 설명드리겠습니다.

모든 것은 CIA Officer가 ETHSecurity 텔레그램 채널에 Spreek의 트윗을 공유하면서 시작되었습니다. 저는 당시 무슨 일이 벌어지고 있는지 몰랐지만, 브릿지에서 막대한 양의 자산이 빠져나가고 있다는 사실만으로도 좋지 않은 신호임을 직감했습니다.

처음 제 생각은 토큰 소수점 설정에 오류가 생긴 것 아닐까 하는 것이었습니다. 어쨌든 제 눈에는 크로스체인 브릿지가 "0.01 WBTC 송금하고 100 WBTC 돌려주기" 프로모션을 진행하고 있는 것처럼 보였으니까요.

초반엔 믿기 어려웠지만 Moonbeam 네트워크에서 수동으로 몇 가지 조사를 해본 결과, 실제로 Moonbeam에서는 단 0.01 WBTC만 전송되었지만, 이더리움에서는 어찌어duit 100 WBTC를 받은 것으로 나타났습니다.

게다가, 이번 WBTC 브릿지 거래는 실제로 Prove 단계 없이 바로 `Process` 함수를 호출했습니다. 증명 없이 메시지를 처리할 수 있다는 점은 매우 심각한 문제입니다.

이 경우 가능한 두 가지 시나리오가 있습니다. 하나는 증명이 이전 블록에서 따로 제출된 것이고, 다른 하나는 Replica 컨트랙트 자체에 치명적인 문제가 있다는 것입니다. 그러나 최근에 별도로 증명된 흔적은 전혀 발견되지 않았습니다.

따라서 남은 가능성은 하나뿐입니다—Replica 컨트랙트에 치명적인 결함이 존재한다는 점이죠. 그런데 도대체 어떻게 그런 일이 가능했을까요? 간단히 코드를 살펴보니, 제출된 메시지는 반드시 허용된 루트에 속해야 하며, 그렇지 않으면 185행의 검사가 실패해야 합니다.

다행히 이 가설을 확인할 간단한 방법이 있었습니다. 제가 알고 있던 미검증 메시지의 루트는 0x00이었고, messages[_messageHash] 값이 초기화되지 않은 상태였습니다. 제가 해야 할 일은 이 루트 값을 컨트랙트가 수용하는지 여부를 확인하는 것이었습니다.

결과는... 컨트랙트가 수용했습니다.

결국 업그레이드 과정에서 Nomad 팀이 신뢰할 수 있는 루트를 0x00으로 초기화한 것이 밝혀졌습니다. 말하자면, 0 값을 초기값으로 사용하는 것은 일반적인 관행입니다. 하지만 불행하게도 이번 경우 이로 인해 모든 메시지가 자동으로 검증되는 작은 부작용이 발생했습니다.


이 때문에 이번 사건이 이렇게 혼란스러웠던 것입니다. 당신이 Solidity나 Merkle 트리 같은 기술 지식을 알 필요는 없습니다. 필요한 것은 단지 유효한 거래 하나를 찾아 자신의 주소로 교체한 후 다시 브로드캐스트하는 것뿐이었습니다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News














