
데이터 검증 단계의 취약점으로 인한 330만 달러 손실, 소켓(SOCKET) 공격 사건 전말 분석
글: CertiK

2024년 1월 16일, Socket Tech가 공격을 받아 약 330만 달러의 손실을 입었다. 공격자는 Socket의 특정 계약에 존재하는 데이터 검증 단계의 취약점을 이용해 악성 데이터 입력을 통해 승인된 계약의 사용자 자금을 탈취했다. 이번 공격으로 총 230개 주소가 피해를 입었으며, 한 주소당 최대 손실액은 약 65.6만 달러였다.
배경 소개
Socket은 크로스체인 보안과 효율적인 데이터 및 자산 전송을 위한 상호운용성 프로토콜이다. Socket Gateway 계약은 Socket 유동성 계층과의 모든 상호작용을 위한 진입점이며, 모든 자산 브리지와 DEX가 하나의 유니크한 메타 브리지로 통합되어 사용자 선호도(비용, 지연 시간, 보안 등)에 따라 최적의 거래 경로를 선택한다.
해킹 사고 발생 3일 전, Socket 계약 관리자는 시스템에 새로운 경로를 추가하기 위해 addRoute 명령을 실행했다. 이 경로 추가는 Socket 게이트웨이 기능 확장을 목표로 했지만, 실수로 중요한 취약점을 도입하게 되었다.
아래 이미지는 계약 관리자가 경로를 추가한 기록이다:

사건 개요
1. 1월 16일 오후 3시 3분(북경시간), 공격자의 지갑이 공격에 사용할 자금을 입금했다. 분석 결과 이 자금은 0xe620에서 유래했으며, Tornado Cash에서 인출한 10 BNB과 관련이 있다.

2. 이 자금은 Socket의 취약점을 이용하기 위해 두 개의 계약을 생성하고 실행하는 데 사용되었다. 첫 번째 계약은 SocketGateway에 권한을 부여한 주소 내 USDC를 대상으로 하였다(스크린샷 참조). 127명의 피해자가 약 250만 달러를 잃었다.

3. 다음으로 두 번째 계약은 피해자 주소 내 WETH, USDT, WBTC, DAI, MATIC를 표적으로 삼았다. 이후 104명의 추가 피해자가 다음과 같은 자산을 잃었다:
-
42.48 WETH
-
347,005.65 USDT
-
2.89 WBTC
-
13,821.01 DAI
-
165,356.99 MATIC
4. 공격자는 USDC와 USDT를 ETH로 교환했다.

취약점 원인
공격자가 악용한 취약점은 새로 추가된 경로 주소 routeAddress 내 performAction 함수에 존재한다.
해당 주소의 performAction 함수는 원래 Wrapping 및 Unwrapping 기능을 지원하는 용도였다.
그러나 이 함수에는 중요한 결함이 존재했는데, 사용자가 검증 없이 .call() 내 swapExtraData를 통해 외부 데이터를 호출할 수 있었던 것이다. 이는 공격자가 임의의 악성 함수를 실행할 수 있음을 의미한다.

이번 사건에서 공격자는 악성 swapExtraData 입력을 만들어 transferFrom 함수를 트리거했다. 이 악성 호출은 사용자가 SocketGateway 계약에 부여한 권한을 이용해 자금을 탈취했다.
계약은 fromToken.call() 후 사용자 잔액이 올바르게 변경되는지 확인하기 위해 잔액 검사를 수행하지만, 공격자가 금액을 0으로 설정하는 경우는 고려하지 않았다.

공격 과정 재현
1. 공격 계약을 사용하여 공격자는 Socket Gateway 계약에서 0x00000196()을 호출했다.

2. fallback()은 196이라는 육진법 서명을 사용하여 취약한 라우터 주소 계약(routerAddress)을 호출했다.

3. 아래 스크린샷에서 공격자가 사용한 가짜 입력을 볼 수 있으며, 스왑 수량은 모두 0이다.

4. 이후 WrappedTokenSwapperImpl.performAction()이 호출되어 스왑이 진행된다.

5. 검증 절차 없이, 위조된 SwapExtraData가 fromToken(WETH)에 의해 수락되고 실행된다.

6. 공격자는 피해자의 자산이 바닥날 때까지 위 과정을 반복한다. 악성 거래 발생 직후 Socket은 disableRoute를 신속히 호출해 취약한 경로를 차단함으로써 추가 피해를 방지했다.
7. 1월 23일, Socket은 1,032개의 ETH를 회수했다고 발표했으며, 25일에는 모든 피해자에게 전액 보상을 제공하겠다고 밝혔다. 이번 사건은 해결되었다.

사건 요약
무제한 사용자 권한이 부여된 라우팅 계약에서는 악성 calldata 공격이 드물지 않다.
이전에도 유사한 공격 사례로는 Dexible과 Hector Bridge가 있었다.
2023년 2월 17일, 탈중앙화 거래소 Dexible이 공격을 받아 150만 달러 이상의 손실을 입었다. 공격자는 악성 calldata를 Dexible의 fill() 함수에 입력해 사용자 자산을 탈취했다.
2023년 6월 2일, Hector 네트워크의 프로토콜이 공격받았다. 공격자는 위조된 USDC 계약을 배포하고 악성 calldata를 통해 피해자 계약에서 실제 USDC 65.2만 개를 이체했다.
블록체인 어그리게이션 플랫폼은 여러 브리지와 라우팅 계약을 포장해 유동성을 높이고 손실을 줄이곤 한다. 그러나 이러한 복잡한 구조는 보안에 더 많은 난제를 초래할 수 있다.
Socket 사건이 해결된 것은 여러 당사자들의 노력 덕분이었으며, CertiK는 앞으로도 플랫폼에 대한 종합적인 감사와 검사를 통해 다양한 어그리게이션 리스크를 줄이고 커뮤니티 신뢰도 및 산업 전체의 보안 수준을 높이는 데 계속 기여할 것이다.
TechFlow 공식 커뮤니티에 오신 것을 환영합니다
Telegram 구독 그룹:https://t.me/TechFlowDaily
트위터 공식 계정:https://x.com/TechFlowPost
트위터 영어 계정:https://x.com/BlockFlow_News












