KLEVA 프로토콜 악성 부채 발생 — 단순 자산 변동성 문제인가

Lano Technology
LanoTechnology
Published in
11 min readAug 3, 2023

Lano Technology와의 협업 진행에 대해 논의하거나 커피챗을 통해 웹3 기술에 대해 이야기 나누고 싶으신 분들은 research@lano.im으로 연락주시기 바랍니다.

이미지 출처

2023년 8월 1일 오후 11시 경, KLEVA 프로토콜의 GCKlay 레버리지 스테이킹 기능에서 약 1.322M KLAY(~$210K, 2.7억원)의 악성 부채가 발생하였습니다. KLEVA 팀은 이 사실을 신속하게 파악해 GCKlay 레버리지 스테이킹 기능을 중단했으며, 악성 부채를 상환할 것이라고 발표해 사태는 일단락 된 것으로 보입니다.

KLEVA 팀은 이번 상황에 대해 발표할 때, 악성 부채가 발생한 원인은 담보 자산, 즉 GCKlay의 심한 가격 변동성 때문이라고 설명했습니다. 물론 1차적인 원인은 담보 자산의 가격 변동성이 맞지만, 저희는 KLEVA 프로토콜의 청산 매커니즘의 설계 방식이 더 근본적인 원인이라고 판단해 이에 대해 설명하고 개선 방법에 대해 공유하고자 합니다.

악성 부채 사태 설명

사건 개요

악성 부채가 발생한 과정을 step-by-step으로 살펴보기 위해서는 먼저 이번에 문제가 된 KLEVA의 GCKlay 레버리지 스테이킹 기능에 대해 알고 있어야 합니다. 이 기능은 유저의 KLAY를 받아 KLEVA에서 대출해준 KLAY 까지 합쳐 GCKlay로 스테이킹해 레버리지 스테이킹 수익을 얻는 기능으로, 유저는 자신이 원하는 레버리지 비율 만큼의 GCKlay를 자산으로, KLEVA에서 대출해준 KLAY를 부채로 보유하게 됩니다. 예를 들어, 유저가 100 KLAY를 3배 레버리지로 예치한다면 300 GCKlay 만큼의 자산과 200 KLAY 만큼의 부채를 가지고 있는 상태가 됩니다. 여기서 GCKlay의 가격이 하락하게 되면 유저의 자산가치가 하락하게 되고, 부채의 가치보다 낮아지기 전에 프로토콜에서는 청산 과정을 통해 유저의 자산(GCKlay)를 처분해 부채(KLAY)를 갚으려고 합니다. 쉽게 말해, GCKlay의 가격이 많이 하락하면 프로토콜은 유저의 GCKlay를 처분하게 됩니다.

트랜잭션 분석

이러한 배경 지식을 가지고 KLEVA에서 어떻게 악성 부채가 발생했는지 시간순으로 트랜잭션을 살펴보면서 파악해 보겠습니다.

- 2023년 8월 1일, 23:09:25 시점에 GCKlay의 거의 유일한 유동성 풀인 Pangea Swap의 GCKlay-KLAY 풀에서 211,624개의 GCKlay 매도가 발생했습니다(tx). 이 트랜잭션으로 인해 가격 1 근처에 있던 대부분의 유동성이 소진되어서 풀의 GCKlay/KLAY 가격 비율이 하락하게 됩니다.

- 같은 날 23:09:44에 풀 내에서 GCKlay 가격이 급락하자 이를 모니터링 하던 KLEVA 청산자들에 의해 유저들의 GCKlay 포지션이 청산됩니다. 최초 청산은 아래 표의 1번으로, 513,553 GCKlay가 241,493 KLAY로 스왑되었습니다 (tx).

  • 최초 청산 직후 Pangea 풀에서 GCKlay-KLAY간 깨져있는 교환 비율을 이용한 차익거래를 통해 적은 양의 KLAY로 18,338 GCKlay gain을 얻은 tx 페어가 있습니다 (tx1, tx2)

- 대규모 청산에 의해 가격 비율이 더 깨지게 되고, 23:09:44~23:15:57 까지 대략 6분 동안 총 30개의 연쇄적인 청산이 발생하였습니다. 이 중에는 300,030, 200,015 개의 GCKlay를 잃은 청산 tx들 또한 포함되어 있습니다.

- 이 과정에서 풀 내의 GCKlay 가격은 헐값이 되고, 차익거래를 통해 매우 큰 수익을 본 tx들이 발생했습니다.

- 대량의 차익거래와 KLAY→GCKlay 스왑 이후 같은날 23:20:07 부터 GCKlay→KLAY 풀이 다시 정상화 되었습니다.

결론적으로, 일련의 청산과 차익거래 TX로 인해 KLEVA 프로토콜은 1.322M 가량의 KLAY 악성 부채를 떠안게 되고, 악성 부채 만큼의 수익이 차익거래자들에게 돌아가게 되었습니다.

악성 부채가 발생한 원인

1차 원인: 유동성 부족으로 인한 GCKlay의 가격 변동성

KLEVA 팀이 공유했듯이, 이번 사태의 1차적인 원인은 GCKlay 가격의 변동성이 너무 컸다는데 있습니다. 이는 GCKlay-KLAY 풀의 유동성이 매우 부족했기 때문인데, 한 가지 더 짚고 넘어갈 점은 GCKlay-KLAY 풀이 집중화된 유동성 풀이었다는 점입니다. GCKlay-KLAY의 비율은 대부분의 경우 1이기 때문에 당연히 대부분의 유동성 공급자들은 1 근처에 유동성을 공급해 놓을 것입니다. 일반적인 CPMM의 경우, 풀의 가격을 조작하기 위해서 대규모 스왑을 하면 그 스왑 자체도 price impact에 노출되기 때문에 공격 비용이 발생하게 됩니다. 반면 이번 GCKlay-KLAY의 경우 1 근처에 있는 유동성을 모두 소진할 만큼만 스왑한다면 price impact에 노출되지 않고 풀의 가격을 조작할 수 있습니다. 실제로 이번 최초 대규모 스왑을 한 tx 또한 211,624 GCKlay로 211,511 KLAY 만큼을 스왑해 price impact에 거의 노출되지 않고 풀의 가격을 조작할 수 있었습니다. 즉, 거의 무위험으로 가격을 조작할 수 있는 유동성 상황이 1차적인 원인이라고 할 수 있습니다.

근본적인 원인: KLEVA 프로토콜의 잘못된 설계

저희는 풀 유동성 상황보다 더 근본적인 원인은 KLEVA 프로토콜 청산 매커니즘의 설계 방식 때문이라고 생각합니다. 풀의 가격이 조작된다고 해도, 프로토콜의 청산 매커니즘이 잘 설계되어 있다면 악성 부채로 이어지지 않을 가능성이 높기 때문입니다. KLEVA 프로토콜의 청산 매커니즘은 화이트리스팅된 주소들이 풀의 가격을 모니터링 하다가 풀의 가격이 변동되어 청산되어야 할 포지션이 있으면 이를 해당 풀 안에서 청산하는 방식입니다. 이 방식은 크게 두 가지 측면에서 문제가 될 수 있다고 판단됩니다.

1) 풀의 가격을 거의 그대로 청산 기준 가격으로 사용한다는 측면

이번 악성 부채가 발생하는 과정을 보면, 대규모 스왑에 의해 풀의 가격이 변하고 불과 19초만에 첫 번째 청산이 발생하는 것을 볼 수 있습니다. 이는 풀의 가격이 거의 즉각적으로 청산자들에게 반영되고 있다는 점을 시사합니다. 즉, 풀의 가격이 조작되면 바로 청산이 유도될 수 있는 구조입니다.

2) 대상 풀 안에서 자산을 매각한다는 측면

1)번 자체는 크게 문제가 되지 않을 수 있지만, 청산을 대상 풀 안에서 진행한다는 점과 결합되면 문제가 커질 수 있습니다. 이미 조작된 풀 안에서 청산을 진행하면 조작된 가격으로 자산이 처분되고 풀의 가격을 더 악화시키게 됩니다. 악화된 가격은 또 다시 청산 기준 가격으로 즉각적으로 반영되어 연쇄 청산으로 이어집니다.

정리하면, KLEVA의 청산 매커니즘은 풀의 가격이 한 번 조작되었을 때 너무 쉽게 연쇄 청산으로 이어질 수 있는 설계를 가지고 있습니다. 이러한 매커니즘은 오라클이 없는 상황에서 가장 쉽게 선택할 수 있는 방안이었고, 실제로 풀의 유동성이 충분한 상황에서는 큰 문제 없이 동작하는 설계였습니다. 하지만, 청산 매커니즘의 본질은 대출자에게 최대한의 자산을 보장해 주고, 프로토콜에 악성 부채를 남기지 않는 것입니다. KLEVA의 청산 매커니즘은 이러한 본질에 입각해 청산 매커니즘을 설계하기 보다는 담보물이 처분되는지 여부에만 집중하였고, 그 결과 이번 상황처럼 조작된 가격에 담보물을 처분해 악성 부채가 발생하게 되었습니다.

프로토콜 개선 방법

KLEVA 프로토콜의 청산 매커니즘을 개선하기 위해서는 청산 기준 가격과 대상 풀 안에서 자산을 매각하는 두 부분 모두 바꿔야 합니다.

청산 기준 가격 매커니즘 개선

가장 먼저, 가격 조작을 어렵게 만들기 위해 청산 기준 가격을 결정하는 매커니즘을 개선해야 합니다. 이러한 기준 가격을 결정할 때는 반응성과 견고성, 두 가지 측면을 고려해야 합니다. 반응성은 기준 가격이 얼마나 최신 가격을 빠르게 반영하는지이고, 견고성은 기준 가격이 가격 조작과 같은 상황에서 얼마나 영향을 받지 않는지 입니다. 일반적으로 반응성과 견고성은 trade-off 관계에 있을 수 밖에 없기 때문에 적절한 지점을 선택해서 사용해야 하고, KLEVA 프로토콜 또한 일반적인 상황에서 잘 동작하도록 적절하게 결정해서 사용하고 있었을 것이라 생각합니다.

다만, GCKlay와 같은 LSD는 KLAY 기준 가격이 대부분의 경우 1이기 때문에 반응성을 크게 고려할 필요가 없는 경우입니다. 거기다가 GCKlay가 unstake 기능을 통해서 7일 후에는 KLAY로 1:1 비율로 회수 가능하다는 점에서 청산이 빠르게 일어날 필요성이 강하지는 않습니다. 이러한 경우에는 견고성을 훨씬 중요한 요소로 보고 기준 가격을 정할 필요가 있습니다. 만약 풀 가격의 time-weighted average price (TWAP) 를 기준 가격으로 사용한다면, 평균을 구하는 time window를 매우 크게 늘리는 방식으로 견고성을 높일 수 있습니다.

옥션 방식의 청산 프로세스 도입

청산시 자산을 대상 풀 안에서 처분하지 않고 별도의 옥션 방식으로 처분하는 방식으로 개선해야 합니다. 옥션 방식은 오라클 가격을 사용하지 않는 대출 프로토콜에서 주로 사용하는 방식입니다. 대표적으로, MakerDAO는 시작가를 최고가로 정해놓고 시간에 따라 경매 가격을 하락시키면서 최초 입찰자에게 바로 자산을 지급하는 dutch auction 방식을 사용하고 있습니다. 이러한 dutch auction 방식을 도입할 경우 KLAY와 1:1로 redeem 가능한 GCKlay 특성상 조작된 가격 대신 1보다 조금 낮은 정상적인 가격에 자산이 처분될 가능성이 높습니다. 청산자가 수익을 볼 수 있는 상황에서 청산자 간 심리 싸움이 생기면서 적절한 가격 수준에서 청산이 진행될 가능성이 높기 때문입니다.

최악의 경우로, 옥션 방식에서 비정상적으로 낮은 가격에 자산이 처분될 때도 기존의 대상 풀 안에서 처분하는 것과 근본적인 차이가 있습니다. 바로 얻게 되는 수익이 차익거래자가 아니라 청산자에게 귀속된다는 점입니다. 이번 KLEVA의 발표에서 악성 부채 상환 재원 중 일부를 차익 거래분을 회수해서 충당한다고 언급되었는데, 이러한 접근 방식 자체가 프로토콜 매커니즘만으로 해결할 수 없다는 의미이기 때문에 좋은 접근 방식은 아니라고 생각합니다. 하지만 이러한 최악의 경우에도 차익 거래자로부터 회수하는 것보다 화이트리스팅 된 청산자로부터 회수하는 것이 훨씬 용이할 것으로 판단됩니다. 더 나아가, 이러한 구조 자체가 풀 가격 조작에 대한 유인을 완전히 없애는 요소로 작용합니다. 풀 가격을 조작해서 청산을 유발해도 이득이 청산자에게 가기 때문에 청산자가 아닌 이상 공격을 할 유인이 사라지게 되는 것입니다.

정리하며

이번 KLEVA 악성 부채 발생은 단순하게 생각했을 때는 자산의 변동성이 심해서 발생한 상황이지만, 더 근본적인 원인은 프로토콜의 청산 매커니즘의 설계 방식이라고 생각합니다. 조작된 풀의 가격을 기준 가격으로 삼고 이 풀 안에서 처분하다 보니 연쇄적으로 악성 부채가 발생하게 되었던 것입니다. 매커니즘을 개선하기 위해서는 좀 더 견고한 기준 가격을 사용하고, 옥션 방식의 청산 프로세스를 도입할 필요가 있습니다.

Lano 팀은 디파이 프로젝트 설계함에 있어 리스크와 관련해서는 유사한 프로젝트에서 발생했던 과거 해킹 사례 및 그에 대한 대응을 많이 참고합니다. 아마 KLEVA 팀도 MakerDAO가 2020년 3월 겪었던 청산 문제 및 그에 대한 대응 과정을 인지하고 있었다면 좀 더 나은 청산 로직을 마련하지 않았을까 생각합니다.

DeFi 프로토콜의 가장 큰 특징 중 하나는 중개인 없이 배포된 컨트랙트에 정의된 로직에 의해서만 작동하는 대신에, 그 로직에 정의된 매커니즘에 전적으로 의존한다는 것입니다. 그런 점에서 DeFi 서비스들은 자신들의 특성에 맞는 매커니즘을 마련할 의무가 있다고 생각합니다. 그렇지 않을 경우 exploit이 발생할 수 있고, 그 피해는 유저에게 전가되기 때문입니다. 이번에는 KLEVA 팀에서 악성 부채를 해결해주겠다고 했지만, 언제까지나 KLEVA 팀이 가지고 있는 자본에만 의존할 수도 없는 노릇입니다. 이는 탈중앙화 금융에도 적절치 않은 접근 방식입니다. 다음에 KLEVA에서 GCKlay 레버리지 스테이킹을 재개할 때는 청산 매커니즘이 개선되어 결국 유저에게 피해가 전가될 수 밖에 없는 악성 부채 문제가 발생하지 않기를 바라면서 글을 마치겠습니다.

About Lano Technology

Lano Technology는 디파이 프로토콜의 설계에 특화된 팀으로, 이번 아티클 내용처럼 매커니즘의 취약성을 분석하고 개선 방안을 설계하는 일 뿐만 아니라 정량적 분석을 통해 새로운 매커니즘을 제시해드립니다. 새로운 프로토콜을 개발하거나 기존 프로토콜에 새로운 기능을 추가하려는 팀들은 research@lano.im로 편하게 연락주시기 바랍니다.

--

--