빠르게 돌아가는 블록체인 세계에서는 단 한 번의 계산 실수로 수백만 달러의 손실이 발생할 수 있기 때문에 복잡한 버그를 이해하는 것이 중요합니다. 최근 Solidity 커뮤니티의 핵심 인물이자 Spearbit의 CEO인 Hari Krishnan은 X에서 간단한 질문으로 흥미로운 논의를 촉발했습니다: "당신이 본 것 중 가장 복잡한 버그/익스플로잇은 무엇인가요? 특히 수학이나 반올림과 관련된 까다로운 버그를 찾고 있습니다."
보안 연구원과 개발자들의 답변이 쏟아져 나오며 수학적 세부사항과 반올림 오류를 중심으로 한 놀라운 익스플로잇 사례들이 강조되었습니다. 이 이야기들은 단순히 흥미진진한 것에 그치지 않습니다—스마트 컨트랙트 보안이 프로젝트의 성패를 좌우할 수 있는 meme token을 개발하거나 투자하는 모든 이에게 귀중한 교훈을 제공합니다. 아래에서는 스레드의 하이라이트를 쉽게 풀어 설명합니다.
KyberSwap Elastic Exploit: 정밀도의 실패
주목할 만한 사례로 zerosnacks.eth가 언급한 것은 2023년 11월의 KyberSwap Elastic 해킹으로 약 5,470만 달러가 탈취된 사건입니다. 이 익스플로잇은 플랫폼의 Concentrated Liquidity Market Maker(CLMM)와 수수료를 유동성 제공자에게 복리로 재투자하는 Reinvestment Curve를 악용했습니다.
전개 방식은 이렇습니다: 공격자는 flash loans를 이용해 풀의 가격(2^96으로 스케일된 가격의 제곱근인 sqrtP로 표현)을 조작했습니다. 정밀한 양으로 유동성을 추가하고 제거함으로써 시스템이 틱(tick)을 넘어선 토큰 스왑을 잘못 계산하도록 속였습니다. calcReachAmount 함수의 버그는 reinvestment 유동성 포함으로 인해 토큰을 과대평가하게 만들었고, 틱을 넘을 때 유동성 업데이트를 건너뛰게 했습니다. 그 결과 유동성이 "중복"되어 공격자가 거대한 이익을 얻으며 되돌려 스왑할 수 있었습니다.
핵심은? 모든 것이 sqrtP 계산에서의 정밀도 문제와 반올림에 달려 있었습니다—작은 불일치가 거대한 이득으로 확대된 것이죠. meme token 제작자에게 이는 맞춤형 유동성 모델의 위험성을 강조합니다. 수학이 많은 함수는 반드시 감사(audit)하세요! 자세한 심층 분석은 여기에서 확인하세요.
Bunni 해킹: 반올림 방향이 배신할 때
Philogy는 며칠 전 840만 달러가 유출된 최근 Bunni 해킹을 언급했습니다. Ethereum과 Unichain에서 운영되는 DeFi 프로토콜인 Bunni는 출금 시 유휴 잔액을 업데이트하는 방식의 반올림 오류에 취약했습니다.
공격자는 3백만 USDT를 flash loan으로 빌린 뒤 USDC/USDT 풀의 가격을 극단적으로 왜곡시켜 USDC 잔액을 28 wei 수준으로 줄였습니다. 그런 다음 44번의 아주 작은 출금을 반복하여 USDC의 유동성 추정치를 불균형하게 깎아내는 반올림을 악용하고, USDT 쪽은 거의 그대로 두었습니다. 이로 인해 "유령 유동성"이 생성되어 과도한 스왑과 이익을 가능하게 했습니다.
교훈은? 단일 연산에서 안전한 것으로 보이는 반올림 방향이 연속된 동작에서는 재앙으로 이어질 수 있다는 점입니다. Bunni의 사후 분석에서는 고립된 안전한 반올림이 연쇄적으로 악용될 수 있음을 지적합니다. 유동성 풀을 사용하는 meme token 프로젝트라면 다단계 시나리오를 철저히 테스트하세요. 자세한 내용은 Bunni의 블로그 포스트를 참고하세요.
Aztec Plonk Verifier '0 버그': 제로 지식의 악몽
Vishal Singh는 Aztec의 zero-knowledge 증명 시스템에서 발견된 Plonk verifier의 "0 버그"를 강조했습니다. Plonk는 개인정보 보호 트랜잭션에 사용되는 zk-SNARK이지만, 이 버그는 0을 타원곡선 수학과 Fiat-Shamir 챌린지 처리에서 어떻게 취급하느냐를 악용해 증명을 위조할 수 있게 했습니다.
본질적으로 Plonk 논문과 구현에서 0을 무한대 점(point at infinity)으로 볼지 여부의 모호성은 공격자가 챌린지와 다항식을 조작해 잘못된 증명을 통과시키게 했습니다. 공개 입력(public inputs)이 완전히 해시되지 않아 위조된 유효성을 맞추는 조정이 가능했습니다.
이 사례는 bilinear pairings와 polynomial commitments 같은 고급 암호 수학을 포함하는 매우 까다로운 문제입니다. 특히 ZK 기술을 사용하는 개인정보 중심의 meme token 개발자에게는 구현 시 실수로 인한 함정을 환기시킵니다. 이 버그는 패치되었지만 자세한 내용은 exploit details에서 확인하세요.
MIM_Spell 공격: Shares 조작의 달인
Misbahu는 2024년 1월의 MIM_Spell(Abracadabra) 공격에 대한 상세 스레드를 참고했습니다. 공격자는 borrow shares 조작을 통해 자금을 탈취했습니다.
Abracadabra는 부채 추적을 위해 shares 시스템을 사용합니다: borrow shares는 고정되어 있는 반면 자산은 이자로 성장합니다. exploit은 total assets를 shares 없이 줄이는 repayForAll을 악용해 비율을 왜곡했습니다.
공격자는 flash-loan으로 자금을 빌린 뒤 거의 모든 부채를 상환하고, 그다음 아주 작은 금액을 반복적으로 빌리고 상환하는 루프를 돌려 total shares를 거의 무한대로 부풀리면서 자산은 낮게 유지했습니다. 이에 따라 프로토콜은 그들의 부채 지분을 잘못 판단해 최소한의 담보로 모든 것을 빌려갈 수 있었습니다.
순수한 수학적 마법—프로토콜 측의 올림(반올림)이 루프에서는 역효과를 낸 셈입니다. 핵심 수정사항: borrow shares가 assets 아래로 떨어지지 않도록 보장해야 합니다. 전체 스레드는 여기에서 확인하세요.
Raydium 치명적 버그: 틱과 유동성 문제
Brainiac는 "Raydium 2 crit"를 언급했는데, 이는 2024년에 수정된 틱 조작 버그처럼 Raydium의 CLMM에서 발견된 치명적 취약점을 가리키는 것으로 보입니다.
어떤 경우에는 increase_liquidity 함수가 공격자에게 틱(가격 범위)을 조작해 잘못된 유동성을 추가하게 해 풀을 고갈시킬 수 있었습니다. 이는 포지션 업데이트에서의 수학적 오류와 관련되어 있었습니다.
Raydium의 코드에는 값 손실을 방지하기 위한 명시적인 반올림 방향 처리가 있지만, sqrt_price_math와 liquidity_math의 버그는 올바르게 처리되지 않으면 익스플로잇으로 이어질 수 있습니다.
Solana 기반의 meme token이 Raydium을 사용할 경우 틱 경계와 수학 라이브러리를 철저히 감사하세요.
일반적인 반올림 공포
TianCi_Club는 고전적인 사례를 공유했습니다: 반올림 오류로 전체 유동성 풀이 고갈되는 경우입니다. 이러한 교묘한 버그는 수수료 계산이나 shares 변환에서 자주 발생하며, 내림(floor)이나 올림(ceiling)의 누적이 트랜잭션을 통해 손실을 쌓아갑니다.
변동성이 큰 meme token 환경에서는 이런 오류가 거래를 증폭시켜 자금을 순식간에 증발시킬 수 있습니다. 항상 사용자 안전을 우선하는 반올림 방식을 선택하고 극단적인 상황을 시뮬레이션하세요.
이들 익스플로잇은 대부분 미세한 반올림이나 정밀도 누락과 같은 수학적 버그가 잘 감사된 프로토콜도 무너뜨릴 수 있음을 보여줍니다. meme token 열풍이 불고 있는 만큼 개발자들은 보안을 최우선으로 두어야 합니다—Spearbit 같은 감사 기관을 고려하세요. 경계를 늦추지 말고 이런 실전 사례 스레드를 팔로우해 현실 세계의 지혜를 얻으세요. 여러분이 겪은 가장 황당한 버그 이야기는 무엇인가요? 댓글로 공유해 주세요!