GDAC 거래소 자산 탈취 사고 분석
개요
2023년 4월 10일(월) 오후 6시 즈음, 여러 커뮤니티에서 동시다발적으로 GDAC(지닥) 거래소의 해킹 피해를 알리며 논의가 시작되었습니다. 실제로 GDAC 거래소의 웹사이트에도 공지가 발표되었고, 얼마 지나지 않아 해당 사실을 확인하며 보도자료가 대외 송출되기 시작합니다.
“거래소 지닥, 180억원어치 해킹 피해…자산 23% 증발”
“가상화폐 거래소 지닥, 해킹 피해…보관자산 23% 털렸다”
“가상자산 거래소 ‘지닥’ 해킹…코인 170억원 어치 유출”
공지에 따르면 실제 공격은 2023년 4월 9일(일) 오전 7시 경에 해킹 사고가 발생했다고 명시하고 있습니다. 실제 사건 발생부터 공지까지 약 36시간 정도 소요된 것입니다. 공지에서 밝힌 피해 금액은 1천만 개의 WEMIX 토큰(약 150억원)을 포함하여 약 180억 원에 해당하는 규모입니다.
특이한 점 들여다보기
1. 자산 탈취 전 다량의 Sweep Transaction과 정렬된 입금 금액
위 그림에 표시된 빨간색 박스는 GDAC 거래소의 핫월렛으로 추정되는 ‘0xF14a18eBdD6755e2831049c54dEcc868d600bA86’ 주소에서 공격자에게 5M씩 두 번 총 10M의 WEMIX를 전송한 트랜잭션입니다.
공격자가 WEMIX 3.0 체인에서 총 10M의 WEMIX를 보내기 전, 모든 GDAC 거래소 사용자의 WEMIX 입금 주소에서 대량의 트랜잭션이 거래소 핫월렛 주소로 발생했다는 것을 볼 수 있습니다. 이 과정은 Sweep이라고 불리우며, 중앙화 거래소가 사용자의 출금 요청의 처리를 용이하기 관리하기 위해 사용하는 일반적인 구조 및 방법입니다. Sweep 트랜잭션은 보통 사용자가 거래소에 디지털 자산을 입금하면 몇 분 또는 몇 시간내에 발생하도록 설계되어있는데, GDAC 거래소의 경우 40일 이상 처리하지 않은 내역도 확인할 수 있었습니다. 사실, 입금 주소에 대한 비밀키는 거래소에서만 가지고 있으므로 굳이 Sweep 하지 않는 것이 일반적이지 않더라도, 그것만으로는 큰 문제는 아닙니다.
다만, 이번 사고를 분석하며 발견한 특이한 점은 GDAC 거래소의 핫월렛에 한 번도 Sweep 트랜잭션을 생성하지 않은 사용자의 입금 주소도 Sweep 트랜잭션을 발생시켰다는 것인데, 이는 모든 거래소 사용자 입금 주소의 비밀키 혹은 mnemonic(seed phrase)을 탈취했거나 입금 주소에서 거래소 핫월렛으로 Sweep 트랜잭션을 보낼 수 있는 어떠한 권한을 가졌다는 것을 의미합니다. 하지만 만약 모든 입금 주소의 비밀키를 탈취할 수 있었다면 거래소 핫월렛으로 WEMIX를 모으는 것이 아닌, 곧바로 공격자의 주소로 전송하는 것이 더 효율적이고 안전하기 때문에 이같은 행위에 대해 의문이 남습니다.
이를 바탕으로 생각해보았을 때 비밀키가 탈취당한 것이 아닌 내부 시스템에 있는 입금/출금 관련 API를 공격자가 호출했을 가능성이 높다고 볼 수 있습니다. 또 흥미로운 점은, Sweep 트랜잭션이 사용자 입금 주소의 잔고가 적은 순에서 많은 순으로 정렬된 채로 발생했다는 것인데, 이 역시도 이미 각 입금 주소의 자산을 알고 있는 거래소 API를 통한 것이 아니라면, 공격자가 굳이 이런 형태의 트랜잭션을 보내지는 않았을 것으로 추측됩니다.
Sweep 트랜잭션을 발생시킨 주소인 ‘0xc5BC3873D0Fe77398A55F4AcE6fA4bDeD772E228’는 GDAC 거래소 사용자 입금 주소인 것을 다음과 같이 알아낼 수 있습니다.
공격자가 10M WEMIX를 탈취하기 전, ‘0xc5BC3873D0Fe77398A55F4AcE6fA4bDeD772E228’ 주소에서 GDAC 거래소 핫월렛으로 2.999M WEMIX가 전송되었는데 이 주소는 ‘[WEMIX] 팀 보유 토큰 이동’ 글을 참고하면 WEMIX 재단 — ‘WEMIX Pte.Ltd. (based in Korea) GDAC wallet’의 소유임을 확인할 수 있습니다.
또한, 공시정보에 따르면 GDAC 거래소에 WEMIX를 매도하기 위함이 아닌 2022년 12월 말 DAXA 관련 거래소에서 상장폐지 절차가 이루어진 후, WEMIX Classic(Klaytn)에서 WEMIX 3.0으로의 스왑을 위한 것임을 알 수 있습니다. 사용자의 편의를 위해 GDAC 거래소와 OTC 거래를 통해 기존 WEMIX Classic을 소각시키고 WEMIX 3.0을 사용자에게 제공한 것으로 추측됩니다. WEMIX Classic 소각은 여기를 통해 확인할 수 있습니다.
Ethereum 체인 기반 자산의 경우도, WEMIX 3.0 체인과 비슷하게 자산 탈취가 이루어졌습니다. ETH를 보관하고 있던 주소에서는 50, 200, 50 ETH 순으로 자산을 탈취한 후 Sweep 트랜잭션을 보낸 다음 나머지 50 ETH를 한번 더 탈취했습니다.(트랜잭션 보기)
2. 공격자 EOA 트랜잭션의 Gas Limit과 자산 탈취시 사용된 Gas Limit의 불일치
공격자의 EOA에서 트랜잭션을 전송할 때는 트랜잭션 실행에 필요한 필수 Gas Limit(eth_estimateGas)만 사용하는 것을 확인할 수 있습니다. 아래 스크린샷을 보면, 공격자의 다른 주소로 0.5ETH를 전송하는 트랜잭션입니다. Gas Limit을 보면 Value Transfer에 필요한 21,000 Gas를 Limit으로 설정하였고 100% 사용된 것을 볼 수 있습니다. 단순한 Value Transfer 뿐만 아니라 USDT 전송에도 정확한 Gas Limit을 사용하고, 토큰 스왑 같은 경우 조금 보수적으로 Gas Limit을 설정하지만 모두 유동적인 수치를 보여줍니다.
하지만 GDAC 거래소 핫월렛에서 자산을 탈취할 때는 21,000 Gas Limit이 아닌 100,000의 Gas Limit이 사용되었습니다.
여기에서 눈여겨 볼 점은 일반 사용자의 입금 주소에서 Sweep 트랜잭션이 발생할 때와 정상적인 출금 진행 시 모두 100,000 Gas Limit이 사용되었다는 것입니다. 이는, 핫월렛에서 자산을 탈취할 때에도 거래소 내부 시스템을 통해 트랜잭션이 생성되었을 것으로 추측할 수 있는 부분입니다.
3. 탈취되지 않고 남아있는 자산
GDAC 거래소 ERC-20 핫월렛은 아직까지 약 8만 USDT 및 기타 토큰들이 많이 남아있습니다. 해당 핫월렛에 대한 비밀키를 탈취했다면, 공격에 성공한 이후에도 입금된 자산들을 왜 더 가져가지 않고 그대로 두는 것일까요? 이미 탈취한 규모에 비해 비교적 적은 금액이기 때문에 수고스러움을 감수할 필요가 없기 때문일지도 모르겠습니다만, 이는 실제로 공격자가 비밀키를 알아내어 공격한 것이 아니라는 의견에 힘을 싣습니다.
GDAC 거래소의 2023년 1분기 재무실사 보고서에 따르면 3월 22일 09시 30분 기준 고시된 WEMIX 핫월렛 보유 수량(18,506,382 WEMIX)과 실제 수량(7,005,895 WEMIX)의 차이가 11,500,486 WEMIX 정도 발생합니다. 그럼에도 아직 거래소 핫월렛에 Sweep 되지 않은 물량을 더할 경우 수량이 일치한다고 가정하고 해당 재무실사 보고서의 내용이 정확하다는 전제하에 살펴보면 ETH, BTC, WEMIX, USDT를 제외한 다른 ERC-20 자산군도 적지 않은 금액을 보유한 것을 확인할 수 있습니다.
KLAY만 하더라도 대략 1억 원 정도의 규모가 들어있었고, 그 외 ERC-20 토큰을 포함하면 더 큰 규모의 자산임에도 BTC, ETH, WEMIX를 제외한 자산을 전혀 손대지 않았다는 것은 수 많은 피해 월렛들의 비밀키를 탈취한 공격자를 생각했을 때 쉽게 이해하기 어려운 행동입니다. 즉, 공격자는 비밀키를 획득하지 못했을 확률이 높고 내부 API를 실행할 수 있는 인프라에 침투하여 권한을 얻은 후 공격을 했을 가능성에 더 무게가 실린다고 판단합니다.
결론
저희는 여러가지 상황과 정황으로 미루어 보아, 거래소 핫월렛의 비밀키가 유출되었을 가능성보다 내부 인프라 시스템이 침투되었을 가능성에 더 무게를 두고 있습니다.
그 이유는 크게 세 가지입니다.
GDAC 거래소의 핫월렛에 한 번도 Sweep 트랜잭션을 생성하지 않은 사용자의 입금 주소도 Sweep 트랜잭션을 발생시켰다는 점
사용자 입금 주소(월렛)에서 직접적으로 바로 공격자의 주소로 보내면 공격자 입장에서는 더 안전하고 빠를 수 있음에도, GDAC 거래소의 핫월렛으로 통합(Sweep) 한 이후에 공격자의 월렛으로 전송한 점
다른 ERC-20 토큰들은 여전히 탈취하지 않고 그대로 두었고, 공격자가 실제로 공격에 사용된 모든 월렛의 비밀키를 얻을 수 있었다면 수억 원 정도의 다른 자산들은 손대지 않았다는 것이 쉽게 이해되지 않는 점
그래서, 저희가 생각하는 공격 시나리오는 거래소 내 존재하는 내부 API 인프라가 해킹을 통해 침투되었고 공격자가 해당 내부 API를 호출함으로써 다양한 사용자 입금 주소로부터 핫월렛으로 모으는 행위를 실행하고, 공격자 월렛으로의 출금도 마찬가지 방법을 이용해 공격을 실행하는 것입니다.
Theori의 ChainLight 팀에서는 이번 일의 심각성을 고려하여 해당 사건에 대해 빠르게 분석하였으며, 공격자의 패턴에서 몇 가지 특이한 점을 발견했습니다. 해당 사고는 계속해서 진행중인 사건으로 아직 분석 및 추적해야하는 부분이 많이 남아있어, 본 내용은 완전하지 않을 수 있으니 참고 및 주의 바랍니다. 저희는 GDAC 거래소와 관련이 없으며, 위 내용은 외부인 관점에서 제한적인 환경 및 정보를 이용하여 기술적인 부분만 고려해 분석한 결과이므로 참고용으로만 활용하시기 바랍니다.
고려해보면 좋을 조치 항목
다음은 현재 상황에서 다양한 이해관계자 및 커뮤니티에서 고려해보면 좋을 조치 항목입니다. 단, 일부 방법들은 중앙화 리스크를 야기할 수 있습니다.
WEMIX 3.0 체인 RPC 또는 노드 코드 수정을 통한 특정 from 주소 차단
AnySwap에서 이더리움으로 전송된 Wrapped WEMIX Burn
WEMIX 유동성 제거를 통한 DEX SWAP 방지
Swap 된 USDC blacklist 등록 요청
Metamask Swap IP 조회(사법기관 협조 필요)
지속적인 자산 추적 및 동결(Tornado Cash, Bridges, DEX, …)
✨ We are ChainLight!
ChainLight 팀은 풍부한 실전 경험과 깊은 기술 이해를 바탕으로 새롭고 효과적인 블록체인 보안 기술을 연구합니다. 연구 결과를 바탕으로 Web3 생태계의 각종 보안 위험 요소와 취약점을 사전 파악하여 제거하는 혁신적인 보안 감사 서비스를 제공합니다. 보안 감사 이후에도 온체인 데이터 모니터링 및 취약점 탐지 자동화 서비스를 이용한 지속적인 디지털 자산 위험 관리 솔루션을 제공합니다.
ChainLight 팀은 사용자들이 탈중앙화 서비스를 안전하게 활용할 수 있도록 Web3 생태계 위협으로부터의 보호에 힘쓰고 있습니다.
ChainLight의 더 다양한 정보를 보고 싶으시다면? 👉 Twitter 계정도 방문해 주세요.
🌐 Website: chainlight.io | 📩 TG: @chainlight | 📧 chainlight@theori.io
Originally published at https://blog.theori.io on May 18, 2023.