2024년 10월 1일, Fire Token이 해킹되어 당시 약 20,000 달러의 손실이 발생했습니다. 이번 공격이 어떻게 이루어졌는지 자세히 살펴보겠습니다.
공격자 : https://etherscan.io/address/0x81f48a87ec44208c691f870b9d400d9c13111e2e
공격 계약 : https://etherscan.io/address/0x9776c0abe8ae3c9ca958875128f1ae1d5afafcb8
취약한 계약 : https://etherscan.io/address/0x18775475f50557b96C63E8bbf7D75bFeB412082D
공격 트랜잭션 : https://etherscan.io/tx/0xd20b3b31a682322eb0698ecd67a6d8a040ccea653ba429ec73e3584fa176ff2b
취약점 분석
Fire Token은 ERC20 토큰입니다. Fire Token의 특징은 유니스왑 v2의 토큰 스왑 기능이 통합되어 있다는 것입니다. 또한 _transfer()
함수가 해당 기능을 사용하도록 수정되었습니다.
그러나 문제는 _transfer()
함수가 유니스왑 쌍으로 토큰을 전송할 때 취약점이 있다는 것입니다. 사용자가 유니스왑 쌍으로 토큰을 전송하면 유니스왑 쌍의 잔액이 자동으로 감소하고 바로 sync()
함수가 호출됩니다. 이는 시스템이 전송 금액과 세금 금액을 기반으로 판매 금액을 계산하고 그 금액을 소각 주소로 전송하기 때문에 발생할 수 있습니다.
어떤 사용자든 여러 개의 Fire 토큰을 유니스왑 쌍으로 전송할 수 있습니다. _transfer()
의 이 조건으로 인해 유니스왑 쌍의 금액이 감소하여 예비 가치가 줄어듭니다. 이 흐름에 따라 공격자는 먼저 20 이더리움(ETH)을 Fire로 교환했고, 받은 토큰을 모두 유니스왑 쌍으로 전송했습니다. Fire 일부가 소각 주소로 전송되면서 Fire의 예비 가치도 줄어들었습니다.
그 후 공격자는 유니스왑 쌍의 swap()
을 사용하여 예비 가치의 차이로 더 많은 토큰을 얻었습니다. 이 행동을 반복하여 예비 가치가 최소 값까지 떨어뜨렸습니다.
이 취약점 공격으로 공격자는 약 8.45 이더리움(ETH)(약 20,000 달러)을 얻었습니다.
결론
Fire Token 취약점 공격 사례를 공유함으로써 철저한 보안 감사와 견고한 스마트 계약 설계의 중요성을 강조하고자 합니다. 특히 탈중앙거래소(DEX)에서는 조작을 방지하기 위한 효과적인 위험 관리 전략이 필요합니다. 작은 결함으로도 사용자 자금에 큰 손실을 초래할 수 있기 때문입니다.