Apollo X 거래소 해킹 공격자 주소 추적
Blog/외부 Blog

Apollo X 거래소 해킹 공격자 주소 추적

※ 본 게시물은 'PLAINBIT' 재직 당시 작성한 블로그 글을 공유하는 것입니다.

원문 참고 : https://blog.plainbit.co.kr/apollox-exchange-hacked/


※ 본 게시글의 암호화폐 주소 추적은 BIG의 암호화폐 추적 솔루션인 "QLUE"를 사용했습니다.

1. 사건 개요

[그림 1] Apollo X 거래소 해킹 관련 coinreaders 기사​

- https://coinreaders.com/35680

1-1) 공격 관련 정보

  • 2022년 6월 8일 19시 경(UTC+8) Apollo X 거래소 대상으로 공격 발생
  • 공격자의 BSC/ETH 주소 - 0x9e532b19abd155ae5ced76ca2a206a732c68f261
  • ApolloxExchangeTreasury의 claim() 함수를 반복적으로 호출하여 계약에서 약 5,300만 APX 토큰을 획득(서명 확인 취약점), 당시 약210만 달러에 해당하는 가치로 알려짐
  • claim() 함수는 ECDSA.recover()로 입력 메시지와 서명을 성공적으로 검증하고 계약에서 공격자에게 해당 토큰 양을 전송
  • 획득한 APX 토큰을 Pancake Swap을 통해 공격 당시 약 160만 개의 BUSD로 변환
  • Pancake Swap 과정 중 총 8건의 트랜잭션을 수행
  • 확보한 BUSD는 3건의 Synapse ZAP Bridge 트랜잭션을 통해 nUSD로 변환
  • nUSD => USDC => DAI => renBTC로 변환
  • renBTC를 BTC로 변환 후 여러 주소에 나누어 전송
- APX 토큰과 BUSD는 모두 Binance Smart Chain에서 발행된 BEP-20 기반의 토큰이다.
- Pancake Swap은 Binance Smart Chain 상에서 서로 다른 토큰 간의 교환을 가능하게 해주는 일종의 DEX이다.
- ZAP Protocol은 서로 다른 블록체인 간의 토큰 교환을 가능하게 해주는 일종의 프로토콜이다.​

1-2) Apollo X 측의 대응

  • 사건 당일 해킹을 당했다고 공식적으로 발표
  • 4 시간 동안 DEX에서 출금 기능을 일시적으로 비활성화
  • 문제 해결 후 DEX에서 출금 기능 재개
  • 거래소 사용자의 자금에는 손실이 없다고 발표
  • 거래소 수수료로 얻은 APX를 통해 손실을 만회할 계획이라고 발표​

1-3) Apollo X 트위터 공식 입장

https://x.com/APX_Finance/status/1534570239177789440

https://x.com/APX_Finance/status/1534810576198979586

 

2. Apollo X 거래소에서 유출된 암호화폐 추적

https://docs.google.com/spreadsheets/d/1uyjVTzuAC76RdgLo0_kSbflqZHL0Z3By/edit?ref=blog.plainbit.co.kr#gid=1004072456

공격자가 탈취한 APX 토큰을 Pancake Swap을 사용해서 약 160만 개의 BUSD 토큰으로 변환하기까지의 과정을 위 시트와 같이 정리했다.​

공격자는 전환한 BUSD 토큰을 Synapse ZAP Bridge를 사용해서 nUSD 토큰으로 변환했으며, 그 과정은 아래 트랜잭션에서 확인할 수 있다.

[그림 2] nUSD -> USDC 전환과정

[그림 2]와 같이 nUSD 토큰이 3 차례에 걸쳐 스마트 컨트랙트에 의해 USDC 토큰으로 전환된 것을 알 수 있다. USDC 토큰은 공격자의 주소로 전송됐다.

  • 0x9e532b19abd155ae5ced76ca2a206a732c68f261

[그림 3] USDC -> DAI 전환 과정

변환된 USDC는 [그림 3]과 같이 스마트 컨트랙트에 의해 DAI 토큰으로 변환됐다.

[그림 4] DAI -> renBTC 변환 과정

변환된 DAI는 [그림 4]와 같이 스마트 컨트랙트에 의해 renBTC 토큰으로 변환됐다.​


이어지는 내용은 회사 블로그를 참고해주세요^^