원래는 어떻게 돼야 하나
Initia 같은 Move 체인에서 토큰은 정해진 발행처만 만들 수 있어요. 예를 들어 iUSD는 iUSD 발행 기능으로만 새로 생기고, 그 밖에는 누군가에게서 받아야만 내 지갑에 생겨요. 이게 체인이 지켜야 하는 기본 규칙이에요.
공격자가 한 것 (수법은 추정)
1. 가짜 토큰을 만들었어요. 자기 코드에 "토큰 종류 + 수량" 두 칸짜리 상자를 만들었어요. 진짜 토큰과 생김새가 똑같아요.
2. 진짜라고 우겼어요. 이 상자를 꺼내는 함수를 부르면서 "이건 진짜 토큰이다"라고 선언했어요.
3. 체인이 그대로 받아들였어요. 겉모양만 같으면 통과시킨 것으로 보여요. 그래서 공격자는 "iUSD 300만" 같은 숫자를 직접 적어 넣어 원하는 만큼 만들었어요.
위조지폐로 치면, 크기와 무늬만 확인하는 ATM에 위조지폐를 넣었는데 진짜로 인정된 상황이에요.
위조가 맞다는 증거 (이건 기록으로 확인한 부분)
- 출처가 없어요. 정상이라면 "누가 보냄" 또는 "새로 발행됨" 기록이 남아요. 공격자 지갑에 iUSD 300만이 들어온 거래에는 그런 기록이 하나도 없어요.
- 전체 발행량보다 많이 갖고 있어요. iUSD는 전 세계에 약 169만 개만 발행됐는데, 공격자 혼자 300만 개를 갖고 있어요.
가짜를 진짜로 바꾼 방법
브릿지는 Initia에서 토큰을 태우면 이더리움 금고에서 같은 양의 진짜 토큰을 내줘요. 브릿지는 태운 토큰이 위조인지 구분하지 못해요. 공격자는 이렇게 가짜를 진짜로 바꿨어요.
- 가짜 AUSD → 이더리움에서 진짜 AUSD 140만
- 가짜 USDC → 진짜 USDC 100만
- 가짜 WETH → 진짜 ETH 105개
진짜로 받은 걸 바로 ETH로 바꿨고, 지금 약 1,102 ETH를 갖고 있어요. 은행 A 지점에 위조지폐를 맡기고 B 지점에서 진짜 현금으로 찾아간 것과 같아요.
