2025년 4월 18일, BTNFT 프로토콜이 악용되어 약 19,000달러의 손실이 발생했습니다.
BTNFT는 NFT 판매와 시간 기반 토큰 릴리즈 메커니즘을 결합한 내장된 비트토렌트(BTT) 토큰 베스팅 및 보상 분배 기능이 있는 NFT 계약입니다.
개요
공격자:
https://bscscan.com/address/0x7a4d144307d2dfa2885887368e4cd4678db3c27a
취약한 계약:
https://bscscan.com/address/0x0fc91b6fea2e7a827a8c99c91101ed36c638521b
공격 트랜잭션:
https://bscscan.com/tx/0x1e90cbff665c43f91d66a56b4aa9ba647486a5311bb0b4381de4d653a9d8237d
익스플로잇 분석
공격 트랜잭션을 보면, 공격자가 반복적으로 transferFrom
함수를 호출하여 1부터 500까지의 NFT ID를 BTNFT 계약 자체로 전송하려고 시도하고 있음을 알 수 있습니다. 방출된 BTT.Transfer
및 BTNFT.TokensClaimed
이벤트를 통해 공격자가 BTNFT 계약에서 비트토렌트(BTT) 토큰을 수집하고 있음을 알 수 있습니다.
공격자가 이를 어떻게 할 수 있었는지 이해하기 위해 BTNFT 계약의 transferFrom
함수 구현을 살펴보겠습니다. NFT를 새 소유자에게 전송하기 위해 _update
함수를 호출하고 있음을 알 수 있습니다.
_update
함수의 구현을 보면, 수신자가 BTNFT 계약 자체일 때 어떠한 검사 없이 호출자에게 비트토렌트(BTT) 토큰을 전송하기 위해 claimReward
함수를 호출합니다. 이는 실제로 BTNFT를 소유하지 않은 사람도 BTNFT 계약 자체로 BTNFT를 전송하고 보상을 청구할 수 있는 명백한 보안 취약점입니다.
결론
이 익스플로잇은 간단한 인증 논리 버그가 어떻게 상당한 재정적 손실로 이어질 수 있는지 보여줍니다. 계약의 _update
함수는 NFT가 계약 자체로 전송될 때 호출자가 보상을 청구할 정당한 권리가 있는지 확인하지 못했습니다. 이러한 간과로 인해 누구나 실제 NFT를 소유하지 않고도 비트토렌트(BTT) 토큰을 청구할 수 있었고, 결과적으로 19,000달러의 손실이 발생했습니다. 이 사건은 특히 계약 자체 상호작용 및 보상 분배를 처리할 때 적절한 인증 검사 및 입력 검증을 구현하는 것의 중요성을 강조합니다.