Para nuestra audiencia global: El 5 y 12 de agosto, fuimos testigos de un atacante que ejecutó un ataque frontal entre nuestro mercado de divisas en cadena y el mercado de divisas primario (global). La ejecución inicial fue posible debido a la demora de nuestro módulo oracle y la provisión de swaps de divisas en cadena de tarifa cero. En esta publicación, primero discutimos la debilidad del módulo de oráculo de Terra que hizo posible el ataque, y cómo se realizó el ataque, paso a paso. En segundo lugar, analizamos los MsgSwapTx del atacante y calculamos el beneficio total de la ejecución frontal. En tercer lugar, calculamos las desviaciones históricas del VaR de las velas USD / KRW de 1 minuto, utilizando un conjunto de datos que abarca todas las velas entre 2014–2019. Por último, explicamos el trabajo en curso para introducir tarifas en los swaps en cadena para evitar ataques frontales en el futuro. En resumen, cobrar una tarifa que excede las ganancias potenciales de primera línea en la gran mayoría de los casos hace que el ataque no sea rentable.
지난 8 월 5 일과 12 일, 테라 오라클 의 Prevotar, votar 구조 로 인한 오라클 가격 과 현실 가격 간의 딜레이 를 이용한 Delantero 공격 이 발생 했습니다. 테라 와 루나 사이 의 스왑 을 이용 했던 7 월 의 공격 들 과 달리, 이번 공격 은 테라 통화 들간 스왑 을 이용한 공격 이었습니다. 지난 7 월 의 차익 거래 공격 이 궁금 하신 분들 은 여기 를 참고 하시면 됩니다. 이번 공격 에서, 공격자 는 테라 와 루나 사이 의 스왑 과 달리, 테라 통화 들간 스왑 에는 수수료 가 전혀 없다는 것을 이용 하여 Ejecución delantera 을 진행 했습니다.
이번 리포트 는 다음 과 같은 순서 로 진행 됩니다.
오라클 딜레이 와 이를 이용한 공격자 의 공격 과정 설명 MsgSwap 분석 을 통한 공격자 의 부당 수익 계산 오라클 딜레이 VaR 계산 (2014 년 ~ 2019 년 USD / KRW 1 분봉 데이터 분석 연구 중인 개선안 소개
온 체인 마켓 에서 의 스왑 을 위해서는, 체인 외부 의 정보 인 루나 의 시장 가격 과, 테라 통화 쌍 끼리 의 교환 비율 을 체인 위로 불러올 필요 가 있습니다. 이때 사용 되는 것이 오라클 모듈 입니다. 오라클 모듈 은 현재 루나 의 시장 가격 과, 각각 의 테라 통화 쌍 간의 교환 비율 을 투표 로 결정 합니다. 투표 는 검증 인 들 에 의해 이루어 지며, 이때 총 보팅 파워 (보증금 으로 묶인 루나 의 총량) 의 반 이상 이 투표 되어야 지만 해당 투표 가 집계 될 수 있습니다. 보팅 파워 의 절반 이상 이 투표 가 완료 되는 경우, 해당 투표 의 중위값 이 교환 비율 로 결정 됩니다. Col-2 에서는, 해당 투표 의 중위값 + – 2% 안에 투표 한 검증 인 들 에 대한 보상 으로 온 체인 스왑 에서 나오는 스프레드 수수료 를 지급 하고 있습니다.
테라 의 오라클 투표 는, 한 시점 (Vote_period) 의 가격 을 총 두번 의 투표 로 결정 합니다. 이때 한 Vote_period 는 12 블록 으로 구성 됩니다.
N 시점 에서 의 가격 을 정하기 위한 첫 번째 투표 는 N-2 시점 에서 행해지 는 MsgPricePrevote 입니다. (이하 prevote) prevote 는 테라 통화 와 루나 의 교환 비율 을 SHA256 함수 로 해싱 한 값 을 담고 있습니다. 예 를 들어, KRW, USD, SDR 에 고정 된 테라 통화 들 과 루나 에 대한 온 체인 스왑 을 지원 하기 위해서는, 각각 Luna <> KRW, Luna <> USD, Luna <> SDR 에 해당 하는 세가지 교환 비율 과 salt 값 을 해싱 한 값 이 포함 된 prevote 가 제출 되어야 합니다. 여기서 sal 값 이란 일종의 비밀번호 라고 생각 하시면 됩니다. 만일 교환 비율 만 해싱 하게 된다면, 현실적으로 가능한 교환 비율 이 정해져 있기 때문에, 무작위 대입 을 통해 교환 비율 을 유추 할 수 있게 됩니다. 이를 방지 하기 위해, sal 라는 일종의 추가적인 비밀번호 를 교환 비율 과 같이 해싱 하여 교환 비율 을 유추 할 수 없게 합니다.
두 번째 투표 는 MsgPriceVote 입니다. (이하 vote) 기간 N-1 에 제출 된 vote 는 N-2 에서 제출 된 prevote 에서 해시 값 을 만드는데 사용 된 salt 값와 실제 투표 된 값 을 공개 합니다. N 에서 제출 된 sal 값 은 검증 인 이 N-1 에서 제출 했던 prevote 를 검증 하기 위해 사용 됩니다. N-1 에 집계 된 투표 의 결과 를 바탕 으로 테라 의 오라클 모듈 은 N 시점 의 오라클 가격 을 결정 합니다. 테라 간 온 체인 스왑 의 경우 에는 위에서 결정된 교환 비율 들을 통해 온 체인 환율 을 계산 하여 이루어 집니다.
prevote 에서 해시 값 을 제출 하는 이유 는, 만일 오라클 투표 를 해시 값 제출 없이 공개 투표 로 진행 하게 된다면, 검증 인 들은 해당 투표 기간 의 마지막 까지 기다렸다가 제출 된 투표 들의 중위값 을 계산 해서 투표 를 제출 하는 것을 것을 으로 보상 을 얻을 수 있게 됩니다. 이를 방지 하기 위해 테라 의 오라클 모듈 은 2 단계 에 걸친 투표 를 통해 오라클 가격 을 결정 하게 되었습니다. 하지만 이러한 투표 과정 은, N-2 에서 관측 한 값 을 N-1 에서 공개 하고, N 에서 사용 하기 때문에 실질적 으로 현재 (N) 의 오라클 가격 이 과거 (N-2) 의 시장 가격 을 나타내게 되는 단점 이 있습니다. 즉, 실제 가격 과 오라클 가격 사이 의 딜레이 가 발생 하게 된다는 것 입니다. 각 Vote_period 는 prevote 와 vote 모두 12 블록 으로 고정 되어 있기 때문에, 해당 딜레이 는 1 ~ 2 Vote_period, 즉 12 ~ 24 블록 사이 의 값 이 될 것 입니다.
앞서 언급 했듯, 저희 는 테라 와 루나 사이 의 스왑 의 경우 이런 공격 이 가능 하다고 판단 하여 스프레드 수수료 를 도입 했지만, 테라 와 테라 간의 스왑 에는 가스비 를 제외한 다른 수수료 를 두지 않았습니다. 공격자 는 이를 인지 하고, 오라클 가격 의 딜레이 와 테라 통화 간 스왑 의 Tarifa cero 를 통해서 Ejecución frontal 을 진행 했습니다.
이 허점 을 이용한 공격자 의 공격 과정 은 다음 과 같습니다.
환율 이 상승 하는 상황 에서, Vote_period 가 끝나기 직전 까지 oracle 환율 과 현실 세계 의 환율 간의 편차 (desviación) 이 존재 한다면 해당 Vote_period 안에서 스왑 진행 다음 오라클 가격 반영 시, 해당 편차 가 반영 되는 즉시 반대 방향 으로 스왑 스왑 통해서 해당 Ejecución frontal 포지션 을 청산 반복
물론 이러한 과정 을 통해서 공격자 가 취한 편차 는 매우 작 습니다. 크립토 시장 과 비해 외환 시장 의 변동성 은 매우 미미한 수준 이기 때문 입니다. 하지만 문제 는 테라 간 스왑 에는 수수료 가 없기 때문에 이 미미한 변동성 에서 오는 편차 를 모두 편취 할 수 있었다는 점 입니다. 가장 문제 되는 부분 은 해당 공격 과정 에서 공격자 가 가지는 리스크 가 거의 0 에 가깝다 는 점 입니다.
실제 공격자 의 공격 트랜잭션 들을 살펴 보겠습니다. 공격자 는 8/5 일 25 개, 8/12 일 30 개의 MsgSwapTx 를 발생 시켰 습니다. 해당 MsgSwapTx 들의 상세한 내용 이 궁금 하신 분들 은 여기 를 참고 하시면 됩니다.
공격자 는 최종 수익 을 KRT 로 확정 지었고, 총 55 번의 스왑 을 통해서, 약 155 만 KRT 의 수익 을 얻었 습니다.
위 MsgSwapTx 를 바탕 으로 Ejecución frontal 거래 에서 공격자 가 취한 온 체인 환율 간 편차 를 계산 한 결과 는 여기 에서 확인 하실 수 있습니다.
공격자 는 최종 수익 을 대부분 KRT 로 확정 짓는 모습 을 보여 주었고, 따라서 하나 의 공격 은 두번 의 MsgSwap 으로 이루어져 있습니다. 따라서 위 편차 들은 총 2 번의 MsgSwapTx 가 개입 되었다고 할 수 있습니다.
공격자 가 취한 편차 중 최대 편차 는 0.078337% 이며, 최소 편차 는 0.00029% 입니다. 31 개의 편차 값 의 평균 은 0.017998% 입니다.
이번 Ejecución frontal 공격 은 테라 오라클 모듈 의 근본적인 한계점 을 이용한 공격 입니다. 따라서 추가적인 개선안 을 위해, 테라 간 스왑 이 Ejecución frontal 의 위험 에 어느정도 노출 되어 있는지 에 대해 분석 할 필요 가 있습니다. 이를 분석 하기 위해서 현재 테라 통화 쌍 들 중 가장 변동성 이 큰 USD / KRW 쌍 에 대하여, 2014 년 부터 2019 년 까지 의 USD / KRW 1 분봉 데이터 를 수집 해 Ejecución frontal 이 일어날 수 있는 최악 의 상황 들을 수집 하여 VaR histórico 을 계산 했습니다.
VaR 계산 을 위해, 연속 되는 2 개의 1 분봉 에서 관측 되는 최대 편차 를 수집 합니다. 연속 되는 2 개의 1 분봉 을 사용 하는 이유 는, 테라 의 온 체인 환율 과 현실 세계 의 환율 사이 의 딜레이 가 1 ~ 2 Vote_period, 즉 12 ~ 24 블록 사이 의 값 이기 때문 입니다. 현재 col-2 의 평균 블록 시간 이 6.45 초 이기 때문에, 이는 약 77 초 ~ 155 초 사이 의 값 입니다. 연속 되는 2 개의 1 분봉 (120 초) 에서 관측 되는 최대 편차 를 VaR 계산 에 사용 한다면 실제 오라클 가격 과 현실 가격 간의 딜레이 에서 관측 될 수 있는 편차 값 과 매우 흡사 할 가능성 이 높기 때문에, 연속 되는 2 개의 1 분봉 을 사용 했습니다. 발생 가능한 최악 의 상황 을 고려 하기 위해, 2 개의 1 분봉 에서 관측 되는 최대 편차 를 사용 하였습니다. 편차 들은 절댓값 의 형태 로 분석 에 사용 되었습니다.
계산 된 VaR histórico 은 다음 과 같습니다.
위 히스토그램 에서 x 축은 편차 의 정도 를 나타내며, y 축은 이에 해당 하는 편차 의 갯수 들을 나타 냅니다. 시각화 를 위해 y 축 에는 로그 를 취 했습니다.
계산 된 VaR histórico 에 따르면, 2014 ~ 2019 USD / KRW 2 분 최대 편차 들의 90% 가 0.05071% 이하 이며, 이를 95% 로 확장 하면 0.06315%, 99% 로 확장 하면 0.0977% 라는 것을 알 수 있습니다. 물론 계산 된 VaR histórico 은 최악 의 상황 (2 분 내 에서 관측 되는 최대 편차) 을 가정 하였기에, 실제 리스크 는 이보다 낮을 가능성 이 매우 높습니다. 하지만 극단적 인 최악 의 상황 을 가정 하는 것을 통해 Ejecución frontal 의 가능성 을 최대한 배제 하는 것이 더 중요 하기 때문에 해당 결과 값 이 충분히 유효 하다고 생각 합니다.
VaR 분석 을 토대로, Ejecución frontal 을 방지 하기 위한 두 가지 개선안 을 연구 중에 있습니다. 첫 번째 개선안 은 Impuesto Tobin predeterminado 입니다. 테라 간 스왑 에 약간 의 고정 수수료 를 추가 하는 것을 통해서 취할 수 있는 편차 보다 더 많은 수수료 를 지불 하게 하면 대부분 의 Ejecución delantera 을 방어 할 수 있을 것 입니다. 이 고정 수수료 값 설정 에 VaR 분석 이 사용될 예정 입니다. 두 번째 개선안 은 서킷 브레이커 도입 입니다. 실제 현실 세계 의 이벤트 로 인해서 급격한 환율 변동 이 관측 되거나, 혹은 기술적 인 오류 로 인해 예상 밖의 편차 가 관측 되는 경우, 서킷 브레이커 가 발동 되어 일정 기간 동안 오라클 작동 을 멈추는 것을 통해서 블랙 스완 이벤트 들을 방 방방 것이라고 기대 하고 있습니다. 서킷 브레이커 를 발동 하는 조건 에도 역시 VaR 분석 결과 를 사용할 예정 입니다.
감사 합니다.