DeFi 오라클 공격 패턴을 살펴보면, 이 여섯 가지 보안 조치를 알아야 합니다
번역자 주: 가격 오라클은 탈중앙화 금융(DeFi)의 중요한 요소입니다. 그러나 이 과정에서 발생할 수 있는 취약점으로 인해 많은 DeFi 프로젝트가 재앙적인 손실을 입었으며, 일부 손실은 수천만 달러에 달했습니다. 이러한 공격은 도대체 어떻게 발생하는 것일까요? 그리고 어떻게 예방할 수 있을까요? 이 글에서 유명한 화이트 해커이자 Paradigm 연구 파트너인 Samczsun은 가격 오라클 공격에 대한 5가지 실제 사례를 분석하고, 이러한 공격을 방어하기 위한 6가지 방법을 정리했습니다.
2019년 말, 나는 "저담보 대출을 통한 수익 창출"이라는 제목의 글을 발표했습니다. 이 글에서 나는 이더리움 dApp에 대한 경제적 공격을 설명했으며, 이 공격은 하나 이상의 토큰의 정확한 가격 데이터에 의존합니다. 지금은 2020년 말입니다. 불행히도 많은 프로젝트가 유사한 실수를 저질렀고, 최근의 사례로는 Harvest Finance가 해킹을 당해 프로토콜 사용자들이 총 3,300만 달러의 손실을 입었습니다.
개발자들은 재진입과 같은 취약점에 익숙해졌지만, 오라클 조작은 분명히 자주 고려되는 문제는 아닙니다. 사실, 재진입 취약점을 기반으로 한 공격은 지난 몇 년 동안 감소했지만, 가격 오라클 조작을 기반으로 한 취약점의 이용률은 현재 증가하고 있습니다. 따라서 가격 오라클 조작에 대한 확실한 자료를 발표할 때가 되었다고 생각합니다.
이 글은 세 부분으로 나뉘어 있습니다. 첫 번째 부분에서는 이 주제에 익숙하지 않은 사람들을 위해 오라클과 오라클 조작에 대한 간단한 소개를 합니다. 두 번째 부분은 몇 가지 사례 연구로, 여기서는 과거의 오라클 관련 취약점과 공격 사건을 되짚어 볼 것입니다. 자신의 지식을 테스트하고 싶은 사람은 이 부분을 건너뛸 수 있습니다. 마지막으로, 우리는 개발자들이 오라클 조작으로부터 프로젝트를 보호하기 위해 사용할 수 있는 기술을 정리했습니다.
실생활에서의 오라클 조작
시간을 2015년 12월 1일(수요일)로 되돌려 보겠습니다. 당신의 이름은 David Spargo라고 가정하고, 지금 호주 멜버른에서 Peking Duk 콘서트에 있습니다. 당신은 백스테이지 라운지에서 이 밴드의 멤버들을 직접 만나고 싶지만, 두 명의 경비원이 당신을 막고 있습니다. 그들은 일반인이 직접 들어가는 것을 허용하지 않을 것입니다.
당신은 Peking Duk 밴드의 친척처럼 행동하면 경비원이 어떻게 반응할지 궁금해합니다. 가족 구성원은 분명히 밴드에 접근할 수 있도록 허용될 것이므로, 당신이 경비원에게 당신이 밴드의 친척이라고 믿게 만드는 것이 전부입니다. 당신은 잠시 생각한 후, "천재적"이거나 "완전히 미친" 계획을 생각해 냅니다.
모든 것을 신속하게 정리한 후, 당신은 자신 있게 경비원 앞에 섭니다. 당신은 자신이 David Spargo이며 Peking Duk 밴드의 가족 구성원이라고 소개합니다. 경비원이 당신에게 증거를 요구할 때, 당신은 반박할 수 없는 증거인 위키백과를 보여줍니다.
경비원은 당신을 지나가게 하고, 잠시 기다리라고 합니다. 1분이 지나고, 2분이 지나고… 5분 후, 당신은 법 집행관이 나타나기 전에 도망쳐야 할지 고민합니다. 포기하려는 순간, Peking Duk 밴드의 멤버인 Reuben Styles가 다가오고, 당신은 그와 함께 라운지로 들어갑니다. 밴드는 당신의 기지를 높이 평가하며, 결국 함께 맥주를 몇 잔 마십니다. 그리고 나중에 그들은 자신의 페이스북 페이지에 그날 밤의 일을 공유합니다.
가격 오라클이란 무엇인가?
가격 오라클은 당신이 가격 정보를 문의하는 모든 것을 의미할 수 있습니다. Pam이 Dwight에게 Schrute 달러의 현금 가치를 물어보면, Dwight는 가격 오라클의 역할을 합니다.
이더리움에서는 모든 것이 스마트 계약이며, 가격 오라클도 마찬가지입니다. 따라서 가격 오라클이 가격 정보를 얻는 방식을 구분하는 것이 더 유용합니다. 한 가지 방법은 가격 API 또는 거래소에서 기존의 체인 외 가격 데이터를 가져와 체인에 가져오는 것입니다. 다른 방법은 체인 상의 탈중앙화 거래소(DEX)에 문의하여 즉각적인 가격을 계산하는 것입니다.
이 두 가지 선택지는 각각 장단점이 있습니다. 체인 외 데이터는 변동성에 대한 반응이 일반적으로 느리며, 이는 당신이 그것을 사용하려는 목적에 따라 좋거나 나쁠 수 있습니다. 이 방법은 일반적으로 소수의 특권 사용자가 데이터를 체인에 푸시해야 하므로, 당신은 이들이 악의적인 행동을 하지 않거나 나쁜 업데이트를 강제로 푸시하지 않을 것이라고 믿어야 합니다. 반면, 체인 상 데이터는 어떤 특권 접근도 필요하지 않으며 항상 최신이지만, 이는 공격자가 조작하기 쉬워 재앙적인 실패를 초래할 수 있습니다.
어떤 문제가 발생할 수 있을까요?
가격 오라클 통합 문제로 인해 DeFi 프로젝트에서 발생한 주요 재정 손실의 몇 가지 예를 살펴보겠습니다.
1. Synthetix sKRW 오라클 오류
Synthetix는 사용자가 다른 통화와 같은 자산에 접근할 수 있도록 하는 파생상품 플랫폼입니다. 이를 위해 당시 Synthetix는 맞춤형 체인 외 가격 피드를 사용했으며, 이 피드 데이터는 고정된 시간 간격으로 체인에 게시되었습니다. 이러한 가격은 사용자가 지원되는 자산에 대해 롱 또는 숏 포지션을 취할 수 있도록 허용합니다.
2019년 6월 25일, Synthetix가 의존하던 한 가격 피드 보고서는 원화의 가격이 실제 환율보다 1000배 높다고 보고했습니다. 가격 오라클 시스템의 다른 곳에서 발생한 오류로 인해 이 가격이 시스템에 의해 수용되고 체인에 게시되었으며, 이후 한 거래 봇이 sKRW 시장에 신속하게 진입하고 퇴출했습니다.
Synthetix 팀은 거래자와 협상하여 자금을 반환받도록 했지만(취약점 보상으로), 전반적으로 이 봇은 10억 달러 이상의 이익을 얻을 수 있는 능력이 있었습니다.
Synthetix는 가격 오라클을 올바르게 실행하고 여러 출처에서 가격을 가져와 거래자가 가격 변화가 체인에 게시되기 전에 예측하지 못하도록 했습니다. 그러나 고립된 상류 가격 피드 오류가 치명적인 공격을 초래했습니다. 이는 체인 외 데이터를 사용하는 가격 오라클의 위험을 보여줍니다: 가격이 어떻게 계산되는지 알 수 없으므로, 시스템은 모든 잠재적 실패 모드를 올바르게 처리할 수 있도록 신중하게 설계되어야 합니다.
저담보 대출
위에서 언급한 바와 같이, 나는 2019년 9월에 체인 상 데이터 가격 오라클과 관련된 위험을 개요한 글을 발표했습니다. 이 글을 읽는 것을 강력히 권장하지만, 글의 길이가 길고 기술적 세부사항이 많아 이해하기 어려울 수 있습니다. 따라서 여기서 간단한 설명을 제공하겠습니다.
상상해 보세요, 당신이 탈중앙화 대출을 블록체인에 올려놓습니다. 사용자는 자산을 담보로 예치할 수 있으며, 다른 자산을 빌릴 수 있습니다. 빌릴 수 있는 최대 금액은 그들이 예치한 자산의 가치에 따라 결정됩니다. 사용자가 ETH를 담보로 사용하고 USD를 빌린다고 가정해 보겠습니다. 현재 ETH의 가격은 400달러이고, 담보 비율은 150%입니다.
사용자가 375 ETH를 예치하면, 그들이 예치한 담보의 가치는 15만 달러입니다. 1.5달러의 담보로 1달러를 빌릴 수 있는 규칙에 따라, 해당 사용자는 시스템에서 최대 10만 달러를 빌릴 수 있습니다.
물론 블록체인에서는 단순히 1 ETH가 400달러라고 선언하는 것만으로는 충분하지 않습니다. 악의적인 사용자가 1 ETH가 1000달러라고 선언하면 시스템에서 모든 돈을 가져갈 수 있기 때문입니다. 따라서 개발자는 Uniswap, Kyber 또는 다른 탈중앙화 거래소(DEX)의 현물 가격을 쉽게 통합하려고 할 것입니다.
겉보기에는 이것이 올바른 접근법인 것 같습니다. 결국, 당신이 ETH를 사고 팔고 싶을 때마다 Uniswap의 가격은 대체로 정확합니다. 왜냐하면 차익 거래자가 빠르게 어떤 편차를 수정하기 때문입니다. 그러나 사실, 탈중앙화 거래소(DEX)의 즉시 가격은 거래 중에 매우 부정확할 수 있으며, 아래의 예시에서 볼 수 있습니다.
Uniswap의 유동성 기능을 생각해 보세요. 가격은 보유 자산의 양에 따라 계산되지만, 사용자가 ETH와 USD 간에 거래를 하면서 보유 자산의 양이 변동합니다. 만약 악의적인 사용자가 플랫폼에서 대출하기 전후로 거래를 실행한다면 어떻게 될까요?
사용자가 대출하기 전에 그들은 200만 USD의 가격으로 5000 ETH를 구매했습니다. 이제 Uniswap 거래소에서 계산된 가격은 1 ETH = 1,733.33 USD입니다. 이제 그들의 375 ETH는 담보로 사용될 수 있으며, 최대 433,333.33 달러의 자산을 빌릴 수 있습니다. 마지막으로 그들은 200만 달러를 다시 5000 ETH로 교환하여 가격을 재설정하고, 당신의 대출 플랫폼은 333,333.33 달러의 손실을 입게 됩니다.
이 사례 연구는 탈중앙화 거래소(DEX)를 가격 오라클로 사용할 때 발생할 수 있는 가장 일반적인 오류를 보여줍니다. 공격자는 거래 과정에서 가격을 거의 완전히 통제하며, 해당 가격을 정확하게 읽으려고 시도하는 것은 결제 완료 전에 저울의 무게를 읽으려는 것과 같습니다.
당신은 잘못된 숫자를 얻을 수 있으며, 상황에 따라 이는 많은 돈을 잃게 만들 수 있습니다.
2. Synthetix MKR 조작
2019년 12월, Synthetix는 다시 한 번 가격 오라클 조작 공격을 당했습니다. 주목할 점은 이번 공격이 체인 상 데이터와 체인 외 데이터의 경계를 넘었다는 것입니다.
Reddit 사용자 u/MusaTheRedGuard는 한 공격자가 sMKR와 iMKR에 대해 매우 의심스러운 거래를 하고 있음을 관찰했습니다. 공격자는 먼저 sMKR를 구매하여 MKR에 대해 롱 포지션을 취한 다음, Uniswap ETH/MKR 자산 거래 쌍에서 대량의 MKR을 구매했습니다. 잠시 기다린 후, 공격자는 그들의 sMKR를 iMKR 공매도 포지션으로 교환하고, 그들의 MKR을 Uniswap에 다시 판매했습니다. 그런 다음 이 과정을 반복했습니다.
배후에서 공격자는 Uniswap에서의 거래를 통해 Synthetix에서 MKR의 가격을 자유롭게 조작할 수 있었습니다. 이는 Synthetix가 의존하는 체인 외 가격 피드가 실제로 MKR의 체인 상 가격에 의존하고 있으며, 차익 거래자가 시장을 최적의 조건으로 재설정할 수 있는 충분한 유동성을 가지고 있지 않기 때문입니다.
이 사건은 하나의 사실을 보여줍니다: 당신이 체인 외 가격 데이터를 사용하고 있다고 생각하더라도, 실제로는 여전히 체인 상 가격 데이터를 사용하고 있을 수 있으며, 이러한 데이터를 사용함으로써 복잡한 공격을 받을 수 있습니다.
3. bZx 해킹 사건
2020년 2월, bZx는 며칠 사이에 두 번의 해킹 공격을 당해 약 100만 달러의 손실을 입었습니다. 두 번의 해킹 공격에 대한 훌륭한 기술 분석 기사는 여기에서 확인할 수 있지만, 우리는 두 번째 공격에만 집중하겠습니다.
두 번째 해킹 공격에서 공격자는 먼저 ETH를 사용하여 Kyber에서 거의 모든 sUSD를 구매한 다음, Synthetix 플랫폼에서 두 번째 배치의 sUSD를 구매하고 이를 bZx에 예치했습니다. sUSD를 담보로 사용하여 공격자는 허용된 최대 수량의 ETH를 빌린 후, sUSD를 Kyber에 다시 판매했습니다.
당신이 주목했다면, 이것은 본질적으로 동일한 저담보 대출 공격이지만, 다른 담보와 다른 탈중앙화 거래소를 사용했습니다.
4. yVault 취약점
2020년 7월 25일, 나는 yEarn이 출시한 새로운 yVault 계약의 취약점에 대해 보고했습니다. 이 취약점에 대한 공식 발표는 여기에서 읽을 수 있지만, 아래에서 간단히 요약하겠습니다.
yVault 시스템은 사용자가 직접 관리할 필요 없이 토큰을 예치하고 수익을 얻을 수 있도록 합니다. 내부적으로 이 금고는 발행된 yVault 토큰의 총량과 예치된 기본 토큰의 총량을 추적합니다. 단일 yVault 토큰의 가치는 발행된 토큰과 예치된 토큰의 비율에 의해 결정됩니다. 금고가 얻는 모든 수익은 모든 발행된 yVault 토큰에 분배됩니다(따라서 모든 yVault 토큰 보유자에게도 분배됩니다).
첫 번째 yVault는 사용자가 Balancer MUSD/USDC 유동성 풀에 유동성을 제공하여 USDC 수익을 얻을 수 있도록 합니다. 사용자가 Balancer에 유동성을 제공할 때, 그들은 BPT를 증명서로 받습니다(풀의 자산을 상환하는 데 사용될 수 있음). 따라서 yVault는 그들의 BPT로 상환 가능한 MUSD/USDC 금액을 기반으로 보유 가치를 계산합니다.
이것은 올바른 구현처럼 보이지만, 불행히도 앞서 언급한 원리와 마찬가지로 ------ 거래 중에 Balancer 풀의 상태는 불안정하므로 신뢰할 수 없습니다. 이 경우, Balancer가 선택한 조합 곡선으로 인해 USDC와 MUSD 간에 교환하는 사용자는 1:1 환율을 얻지 못하며, 실제로는 풀에 일부 MUSD를 남기게 됩니다. 이는 BPT의 값이 일시적으로 팽창할 수 있게 하여 공격자가 가격을 자유롭게 조작하고 금고를 고갈시킬 수 있게 만듭니다.
이 사건은 가격 오라클이 항상 신뢰할 수 있는 것은 아니며, 개발자는 어떤 데이터를 수집하고 있는지 주의해야 하며, 이러한 데이터가 비특권 사용자가 쉽게 조작할 수 있는지 고려해야 함을 보여줍니다.
5. Harvest Finance 해킹 공격
2020년 10월 26일, 한 익명의 사용자가 (지금 당신이 추측할 수 있는) 기술을 사용하여 Harvest Finance의 유동성 풀을 공격했습니다. 공식 분석 보고서를 여기에서 읽을 수 있지만, 다시 한 번 요약하겠습니다: 공격자는 거래를 실행하여 Curve 풀의 USDC 가격을 낮춘 다음, 낮아진 가격으로 Harvest 풀에 진입하고, 이전 거래를 되돌려 가격을 회복한 후, 더 높은 가격으로 Harvest 풀에서 나옵니다. 이로 인해 사용자들은 3,300만 달러의 손실을 입게 되었습니다.
자기 보호 방법은?
이제 가격 오라클 조작 공격에 대해 이해했기를 바랍니다. 또한 적절한 방어 조치를 취하지 않으면 공격자가 당신의 프로토콜을 속여 돈을 가져갈 수 있습니다. 현재 모든 상황에 적용 가능한 솔루션은 없지만, 다른 프로젝트에서 효과를 본 몇 가지 솔루션이 있으며, 그 중 하나가 당신에게도 적합할 수 있습니다.
제안 1: 얕은 시장에 뛰어들지 마라
수영장 얕은 곳에 뛰어드는 것처럼, 얕은 시장에 뛰어드는 것도 고통스럽고, 이는 막대한 손실로 이어져 당신의 삶을 영원히 바꿀 수 있습니다. 특정 가격 오라클 계획을 고려하기 전에, 먼저 토큰의 유동성이 당신의 플랫폼 통합을 보장할 만큼 충분한지 고려해 보세요.
제안 2: 손 안의 새가 숲 속의 두 마리 새보다 낫다
Uniswap에서 잠재적인 환율을 보는 것은 매혹적일 수 있지만, 당신이 실제로 "거래" 버튼을 클릭하고 토큰을 지갑에 넣기 전까지는 모든 것이 최종적이지 않습니다. 마찬가지로 두 자산 간의 환율을 확인하는 가장 좋은 방법은 자산을 직접 교환하는 것입니다. 이 방법은 취소할 수 없고 가정이 없기 때문에 좋습니다. 그러나 대출 플랫폼과 같은 프로토콜의 경우, 이러한 방식은 작동하지 않을 수 있습니다. 왜냐하면 이러한 프로토콜은 원래 자산을 보유해야 하기 때문입니다.
제안 3: 거의 탈중앙화된 오라클
체인 상 데이터 오라클이 존재하는 문제를 요약하면, 그들의 업데이트가 다소 빠르다는 것입니다. 그렇다면 왜 약간의 인위적인 지연을 도입하지 않겠습니까? 탈중앙화 거래소(예: Uniswap)의 최신 가격으로 자신을 업데이트하는 계약을 작성하되, 소수의 특권 사용자에게 필요합니다. 이제 공격자가 가격을 조작할 수 있더라도 이를 이용할 수 없습니다.
이 방법은 구현하기 쉽고 효과가 빠르지만, 몇 가지 단점도 있습니다. ------ 블록체인이 혼잡할 때, 당신은 원하는 대로 가격을 빠르게 업데이트할 수 없으며, 여전히 샌드위치 공격에 취약할 수 있습니다. 또한, 이제 당신의 사용자는 당신이 가격 업데이트를 유지할 것이라고 신뢰해야 합니다.
제안 4: 최소 지연 시간 증가
가격 오라클 조작은 시간에 민감한 작업입니다. 왜냐하면 차익 거래자는 항상 관찰하고 있으며, 최적이 아닌 시장을 최적화할 기회를 원하기 때문입니다. 공격자가 위험을 최소화하고 싶다면, 그들은 단일 거래에서 가격 오라클 조작에 필요한 두 거래를 완료하려고 할 것입니다. 이렇게 하면 차익 거래자는 중간에 뛰어들 기회를 가지지 못하게 됩니다. 프로토콜 개발자로서, 만약 당신의 시스템이 이를 지원한다면, 사용자들이 시스템에 들어가고 나가는 사이에 최소한의 지연을 구현하는 것으로 충분합니다.
물론, 이는 조합 가능성에 영향을 미칠 수 있으며, 채굴자와 거래자 간의 협력이 증가하고 있습니다. 미래에는 악의적인 행위자가 여러 거래에서 가격 오라클 조작을 수행할 가능성이 있으며, 그들은 채굴자가 아무도 중간에 뛰어들어 이익을 얻지 못하도록 할 것이라는 것을 알고 있습니다.
제안 5: 시간 가중 평균 가격(TWAP)
Uniswap V2는 체인 상 개발자가 사용할 수 있는 시간 가중 평균 가격(TWAP) 오라클을 도입했습니다. 이 문서는 이 오라클이 제공하는 정확한 보안 보장을 자세히 설명합니다. 일반적으로 체인 혼잡이 없는 긴 시간 동안 대형 자산 풀에 대해 이 TWAP 오라클은 오라클 조작 공격에 대해 강력한 저항력을 가지고 있습니다. 그러나 그 구현의 특성상, 시장의 급격한 변동 시점에 충분히 빠르게 반응하지 못할 수 있으며, 체인 상 유동성이 있는 토큰 자산에만 적용됩니다.
제안 6: M-of-N 보고자 메커니즘
가끔 사람들은 "일을 잘 하고 싶다면, 스스로 하라"고 말합니다. 그렇다면 신뢰할 수 있는 친구 N명을 모아 그들이 생각하는 올바른 체인 상 가격을 제출하게 하고, 그 중 M개의 최상의 답변을 현재 가격으로 집계하면 어떻게 될까요?
현재 많은 대형 프로젝트가 이 방법을 사용하고 있습니다: Maker는 신뢰할 수 있는 엔티티가 운영하는 가격 피드를 운영하고, Compound는 Open Oracle을 생성하며, Coinbase와 같은 오라클 가격 제공자가 있으며, Chainlink는 Chainlink 운영자로부터 가격 데이터를 집계하여 체인 상에 공개합니다. 이러한 솔루션 중 하나를 선택하면, 당신은 이제 신뢰를 제3자에게 위임한 것이며, 당신의 사용자도 그렇게 해야 합니다. 가격 제공자가 체인 상에서 수동으로 최신 정보를 게시하도록 요구하는 것은 시장이 크게 변동하고 블록체인이 혼잡한 시기에 가격 업데이트가 제때 완료되지 않을 수 있음을 의미합니다.
결론
가격 오라클은 DeFi의 안전성에 있어 중요한 요소이지만, 종종 간과됩니다. 가격 오라클을 안전하게 사용하는 것은 어렵고, 당신과 당신의 사용자 모두를 놀라게 할 수 있는 많은 방법이 있습니다. 이 글에서는 가격 오라클이 조작된 몇 가지 사례를 논의하고, 거래 과정에서 가격 정보를 읽는 것이 안전하지 않을 수 있음을 확인했습니다(이로 인해 잠재적으로 재앙적인 재정 손실이 발생할 수 있습니다). 또한 우리는 과거에 다른 프로젝트에서 사용된 가격 오라클 조작을 방어하기 위한 몇 가지 기술을 논의했습니다. 마지막으로, 모든 상황은 독특하며, 당신은 가격 오라클을 올바르게 사용하고 있는지 확신이 서지 않을 수 있습니다. 그런 경우 언제든지 조언을 구하세요.
특별히 Dan Robinson과 Georgios Konstantopoulos가 이 글을 검토해 주신 것에 감사드립니다.