소르베 파이낸스 취약점 사후보고

젤라토 네트워크
젤라토 네트워크
11 min readDec 22, 2021

지난 12월 11일 10:15 CET 경에 저희는 소르베 파이낸스에 쓰이는 스마트 컨트랙트에 중대한 결함이 있다는 사실을 접수했습니다. 해당 컨트랙트는 유저들이 G-UNI 풀에 진입 및 퇴장 시 동등한 가치의 2가지 토큰이 아닌 단일 토큰으로도 진입할 수 있게 해주는 기능을 수행하도록 디자인 된 것이였습니다.

22:00 CET에 젤라토 팀은 총 2,600만 달러 상당의 위험에 처한 유저 자금을 구출해내는 화이트햇 핵킹을 성공적으로 완수하였습니다. 해당 자금은 오직 유저들 본인만이 되받을 수 있게 되어있는 안전한 에스크로 컨트랙트로 예치되었으며, 이를 되받기 위해선 대상 유저들은 취약점이 발견된 컨트랙트에 부여한 모든 허용(approval)들을 철회해야만 합니다.

젤라토 네트워크, G-UNI 및 여타 소르베 파이낸스의 스마트 컨트랙트 및 요소들은 해당 취약점으로부터 영향을 받지 않았습니다. 특히 G-UNI 풀은 해당 취약점에서 안전했으며, 이후로도 영향을 받진 않을 것입니다. 소르베 파이낸스를 통해 해당 컨트랙트에 허용을 실행하지 않은 지갑들도 영향을 받지 않았습니다. 만일 본인이 이번 취약점의 피해자인지 확신할 수 없는 분들은 다음 링크의 툴을 통해 확인해 보실 수 있습니다.

만일 허용 철회에 대해 잘 모르신다면 저희 텔레그램 커뮤니티에 방문해 주세요.

12월 17일 금요일, 젤라토 팀은 세부적인 리뷰 및 감사 프로세스를 진행한 뒤 소르베 UI 상 풀들과 안전히 상호작용 할 수 있는 신규 스마트 컨트랙트를 배포하였습니다.

잠재적 리스크는 이전 스마트 컨트랙트에서 토큰 허용을 철회하지 않은 분들에 한하여 존재합니다. 때문에 저희는 이전에 소르베 파이낸스 풀과 한번이라도 상호작용을 하신 분들은 토큰 트랜잭션 이전에 위 링크의 툴에서 본인 지갑의 상태를 확인해 보시길 권장합니다.

12월 20일 12:00 CET 부로 66개의 계정을 제외한 모두가 이전 컨트랙트에 대한 토큰 허용을 비활성화 하였습니다. 저희는 팀의 역량이 닿는 데 까지 최대한의 모니터링을 진행하고 있고 위험에 처한 자금 및 지갑을 보호하려 하고 있으나 결국 유저가 스스로 이전에 진행한 허용을 헤제하는 것이 궁극적인 해결책 입니다.

사건경과

모든 시간은 CET 기준입니다.

2021년 12월 11일

  • 10:16: 젤라토 팀이 Yash Shah(버그발견자)와 Samszun로부터 중대 결함에 대해 접수한 시기입니다.
  • 10:18: 버그에 대한 논의와 위험에 처한 자금 보호를 위한 워룸이 생성되었고 이후 젤라토 팀은 즉각 결함임을 확인하였습니다.
  • 11:26: 젤라토 팀은 결함으로 인해 영향을 받은 자금 구출을 위해 화이트햇 해킹 시도를 결정하였습니다.
  • 11:45: 젤라토 프론트엔드 팀은 소르베 파이낸스 유저들이 토큰 허용을 철회할 수 있는 기능 개발에 착수했습니다.
  • 22:00: 최초 화이트햇 해킹은 2600만 달러 상당의 자금을 회수하였고 플래시봇(Flashbots)을 통해 프라이빗 트랜잭션으로 실행되었습니다. 이후 팀은 유저 자금을 위험에 노출시키는 트랜잭션 감지를 위해 멤풀을 모니터링 하는 화이트햇 봇을 가동하였고 추가적인 화이트햇 해킹을 통해 자금 회수를 시작했습니다.

2021년 12월 12일

  • 12:38: 토큰 허용 철회 UI가 출시되었습니다. 이후 젤라토 팀은 모든 소셜 미디어 및 채널을 통해 소르베 파이낸스에 진행한 토큰 허용 철회에 대해 알렸습니다. 또한 다양한 웹3 프로젝트와 크립토 인플루언서들에게 해당 사실 리트윗 및 공유를 부탁하였습니다.
  • 19:24: 화이트햇 서쳐(Searcher)이자 플래시봇 커뮤니티 일원인 0x911, imagine, Bert Miller가 블랙햇 해커를 저지하기 위해 추가 봇을 지원했습니다.

2021년 12월 13일

  • 16:54: 피해대상 지갑과 상호작용한 모든 중앙화 거래소에 결함의 위험성에 대해 알리고 해당 계정들의 위험 노출 최소화를 위해 계정 동결 조치를 촉구했습니다. 블랙햇 해커 계정은 동결되었고 해당 계정 보유자에 대한 조사 및 법적 조치가 실시되었습니다.
  • 17:21: 이더스캔 알림 및 배너 적용이 완료되었습니다. 위험에 처한 지갑 검색시 소르베 파이낸스 결함에 대해 알리고 토큰 허용 철회로 유도하기 위함이였습니다.
  • 19:45: 해킹 위험에 노출된 인원들이 이더스캔 트랜잭션 내역에서 해당 사실을 알 수 있도록 젤라토 팀은 250건 이상의 알림 트랜잭션을 진행했습니다. 트랜잭션 발행인을 클릭시 소르베 파이낸스 토큰 허용 철회 방법을 알 수 있도록 이더스캔과 협업하여 조치되었습니다.
  • 해당 조치의 목적은 소셜 채널을 통한 알림과 함께 ENS, 컨트랙트 사용 내역 등 모든 기록을 역추적하여 위험에 처한 모든 유저들이 위험에 대한 경고를 받고 적합한 조치를 취할수 있도록 유도하는 것이였습니다.

2021년 12월 18일

  • 14:30: 해당 시각까지 위험에 처한 계정들에 한해 결함의 위험성을 알리는 NFT가 에어드랍 되었습니다.

현황

젤라토 팀은 35건의 추가적인 화이트햇 해킹을 성공적으로 완수하였고, 100만 달러 상당의 자금을 위험으로부터 구출하였습니다. 현재 이전 소르베 파이낸스 스마트 컨트랙트 결함으로 인해 위험에 처한 계정은 66개가 남아있습니다.

기술적 세부사항

이번 결함을 포함하고 있던 스마트 컨트랙트는 지난 12월 10일 공유된 dYdX의 결함 리포트에 나온 것과 비슷한 버그를 내포하고 있었습니다. 해당 포고서와 제보자 덕분에 저희는 해당 결함을 소르베에서 감지하고 블랙햇 해커가 이를 악용하기 이전에 조치를 취할 수 있었습니다.

결함의 대상이 된 스마트 컨트랙트의 핵심 기능은 유저들이 G-UNI 풀에 진입할 때 1가지의 토큰만으로 할 수 있도록 하는 기능이였습니다. 때문에 해당 컨트랙트는 토큰을 풀에 예치하기 이전에 이를 DEX 어그리게이터를 통해 스왑을 진행했어야 했습니다. 스왑은 여타 컨트랙트들이 특정 주소를 패스하고 컨트랙트의 올바른 기능이 실행될 수 있도록 API로 calldata가 생성될 수 있도록 요구하는 1인치(1inch)를 통해 진행되고 있었습니다.

1인치에서 스왑만 실행할 수 있게 임의의 로우레벨 호출을 허용한 결함 컨트랙트는 잠재적 악용의 위험성을 가지고 있었습니다. 혹시 개발자라면 절대로 스마트 컨트랙트가 임의의 주소를 통해 데이터 어규먼트를 호출하게 할 수 있도록 개발을 하시면 안될 것입니다.

만일 a) 해당 기능을 누구나 호출할 수 있고; b) 패스되어야 할 주소와 calldata에 대한 충분한 체크가 이루어지지 않고; c) 유저가 해당 컨트랙트에 토큰 허용을 해야한다면 이는 개발에서 절대적으로 기피되어야 할 사항들 입니다.

만일 개발자라면 본인의 댑이 스마트 컨트랙트 레벨에서 DEX 어그리게이터와 상호작용을 하고 있는지 확인하고, 만일 그렇다면 저희와 같은 취약점이 존재하는지 다시 한번 검수해야 할 것입니다.

버그 원인

젤라토 개발팀은 솔리디티의 ‘.call()’과 같은 로우레벨 호출이 가지고 있는 위험성에 대해선 충분히 인지하고 있었습니다. 이와 같은 버그는 프로덕션 단계에서 제외되었어야 하지만 저희의 리뷰 프로세스와 컨트랙트 테스팅에 중대한 실수가 있었던 것입니다. 이번 보안 결함은 지난 2.5년의 젤라토 사상 최초로 발견된 버그였으며 저희는 추후 배포할 모든 스마트 컨트랙트에 대해 더욱 엄중하고 높은 기준을 적용하여 실시할 것입니다.

이번 결함을 내포한 컨트랙트는 저희가 이전부터 실전에 쓴 컨트랙트와 비교했을 때 매우 작은 변경점만 추가로 적용된 것이였습니다. 때문에 저희 컨트랙트 개발팀은 이번 배포를 일반적으로 진행하는 보안 리뷰를 생략한 채 성급히 실시했습니다.

이번 사고는 충분히 예방될 수 있었으며 저희는 이러한 버그가 프로덕션 단계에 절대로 이르지 않도록 다수의 절차를 이미 마련하였습니다.

사후조치

저희는 웹3에 있어 최고 수준의 보안 표준을 추구합니다. 이번 사고를 통해 저희는 변경점이 아무리 작더라도 충분히 실전에서 검증된 컨트랙트에 치명적일 수 있고, 때문에 리뷰와 코드감사를 충분히 진행해야 한다는 사실을 다시 한번 깨닫게 되었습니다.

이번과 같은 취약점을 회피하기 위해 저희는 다음과 같은 보안 수단을 적용할 것입니다.

  • 규모에 상관없이 모든 컨트랙트와 해당 컨트랙트에 적용된 변경점에 대해 다수의 팀 멤버를 통한 코드 리뷰.
  • 고위험 패턴과 dYdX 리포트에 나타난 것과 같은 스마트 컨트랙트 악용 사례에 대해 밀착 모니터링.
  • 새로운 배포 및 컨트랙트 변경점에 대한 최악의 시나리오 검토 및 조치사항 디자인.
  • 코드 공개 이전 에러 포착을 장려하기 위해 외부 개발자들을 위한 버그 바운티 인센티브 생성.
  • 무사고 배포 컨트랙트에 대해서도 지속적인 코드 감사 및 리뷰 진행.
  • 신규 기능 출시 전 젤라토와 이미 적용이 진행된 프로토콜에 대한 확인.

버그 바운티

저희에게 이번 결함을 신속히 개인적으로 알려주신 인원에 대해 저희는 크나큰 감사를 표하고자 합니다. 이번과 같은 제보 덕분에 저희는 위험에 처해있던 2,600만 달러 상당의 유저 자금은 빠르게 구조될 수 있었습니다.

더하여 이번 사태와 관련하여 적합한 인물들과 연계를 도와준 멋진 젤라토 커뮤니티 멤버들에게도 감사의 말씀을 드리고자 합니다. 해당 인원들의 지속적인 홍보 덕분에 많은 유저들이 결함으로 초래된 위험성에서 벗어났고, 추가적인 자금 구제가 가능했습니다. 이번 사태에 기여를 해주신 커뮤니티 여러분께 큰 감사의 말씀을 드립니다.

젤라토 팀은 이번 사태 해결에 기여한 인원들에 대해 바운티 인센티브를 지급하기 위한 거버넌스 제안을 제출할 것입니다.

도난 자금에 대한 조치

젤라토 팀은 이번 결함으로 부터 자금 보호를 위한 화이트핵 해킹을 실시했지만 유저들이 이전 소르베 파이낸스 스마트 컨트랙트에 부여한 토큰 허용을 거두지 않는 이상 해킹의 위험은 항상 존재할 것입니다. 다수의 봇을 통해 위험에 처한 자금을 구출하기 위한 최대한의 노력에도 불구하고 현재 약 74만 달러 상당의 자금이 악의적인 플래시봇 운영자들에 의해 조기에 탈취당했습니다.

해당 피해금액 전액을 보상하는 의제가 거버넌스에 제출될 것이며 이는 GEL 토큰 홀더들에 의해 결정될 것입니다. 자금 도난 위증에 대한 위험과 사건이 발생한 뒤 팀의 지속적인 알림이 비교적 긴 시간동안 이뤄진 점을 고려했을 때 12월 20일 13:00 CET 이후에 발생하는 자금 도난에 대해선 보상 조치가 이뤄지지 않을 것입니다.

하지만 저희는 위험에 처한 자금에 대해 화이트햇 플래시봇을 지속적으로 운영하며 구출에 최선을 다할 것입니다. 보상 기간이 지난 이후에 구출되는 자금들은 봇 운영진들이 마이너에게 제출한 수수료를 제한 뒤 원 주인에게 반환될 예정입니다.

결론

이번에 저희는 기존에 항상 지향하던 최고 수준의 보안 기준을 충족하지 못했습니다. 이번 결함으로 위험에 처해졌던 2,700만 달러 상당의 유저 자금들은 다수의 성공적인 화이트햇 해킹을 통해 대부분 구출되었습니다. 젤라토 팀은 이번 코드결함에 대해 신속하고 성실하게 대처했고 다수의 봇 운영과 커뮤니티에 사태의 심각성 및 위험성을 널리 알리고, 유저들이 결함 컨트랙트에 행한 토큰 허용 철회를 최대한 빠른 시간 내에 하도록 촉구하였습니다.

이번 사태에도 크나큰 지지와 인내, 그리고 이해를 보여주신 커뮤니티 여러분께 감사의 말씀을 드립니다. 저희는 이번 사태를 겪음으로 더욱 견고하고 강해졌다 말씀드릴 수 있습니다. 저희는 이후로도 웹3 생태계 최고의 자동화 툴을 가져올 수 있도록 앞서 나아갈 것입니다.

감사의 말

최초 보고자들인 Yash Shah, Samczsun, 투자사인 Dragonfly, 플래시봇 운영을 도와주신 Robert Miller, Imagine, 0x911, Nathan Worsley, 그리고 Binance, Etherscan 팀, Kaito San, Hory San 에게도 이번 사태에 큰 도움을 주신 점에 대해 감사의 말씀을 올립니다.

--

--