Back to Blog

주간 Web3 보안 사고 요약 | 2026년 4월 13일 – 4월 19일

Code Auditing
April 22, 2026
16 min read
Key Insights

지난 한 주간(2026/04/13 - 2026/04/19), BlockSec는 총 4건의 공격 사건을 탐지 및 분석하였으며, 총 예상 피해액은 약 $310M에 달합니다. 아래 표는 각 사건을 요약한 것이며, 세부 분석은 이후 소절에서 제공됩니다.

날짜 사건 유형 예상 피해액
2026/04/18 KelpDAO 인프라 침해 $290M
2026/04/16 Rhea Finance 잘못된 회계 처리 $18.4M
2026/04/13 Hyperbridge 부적절한 검증 $242K
2026/04/13 Dango 부적절한 검증 $1.5M

Web3 최고의 보안 감사 기관

출시 전 설계, 코드, 비즈니스 로직을 검증하세요

주간 하이라이트: KelpDAO

익스플로잇 이후의 연쇄 영향, Arbitrum의 온체인 복구 메커니즘, 그리고 더 넓은 거버넌스 함의를 다루는 전용 보고서는 다음을 참고하세요: 탈중앙화 딜레마: KelpDAO 위기에서의 연쇄 리스크와 긴급 권한

이 사건은 새로운 인프라 수준의 공격 벡터(스마트 컨트랙트 익스플로잇이 아닌 유일한 DVN을 대상으로 한 RPC 포이즈닝), DeFi 구성 가능성을 통한 다중 체인에 걸친 연쇄 영향, 그리고 Arbitrum의 강제 상태 전환을 통한 도난 자금 회수가 제기한 거버넌스 문제로 인해 주목받고 있습니다.

2026년 4월 18일, KelpDAO의 rsETH LayerZero OFT 브릿지가 국가 지원 행위자(likely 북한 라자루스 그룹)에 의해 약 $290M 규모의 공격을 받았습니다 [1]. 근본 원인은 KelpDAO의 1-of-1 DVN 구성으로, 이는 크로스체인 메시지 검증을 단일 장애 지점으로 축소시켰습니다. 공격자는 LayerZero Labs DVN이 신뢰하는 RPC 인프라를 오염시켜, 조작된 크로스체인 메시지를 증명하도록 강제함으로써 Unichain에서 어떠한 소스 측 이벤트도 없이 Ethereum에서 116,500 rsETH가 방출되도록 했습니다.

배경

LayerZero는 모듈식 보안 아키텍처를 기반으로 구축된 크로스체인 메시징 프로토콜입니다. 핵심적으로, 크로스체인 메시지 무결성은 탈중앙화 검증자 네트워크(DVN)에 의해 강제됩니다. DVN은 소스 체인에서 전송된 메시지가 목적지 체인에서 실행되기 전에 실제로 발생했는지 독립적으로 검증하는 오프체인 엔티티입니다. LayerZero에 배포하는 각 애플리케이션은 신뢰할 DVN, 필요한 DVN 수, 충족해야 할 합의 임계값 등 자체적인 DVN 설정을 구성합니다. 이 모듈성은 애플리케이션에 보안 모델에 대한 완전한 제어권을 부여하지만, 동시에 완전한 책임도 부여합니다: 취약한 구성은 프로토콜 자체가 보완해줄 수 없습니다.

KelpDAO의 rsETH는 LayerZero에서 OFT(옴니체인 대체 가능 토큰)로 배포되어 있으며, Unichain(소스)과 Ethereum 메인넷(목적지)을 연결하는 브릿지 경로를 가지고 있습니다. OFT 표준은 소스 체인에서 토큰을 소각하고 목적지 체인의 잠금에서 해제하는 것을 허용하며, 크로스체인 메시지가 해제의 유일한 승인 수단으로 사용됩니다. Ethereum 측 어댑터(0x85d456...e98ef3)는 유효한 크로스체인 메시지가 검증 및 전달되면 수신자에게 rsETH를 방출하는 역할을 합니다. 중요한 것은, KelpDAO가 이 경로를 1-of-1 DVN 설정으로 구성하여 LayerZero Labs를 유일한 검증자로 지정했다는 점입니다. 이는 단일 DVN 증명만으로도 토큰 방출을 승인하기에 충분하며, 두 번째 의견이 필요하지 않음을 의미합니다.

검증 역할을 수행하기 위해, LayerZero Labs DVN은 여러 RPC 노드에 쿼리하여 소스 체인에서 크로스체인 전송 이벤트가 실제로 발생했는지 확인합니다. 이 RPC 노드에는 자체 운영 인프라와 외부 제공업체가 모두 포함되며, DVN은 증명에 서명하기 전에 이들의 집합적인 응답에 의존합니다. 이 프로세스의 무결성은 조회된 노드의 다수가 정확한 데이터를 반환한다는 가정에 달려 있습니다.

취약점 분석

이 취약점은 세 가지 복합적인 약점으로 구성된 인프라 및 구성 수준의 체계적 실패입니다.

첫째, KelpDAO의 1-of-1 DVN 구성은 검증 계층의 모든 중복성을 제거했습니다. LayerZero의 권장 보안 자세는 어떤 단일 DVN도 독자적으로 메시지를 승인할 수 없도록 독립 검증자를 갖춘 다중 DVN 설정을 명시적으로 요구합니다. LayerZero Labs DVN에만 의존함으로써, KelpDAO는 해당 단일 검증자가 침해되면 임의의 토큰 방출을 승인하기에 충분하다는 상황을 만들었습니다.

둘째, DVN의 페일오버 메커니즘은 연결 가능한 RPC 노드로 검증 쿼리를 라우팅합니다. 이 설계는 노드 불가용성이 의도적이 아닌 우연적이라고 가정합니다. 그러나 이는 공격자가 모든 데이터 소스를 침해할 필요가 없는 조건을 만들어냅니다: DDoS로 정상 노드를 오프라인으로 만들고 오염된 노드만 연결 가능한 대안으로 준비해 두면, 공격자는 DVN이 수신하는 데이터를 완전히 제어할 수 있습니다.

셋째, RPC 노드의 op-geth 실행 파일을 교체하려면 기본 서버에 대한 OS 수준 액세스가 필요했습니다. 정확한 초기 액세스 벡터는 공개되지 않았지만, 별도 클러스터의 두 독립 노드를 침해한 것은 이 서버들에 대한 액세스 제어 방식의 공통 약점을 시사할 수 있습니다.

이 세 가지 조건이 합쳐져 완전한 공격 체인을 형성했습니다: 첫 번째는 증명된 메시지를 교차 검증할 독립적인 DVN이 없도록 보장했고, 두 번째는 공격자가 유일한 DVN이 수신하는 데이터를 완전히 제어할 수 있도록 보장했으며, 세 번째는 데이터 조작을 가능하게 한 초기 거점을 제공했습니다. 단일 약점만으로는 충분하지 않았을 것입니다. 1-of-1 구성이 없었다면, 독립 인프라를 조회하는 두 번째 DVN이 위조된 메시지를 거부했을 것입니다. 페일오버 동작이 없었다면, 정상 노드가 오염된 노드를 다수결로 이겼을 것입니다. 서버 침해가 없었다면, 공격자는 위조 데이터를 주입할 방법이 없었을 것입니다.

공격 분석

다음 분석은 트랜잭션 0x1ae232...4222 및 LayerZero Labs의 공식 사건 성명을 기반으로 합니다.

  • 1단계: 공격자는 LayerZero Labs DVN이 신뢰하는 특정 RPC 노드 목록을 입수했습니다. 이 목록은 고가치 정보 목표물로, 정확한 노드를 알면 광범위한 인프라 공격이 아닌 외과적 작전을 계획할 수 있었습니다.

  • 2단계: 공격자는 두 개의 RPC 노드에 대해 OS 수준 쓰기 액세스를 획득하고 실행 중인 op-geth 바이너리를 악성 버전으로 교체했습니다. 이 두 노드는 서로 직접 연결이 없는 독립적인 클러스터에서 실행 중인 것으로 설명되어, 초기 액세스 벡터가 공유 업스트림 종속성(예: 침해된 배포 자격증명, CI/CD 파이프라인, 또는 두 곳 모두에 액세스 권한을 가진 운영자에 대한 사회공학)을 포함했음을 시사합니다. 정확한 초기 액세스 방법은 LayerZero Labs에 의해 공개되지 않았습니다. 이 단계는 이후 모든 데이터 조작의 전제 조건이었습니다.

  • 3단계: 악성 op-geth 바이너리는 표적화된 응답 로직을 구현했습니다: DVN의 IP 주소에만 위조된 트랜잭션 데이터를 반환하고, LayerZero의 자체 모니터링 인프라, 블록 탐색기, 스캔 서비스를 포함한 다른 모든 요청자에게는 실제 블록체인 상태를 제공했습니다. 이 선택적 오염은 공격을 기존의 모든 관측 시스템에 보이지 않게 만들었습니다; 외부적 관점에서는 소스 체인이 정상으로 보였습니다.

  • 4단계: DVN의 내부 합의는 오염된 노드와 오염되지 않은 RPC 노드 모두의 동의를 필요로 했습니다. 이 충돌을 해결하기 위해, 공격자는 공격 창(태평양 시간 오전 10:20~11:40) 동안 남은 정상 노드를 DDoS 공격하여 DVN의 페일오버 로직을 트리거하고 오염된 인프라에만 의존하도록 강제했습니다. 이 단계는 정상 노드가 그렇지 않으면 위조된 응답과 모순되는 실제 데이터를 반환했을 것이기 때문에 필요했습니다.

  • 5단계: DVN이 이제 공격자가 제어하는 데이터만 수신함으로써, 조작된 LayerZero 크로스체인 메시지가 유효한 것으로 제시되었습니다. DVN은 Ethereum 목적지 엔드포인트에서 논스 308을 증명했는데, 이 논스는 Unichain에 해당하는 아웃바운드 이벤트가 없었습니다(소스 엔드포인트는 여전히 최대 아웃바운드 논스가 307임을 보고하는 것으로 확인됨).

  • 6단계: 유효하게 증명된 메시지를 수신한 Ethereum 측 rsETH 어댑터는 공격자의 수신자 주소(0x8b1b6c...0d3b)에 116,500 rsETH를 방출했으며, 이 주소는 몇 시간 전에 Tornado Cash를 통해 미리 자금이 지원되었습니다. 도난된 토큰은 즉시 7개의 브랜치 지갑에 분산되어 Aave 담보 포지션, 직접 ETH 스왑, Arbitrum으로의 재브릿징을 통해 청산되었으며, 최종 수익은 Ethereum의 0x5d3919...7ccc 및 Arbitrum의 해당 수집자에게 통합되었습니다.

  • 7단계: 악성 바이너리는 완료 후 자기 삭제 루틴을 실행하여 모든 로컬 로그 및 구성 파일과 함께 자신을 삭제했습니다. 이는 사후 포렌식 복구를 크게 방해했으며 공격자의 작전적 정교함을 보여줍니다.

  • 8단계: 공격자가 동일한 경로를 통해 추가 40,000 rsETH(~$95M)를 익스플로잇하려는 시도는 KelpDAO가 이상 징후를 감지하고 Ethereum 메인넷 및 L2의 모든 관련 컨트랙트를 일시 정지한 후 차단되었습니다 [2].

광범위한 영향

피해는 초기 $290M 브릿지 익스플로잇을 훨씬 넘어 확대되었습니다. 공격자는 약 89,567 rsETH(~$221M)를 여러 마켓에 걸쳐 Aave에 예치하고, E-Mode의 93% LTV로 WETH를 빌렸습니다 [4]. Aave는 합법적으로 브릿지된 rsETH와 위조된 메시지를 통해 방출된 토큰을 구분할 수 없었기 때문에, "오염된" 담보는 완전히 유효한 것으로 처리되었습니다. 그 결과 WETH 리저브 동결이 Ethereum, Arbitrum, Base, Mantle, Linea 전반으로 전파되어 rsETH에 전혀 노출되지 않은 사용자들에게도 영향을 미쳤습니다. 단일 브릿지 구성 결함에서 다중 체인 대출 시장 혼란으로 이어지는 이 연쇄 전파는 DeFi 구성 가능성이 단일 실패 지점의 도달 범위와 비용을 어떻게 증폭시키는지를 보여줍니다.

여파는 탈중앙화의 운영적 현실에 대한 중요한 질문도 제기했습니다. LayerZero Labs는 자체 DVN이 1-of-1 구성을 사용하는 애플리케이션의 메시지에 더 이상 서명하지 않을 것이라고 발표했으며 [1], 이는 프로토콜 수준의 탈중앙화만으로는 애플리케이션 수준의 구성 약점을 보완할 수 없음을 시사합니다.

체인 수준에서, Arbitrum 보안 위원회는 공격자가 Arbitrum One에 보유한 30,766 ETH를 동결하는 긴급 조치를 실행했습니다. BlockSec의 분석 [5]에 따르면, 이는 체인 수준의 강제 상태 전환을 통해 이루어졌습니다: 보안 위원회는 Ethereum 인박스 컨트랙트를 일시적으로 업그레이드하고, 공격자의 주소를 사칭하는 서명되지 않은 L1-to-L2 메시지를 주입한 다음, 보유자의 서명 없이 원래 구현을 복원했습니다 [3].

이 조치는 법 집행 기관과 협력하여 투명하게 수행된 거버넌스가 정의한 긴급 권한의 합법적 행사였습니다. 그러나 이는 동시에 L2 체인이 설계상 중앙화된 개입 능력을 유지하고 있음을 보여줍니다: Arbitrum One의 모든 자산은 원칙적으로 동일한 메커니즘을 통해 보안 위원회에 의해 이동될 수 있습니다. 시스템의 이론적 신뢰 모델과 실제 신뢰 경계 사이의 간극은, 이 사건이 모든 계층에서 보여주듯이, 가장 중대한 리스크가 존재하는 곳입니다.

결론

이 사건은 브릿지 보안이 프로토콜 정확성만으로는 축소될 수 없음을 보여줍니다. LayerZero 프로토콜 자체는 설계대로 작동했습니다; 취약점은 전적으로 그 위의 운영 계층에 존재했습니다. 핵심 교훈은 오프체인 검증 인프라가 신뢰 경계의 일부이며, 그 보안 자세는 보호하는 가치와 일치해야 한다는 것입니다.

세 가지 완화 조치가 각각 독립적으로 이 결과를 방지했을 것입니다:

  • 다중 DVN 구성: 여러 독립 DVN에 걸쳐 합의를 요구하면 단일 DVN 침해만으로는 메시지 승인이 불충분하여, 해당 DVN이 얼마나 완전히 속았는지와 무관하게 보호됩니다.

  • 페일오버 인식 RPC 선택: 활성 검증 창 중 연결 가능한 노드의 급격한 감소는 일상적인 가용성 이벤트가 아닌 잠재적 공격 신호로 처리되어야 합니다. DVN 구현은 축소된 노드 세트로 진행하는 대신 중단하거나 경보를 발령해야 합니다.

  • RPC 인프라 강화: 프로덕션 RPC 노드에서 실행 중인 실행 파일을 교체할 수 있다는 것은 기본 서버에 대한 액세스 제어가 불충분함을 나타냅니다. DVN이 소스체인 진실의 근거로 의존하는 인프라는 DVN 서명 인스턴스와 동일한 보안 경계를 적용받아야 합니다.

더 광범위하게, 오프체인 증명에 의존하는 모든 브릿지 또는 크로스체인 프로토콜은 스마트 컨트랙트 계층뿐만 아니라, 소스체인 이벤트에서 목적지 체인 실행까지의 전체 데이터 파이프라인을 감사해야 합니다. RPC 인프라가 기본적으로 신뢰할 수 있다는 가정은 수억 달러가 그에 의존할 때 더 이상 유효하지 않습니다.

참고문헌

[1] LayerZero Labs, "KelpDAO 사건 성명," 2026년 4월 20일. https://x.com/LayerZero_Core/status/2046081551574983137

[2] KelpDAO, "4월 18일 사건: 추가 맥락," 2026년 4월 21일. https://x.com/KelpDAO/status/2046332070277091807

[3] Arbitrum, "보안 위원회 긴급 조치," 2026년 4월 21일. https://x.com/arbitrum/status/2046435443680346189

[4] LlamaRisk, "rsETH 사건 보고서," 2026년 4월 20일. https://governance.aave.com/t/rseth-incident-report-april-20-2026/24580

[5] BlockSec, "Arbitrum 보안 위원회 동결 메커니즘 분석," 2026년 4월 21일. https://x.com/Phalcon_xyz/status/2046467830498173088

Phalcon Explorer 시작하기

트랜잭션을 심층 분석하여 현명하게 행동하세요

지금 무료로 시작하기

이번 주 추가 사건


Rhea Finance

2026년 4월 16일, NEAR 기반의 Rhea Finance 산하 대출 및 마진 트레이딩 프로토콜 Burrowland가 마진 트레이딩 모듈의 비즈니스 로직 결함으로 인해 약 $18.4M의 피해를 입었습니다. 레버리지 포지션을 열 때, 프로토콜은 verify_token_out()에 의존하여 포지션 수락 전 예상 스왑 출력값을 검증합니다. 그러나 이 함수는 토큰이 최종 출력 토큰과 일치할 때마다 중간 스왑 단계의 token_out 금액을 잘못 누적하여, 이 중간 금액이 이후 token_in으로 재사용된다는 사실을 고려하지 못했습니다. 공격자는 가짜 토큰과 풀을 배포한 다음, 인지된 출력 금액을 부풀려 지급 능력 검사를 통과하는 순환 스왑 경로를 구성하여 프로토콜에서 약 $18.4M을 탈취했습니다.

배경

Burrowland는 NEAR 기반의 오픈소스 대출 및 마진 트레이딩 프로토콜입니다. 표준적인 공급 및 차입 기능 외에도 마진 트레이딩을 지원하며, 사용자의 레버리지 포지션을 나타내는 세 가지 핵심 변수를 도입합니다: token_c(담보), token_d(부채 자산), token_p(포지션 자산).

롱 포지션의 경우, 사용자는 token_c를 담보로 예치하고 선택한 레버리지(예: 5배)로 token_d를 차입합니다. 차입한 token_d는 사용자가 노출을 원하는 자산인 token_p로 DEX에서 스왑됩니다. 정상적인 조건에서 수신한 token_p의 가치는 지출한 token_d의 가치와 대략 동일합니다. 프로토콜은 사용자를 대신하여 token_p를 보관하면서 차입한 token_d를 부채로 기록합니다.

숏 포지션의 경우, 사용자는 마찬가지로 token_c를 예치하고 레버리지를 사용하여 공매도하려는 자산인 token_d를 차입합니다. 차입한 token_d는 다른 자산(token_p)으로 스왑되어 token_d에 대한 숏 노출을 효과적으로 취합니다. 마찬가지로, 스왑은 정상적인 시장 조건에서 가치를 보존할 것으로 예상됩니다.

포지션의 생애 주기 동안, token_p는 프로토콜 내에 보관되며 사용자는 직접 인출할 수 없습니다. 포지션은 이익 또는 손실을 실현하기 위해 종료되어야 하며, 이때 token_p가 다시 token_d로 스왑되어 부채를 상환합니다.

마진 포지션 개설은 internal_margin_open_position()이 처리하며, 포지션 매개변수를 설정하고 차입을 DEX로 디스패치합니다.

프로토콜이 새로운 포지션을 수락하기 전에 네 가지 보호를 순서대로 평가합니다: is_min_amount_out_reasonable()은 사용자가 선언한 min_token_p_amount를 Pyth 오라클 기반의 스왑 출력값과 교차 확인하여 슬리피지를 제한하고, is_open_position_liquidatable()은 예상 포지션과 담보 가치가 청산 라인을 넘는지 확인하며, is_open_position_forcecloseable()은 계정이 이미 장부상 지급 불능 상태가 아닌지 확인하고, get_open_position_lr()token_d / token_c 가치가 최대 레버리지 비율을 초과하지 않도록 강제합니다.

스왑이 아직 실행되지 않았고 사용할 실현된 금액이 없기 때문에, 네 가지 검사 모두 포지션 자산의 가치로 min_token_p_amount를 사용합니다. 따라서 모든 게이트의 정확성은 min_token_p_amount가 DEX가 실제로 제공할 값에 바인딩되어 있는지에 달려 있습니다. 바로 그 바인딩이 verify_token_out()이, RefV1TokenReceiverMessage::get_token_out()을 통해 구현된, 사용자가 제출한 스왑 메시지에서 강제해야 하는 것입니다.

취약점 분석

결함은 verify_token_out() 내부에 있습니다. 이 함수는 마지막 스왑 단계의 token_out을 최종 출력 토큰으로 선택한 다음, 각 프로덕션이 최종 출력에 기여한다는 가정 하에 동일한 토큰을 생성하는 모든 스왑 단계의 선언된 min_amount_out을 합산합니다. 이는 진정한 다중 경로(분할 경로) 스왑에서는 올바르지만, token_out이 즉시 다음 단계의 token_in으로 소비되는 단계를 제외하지 않습니다. A->B->A->B와 같은 왕복 경로는 ->B 단계의 출력이 이후 B->A 단계에서 소비되어 Burrowland에 도달하지 않음에도 불구하고 모든 ->B 단계가 합계에 포함되도록 합니다. verify_token_out()이 승인하는 합산된 min_amount_out은 더 이상 DEX가 실제로 반환할 값을 나타내지 않습니다.

verify_token_out()이 우회되면, 부풀려진 min_token_p_amountinternal_margin_open_position() 전체에서 기준 진실로 처리됩니다. 안전하지 않은 개설을 막기 위한 모든 지급 능력 게이트가 조작된 숫자에 대해 계산되므로, 포지션이 수락되고 프로토콜은 첨부된 순환 스왑 메시지와 함께 차입한 token_d를 DEX로 디스패치합니다.

공격 분석

다음 분석은 트랜잭션 GcXEKm...fnFT를 기반으로 합니다.

1단계: 가짜 토큰 및 풀 배포

공격자는 세 가지 가짜 토큰을 배포하고 다섯 가지 가짜 풀을 생성했습니다.

  1. 가짜 토큰 ID:

    1. Fake1: 31623e1d98275d2b0db4f50e102f6bf40877c1345e06e4ca6727f58c89564bb2

    2. Fake2: 6a28e3d3c7af1415ec22c6264013e1138bab00f85b8b6055d882d7d46afdf49b

    3. Fake3: e081e03daf58f5bb04cf95a03017e58449b76e704f1974771d7e3bd52835b6e5

  2. 가짜 풀 ID:

    1. Zec-Fake1: 7509

    2. Fake1-Fake2: 7510

    3. USDC-Fake2: 7511

    4. Fake2-Fake3: 7512

    5. Fake3-USDC: 7513

2단계: 마진 포지션 개설

  • 1단계: Burrowland의 마진 트레이딩 기능을 사용하여, 공격자는 합법적으로 가치 있는 자산을 token_c로, 실제 리저브 자산을 token_d로 하는 레버리지 포지션을 열었으며, 1단계에서 공격자가 제어하는 풀을 통해 완전히 라우팅되는 A->B->A->B 왕복 액션 목록을 포함한 스왑 메시지를 첨부했습니다.
  • 2단계: verify_token_out()이 최종 출력과 일치하는 token_out을 가진 모든 단계에 걸쳐 min_amount_out을 합산하기 때문에, 왕복 경로를 통해 공격자는 선언된 min_token_p_amount를 임의의 값으로 부풀릴 수 있었습니다.

  • 3단계: 부풀려진 min_token_p_amountinternal_margin_open_position()의 모든 개설 시점 건전성 검사를 통과하여, 포지션이 수락되고 프로토콜은 token_d를 Ref-Finance로 디스패치했습니다.

  • 4단계: 순환 스왑은 극소량의 token_p만 반환했습니다; on_open_trade_return()은 재검사 없이 이를 기록하여, 포지션이 생성 시부터 지급 불능 상태가 되었습니다.

  • 5단계: 차입한 token_d는 경로를 따라 공격자가 제어하는 풀 내에 정착했습니다; 공격자는 remove_liquidity()를 통해 이를 추출했습니다.

  • 6단계: 차입이 레버리지되어 있으므로, 인출된 token_d는 예치된 token_c보다 가치가 높습니다. 그 차이가 사이클당 순이익이며, 회수 불가능한 부채는 protocol_debts로 강제 청산됩니다. 공격자는 약 $18.4M이 탈취될 때까지 이 구조를 반복했습니다.

결론

이 사건은 Burrowland의 마진 개설 경로에서 발생한 비즈니스 로직 결함으로 인해 발생했습니다. RefV1TokenReceiverMessage::get_token_out() 함수는 최종 토큰과 일치할 때마다 중간 출력값을 잘못 집계하여, 이 금액이 최종 출력으로 남을 것이라고 가정했습니다. 그러나 순환 스왑 경로는 이 가정을 깨뜨립니다. 이러한 토큰들이 경로 내에서 재사용되고 소비될 수 있기 때문입니다. 결과적으로, 계산된 min_token_p_amount가 인위적으로 부풀려질 수 있어, 이후의 모든 지급 능력 검사가 잘못된 값에 의존하게 되고, 실제 수신 금액을 검증하지 않고 조작된 건전성 상태에 대해 포지션을 개설할 수 있게 됩니다.

프로덕션 마진 트레이딩 컨트랙트의 경우, 개발자는 다음을 수행해야 합니다:

  • 사용자가 선언한 min_amount_out을 미검증 입력으로 처리하고, 최종 홉의 min_amount_out만 취하거나 이전에 생성된 token_out을 재소비하는 스왑 경로(목표에 대한 순환 없음)를 명시적으로 거부합니다.

  • 오라클 기반의 스왑 출력값에 대해 선언된 슬리피지를 하한과 상한 범위로 모두 제한하여, 공격자가 선언된 값을 일방적으로 부풀려 지급 능력 조건을 우회할 수 없도록 합니다.

Phalcon Security 시작하기

모든 위협을 탐지하고, 중요한 경보를 발령하며, 공격을 차단하세요.

지금 무료로 시작하기

Hyperbridge

2026년 4월 13일, Ethereum 기반의 크로스체인 메시징 브릿지 Hyperbridge가 MMR(Merkle Mountain Range) 증명 검증 로직의 입력값 검증 누락으로 인해 약 $242K의 피해를 입었습니다. MerkleMountainRange.VerifyProof() 함수가 leaf_index < leafCount를 강제하지 않아, 공격자가 크로스체인 증명을 위조하고 10억 DOT 토큰 발행을 포함한 권한 있는 작업을 수행할 수 있었습니다.

배경

Hyperbridge는 크로스체인 메시지를 위해 Ethereum 측 검증자 및 디스패처 모델을 사용합니다. Ethereum에서, 컨트랙트 HandlerV1은 저장된 overlayRoot에 대해 제공된 증명을 검증하고, 증명이 수락되면 TokenGateway와 같은 목적지 모듈로 메시지를 디스패치합니다.

컨트랙트 TokenGateway는 권한 있는 자산 관리 모듈입니다. 일반적인 자산 브릿징 외에도, 자산 생성, 등록 해제, 관리자 관리와 같은 거버넌스 스타일의 작업을 지원합니다. ERC6160Ext20으로 구현된 브릿지된 자산의 경우, 관리자는 changeAdmin() 함수를 호출하여 발행 권한을 직접 이전할 수 있으며, 새 관리자는 mint() 함수를 통해 임의의 공급량을 발행할 수 있습니다.

이는 전체 자산 브릿지의 안전성이 HandlerV1의 증명 검증 경로의 정확성에 달려 있음을 의미합니다. 위조된 메시지가 검증을 통과할 수 있다면, 다운스트림 모듈은 공격자가 제어하는 페이로드를 진정한 크로스체인 지시로 처리할 것입니다.

취약점 분석

핵심 문제는 컨트랙트 HandlerV1(0x6c84ed...6d64)의 MMR 증명 검증 흐름에 있습니다. 진입 함수 handlePostRequests()는 먼저 공격자가 제공한 입력값을 기반으로 MmrLeaf(leaf.kIndex, leaf.index, commitment)를 구성합니다. 그런 다음, MerkleMountainRange.VerifyProof()가 증명 검증을 수행하기 위해 호출됩니다.

MerkleMountainRange.VerifyProof(root, request.proof.multiproof, leaves, request.proof.leafCount)

그러나 VerifyProof()root == CalculateRoot(proof, leaves, mmrSize)만 확인하고 각 leaf.index가 범위 내에 있는지(즉, leaf.index < leafCount) 검증하지 않습니다. leafCount = 1leaf_index = 1을 선택함으로써, 공격자는 CalculateRoot()가 위조된 요청 커밋먼트를 계산된 루트에 접어 넣는 것을 건너뛰어 피크 루트를 직접 반환하도록 만듭니다. 이는 메시지-증명 바인딩을 깨뜨리고 임의의 페이로드가 과거의 overlayRoot에 대해 유효한 것으로 통과할 수 있게 합니다.

공격 분석

다음 분석은 트랜잭션 0x240aeb...1109를 기반으로 합니다 [1].

  • 1단계: 공격자 EOA 0xC513...F8E7이 동일한 트랜잭션에서 도우미 컨트랙트 0x518A...8f260x31a1...ca9AB를 배포했습니다.

  • 2단계: 도우미 컨트랙트 0x31a1...ca9ABHandlerV1의 취약한 검증 경로를 통해 위조된 요청을 제출했습니다. VerifyProof()가 범위를 벗어난 leaf_index를 거부하지 않았기 때문에, 위조된 요청 커밋먼트가 루트 계산에서 제외되었음에도 불구하고 증명이 과거의 overlayRoot와 일치했습니다.

  • 3단계: 위조된 메시지가 수락된 후, HandlerV1이 이를 TokenGateway로 디스패치하여 ChangeAssetAdmin 작업을 실행했습니다. 이로 인해 DOT 토큰의 관리자가 공격자가 제어하는 도우미 컨트랙트 0x31a1...ca9AB로 변경되었습니다.

  • 4단계: 도우미 컨트랙트가 1,000,000,000e18 DOT 토큰을 발행했습니다.

  • 5단계: 도우미 컨트랙트가 새로 발행된 DOT 토큰을 Odos Router V3를 통해 108.2 ETH로 스왑했습니다.

  • 6단계: 공격자가 108.2 ETH를 자신의 EOA 계정으로 이체했습니다.

결론

이 사건은 Hyperbridge의 MMR 검증 로직에서 부적절한 증명 검증으로 인해 발생했습니다. leaf_index < leafCount가 강제되지 않았기 때문에, 공격자는 커밋먼트가 계산된 루트에 실제로 포함되지 않은 메시지를 위조하면서도 과거의 상태 루트에 대한 검증을 통과할 수 있었습니다. 완화 방안으로는 증명 검증 전에 leaf_index < leafCount와 같은 엄격한 경계 검사를 강제해야 합니다.

참고문헌

[1] BlockSec, "Hyperbridge 공격 분석," 2026년 4월 13일. https://x.com/Phalcon_xyz/status/2043601549893738970


Dango

2026년 4월 13일, Cosmos AppChain으로 구축된 무기한 선물 DEX Dango가 부호 검사 누락으로 인해 약 $1.5M의 피해를 입었습니다. replenish_insurance_fund() 함수가 입력 금액을 검증하는 데 is_positive() 대신 is_non_zero()를 사용하여, 공격자가 음수 UsdValue를 제공하고 보험 기금을 자신의 마진 포지션으로 탈취할 수 있었습니다.

배경

Dango는 Cosmos AppChain으로 구축된 무기한 선물 DEX입니다. 사용자는 USDC를 퍼프스 컨트랙트에 담보로 예치하고, 온체인 중앙 지정가 주문서(CLOB)를 통해 BTC, ETH, SOL 등의 자산에 대한 레버리지 롱 또는 숏 포지션을 개설합니다. 각 사용자의 담보 잔액은 퍼프스 컨트랙트 내에서 마진 계정으로 추적됩니다.

유동성 공급자(LP)를 불량 부채 손실로부터 보호하기 위해, 프로토콜은 청산된 포지션의 담보가 부채를 완전히 상환하기에 부족할 때의 부족분을 충당하는 USDC 리저브인 보험 기금을 유지합니다. 이것이 없으면, 그러한 부족분은 LP에게 직접 사회화될 것입니다. 모든 사용자는 퍼프 계정의 마진을 보험 기금에 기여할 수 있었습니다.

취약점 분석

근본 원인은 컨트랙트 0x90bc84...bea4freplenish_insurance_fund() 함수에 있으며, 음수 입력 금액을 거부하지 않습니다. 이 함수에는 두 가지 가드가 있지만, 어느 것도 음수 amount를 막지 않습니다:

  1. ensure!(amount.is_non_zero())는 금액이 0이 아닌지 확인하지만, 양수인지는 확인하지 않습니다.
  2. ensure!(user_state.margin >= amount)는 사용자가 충분한 마진을 가지고 있는지 확인하지만, 모든 양수 마진은 >= 음수를 만족합니다.

두 가드를 통과하면, 함수는 user_state.margin.checked_sub_assign(amount)state.insurance_fund.checked_add_assign(amount)를 실행합니다. amount가 음수일 때, 이를 빼면 사용자의 마진이 증가하고, 이를 더하면 보험 기금이 감소하여 의도한 자금 흐름이 완전히 역전됩니다.

공격 분석

트랜잭션:

Tx ID 작업 Tx 해시
1 익스플로잇 5505BB...A901
2 브릿지 95AD18...00B6
3 브릿지 95B5D7...D9AD
4 브릿지 2DA851...90E6
5 브릿지 4B141D...1CD4
6 브릿지 FD1BFF...2E4E
7 브릿지 641015...E126
8 브릿지 9B951D...2858

1단계:

Tx 1에서, 공격자는 Dango의 보험 기금에서 자산을 탈취하기 위해 다음 단계를 수행했습니다:

  • 1단계: 공격자는 1e6 USDC를 예치하여 마진 포지션을 개설했습니다. 이는 replenish_insurance_fund()를 호출하기 위한 전제 조건이었습니다.
  • 2단계: 공격자는 음수 amount(즉, -1500000)로 replenish_insurance_fund()를 호출했습니다. 부적절한 검증으로 인해 음수 amount가 수락되어, 보험 기금에서 공격자의 마진 포지션으로 자산이 탈취되었습니다.

  • 3단계: 공격자는 마진 포지션에서 모든 자산을 인출하여 $1,500,000의 USDC를 획득했습니다.

2단계:

Tx 2-8에서, 공격자는 transfer_remote()를 호출하여 도난된 자산을 Ethereum으로 브릿징했습니다. 그 결과, $410,000의 USDC가 Ethereum으로 브릿징되었습니다.

결론

이 공격의 본질은 부호 없는 컨텍스트에서 부호 없는 가드 없이 사용된 부호 있는 정수 타입입니다. UsdValue 타입은 설계상 부호가 있습니다(퍼프스 PnL은 음수가 될 수 있음), 그러나 보험 기금 기부 경로는 양수 기여에만 의미가 있습니다. is_positive() 대신 is_non_zero()를 사용하면 어떤 호출자도 자금 흐름의 방향을 바꿔 보험 기금에서 자신의 마진으로 USDC를 탈취할 수 있는 한 단어의 허점을 남겼습니다. 공격자는 단일 트랜잭션($1 예치, $1.5M 탈취, $1,500,001 인출)에서 전체 공격을 실행한 다음 천천히 자금을 브릿징했습니다. 브릿지 속도 제한이 피해를 제한한 유일한 메커니즘이었습니다: 그것이 없었다면, 전체 ~$1.5M이 회수 불가능하게 Ethereum으로 브릿징되었을 것입니다.


BlockSec 소개

BlockSec은 풀스택 블록체인 보안 및 암호화폐 컴플라이언스 제공업체입니다. 저희는 고객이 코드 감사(스마트 컨트랙트, 블록체인 및 지갑 포함), 실시간 공격 차단, 사건 분석, 불법 자금 추적, AML/CFT 의무 이행을 프로토콜 및 플랫폼의 전체 생애 주기에 걸쳐 수행할 수 있도록 제품과 서비스를 구축합니다.

BlockSec은 저명한 학회에서 다수의 블록체인 보안 논문을 발표하고, DeFi 애플리케이션의 제로데이 공격을 여러 건 보고하였으며, 다수의 해킹을 차단하여 2,000만 달러 이상을 구제하고 수십억 달러 규모의 암호화폐를 보호했습니다.

Sign up for the latest updates
~$410만 손실: Taiko, SecondFi 익스플로잇 | BlockSec 위클리
Security Insights

~$410만 손실: Taiko, SecondFi 익스플로잇 | BlockSec 위클리

이 주간 블록체인 보안 리포트는 2026년 6월 22~28일 발생한 주요 사건 2건을 다루며, 이더리움과 카르다노에서 약 410만 달러의 피해가 확인됐습니다. Taiko 브릿지 공격은 노출된 SGX 서명 키와 디버그 엔클레이브를 거부하지 못한 증명 정책 결함을 이용해 악성 증명자를 등록하고 L2 상태 증명을 위조했습니다. SecondFi 지갑은 Ed25519 논스 도출 시 비밀 입력이 제거되는 결함으로 공개 트랜잭션 데이터만으로 개인 키 복구가 가능했습니다.

~$18M 손실: jaredFromSubway, Aztec 등 | BlockSec 위클리
Security Insights

~$18M 손실: jaredFromSubway, Aztec 등 | BlockSec 위클리

이 주간 블록체인 보안 보고서는 2026년 6월 15일~21일을 다루며, 이더리움과 BNB 체인에서 3건의 주요 사고가 발생해 약 $18.3M의 손실이 발생했습니다. jaredFromSubway 사건은 MEV 봇이 차익거래를 위해 신뢰할 수 없는 제3자 컨트랙트에 자산을 승인한 역방향 승인 공격으로, 가짜 래퍼 토큰과 스왑 풀을 이용해 약 $15M 손실이 발생했습니다. Aztec은 이스케이프 해치 ZK 회로의 제약 누락으로 공격자가 가짜 머클 트리로 온체인 검증을 통과했습니다.

Web3 컴패니언: 오픈소스 보안 에이전틱 지갑

Web3 컴패니언: 오픈소스 보안 에이전틱 지갑

BlockSec가 Web3 Companion을 오픈소스로 공개했습니다. 이 보안 중심의 에이전트 지갑은 자체 AI 에이전트를 신뢰하지 않는 방식으로 설계되었으며, 키 격리, 강력한 정책, Passkey를 활용해 온체인 자산을 보호합니다.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit