Cybersecurity Tips

[블록체인 수사관 되기 3편]

tracker
tracker

May 06, 2025



💣 “왜 단순히 지갑을 연결했는데도 자산이 빠져나갔을까?”


🤔 흔한 피해자의 말:



“나는 지갑만 연결했을 뿐인데, 코인이 빠져나갔어요.”

실제로는 단순 연결이 아니라, 서명을 유도당한 것입니다.


대부분의 피해는 바로 아래 두 함수로 인해 발생합니다:


  • approve()


  • transferFrom()


이번 글에서는 이 두 함수가 어떻게 Web3 스캠의 핵심 도구가 되는지



실제 호출 흐름을 통해 분석합니다.





🧬 함수 구조 먼저 보기


1. approve(address spender, uint amount)



이 함수는 토큰 보유자가 타인에게 자신의 토큰을 사용할 수 있도록 권한을 주는 것입니다.


예시:


token.approve(0xAttacker, 1000 * 10**18);



  • 이 호출이 성공하면, 0xAttacker는 내 토큰 1000개를 마음대로 가져갈 수 있는 권한을 얻습니다.




2. transferFrom(address from, address to, uint amount)



이 함수는 approve미리 승인된 토큰을 대신 이동시키는 함수입니다.


예시:


token.transferFrom(0xVictim, 0xAttacker, 1000 * 10**18);



  • 이건 공격자가 실행합니다.


  • 만약 Victim이 사전에 approve를 했다면, 이 함수로 실제 탈취가 일어납니다.




🕵️ 스캠 흐름 예시 (단계별)







🧪 실제 컨트랙트 호출 예시


function maliciousApproval() public {
    IERC20(token).approve(address(this), type(uint256).max); // 최대치 승인
}

function drainTokens(address victim) public {
    IERC20(token).transferFrom(victim, attackerWallet, 1000 * 10**18);
}

이 두 줄로 공격자는 수천 명의 피해자 지갑에서 자산을 동시에 빼내는 자동화 시스템을 구성할 수 있습니다.


🔍 포렌식에서의 체크포인트



  • ✅ 지갑에서 approve 이력이 있는가?


  • ✅ 승인 대상이 의심 주소인가?


  • ✅ 그 후 transferFrom 호출이 존재하는가?


  • ✅ 피해자의 지갑에서는 직접적인 send()없음




이런 패턴이 반복되면, 거의 확실한 피싱 & Drainer 스캠 구조입니다.


🛡️ 대응 방법



  • 절대 모르는 사이트에서 토큰 승인하지 말 것


  • 등으로 승인된 토큰을 주기적으로 제거


  • 서명 요청 시 “이건 정말로 내가 원하는 행동인가?” 다시 생각




📌 다음 예고

실제로 탈취된 트랜잭션을 디코딩하면 무엇이 보일까?
다음 글에서는 악성 서명(Signature)과 인코딩된 데이터를 직접 디코드하여,
우리가 무엇을 서명했는지 해석해보겠습니다.



#BlockchainSecurity #ApproveAttack #TransferFromScam #ERC20Abuse #ScamForensics

post_like_sub2
post_total_comment_sub2

30 조회

0/500 bytes
2개의 댓글 더 보기