크립토와 해킹 — 블랙햇의 악몽
블랙햇 암호화폐 보안 사고 — 브릿지, 키, 사회 공학적 기법, 거버넌스 익스플로잇 — 그리고 전문적인 팀들이 도입하는 느리고 비용이 많이 드는 방어 체계.
다른 언어: EnglishРусскийEspañol中文ไทยFrançaisУкраїнськаTürkçeहिंदीفارسیالعربيةHausaPortuguêsTiếng Việt日本語Bahasa IndonesiaDeutschTagalog

목차
가상자산은 흔히 암호학, 탈중앙화된 합의, 그리고 불변의 원장으로 이루어진 성벽으로 묘사되곤 합니다. 하지만 이 디지털 약속의 땅의 실체는 훨씬 더 복잡하고 위험합니다. 주류 언론은 보통 사회공학적 기법이나 피싱 캠페인, 혹은 의심하지 않는 사용자가 악성 사이트에 거래소 주소나 개인 키를 입력하게 만드는 단순 사기를 통한 가상자산 해킹에 대해 이야기합니다.
하지만 이 글에서는 이러한 인적 오류를 완전히 배제할 것입니다. 대신 우리는 순수 해킹에 대해 다룰 것입니다. 이곳은 무너진 사이버 보안과 심각한 결함이 있는 코드가 끔찍한 침해 사고로 이어지는 영역입니다. 코드가 제작자를 공격하는 무기가 되어 단 한 발의 총성도 없이 단 몇 분 만에 수억 달러를 빼돌리는, 블랙햇 해커들의 꿈이 실현되는 곳입니다. 이는 우리를 논리적 결함, 컴파일러 버그, 그리고 아키텍처적 허점의 극단으로 몰아넣습니다.
스마트 컨트랙트 익스플로잇의 기원
순수한 스마트 컨트랙트 해킹을 설명하기 위해서는 이더리움의 행보를 영원히 바꿔 놓은, 당시 디파이(DeFi) 역사상 가장 악명 높은 사건 중 하나를 먼저 짚어봐야 합니다. 프로그래밍 가능한 블록체인의 초기 시절, '더 다오(The DAO)'라는 프로젝트가 있었습니다. 이 펀드는 인간의 개입 없이 전적으로 스마트 컨트랙트에 의해 관리되는 일종의 탈중앙화 벤처 캐피털 펀드를 지향했습니다.
이 컨트랙트는 제안에 투표하고 보상을 받으려는 투자자들로부터 수백만 달러 상당의 이더(Ether)를 모았습니다. 하지만 개발자들은 출금 프로세스를 안전하게 구현하지 못했고, 이는 '재진입성(reentrancy)'이라 불리는 버그로 이어졌습니다.
재진입성(Reentrancy) — 스마트 컨트랙트가 외부 컨트랙트를 호출하면서 자신의 내부 상태를 업데이트하지 않는 현상을 말합니다. 예를 들어, 더 다오(The DAO)의 출금 함수는 요청된 자금을 사용자에게 먼저 전송한 후에야 사용자의 상태를 출금된 금액으로 업데이트했습니다.
블랙햇 해커는 폴백(fallback) 함수를 포함한 악성 스마트 컨트랙트를 배포할 수 있다는 사실을 깨닫습니다.The DAO가 이 악성 컨트랙트로 자금을 보낼 때마다 폴백 함수가 호출되었습니다. 폴백 함수는 단순히 자금을 수령하는 데 그치지 않고, 즉시 The DAO의 출금 함수를 다시 호출했습니다. 첫 번째 출금 시점에 해커의 잔액이 아직 업데이트되지 않았기 때문에 The DAO는 이를 실행했고, 이는 다시 한번 폴백 함수를 유발했습니다.
네트워크가 대응하기 전까지 이 과정이 반복적으로 되풀이되었으며, The DAO로부터 수백만 달러가 탈취되었습니다.
여파와 하드포크
이 해킹의 여파는 이전에 본 적 없는 수준이었습니다. 네트워크는 붕괴 위기에 처했으며, 당시 존재하던 전체 이더(Ether) 중 상당 부분이 도난당했습니다. 이는 커뮤니티에 존립 및 기술적 위기를 초래했고, 결국 커뮤니티는 블록체인 기록을 되돌리고 자금을 회수하기 위해 하드포크를 단행했습니다.
이 논란의 여지가 있는 결정은 영구적인 분열을 야기했으며, 그 결과 이더리움과 이더리움 클래식으로 나뉘게 되었습니다. 이 특정 취약점은 오늘날 잘 알려져 있으며, 주로 'Checks-Effects-Interactions' 패턴을 사용하여 방지되고 있습니다. 이 패턴은 컨트랙트가 먼저 모든 조건을 검증한 후 내부 상태를 업데이트해야 하며, 외부 컨트랙트 호출은 반드시 마지막 단계에서만 수행해야 함을 명시합니다.
하지만 기본적인 재진입성(reentrancy) 공격은 이제 자동화된 보안 감사 도구로 매우 쉽게 감지할 수 있음에도 불구하고, 미묘한 교차 컨트랙트 재진입성 공격은 여전히 매우 특수하고 틈새적인 상황에서 발생할 수 있습니다. 이는 이미 확립된 개념조차 새로운 공격 형태로 변모할 수 있음을 보여줍니다.
초기화되지 않은 로직과 Delegate Call의 시대
The DAO 사건을 통해 얻은 교훈은 개발자 커뮤니티에 빠르게 흡수되었습니다. 이후 커뮤니티는 가스 비용을 절감하고 업그레이드를 용이하게 하기 위해 라이브러리 컨트랙트 및 프록시 패턴과 같은 개념을 도입하며 더욱 복잡한 시스템을 개발해 왔습니다. 이러한 복잡성 속에서 순수 해킹의 추가적인 공격 벡터가 등장했으며, 그 중 가장 악명 높은 사례가 바로 패리티(Parity) 멀티시그 지갑 취약점 사건입니다.
패리티는 널리 사용되는 이더리움 클라이언트로, 핵심 로직을 중앙 라이브러리 컨트랙트에 두는 방식의 멀티 시그니처 지갑 스마트 컨트랙트를 제공했습니다. 이는 동일한 코드를 여러 번 배포하는 대신 수많은 지갑이 동일한 라이브러리를 참조할 수 있게 함으로써 리소스 효율성을 높이기 위한 의도였습니다.

해당 취약점의 유형은 delegatecall 함수에 대한 오해와 초기화되지 않은 상태 변수로 인해 발생했습니다. delegatecall 함수는 컨트랙트가 다른 컨트랙트의 함수를 실행할 수 있게 해주면서도, 해당 함수가 호출한 컨트랙트의 스토리지에 접근할 수 있도록 허용합니다. 패리티 라이브러리 컨트랙트 내부에는 지갑 소유자를 초기화하는 함수가 포함되어 있었습니다.
하지만 라이브러리 컨트랙트 자체는 실제로 초기화된 적이 없었습니다. 한 해커가 라이브러리 컨트랙트에서 초기화 함수를 직접 호출하여 해당 라이브러리의 소유권을 주장할 수 있다는 사실을 알아냈습니다. 라이브러리 소유권을 획득한 후, 그들은 이를 자가 파괴(self-destruct)하는 함수를 호출했습니다.
멀티시그 지갑의 동결
해당 라이브러리에 의존하던 멀티시그 지갑들은 라이브러리가 파괴되자마자 즉시 작동 불능 상태가 되었습니다. 트랜잭션을 처리하거나 자금을 인출하고, 심지어 단순히 잔액을 조회하는 데 필요한 모든 로직이 사라져 버린 것입니다. 이 과정에서 순수한 설계상의 실수로 인해 수억 달러 상당의 이더(Ether)가 도난당한 것이 아니라, 물리적으로 동결되고 말았습니다.
이 사건은 초기화되지 않은 로직 컨트랙트의 극심한 위험성과 delegatecall 함수와 관련된 미묘한 리스크를 부각시켰습니다. 오늘날에는 상식처럼 여겨지는 리스크들이지만, 당시에는 제대로 이해되지 않았던 부분입니다. 이를 해결하기 위해 현재 개발자들은 컨트랙트가 단 한 번만 초기화되도록 강제하는 특수한 초기화 모디파이어(modifier)를 사용하며, 누구도 소유권을 주장할 수 없도록 배포자의 로직 컨트랙트 상태에 더미 값을 설정해 두기도 합니다.
오늘날 동일한 상황이 발생할 가능성은 낮지만, 프록시 패턴 오용에 따른 일반적인 리스크는 여전히 모든 제대로 된 탈중앙화 금융(DeFi) 아키텍처에서 신중하게 고려해야 할 사항입니다.
크로스체인 브릿지의 암호학적 신기루
암호화폐 생태계가 여러 블록체인으로 확장됨에 따라 상호운용성에 대한 수요가 생겨났고, 이는 다양한 형태의 크로스체인 브릿지로 나타났습니다. 이러한 프로토콜은 한 체인에서 자산을 잠그고(lock), 다른 체인에서 그에 대응하는 자산을 발행(mint)할 수 있게 해줍니다.
이들이 보유한 막대한 자산 규모로 인해, 블랙햇 해커들에게는 꿈의 허니팟과도 같았습니다.
웜홀 브리지 익스플로잇 사건은 구현 과정에서 누락된 사소한 디테일 하나가 복잡한 암호학적 검증을 어떻게 무력화할 수 있는지 보여주는 매우 공포스러운 사례입니다. 웜홀은 솔라나와 이더리움 간의 자산 전송을 지원했습니다. 이 과정에서 가디언(guardian) 그룹이 한 체인에서 발생하는 이벤트를 모니터링하고, 이를 증명하기 위해 메시지에 서명합니다. 이후 대상 체인에서 이 서명들을 검증한 뒤, 해당 토큰을 새로운 토큰으로 발행(민팅)하게 됩니다.
취약점은 솔라나 스마트 컨트랙트의 서명 검증 과정에 있었습니다. 암호학적 검증은 컨트랙트가 호출하는 솔라나 내장 프로그램에 의해 수행되었습니다. 하지만 웜홀 개발자들은 호출되는 프로그램이 실제 시스템 프로그램인지 확인하지 않았습니다. 해커는 입력값에 상관없이 항상 성공 메시지를 반환하는 프로그램을 별도로 생성했습니다.

그다음, 웜홀 컨트랙트가 검증을 위해 이 가짜 앱을 사용하도록 유도했습니다. 서명이 유효하다는 잘못된 가정하에, 컨트랙트는 반대편 체인에 실제 예치된 이더리움이 전혀 없음에도 불구하고 솔라나 상에서 수억 달러 상당의 래핑된 이더리움(wrapped Ethereum)을 발행했습니다. 해커는 이렇게 발행된 담보 없는 토큰들을 다시 이더리움으로 래핑하여 프로토콜의 실제 자산을 모두 탈취했습니다.
이는 솔라나 계정 검증 모델을 겨냥한 깔끔하고 고도로 기술적인 공격이었습니다. 이 문제는 검증 셸이 실제로 하드코딩된 공식 시스템 주소인지 확인하는 엄격한 검증 절차를 도입함으로써 해결되었습니다.
그 파장은 엄청났으며, Solana DeFi 생태계의 시스템적 붕괴를 막기 위해 프로젝트 후원자들의 구제금융이 필요했습니다.이러한 취약점은 스마트 컨트랙트 개발 패러다임의 고유한 특성으로 인해 향후에도 재발할 수 있습니다. 특히 Solana와 같이 계정 모델 중심의 환경에서는 개발자가 스마트 컨트랙트 내에서 호출되는 모든 외부 엔티티에 대해 엄격한 계정 및 프로그램 유효성 검사와 검증을 수행하지 않을 경우 더욱 그러합니다.
Nomad 브릿지 익스플로잇
Wormhole이 특정 방향으로 진행된 조직적인 공격이었다면, Nomad 브릿지 익스플로잇은 단 하나의 단순한 로직 결함이 어떻게 프로토콜을 무질서한 난장판으로 만들 수 있는지 증명했습니다. 이러한 크로스체인 메시징을 구현하기 위해 Nomad는 메시지의 유효성을 증명하기 위해 머클 트리에 의존하는 옵티미스틱 롤업 모델을 사용했습니다. 개발자들은 프로토콜 업데이트를 배포할 때 신뢰할 수 있는 루트(trusted root)의 초기화 과정에서 중대한 실수를 저질렀습니다.
이는 신뢰할 수 있는 루트를 솔리디티에서 초기화되지 않은 변수의 기본값인 제로 해시(zero hash)로 설정했기 때문에 발생했습니다. 이로 인해 명시적으로 검증되지 않은 모든 메시지는 제로 해시로 대체되었고, 컨트랙트는 이를 유효한 신뢰 루트로 간주하게 되었습니다. 본질적으로 해커는 자금 인출을 요청하는 트랜잭션을 생성할 수 있다는 점을 깨달았으며, 증명 값이 제로 해시로 해싱되었기 때문에 컨트랙트는 이를 항상 수락했습니다.
이 해킹 사건은 그 단순함과 뒤따른 광기 어린 혼란으로 인해 매우 독특했습니다. 최초의 해커가 익스플로잇을 실행한 후, 다른 사용자들도 이에 가담하기 시작했습니다. 기술적인 해킹 능력은 전혀 필요하지 않았습니다. 그저 해커의 트랜잭션 정보를 복사하여 붙여넣고, 수신 주소를 자신의 주소로 바꾼 뒤 네트워크에 전송하기만 하면 되었습니다.
수백 명의 다양한 행위자들이 단 몇 시간 만에 노마드(Nomad) 브리지에서 약 2억 달러에 달하는 자금을 탈취했습니다.
이는 교과서적인 사이버 보안 실패 사례였습니다. 단 한 줄의 잘못 설정된 초기화 코드가 전체 암호화 보안 시스템을 무력화했습니다. 이는 제로 루트(zero root) 초기화 로직을 패치하고, 이를 유효한 루트로 인정하지 않도록 명시적으로 거부함으로써 해결되었습니다. 브리지 이용자들이 그 대가를 치러야 했으며, 이는 스마트 컨트랙트 개발 시 문자 하나가 누락되거나 기본값이 잘못 설정되는 것만으로도 프로토콜 전체가 위험에 처할 수 있다는 사실을 상기시켜 주는 뼈아픈 사례가 되었습니다.
이러한 특정 버그는 철저한 테스트를 통해 충분히 방지할 수 있는 문제였지만, 더 광범위한 유형의 초기화 오류들은 여전히 시스템을 위협하고 있습니다.
컴파일러 버그와 시장 조작
가장 끔찍한 형태의 해킹 중 하나는 개발자가 작성한 코드 자체가 아니라, 코드를 컴파일하는 데 사용된 도구에 결함이 있는 경우입니다. 우리는 DeFi의 근간을 흔들었던 커브 파이낸스(Curve Finance) 익스플로잇 사건을 통해 이 사실을 다시금 깨닫게 되었습니다. 스테이블코인을 위한 주요 DEX인 커브의 핵심 컨트랙트 대부분은 보안과 단순성을 강조하는 파이썬 스타일의 스마트 컨트랙트 언어인 바이퍼(Vyper)로 작성되었습니다.

다행히 커브 개발자들은 스마트 컨트랙트에 재진입 방지 가드(reentrancy guards)를 구현하여, 과거 The DAO 사태를 일으켰던 것과 동일한 유형의 공격으로부터 시스템을 보호하고 있었습니다. 하지만 바이퍼 컴파일러의 특정 구버전 내에 바로 그 버그가 숨겨져 있었습니다.
컴파일러는 사람이 읽을 수 있는 Vyper 코드를 이더리움 가상 머신(EVM)에서 실행될 기계 판독 가능 바이트코드로 성공적으로 변환했으나, 여러 함수에 걸쳐 재진입 잠금(reentrancy lock)을 적절히 분산시키지 못했습니다.코드는 안전했습니다. 개발자들은 의도한 대로 코드를 작성했으나, 컴파일러가 취약점이 포함된 바이트코드를 생성하며 그들의 뒤통수를 쳤습니다. 이는 블랙햇 해커가 일부 Curve 유동성 풀이 교차 함수 재진입(cross-function reentrancy)에 취약하다는 점을 인지하고 파악했음을 의미합니다. 그들은 이를 악용하여 풀에서 수천만 달러를 탈취했습니다.
이번 해킹은 전통적인 소스 코드 감사로는 포착할 방법이 없었기에 특히나 교묘하고 치명적이었습니다. 소스 코드 자체는 정확했기 때문입니다. 취약점은 오직 컴파일된 바이트코드에만 존재했습니다. 이 사건으로 인해 업계 전체가 컴파일러와 인프라에 대한 신뢰를 재고하게 되었습니다. 이 문제는 Vyper 컴파일러를 업데이트하고, 취약한 풀을 안전하게 컴파일된 새로운 컨트랙트로 마이그레이션함으로써 해결되었습니다.
그 결과 심각한 신뢰 위기가 닥쳤으며, 보안이 기술 스택의 최하단까지 도달해야 한다는 인식이 확산되었습니다. 컴파일러 버그는 물론 드물지만 예측이 거의 불가능하기 때문에, 이러한 인프라 수준의 악몽은 언제든 다시 발생할 수 있습니다.
탈중앙화 금융(DeFi)의 발전과 함께 등장한 새로운 형태의 금융 상품인 플래시 론(Flash loans)은 순수 해킹의 본질을 근본적으로 변화시켰습니다. 플래시 론을 사용하면 사용자는 동일한 트랜잭션이 완료되기 전에 대출금을 상환하기만 하면, 담보 없이 거의 무제한에 가까운 암호화폐를 빌릴 수 있습니다. 자금이 정산되지 않을 경우, 전체 트랜잭션은 마치 발생하지 않았던 것처럼 되돌려집니다.
보통 차익 거래나 청산을 목적으로 하는 플래시 론은 블랙햇 해커들에게 시장 메커니즘의 심각한 논리적 결함을 악용하는 데 필요한 유동성을 제공했습니다. 오일러 파이낸스(Euler Finance) 해킹 사건을 사례로 들어보자면, 오일러는 예치와 수익 창출을 위한 대출 프로토콜이었습니다. 사용자들은 또한 예치한 자산을 프로토콜 예비금으로 기부할 수 있었는데, 프로토콜 내에서는 이를 donateToReserves라는 함수로 불렀습니다.
하지만 개발자들은 해당 함수에서 매우 중요한 건전성 검사(health check)를 누락했습니다. 기부자가 자금을 인출한 계정이 기부 후에도 건전한 상태를 유지하는지 여부를 확인하지 않은 것입니다. 공격자는 플래시 론을 통해 막대한 양의 자산을 빌려 오일러에 예치했습니다. 그 다음, donateToReserves 함수를 호출하여 예치금의 일부를 기부했습니다.
건전성 검사가 없었기에 프로토콜은 기부를 승인했고, 이는 해커의 계정을 매우 인위적인 파산 상태로 몰아넣었습니다. 이후 해커는 자신의 계정에 대해 청산을 실행했습니다. 그러나 오일러의 청산 보너스 산출 방식은 복잡했고 플래시 론 규모가 워낙 컸기 때문에, 청산인은 결과적으로 예치했던 것보다 더 많은 가치를 프로토콜로부터 탈취하게 되었습니다.
그들은 플래시 론을 상환하고 약 2억 달러를 챙겨 달아났습니다. 이는 암호학적 실패나 컴파일러 버그가 아니라, 코드 내 금융 논리의 단순한 결함 때문이었습니다. 이 사례에서 개발자들은 특정 작업 수행 후 계정의 건전성을 확인하는 단 한 줄의 코드를 삽입하는 것을 잊었습니다. 패치 과정에서 적절한 건전성 검사가 추가되었고 프로토콜의 리스크 관리 논리가 완전히 재설계되었습니다.
이 사건은 프로토콜 운영이 중단되는 등 심각한 파장을 일으켰으며, 자금의 일부를 회수하기 위해 수개월 간의 협상이 필요했습니다.
복잡한 금융 메커니즘이 서로 의도치 않은 방식으로 반응하는 이러한 논리적 익스플로잇(logical exploits)은 오늘날 가장 만연하고 위험한 형태의 순수 해킹입니다. 프로토콜의 복잡성은 더욱 증가할 것이며, 이러한 유형의 논리적 간과는 거의 확실하게 반복될 것입니다.코드와 그 결과 사이의 끊임없는 사투
과거에 발생한 거대한 보안 침해 사건들을 되돌아보면 하나의 패턴을 쉽게 발견할 수 있습니다. 이러한 취약점은 기저의 블록체인 합의 메커니즘의 결함으로 인해 발생하는 경우가 거의 없습니다. 이는 변경 불가능한 코드에 내재된 인간의 논리적 오류입니다. 잘못된 상태 업데이트, 프록시의 정의되지 않은 코드 경로, 누락된 암호학적 검증, 컴파일러 오류, 혹은 존재하지 않는 금융 불변성 검사 등 그 원인이 무엇이든, 근본적인 문제는 항상 스마트 컨트랙트 설계 자체의 실수에 있습니다.
이러한 리스크를 제거하기 위해 업계는 다음과 같은 철저한 방어 체계를 갖추고 있습니다:
1. 독립적인 보안 기업을 통한 제3자 코드 감사. 2. 코드가 계획된 대로 정확히 실행됨을 수학적으로 증명하는 형식 검증(Formal verification) 도구. 3. 악의적인 공격자보다 먼저 결함을 찾아낸 화이트햇 해커에게 보상하는 대규모 버그 바운티. 4. 악의적인 업데이트 배포를 늦추기 위한 타임락(Time release locks) 및 멀티시그(Multi-sig) 관리자 키 제어 활용. 5. 보안 침해 발생 시 보상을 제공하는 탈중앙화 보험 프로토콜 활용.
그러나 이러한 방어 조치가 더욱 정교해졌음에도 불구하고 블랙햇 해킹은 여전히 존재합니다. 소프트웨어 개발의 출발점은 복잡성이 곧 실패의 기회를 만든다는 사실입니다.
수십 개의 다른 스마트 컨트랙트를 통합하고 여러 블록체인에 걸쳐 작동하는 복잡한 프로토콜을 개발자들이 구축함에 따라, 탈중앙화 금융(DeFi)의 복잡성이 증가하며 전례 없는 새로운 공격 경로가 생겨나고 있습니다.
공격자들은 오직 자신의 상상력에 의해서만 제한될 뿐이며, 성공을 위해 단 하나의 유효한 벡터만 찾아내면 되기 때문에 방어 측은 항상 사후 대응에 그치며 뒤처질 수밖에 없습니다. 이는 탈중앙화된 미래를 건설하는 이들과 이를 악용하려는 이들이 맞붙는 영구적인 투쟁이 될 것입니다. 전면적인 해킹의 악몽은 계속해서 변이하며 우리에게 끊임없이 상기시킬 것입니다. 코드가 곧 법인 세상에서는 단 하나의 오타가 모든 것을 앗아갈 수 있다는 사실을 말입니다.
코드 한 줄이 말 그대로 수십만 달러의 가치를 지니는 상황에서, 보안만큼이나 중요한 것은 최고 수준의 성능을 보장하기 위한 일상적인 운영의 효율성과 정밀도입니다. 사용자들은 디지털 자산, 특히 스테이블코인을 관리할 때 네트워크 비용이라는 부담을 정기적으로 겪게 됩니다. 이제 자본 이전을 위해 USDT를 자주 전송하는 경우라면, 이러한 USDT 트랜잭션 비용의 변동이 자산에 상당한 손실을 줄 수 있다는 점을 잘 알고 계실 것입니다.

생태계의 활발한 참여자로서 USDT를 저렴하게 전송하는 방법을 찾는 것은 매우 중요합니다. 바로 이 지점에서 특정 도구들이 이점을 제공합니다. netts 서비스의 'USDT 전송 계산기(USDT Transfer Calculator)'는 바로 이러한 활용을 극대화하기 위해 제작되었습니다.
TRON 네트워크에서 테더(Tether)를 전송할 때, 일정량의 에너지(Energy)와 대역폭(Bandwidth)이 소모됩니다. 만약 이를 보유하고 있지 않다면, 네트워크는 USDT 수수료에 따라 사용자의 TRX를 소각합니다.
사전에 필요한 정확한 에너지와 대역폭을 계산하는 Netts 추정기를 활용하면, 사용자는 TRX를 소각하는 대신 에너지를 임대하여 비용을 대폭 절감할 수 있습니다. 이는 토큰의 아주 작은 단위까지도 중요한 이 시장에서 자산을 최대한 효율적으로 관리하고 보존할 수 있음을 의미합니다.