2025년 2월 21일, Bybit은 공격자가 소셜 엔지니어링을 통해 Safe{Wallet} 개발자의 머신을 침해한 후 약 15억 달러를 탈취당했습니다. 공격자는 Bybit의 트랜잭션을 특정적으로 겨냥하여 Safe{Wallet}의 AWS S3 버킷에 악성 JavaScript를 주입했습니다. 주입된 코드는 서명 과정에서 트랜잭션 내용을 변조했으며, Safe{Wallet} UI는 정상적인 트랜잭션을 표시하는 동안 실제로 서명자의 Ledger 장치에 전송된 페이로드는 Bybit의 Safe 컨트랙트를 악성 구현체로 업그레이드하여 공격자에게 완전한 제어권을 부여했습니다. 서명 및 실행이 완료되자 공격자는 컨트랙트에서 모든 자산을 탈취했습니다. 자세한 기술적 분석은 이전 보고서 [1]에서 확인할 수 있습니다.
배경
Safe{Wallet}(GnosisSafe라고도 함)은 n-of-m 모델을 사용하는 멀티시그 지갑 인프라로, 트랜잭션을 실행하려면 m명의 전체 서명자 중 최소 n개의 서명이 필요합니다.
각 Safe 지갑은 프록시 컨트랙트로 배포됩니다. 이 사건에서 핵심이 되는 두 가지 스토리지 변수가 있습니다:
masterCopy(슬롯 0): 구현 컨트랙트의 주소입니다. 이 컨트랙트에는 서명 검증 및 업그레이드 메커니즘을 포함한 모든 실행 로직이 포함되어 있습니다. 프록시는delegatecall을 통해 모든 호출을masterCopy에 위임합니다.threshold(슬롯 4): 필요한 최소 서명 수(n)입니다. Bybit의 Safe의 경우 이 값은 3이었습니다.
프록시가 delegatecall을 사용하기 때문에 masterCopy에서 호출된 모든 함수는 프록시의 스토리지 컨텍스트에서 실행됩니다. 이는 delegatecall 대상이 슬롯 0의 masterCopy를 직접 덮어쓸 수 있으며, 단일 트랜잭션으로 전체 구현체를 교체할 수 있음을 의미합니다.
취약점 분석
공격 경로는 시스템의 세 가지 계층을 통과했으며, 각 계층에는 공격자가 활용한 구조적 조건이 존재했습니다:
프론트엔드 서빙 모델. Safe{Wallet} 프론트엔드 JavaScript는 AWS S3 버킷에서 제공되었습니다. 이 아키텍처에서는 버킷에 대한 쓰기 권한을 가진 누구든 서명자를 위한 트랜잭션을 구성하는 코드를 수정할 수 있습니다. 서브리소스 무결성(SRI) 해시나 코드 서명과 같은 무결성 검증 메커니즘이 이러한 위험을 완화할 수 있지만, 대부분의 dApp 프론트엔드에서는 아직 표준 관행으로 자리잡지 못했습니다. 공격자는 침해된 개발자 머신을 통해 쓰기 권한을 획득하고 제공되는 JavaScript를 은밀하게 수정했습니다.
UI 표시와 서명 페이로드 간의 괴리. 주입된 JavaScript는 Safe{Wallet} UI에 정상적으로 보이는 트랜잭션을 표시하면서 Ledger 하드웨어 지갑에는 다른 페이로드를 전송했습니다. Ledger 화면에 표시된 트랜잭션 세부 정보는 UI와 달랐겠지만, 하드웨어 지갑 화면에서 원시 트랜잭션 데이터를 해석하는 것은 특히 복잡한 멀티시그 작업의 경우 쉽지 않습니다. 이 괴리로 인해 공격자는 악성 페이로드에 대한 세 개의 유효한 서명을 수집할 수 있었습니다.
프록시 업그레이드 모델. 배경 섹션에서 설명한 바와 같이, delegatecall은 대상의 코드를 프록시의 스토리지 컨텍스트에서 실행합니다. Safe 프록시 아키텍처는 슬롯 0의 단일 masterCopy 포인터를 통해 모든 호출을 라우팅합니다. 이 포인터를 덮어쓰면 단일 트랜잭션으로 서명 검증 로직을 포함한 완전히 다른 구현체로 프록시를 리다이렉트할 수 있습니다. n-of-m 모델은 트랜잭션을 시작할 수 있는 주체를 제어하지만, 트랜잭션이 승인되고 실행된 후에는 구현체 자체를 변경할 수 있습니다. 새 구현체가 서명 검증을 제거하면, 이후의 모든 트랜잭션에서 멀티시그 보호가 사실상 무력화됩니다.
공격 분석
공격은 악성 코드 주입, 구현체 교체, 자산 탈취의 세 단계로 진행되었습니다.
1단계: 악성 코드 주입
공격자는 Safe{Wallet} 개발자의 머신을 침해하고 프론트엔드를 제공하는 AWS S3 버킷에 악성 JavaScript를 주입했습니다. 주입된 코드는 Bybit의 Safe 주소에서 발생하는 트랜잭션을 특정적으로 겨냥했습니다. Bybit CEO Ben Zhou [2]에 따르면, Safe{Wallet} UI는 정상적인 트랜잭션을 표시했지만, 서명자의 Ledger 장치에는 다른 페이로드가 전송되었습니다. 서명자들은 UI에 표시된 트랜잭션을 승인했고, 이로써 공격자는 악성 페이로드에 대한 세 개의 유효한 서명을 획득했습니다.
2단계: 구현체 교체
공격자는 수집된 세 개의 서명과 함께 악성 트랜잭션을 제출했습니다. Safe 프록시는 호출을 masterCopy에 위임했고, masterCopy의 execTransaction() 함수는 서명을 검증한 후 트랜잭션 페이로드를 실행했습니다: 공격자의 컨트랙트(0x962214...5c7242)로의 delegatecall이었습니다. 이 delegatecall은 프록시의 스토리지 컨텍스트에서 실행되므로, 공격자의 transfer() 함수는 슬롯 0의 masterCopy 값을 악성 구현체 주소(0xbDd077...9516)로 덮어썼습니다. 이 시점부터 Safe 컨트랙트에 대한 모든 호출은 공격자의 코드로 위임되었습니다.
3단계: 자산 탈취
masterCopy가 이제 공격자의 구현체를 가리키게 되면서 멀티시그 요건이 더 이상 적용되지 않게 되었습니다. 공격자는 Safe 컨트랙트에서 직접 SweepERC20()과 SweepETH()를 호출했습니다. 공격자의 구현체 컨트랙트에 정의된 이 함수들은 서명 검증 없이 보유한 모든 자산을 이전했습니다. 총 다섯 건의 탈취 트랜잭션이 실행되었으며, 손실액은 약 15억 달러에 달했습니다.
관련 컨트랙트 및 트랜잭션
| 유형 | 설명 | 주소 / 해시 |
|---|---|---|
| 컨트랙트 | Bybit의 Safe 컨트랙트 | 0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4 |
| 컨트랙트 | 원본 masterCopy 컨트랙트 | 0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F |
| 컨트랙트 | 악성 masterCopy 컨트랙트 | 0xbDd077f651EBe7f7b3cE16fe5F2b025BE2969516 |
| 컨트랙트 | 공격자의 컨트랙트 (즉, transfer()) | 0x96221423681A6d52E184D440a8eFCEbB105C7242 |
| 트랜잭션 | masterCopy 컨트랙트를 교체한 트랜잭션 | 0x46deef0f52e3a983b67abf4714448a41dd7ffd6d32d32da69d62081c68ad7882 |
| 트랜잭션 | 15,000 cmETH를 탈취한 트랜잭션 | 0x847b8403e8a4816a4de1e63db321705cdb6f998fb01ab58f653b863fda988647 |
| 트랜잭션 | 90,375 stETH를 탈취한 트랜잭션 | 0xa284a1bc4c7e0379c924c73fcea1067068635507254b03ebbbd3f4e222c1fae0 |
| 트랜잭션 | 8,000 mETH를 탈취한 트랜잭션 | 0xbcf316f5835362b7f1586215173cc8b294f5499c60c029a3de6318bf25ca7b20 |
| 트랜잭션 | 401,346 ETH를 탈취한 트랜잭션 | 0xb61413c495fdad6114a7aa863a00b2e3c28945979a10885b12b30316ea9f072c |
| 트랜잭션 | 90 USDT를 탈취한 트랜잭션 | 0x25800d105db4f21908d646a7a3db849343737c5fba0bc5701f782bf0e75217c9 |
요약
이번 사건은 오프체인 인프라의 침해가 어떻게 온체인에서의 치명적인 손실로 이어질 수 있는지를 보여주었습니다. 공격자는 Web2 침해, 프론트엔드 조작, 프록시 업그레이드를 연결하여 온체인 취약점을 악용하지 않고도 멀티시그 보호를 우회하는 단일 공격 경로를 구성했습니다.
주요 교훈:
- 프론트엔드 무결성은 온체인 보안과 동일한 수준의 주의를 받아야 합니다. 공격 체인은 프론트엔드 서빙 계층에서 시작되었습니다. dApp이 점점 더 고가치 트랜잭션을 중개함에 따라, 무결성 검증(SRI, 코드 서명, 재현 가능한 빌드)을 통한 프론트엔드 코드 보호와 무단 변경 모니터링이 기본 요건이 되고 있습니다.
- 하드웨어 지갑 검증은 실제로 여전히 어렵습니다. 하드웨어 지갑은 실제 서명 페이로드를 표시할 수 있지만, 작은 화면에서 복잡한 멀티시그 트랜잭션 데이터를 해석하는 것은 알려진 사용성 문제입니다. 장치 내 트랜잭션 요약의 가독성 향상은 지갑 생태계의 미해결 과제입니다.
- 프록시 업그레이드 메커니즘은 고영향 공격 대상입니다. Safe 프록시 아키텍처는 모든 로직을 단일 업그레이드 가능한 포인터를 통해 라우팅합니다. 단일 단계 구현체 교체를 허용하는 메커니즘은 위험을 집중시킵니다. 업그레이드에 타임락, 보조 확인 단계, 또는 독립적인 가디언을 추가하면 단일 침해 트랜잭션의 영향을 줄일 수 있습니다.
참고 문헌
BlockSec 소개
BlockSec은 풀스택 블록체인 보안 및 암호화폐 컴플라이언스 제공업체입니다. 저희는 고객이 코드 감사(스마트 컨트랙트, 블록체인 및 지갑 포함), 실시간 공격 차단, 사건 분석, 불법 자금 추적, 그리고 프로토콜 및 플랫폼의 전체 수명 주기에 걸쳐 AML/CFT 의무를 이행할 수 있도록 돕는 제품과 서비스를 구축합니다.
BlockSec은 권위 있는 학술 컨퍼런스에서 다수의 블록체인 보안 논문을 발표했으며, DeFi 애플리케이션의 여러 제로데이 공격을 보고하고, 2,000만 달러 이상을 구조하기 위한 다수의 해킹을 차단했으며, 수십억 달러 규모의 암호화폐를 보호했습니다.
-
공식 웹사이트: https://blocksec.com/
-
공식 트위터 계정: https://twitter.com/BlockSecTeam
-
🔗 BlockSec 감사 서비스 : 요청 제출



