화이트 해커 ‘윙라이더스’, 민스왑 $195M TVL 보호

윙라이더스 코리아
7 min readApr 11, 2022

--

우리는 코딩하는 것을 좋아하고 코딩에서 가치가 어떻게 만들어지는지 관찰합니다. 코드는 일종의 살아있는 활성화된 기능적 존재가 됩니다. 이를 바탕으로 우리는 항상 공간을 관찰하고 현재 개발 상황을 주시하고 있습니다. 우리는 스마트 컨트랙트 보안과 정확성을 최우선으로 생각합니다. 일괄 트랜잭션의 정확성을 확인하는 기능을 제한할 수 있는 트랜잭션 입력과 관련된 잠재적인 재정렬 문제에 대한 게시물을 블로그에 이미 게시했습니다. 오늘 우리의 게시물은 유감스럽게도 더 영향력이 있으며 객관적이고 투명한 방식으로 우리의 결과를 여러분에게 제공하기 위해 최선을 다할 것입니다.

민스왑(Minswap)은 카르다노의 탈중앙화 거래소입니다. 커뮤니티 중심이며 세련된 UX를 제공합니다. Tweag의 감사를 완료한 후 메인넷에서 런칭하여 1억 9500만 달러가 넘는 TVL에 도달했습니다. 최근에 그들은 스마트 계약 코드를 공개했습니다. 오픈 소스 스마트 계약만이 신뢰할 수 없다고 믿기 때문에 그렇게 하는 팀에 감사함을 느낍니다.

비록 그들이 우리의 경쟁자이지만 우리는 공통의 가치를 공유하고 전체 카르다노 커뮤니티에 안전한 경험을 제공하기 위해 노력합니다. 그들의 코드를 살펴본 후 우리는 2022년 3월 21일 UTC 시간으로 저녁쯤에 적어도 하나가 심각한 수준인 곳에 여러 취약점을 발견했습니다. 설립자와 직접 검증된 연락을 취하는 데 몇 시간이 걸렸습니다. 그곳에서 우리는 책임 있게 취약점을 공개하고 플랫폼을 중지하는 첫 번째 단계로써 임박한 위협을 멈추게 하고 자금을 최대한 빨리 보호하기 위한 지침을 제공했습니다. 우리는 커뮤니티 중심적이며 민스왑의 큰 커뮤니티를 고려하여 보호 조치를 실행하는 방법에 대한 조치 계획에 대한 조언, 지원 및 팁을 제공했습니다.

잠시 동안 우리는 그들의 취약점을 이용해서 블록체인 스냅샷을 기반으로 하는 자금을 커뮤니티에 반환하는 것을 고려했습니다(취약점 시간 창을 최소화하기 위해). 그러나 민스왑 팀과 커뮤니티가 지금까지 달성한 ​​것을 존중하여 우리는 문제를 해결하기 위해 그들에게 맡기기로 결정했습니다. 우리는 그것이 올바른 선택이 되었기를 진심으로 바라며 그들이 문제를 해결하기 위해 선택한 도전적인 솔루션으로 행운을 바라고 있습니다.

취약성

우리가 발견한 취약점을 이해하려면 민스왑 DEX가 내부에서 어떻게 작동하는지 이해해야 합니다. 유동성 풀을 생성하기 위해 초기 유동성 공급자가 풀 내부에 특별한 풀 NFT를 생성하고 잠급니다. 사용자가 유동성을 제공할 때마다 LP 토큰(또는 윙라이더스 용어로 공유 토큰)이 주문형으로 발행되어 유동성 공급자에게 제공됩니다. LP 토큰은 유동성 공급자가 제공하는 유동성을 나타내며 나중에 유동성 비율(+수수료 -영구적 손실)로 상환될 수 있습니다.

LP 토큰은 유동성 풀마다 다르기 때문에 한 풀의 유동성 공급자는 다른 풀의 유동성을 상환할 수 없습니다. 민스왑 발행 정책은 LP 토큰 발행을 허용했습니다 **IF** 해당 풀 NFT가 트랜잭션 출력의 **ANY** 스크립트 주소에서 발견됩니다. 종합하면, LP 토큰 발행에 대한 가정은 단일 유동성 풀에 대해 하나의 풀 NFT만 존재할 수 있다는 것입니다. 풀 NFT는 특정 유동성 풀 내부에 잠겨 있어야 하며 절대 잠금 해제할 수 없습니다. 두 번째 가정은 풀 NFT가 해당 풀 스크립트 주소의 트랜잭션 출력에 있을 때마다 스크립트 유효성 검사기가 트랜잭션의 유효성을 검사해야 한다는 것입니다.

우리는 이러한 가정이 성립하지 않는다는 것을 보여줄 것입니다. 풀 NFT 발행을 관리하는 정책에서 취약점을 발견함으로써 공격자는 기존 풀과 이미 일치하는 풀 NFT를 원하는 수만큼 생성하고 소유권을 가져 와서 공격자가 제어할 수 있는 스크립트에 넣을 수 있습니다. (예: 모든 작업을 허용하는 스크립트) 그런 다음 공격자는 악의적으로 생성되고 잠금 해제된 풀 NFT를 사용하여 해당 풀에 대해 원하는 수의 LP 토큰을 생성할 수 있습니다. 풀은 기존 풀 중에서 자유롭게 선택할 수 있음을 다시 한 번 강조합니다.

이 시점에서 공격자는 기존 유동성 풀에 대해 임의의 수의 LP 토큰을 소유하고 있으며, 이는 실제 유동성 공급자가 소유한 양과 같거나 그 이상일 수 있습니다. 유동성 공급자는 유동성을 상환할 수 있으며 공격자도 다르지 않습니다. 따라서 공격자는 주어진 풀에서 모든 유동성을 인출할 수 있습니다. 공격자는 공격을 계속하고 모든 유동성 풀을 비울 수 있습니다.

실제 치명적인 취약점은 Pool NFT 발행 정책에 있었습니다. UTxO 참조를 올바르게 가져오고 트랜잭션이 트랜잭션에서 정확한 UTxO를 지출하는지 확인하여 성공적인 트랜잭션을 최대 1개로 제한합니다(UTxO는 두 번 사용할 수 없기 때문에). 그리고 해당 해시와 동일한 토큰 이름으로 Pool NFT 토큰을 발행했습니다. UTxO 참조. 이 모든 것을 확인했다면 취약점이 있다고 어떻게 말할 수 있습니까? 카르다노의 스마트 계약은 유효성 검사 스크립트입니다. 트랜잭션이 의도한 것과 유사하지 않더라도 명시적으로 금지되지 않은 모든 것은 허용됩니다.

공격자는 지갑에서 UTxO를 선택하여 공격을 수행할 수 있습니다. 공격자는 정책에 대한 상환자로서 UTxO 참조를 전달했습니다. 트랜잭션은 UTxO 참조의 해시와 동일한 토큰 이름으로 풀 NFT를 발행합니다. 지금까지는 의도한 동작만 다루었습니다. 그러나 공격자는 동일한 트랜잭션에서 이와 함께 다른 풀 NFT 토큰을 발행할 수 있습니다. 다시 한번. 동일한 발행 정책을 가진 다른 풀 NFT 토큰은 이 트랜잭션에 의해 발행될 수 있습니다. 정책의 첫 번째 검사는 트랜잭션이 UTxO 참조에 해당하는 정확히 하나의 풀 NFT를 발행했는지 확인했습니다. 그러나 이 정책에 대해 다른 풀 NFT 토큰이 발행되지 않았는지 확인하는 것이 누락되었습니다.

첫 번째 확인의 Snippet:

‘값 v’에 추가 토큰이 포함되어 있지 않음을 보장하지 않습니다.

기존 유동성 풀에 있는 토큰에 해당하는 토큰을 발행한 공격자는 위에서 언급한 다른 단계를 수행하여 취약점을 악용할 수 있었습니다.

이러한 결과를 공개한 후 우리는 민스왑이 취약성을 악용하고 TVL을 부분적으로나마 노출할 수 있는 취약성에 대한 추가 잠재적 영역을 발견함에 따라 유동성 공급자에게 유동성을 반환할 것으로 예상했습니다. 우리는 그들에게 완전한 재감사를 하고, 자금을 인출하고, 계약을 철저히 확인한 후에만 재발행할 것을 권고했습니다. 그들은 패치된 컨트랙트가 충분할 것이라고 확신했기 때문에 우리가 완전히 조사하지 않은 추가 취약점을 전달하여 그들이 이러한 사실을 인식하고 필요한 경우 해결하려고 시도할 수 있는지 확인했습니다. 코드베이스에 대한 철저하고 심층적인 감사가 필요한 hotfix 쪽에서 모든 문제를 해결했는지 확인할 수 없으므로 잠재적으로 취약한 영역에 대한 세부 정보는 공개하지 않을 것입니다. 향후 조사 결과에 대한 세부 정보를 공개할 수 있습니다.

결론

윙라이더스는 엄격한 코드 리뷰, 두 테스트넷 출시 전, 그리고 다가오는 메인넷 출시 전에 더욱 철저한 코드 검사를 통해 항상 우리 자신의 코드를 해킹하려고 적극적으로 시도했습니다. 우리는 민스왑 오픈 소스 코드를 검토하기 위해 습득한 사고 방식을 사용했습니다.

우리는 민스왑 팀이 취약점을 공개한 후 대응하기로 결정한 것을 기쁘게 생각하며 부가가치를 제공할 수 있다면 프로젝트 및 커뮤니티 수준에서 잠재적인 미래 협력에 열려 있을것입니다.

윤리적인 팀이 처음으로 취약점을 발견한 멋진 날이었습니다. 불행한 영향으로부터 사랑하는 카르다노 커뮤니티를 보호할 수 있게 된 것을 자랑스럽게 생각합니다. 우리 개발 팀이 여러 NFT 시장에서 치명적인 취약점을 발견하고 공개하였는데 이번 사건은 또 다른 주요 취약점 발견으로 남을 것입니다.

부인 성명

우리는 감사 회사가 아니며 민스왑 계약이나 코드에 대한 철저한 검토도 하지 않았습니다. 이는 공개적으로 사용 가능한 오픈 소스 코드를 표면 수준에서 작업한 결과였습니다. 우리는 코드 및 계약 검토의 완전성이나 철저함을 보장할 수 없습니다.

또한 이 기회를 통해 이 잠재적인 문제를 찾아 식별하고 커뮤니티의 관심을 끌기 위해 열심히 노력한 윙라이더스와 배큠랩스(Vacuumlabs)의 지칠 줄 모르는 개발자들에게도 감사드립니다.

--

--