Apollo X Exchange attacker address tracking

2022년 6월 8일, Apollo X 거래소가 해킹되어 5,300 만 APX 토큰이 탈취되었다. 본 글에서는 공격자에게 전송된 자금을 추적한 내용에 대해 살펴본다.

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

1. 사건 개요

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

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 트위터 공식 입장

Apollo X 트위터 공식 입장1

Apollo X 트위터 공식 입장2​

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

Apollo X Timeline.xlsx
Apollo X Date (UTC),From,to,Hash,Crypto,Quantity,Info 2022-06-08 10:49:53,0xd2419bccace1c6100b5aa47f0a31c64b20ba9a49,0xcc6eedeb5266aae42a33b629380b78c570e29956,0x21e5e6ee42906a840c07eb39fb788553a3fbb5794562825c2a1d37bfc910e5f7,APX,10472026.586550705,->APX, ApolloX ExchangeTreasury - claim() 반복 호…

공격자가 탈취한 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 토큰으로 변환됐다.​

[그림 5] renBTC -> BTC 변환 과정

마찬가지로 72.94215535 renBTC는 스마트 컨트랙트에 의해 72.87 BTC로 변환되었으며 5개의 트랜잭션으로 나뉘어져 다음 공격자 주소로 전송됐다.

  • bc1qew8rvlexmwlhwa97ulhyvg8fk2ngj9yrrd2t80​
[그림 6] 자금 추적을 회피하는 행위

공격자는 변환한 비트코인을 여러 주소에 나누어 전송하는 방법을 통해 추적을 회피하려고 한 것을 알 수 있다.​

[그림 7] Lazarus 그룹이 소유한 주소로 이어지는 모습

다수의 트랜잭션 중 일부 트랜잭션을 확장해서 추적해본 결과, 북한 해커 그룹으로 알려져 있는 Lazarus 그룹이 소유한 주소로 일부 자금이 전송된 것을 확인할 수 있었다.해당 트랜잭션 과정은 다음과 같다.

  • bc1qew8rvlexmwlhwa97ulhyvg8fk2ngj9yrrd2t80 (Apollo X Hacker Address)
  • 94ebd5715184d7c3c82cf55d9502dab02da7fae494abf79fd0873cfd8e6b1624
  • 192bef7297097ce3c3c98f8577c3672f266ff17a7b9a5d53c913726339841c58
  • 94f4f66f18a05e3bf4f8a5cd380b4f4e8383fe03f025dd97e9d9129d0f8bfd35
  • 7d6ad4cd9feaf2974cf4865fd991ddc242575c0245f551f885895f5496c98986
  • 98a22812ceff6c8ba6b19796473f3ca5a751c6318b5a251c43c48c7001c0d1da
  • fe3c483b1f98379e5129b606d532d3b3f203866d79836e44532564f0a5dd4389
  • 63643e568f73eb5fb4780f354da20f2d817c31a18eee25fce49c1f591ed99b0b
  • 3a0a4dbfdefa5d2feaf645da63027adad48f3db7d82ea57a22b94e71bbb42be2
  • 0aa9fe60eec1685b5c65ba0a4d0f20337600b49b471d83530af608579032cee8
  • c9b86f2fe0ff91308fa2d750c5c2f6a5cc93a6c5040e540b59fd9c5380eaea70
  • cf4f4dca2523c317f201947d0a18d509dbc73a5f6a88f5a73ba15672248b2701
  • efa2c660e1e68050d0188df0f5c37f32baf219d69503026f94ab24279543ceeb
  • bc1qa4tuyce76x025mghu3wxyygzhvyyvx8twtzmwa (Lazarus Group)​

3. 결론

  • Apollo X 공격자는 스마트 컨트랙트의 서명 확인 취약점을 이용해 5,300만 APX 토큰을 탈취했다.
  • APX 토큰을 Pancake Swap을 통해 약 160만 BUSD 토큰으로 변환했다. (Binance Chain -> Binance Chain)
  • BUSD 토큰을 Synapse ZAP Bridge를 통해 nUSD 토큰으로 변환했다. (Binance Chain -> Ethereum Chain)
  • 이어서 nUSD => USDC => DAI => renBTC 순서대로 변환했다. (Ethereum Chain -> Ethereum Chain)
  • renBTC 토큰을 BTC로 변환했다. (Ethereum Chain -> Bitcoin Chain)
  • BTC는 여러 주소로 나뉘어져 전송됐으며, 그 중 일부는 Lazarus Group이 소유한 주소에도 전송됐다.​
You've successfully subscribed to PLAINBIT
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.