Increasing Robustness of Terra Oracle (2차 차익거래 공격 보고서)

EJ
Terra
Published in
11 min readJul 30, 2019

For our global audience: On July 15th, we witnessed an attacker who manipulated Luna’s price on exchange Coinone, creating a window for profitable on-chain swaps between Terra and Luna. In response, we changed the oracle price setting to a 15 minute MA (Moving Average). On July 22nd, we witnessed another attack, and enclosed below is a detailed analysis. As a result, we’ve implemented a 30 minute Mid-price MA and outlined the tradeoff between robustness and responsiveness of Terra’s oracle. For more details, please check out our Agora post here. We are grateful for the community’s continuous feedback and look forward to your suggestions towards making the Terra protocol stronger and more resilient.

2019년 7월 15일에 일어난 첫 번째 차익거래 공격 이후, 테라 팀에서는 시장 조작 비용을 증가시키기 위해 오라클 가격에 15분 MA(Moving Average, 이동 평균)을 도입했습니다. 첫 번째 차익거래에 대한 보고서는 여기에서 확인하실 수 있습니다.

하지만, 7월 22일, terra1q9m7dahs2nrs4v4l83843k9hagxwl0ytqqc8fy 주소를 사용하는 같은 공격자가 다시 한번 차익거래 공격을 진행했습니다.

이번 보고서는 7.22일 공격에 대해 아래와 같은 주제로 정리합니다.

  1. MsgSwap 분석을 통한 공격자의 부당 수익 계산/ 공격 과정 분석
  2. 15분 MA가 두 번째 공격을 방어하지 못한 이유
  3. 두 번째 공격의 개선안인 30분 mid-price MA와 그 한계
  4. 오라클의 견고성(Robustness)과 반응성(Responsiveness)간의 Tradeoff
  5. 진행중인 연구들

MsgSwap 분석을 통한 공격자의 부당 수익 계산

공격자는 12개의 MsgSwap(이하 Tx)을 실행했습니다. 이중 2:48, 5:15, 6:10에 실행된 Tx들을 배제하고, 각각의 buy/sell 쌍으로 묶어 3개의 그룹으로 나누어서 공격자가 얻은 차익에 대해서 분석해 보도록 하겠습니다.

첫번째 그룹에서, 공격자는 34000 루나를 55,694,548 KRT로 스왑하고, 이후 54,800,000 KRT를 34320 루나로 스왑합니다.

해당 스왑을 통해서 공격자가 얻은 수익은 +894,548 KRT와 +320 루나입니다.

두번째 그룹에서, 공격자는 첫 두 트랜잭션을 통해 98,000 루나를 161,117,223 KRT로 스왑하고, 이후 160,414,000 KRT를 100,943루나로 스왑합니다.

해당 스왑을 통해서 공격자가 얻은 수익은 +703,223 KRT와 +2943 루나입니다.

마지막 그룹에서 공격자는 먼저 3개의 트랜잭션을 통해서 90,000 루나를 147,335,159.3 KRT 로 스왑하고, 이후 147,335,240 KRT를 94,823 루나로 스왑합니다.

해당 스왑을 통해서 공격자가 얻은 수익은 -80 KRT와 +4842 루나입니다.

각 공격의 손익을 정리해 볼 때, 이번 공격의 각 Buy/Sell 그룹별 수익이 저번 공격에 비해서 증가했다는 것을 알 수 있습니다.

이는 변경된 MA의 문제라기 보다는, 이전 공격보다 Swap 횟수는 줄었지만, 더 큰 스프레드를 만드는 것을 통해 각 Swap의 이율을 증가시켰기에 가능했다고 이야기 할 수 있습니다.

공격 과정 분석

공격 프로세스 자체는 7.15일과 큰 차이는 없습니다.

공격자는 먼저 호가창에 큰 스프레드를 만들고, 조작된 스프레드의 양 끝 가격에 시장가격을 유지시키는 것을 통해서 MA를 사용한 오라클을 조작했습니다.

  1. 시장가 매수 매도로 스프레드 조작
  2. 조작된 스프레드의 Best ask에 MA가 조작될 때 까지 시장가를 유지 : 이는 1분봉 종가가 일정 기간동안 유지된 것을 통해서 알 수 있음
  3. 조작된 Oracle price로 루나를 테라로 스왑
  4. 조작된 스프레드의 Best bid에 MA가 조작될 때 까지 시장가를 유지 : 이는 1분봉 종가가 일정 기간동안 유지된 것을 통해서 알 수 있음
  5. 조작된 Oracle price로 테라를 루나로 스왑
  6. 반복

왜 15분 MA는 공격을 방어하지 못했나?

7.15일 공격을 받기 전까지, 저희는 최신 시장 가격을 오라클 가격으로 사용했습니다. 7.15일 공격 이후, 저희는 공격자의 시장 조작 비용을 증가시키기 위해 오라클 가격에 15분 MA를 적용했습니다.

위 그래프는 2차 공격 당시의 코인원 루나 마켓과 오라클 가격을 비교한 그래프 입니다. 파란색 선은 코인원 루나 마켓의 1분봉 종가를 의미하며, 주황색 선은 해당 시점의 오라클 가격을 의미합니다.

우리는 위 그래프를 통해서 공격자가 오라클 가격을 조작하는데 첫번째 공격에 비해서 상대적으로 더 오랜 시간을 들였다는 것을 알 수 있습니다. 즉 MA를 사용하는 것이 실제로 공격 비용을 증가시켰습니다.

하지만 그럼에도 불구하고 차익거래가 가능했던 이유는, 저희 예상보다 코인원 루나 마켓의 시장 조작 비용이 더 낮았기 때문입니다. 공격자는 시장 조작을 위해 이전보다 더 긴 시간동안 시장을 통제해야 했지만, 이는 실질적으로 공격자가 공격을 하지 않을 정도의 페널티는 아니었습니다.

개선안 : 30분 Mid-price MA

저희는 7/22 공격에 대한 개선안으로 오라클 가격에 30분 Mid-price MA를 도입했습니다.

보통 Mid-price란 호가창의 Best bid 가격과 Best ask가격의 평균값을 뜻합니다. Mid-price를 통해 조작된 스프레드로 인한 시장 조작을 완화시킬 수 있습니다. 하지만 이를 실제로 오라클에 적용하기 위해서는 매번 호가창 데이터들의 스냅샷에서 Best bid와 Best ask 가격의 평균을 구해야 하며 이 역시 조작이 불가능하지 않다는 점을 고려해 저희는 이와 유사하게 1분봉 캔들 데이터의 고가와 저가를 평균내는 것으로 Mid-price를 대체하였습니다.

또한 30분 MA로 변경하여, 기존 15분 MA보다 오라클 가격 조작에 더 많은 시간이 소요되게 했습니다.

아래 그래프는, 7.22일 공격 당시의 코인원 시장 데이터에 30분 Mid-price MA를 적용한 결과를 보여줍니다. 오라클 가격의 변동이 15분 MA에 비해서 확연히 줄어든 것을 확인하실 수 있습니다.

30분 Mid-price MA가 적용되었다는 것을 가정했을 때, 공격자는 첫 번째 그룹에서는 손해를 보게 되며 2,3번째 그룹에서만 1% 미만의 수익을 얻게 됩니다. 이는 약 2.6%~5.4% 수익을 본 15분 MA에 비해 확연히 개선된 수준입니다. 심지어 해당 수익은 공격자의 리스크와 시장 조작 비용을 제외한 것으로, 공격자의 순수익은 더 낮을 것으로 예상됩니다.

30분 Mid-price MA의 한계점

안타깝게도, 30분 Mid-price MA에는 몇 가지 한계가 존재합니다.

공격자가 시장을 장악 시 Mid-price도 조작 가능하다는 점이 첫 번째 입니다. Mid-price가 최신 가격을 사용하는 것 보다 시장 조작 비용을 증가시키는 것은 사실이지만, 공격자가 시장을 장악하고 있는 상황에서는 Mid-price도 최신 가격과 마찬가지로 조작이 가능합니다.

두 번째는 30분 MA는 시장가격보다 느리게 움직인다는 부분입니다. 만일 시장 가격이 급격하게 변동한다면, MA 가격와 시장 가격의 차이를 통해서 또다른 차익거래 기회가 열릴 가능성이 존재합니다. 오라클 투표 구조상 오라클 가격과 시장 가격 사이에는 항상 딜레이가 존재하기 때문에, 해당 차익거래는 더 쉽게 이루어질 수 있습니다.

견고성과 반응성(Robustness and Responsiveness)

견고성이란 시장 조작에 저항성을 가질수록 상대적으로 시장 가격과 오라클 가격간의 편차가 증가하는 성질을 의미합니다. 반응성이란 오라클 가격이 시장에 더 잘 반응하여 시장 가격과 오라클 가격간의 편차가 감소할수록 상대적으로 시장 조작에 취약해지는 성질을 의미합니다. 이는 아래 테이블에서 확인하실 수 있습니다.

해당 표는 세가지 종류의 오라클 (1. 최신 가격, 2. 15분 MA, 3. 30분 Mid-price MA)를 6월 1일부터 7월 22일 코인원 마켓 데이터에 시뮬레이션 했을 때, 실제 시장 가격과 오라클 가격간의 편차를 수집하여 정리한 것입니다.

최신 가격의 경우, 전체 1분봉의 90%가 0.4% 이하의 편차를 가지고 있으며, 99%가 1.7%의 편차를 가지고 있고, 99.9%가 5.0% 이하의 편차를 가지고 있습니다.

반면, 30분 Mid-price MA 의 경우, 전체 1분봉의 90%가 0.8% 이하의 편차를 가지고 있으며, 99%가 2.6% 이하의 편차를 가지고 있고, 99.9%가 5.5%이하의 편차를 가지고 있습니다.

우리는 이를 통해서, 견고성이 높을 수록, 시장 가격과 오라클 가격의 편차가 실제로 증가하는 경향이 있다는 것을 알 수 있습니다. 이는 견고성이 낮을 수록, 즉 반응성이 높을 수록, 상대적으로 시장 가격과 오라클 가격 편차를 사용한 온체인 마켓(테라 블록체인)과 오프체인 마켓(코인원)간 차익거래에 안전하다는 것을 의미합니다.

그럼에도 불구하고 저희가 30분 Mid-price를 개선안으로 선택한 것은, 현재 오프체인 루나 마켓의 유동성이 낮기 때문입니다. 낮은 유동성을 가진 시장은 시장 조작에 취약합니다. 반면, 시장 가격과 오라클 가격간 편차를 이용한 차익거래는 낮은 유동성을 가진 시장에서 일어나기 어렵습니다. 따라서 저희는 현재 루나 마켓의 특성을 고려하여 견고성에 중점을 둔 30분 Mid-price MA를 채택하게 되었습니다.

만일 루나 마켓의 유동성이 증가한다면, 자연스럽게 시장 조작 비용은 증가하고, 이에 따라 시장 가격과 오라클 가격간의 편차를 이용한 차익거래는 더 쉽게 일어날 수 있습니다. 따라서 루나 마켓의 유동성이 증가하는 경우에는, 좀 더 반응성이 높은 오라클을 사용하는 것이 효과적이라고 판단됩니다.

진행중인 연구들

저희는 오라클 개선을 위해, 서킷브레이커를 도입할 계획입니다. 서킷브레이커란, 주식 시장에서 급격한 가격 변동이 감지될 때, 잠시 거래를 중단시키는 제도입니다.

저희는 오라클에 서킷브레이커를 도입하여, 오라클 가격과 시장 가격이 특정 기간 내에 급격하게 변동할 때 잠시 스왑을 중단시키는 것을 통해 차익거래를 상당 부분 방어할 수 있을 것이라고 생각하고 있습니다. 변경된 30분 mid-price MA는 시장 조작 비용을 증가시켜서 시장 조작에는 상대적으로 견고하지만, 시장 가격이 급변할 시에는 오히려 최신 가격을 오라클로 사용하는 것보다 차익거래에 취약하다는 단점이 있습니다. 따라서 시장 가격 급변에 대해 서킷브레이커를 사용하는 것을 통해 가격 급변에 따른 차익거래를 방어할 수 있습니다.

또한 앞서 언급한 오라클의 견고성과 반응성 사이의 최적의 트레이드오프를 찾기 위한 연구를 진행하고 있습니다.

추가적으로 이번 오라클 공격에 대한 더 자세한 리포트를 원하시는 분은 여기에서 저희가 이번에 작성한 Full paper를 확인하실 수 있습니다.

감사합니다.

--

--