슈퍼플루이드 - REKT



870만 달러가 슈퍼플루이드에서 빠져나갔습니다.

암호화폐 스트리밍 프로토콜이 06:17 +UTC 08/02/22에 해킹 당했습니다.

이 서비스를 보상 분배 혹은 투자자 에스크로 컨트랙트로 사용하던 프로젝트들은 해커가 그들의 고유 토큰을 덤핑하여서 가격이 부정적인 영향을 받았습니다.

영향 받은 프로토콜은 Mai 파이낸스 (QI), 스태커 벤처스 (STACK), 스테이크 DAO (SDT), 그리고 뮤지엄오브크립토아트 (MOCA)입니다.

QI가 가장 영향을 많이 받았는데, 덤핑 이후 가격이 80% 폭락하였으나 해킹 이전 가격의 ~62% 정도까지 회복하였습니다.

슈퍼플루이드의 @francescorenzia는 플랫폼에서 자금이 많은 지갑 주소에 집중해서 공격이 이루어졌다고 rekt.news에 말씀해주셨습니다. 취약점이 패치되기 전에, 해커는 많은 양의 ETH, USDC 그리고 DAI를 건들지 않았는데, 아마도 해커는 “이미 충분하다”고 생각했던 것 같습니다.

이번 사건은 왜 발생되었을까요?

공격자 주소: 0x1574f7f4c9d3aca2ebce918e5d19d18ae853c090

공격 tx: 0xdee86cae2e1bab16496a49…

도난당한 자산:

1940만 QI (2400만 달러어치)가 개의 트랜잭션 만으로 총 2,300 WETH에 매도되었습니다 (~620만 달러)

24.4 WETH - (~$76,000)

56.3만 USDC 173 WETH에 매도

4.5만 SDT - ~17 WETH에 매도 - (~$5.4만)

2.4만 STACK - ~6.2 WETH에 매도 - (~$1.9만)

3.9만 sdam3CRV - am3CRV으로 스왑, 그리고 ~4.4만 amDAI에 매도

150만 MOCA - 150만개 중에 100만개를 173 WETH에 매도 (~$50만)

1.1만 MATIC - 아직 매도하지 않음

총 - ~$870만

공격받은 지 ~6시간 이후, 슈퍼플루이드는 Mudit Gupta님의 도움을 받아 버그를 패치 했습니다.

패치는 이곳에서 확인하실 수 있습니다.

아래의 텍스트는 슈퍼플루이드의 사후분석 보고서에서 발췌한 내용입니다.

취약점 설명

호스트 컨트랙트로 알려진 Superfluid.sol은, 구성된 슈퍼플루이드 합의 컨트랙트를 허가하는 컨트랙트입니다. (ConstantFlowAgreement, InstantDistributionAgreement) 는 하나의 트랜잭션으로, 구성 시스템은 보통 Super Apps.라고 불립니다.

또한 서로 다른 컨트랙트 호출에서, 전체 트랜잭션이 신뢰할 수 있고 공유된 상태를 유지하기 위해 "ctx"(호스트 컨트랙트에 의해 관리되는 시리얼화된 상태)라는 개념을 도입했습니다.

“ctx”는 최초 호출의 “msg.sender” 가 누구인지를 포함하여, 합의 컨트랙트 기능이 알아야 하는 모든 내용을 담고 있습니다.

바로 이것이 운이 없게도 공격당했던 취약점이었습니다.

공격자는 호스트 컨트랙트의 시리얼화 과정에서 합의 컨트랙트의 시리얼을 해제하는 것에 성공하여, 합의 컨트랙트가 특별히 다른 계정인 것처럼 조작된 상황에서 작동되도록 calldata를 능숙하게 조작할 수 있었습니다.

이 메커니즘은 다른 계정들을 "대신하여" IDA 인덱스를 만들어내어 그들의 토큰들을 빼낼 수 있었습니다.

공격 컨트랙트:

다음의 공격자 컨트랙트는 이 취약점이 어떻게 다른 계정으로 위장하는 데에 사용되었는지를 나타냅니다.

실제 공격 트랜잭션을 보면, 공격자는 IDA 컨트랙트를 사용하여 같은 방식으로 다른 계정들에서 자금을 빼내었습니다:

연속된 기능 호출

deleteAnyFlowBad

원래 callAgreement는 플레이스 홀더 ctx를 사용하는 것으로 되어있는데, 이것은 이후의 솔리디티 코드가 이를 "ctx"로 바로 읽을 수 있게 하기 위함입니다.

이 컨셉에 대해서 더 알고 싶으신 분들은, About-Placeholder-Ctx를 읽어보시기 바랍니다.

바로 이곳에 가짜 "ctx"를 주입하여, 임의의 전송자를 설정할 수 있었습니다.

Superfluid.callAgreement

일반적인 상황에서는, Superfluid.callAgreement 는 ctx를 생성하고 스탬프를 찍어(상태 변수에 해시를 저장하는 것), Superfluid.isCtxValid. 를 사용할 때 인증될 수 있도록 합니다.

ConstantFlowAgreementV1.createFlow

합의 컨트랙트는 AgreementLibrary.authorizeTokenAccess를 사용하여, 호출하는 호스트 컨트랙트가 토큰 컨트랙트에서 상태 변화 호출을 할 수 있도록 인증되었는지를 확인합니다.

AgreementLibrary.authorizeTokenAccess

호출하는 호스트가 한번 인증되면, 합의 컨트랙트는 타동적으로 전달받은 ctx도 신뢰하기 때문에, 이를 해독(시리얼을 푸는)하여 메모리 구조에 넣습니다.

그러나 Ctx가 가짜입니다!

문제가 되었던 것은, 취약점이 있었던 기능인 deleteAnyFlowBad 를 사용하면 가짜 ctx를 삽입할 수 있다는 것이었습니다.

Superfluid.replacePlaceholderCtx 에 의해 1바이트 오브젝트로 합쳐지고 난 이후에는(호스트는 합의 컨트랙트의 구체적인 데이터에 대한 가정을 하지 않습니다), 그 결과물인 dataWithCtx 은 이제 합법적인 것과 삽입된 서로 다른 2 ctx를 포함하게 됩니다.

합의 컨트랙트가 해당 데이터를 해독하면, abi 해독기가 먼저 있는 (삽입된) 것을 인식하고, 합법적인 ctx가 있는 나머지 데이터는 무시하게 됩니다.

이 문제를 해결하기 위해서, Superfluid는 합의 컨트랙트에 인증 과정을 하나 추가하였습니다:

ISuperfluid.isCtxValid. 는 해독된 ctx를 호스트 컨트랙트의 스탬프(해시)와 비교하여 인증합니다.

ctx 데이터를 확인하는 과정은 이미 SuperApp 콜백을 통해 제공되고 있었으나, 신뢰할 수 있는 호스트 컨트랙트로부터 받는 것을 확인하지는 않았었습니다.

Superfluid는 온체인을 통해 해커와 접촉하여, 사후 분석 보고서에 따라, 자금을 돌려주는 대가로 아직 100만달러의 바운티를 줄 의향이 남아있다고 말했습니다.

팀은 또한 대부분의 피해를 입은 계정은 이미 보상을 받았으며, 그 중 더 큰 피해를 입은 QI와 MOCA는 보상이 점진적으로 진행될 것이라고 말했습니다.

이번 사건이 가장 큰 해킹 사건은 아니었고 (리더보드의 42위에 해당), 유저의 자금이 도난당하지도 않았지만, 다른 프로토콜들에 영향을 미쳤다는 점이 주목해볼만합니다.

점점 성장하는 DAO 인프라는, DeFi에 만연한 익명의 공격자들에게 더 많은 타겟을 제공하고 있습니다.

도난당한 자금은 공격자의 지갑에 여전히 머물러있습니다.

그들은 바운티를 받을까요, 아니면 슈퍼플루이드가 곤경에 빠지도록 내버려둘까요?


기사 공유하기

REKT는 익명 작성자들에 의한 공공 플랫폼이며, REKT에 작성된 관점이나 내용에 대해서 그 어떤 책임도 지지 않습니다.

기부 (ETH / ERC20): 0x3C5c2F4bCeC51a36494682f91Dbc6cA7c63B514C

disclaimer:

REKT는 당사 웹 사이트의 익명의 작성자 또는 REKT에 의해 게시되거나 관련된 서비스에서 게시되는 콘텐츠에 대해 어떠한 책임도 지지 않습니다. 당사는 익명 작성자들의 행동 및 게시물에 대한 규칙을 제공하지만, 익명의 작성자가 웹 사이트 또는 서비스에 게시, 전송 혹은 공유한 내용을 통제하거나 책임지지 않으며, 귀하가 웹 사이트 또는 서비스에서 직면할 수 있는 불쾌함, 부적절함, 음란함, 불법 또는 기타 해로운 콘텐츠에 대해서도 책임을 지지 않습니다. REKT는 당사 웹 사이트 또는 서비스 사용자의 온라인 또는 오프라인 행위에 대한 책임을 지지 않습니다.