폴리 네트워크(Poly Network) - REKT



rekt 독자분들 바로 이것입니다; 큰 것이 왔습니다. 6억 1100만 달러가 도난당했습니다. 이것은 마운트 곡스 해킹때보다도 더 큰 금액입니다. 여러 작은 나라들의 GDP보다도 큰 금액입니다. 심지어 rekt 리더보드의 모든 금액을 합친 것보다도 큰 금액입니다. 역사상 가장 큰 규모의 암호화폐 해킹... 역사상.

폴리 네트워크(Poly Network) = rekt.

하지만 어떻게 해킹을 당했을까요?

Credit:breadcrumbs.app, slowmist, blocksec 해커 ETH: 0xc8a65fadf0e0ddaf421f28feab69bf6e2e589963 해커 BSC: 0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71 이것은 여태까지 있었던 일반적인 스마트 컨트랙트 플래시 론 / 차익거래 사건이 아닙니다. 해커는 세 가지 다른 체인 상의 폴리 네트워크(Poly Network) 프록시 잠금 컨트랙트들(Proxy Lock Contracts)의 취약점을 공격했습니다. Ethereum:0x250e76987d838a75310c34bf422ea9f1ac4cc906
BSC:0x05f0fDD0E49A5225011fff92aD85cC68e1D1F08e
Polygon:0x28FF66a1B95d7CAcf8eDED2e658f768F44841212

Credit: @kelvinfichter

"폴리(Poly)는 "EthCrossChainManager라는 컨트랙트를 가지고 있습니다". 이 컨트랙트는 다른 체인에서 메세지를 트리거할 수 있는 특권을 가지고 있습니다. 크로스-체인 프로젝트로서는 일반적인 것입니다. 이 컨트랙트는 verifyHeaderAndExecuteTx 라는 이름의 기능을 가지고 있는데, 크로스-체인 트랜잭션을 실행하고 싶은 유저는 누구나 실행할 수 있습니다. 이것은 (1) 서명을 체크해서 블록헤더가 정상인지 인증하고 (상대편 체인은 poa 사이드 체인 이었던 것 같습니다) (2) 해당 트랜잭션이 해당 블록에 머클 증명(Merkle proof)으로 포함되어있는지를 체크합니다. 관련 코드 이 기능의 마지막은 목표 컨트랙트를 호출하는 executeCrossChainTx을 호출하는 기능입니다. 바로 이곳에서 중요한 허점이 있었습니다. 폴리(Poly)는 타겟이 컨트랙트인지 체크하였으나, 유저가 아주 중요한 타겟을 호출하는 것을 막는 것을 잊어버렸고, 그 중요한 타겟은 바로... EthCrossChainData 컨트랙트였습니다. 바로 이러한 크로스-체인 메시지를 전송함으로써, 유저는 EthCrossChainManager를 속여서, 컨트랙트의 소유자인지를 확인하는 onlyOwner 단계를 피해 EthCrossChainData 컨트랙트를 호출할 수 있었습니다. 이제 유저는 퍼블릭 키를 변경할 수 있는 기능을 트리거할 수 있는 적절한 데이터를 만들어 넣기만 하면 되었습니다... 마지막 남은 장애물은 어떻게 하면 해당 기능을 EthCrossChainManager가 호출하게 할 수 있는지 알아내는 것이었습니다. 이제 약간 복잡한 설명이 나오는데, 솔리디티에서 유저가 호출하고 싶은 기능을 어떻게 선택되는지에 대한 내용입니다.

트랜잭션 인풋 데이터의 첫 네 개의 바이트는 "시그니처 해시(signature hash)" 혹은 짧게 "시그해시(sighash)"라고 불립니다. 이것은 솔리디티 컨트랙트에게 어떤 것을 하고 싶은지를 알려주는 작은 정보 조각입니다. 시그해시는 "<function name>(<function input types>)"의 해시의 첫 네 개의 바이트를 가져와서 계산하는 기능입니다. 예를들어, ERC20 전송 기능의 시그해시는 "transfer(address,uint256)" 해시의 첫 네개의 바이트입니다. 폴리의 컨트랙트는 어떤 컨트랙트든 호출 할 준비가 되어있습니다. 그러나, 다음의 시그해시를 만족하는 컨트랙트 기능만을 호출할 것입니다: 음 잠깐... 여기서 **"_method"**는 유저 인풋이었습니다. 해커가 정상적으로 기능을 호출하기 위해서는 **"_method"**의 적절한 값을 찾아서, 이것이 다른 값들과 같이 해싱되었을 때, 원하는 기능의 시그해시와 앞 네 자리 바이트가 같기만 하면 되었습니다. 약간 더 생각해보자면, 정상적인 시그해시를 만드는 인풋을 찾는 것은 어렵지 않습니다. 모든 해시를 다 찾을 필요 없이, 앞의 네 자리만 체크하면 되기 때문입니다. 이 생각이 과연 통할까요? 음... 이것이 타겟 기능의 실제 시그해시입니다:

http://ethers.utils.id ('putCurEpochConPubKeyBytes(bytes)').slice(0, 10)

'0x41973cd9' 그리고 이것이 해커가 만들어낸 시그해시입니다...

http://ethers.utils.id ('f1121318093(bytes,bytes,uint64)').slice(0, 10)

'0x41973cd9' 환상적입니다. 프라이빗 키를 알아낼 필요가 전혀 없습니다! 그냥 적당한 데이터를 만들면 짜잔... 컨트랙트가 스스로를 해킹하게 됩니다! 이번 사건을 통해 사람들이 시스템을 디자인할 때 깨달아야 할 가장 큰 교훈 중 하나는 이것입니다 : 만약 이러한 크로스-체인 릴레이 컨트랙트가 있다면, 이 컨트랙트가 특별한 컨트랙트를 호출할 수 없도록 해야합니다. EthCrossDomainManagerEthCrossDomainData 컨트랙트를 소유하면 안됐었습니다. 또 다른 걱정은 이것입니다. 만약 당신의 컨트랙트가 이러한 특별한 권한을 가지고 있다면, 유저가 그 특별한 컨트랙트를 호출하는 크로스-체인 메시지를 사용할 수 없도록 해야 합니다."

이더리움 블록체인에서, 해커가 훔친 물량은 다음과 같습니다:

USDC - 96,389,444

WBTC - 1,032

DAI - 673,227

UNI - 43,023

SHIBA - 259,737,345,149

renBTC- 14.47

USDT - 33,431,197

wETH - 26,109

FEI USD - 616,082

BSC에서 해커가 훔친 물량은 다음과 같습니다:

BNB - 6,613.44

USDC - 87,603,373

ETH - 299

BTCB - 26,629

BUSD - 1,023

Polygon 블록체인에서 해커가 훔친 물량은 다음과 같습니다:

USDC - 85,089,610

도난당한 총 가치 - ~$611,000,000

이 글을 작성할 당시에, 도난된 자금은 다음의 지갑 주소들에 있었습니다.: ETH: 0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963

BSC: 0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71

Polygon: 0x5dc3603C9D42Ff184153a8a9094a73d461663214

DeFi 이야기들은 대부분 간단하지 않으며, 이번 이야기도 예외가 아닙니다. 심지어 익명의 배우들도 주목받는 것을 좋아합니다. 해킹 이후 얼마되지 않아, hanashiro.eth.라는 이름의 예상치 못한 주인공이 등장했습니다. hanashiro.eth 는 먼저 해커들에게 어떻게 하면 USDT를 운용할 수 있는지에 대한 팁을 주어 이목을 끌었고, 팁을 알려준 대가로 해커로부터 13.37 Ether 의 보상을 받았습니다. 다른 사람들도 이후에 해커에게 메시지를 보냈지만, 그 누구도 hanashiro.eth만큼 성공적이지는 못했습니다. 암호화폐 업계 토박이 수준의 관대한 쇼맨십으로, hanashiro.eth는 그들로부터 받은 도난된 자금을 Infura, Etherscan, 그리고 rekt.news와 같이 암호화폐 산업을 뒷받침하고 있는 단체에게 기부하였습니다. 그러나 모든 자금에 자유롭게 접근할 수 있었던 것은 아니었습니다. 테더는 이더리움 체인에서 도난당한 [모든 3300만 USDT를 동결]https://twitter.com/paoloardoino/status/1425090760609832978?s=20)했습니다. 그들의 코인이니 - 그들의 결정이었습니다... 만약 당신이 USDT를 사용하고 있었다면 기억할만한 사실입니다. 이때쯤 사건이 제대로 알려지게 되었습니다; 폴리 네트워크가 해커에게 훔쳐간 자산을 되돌려 달라고 비는 최후의 수단인 공식 서한에 모든 관심이 향했습니다.

도둑들에게 훔쳐간 6억 달러를 되돌려 달라는 트윗 한개... Gensler가 말했듯이 우리는 암호화폐의 “서부 개척시대” 단계에 있는지도 모릅니다. 이 시점에서 해커가 어떤 느낌을 느꼈을지 생각해보세요. 그들이 행복감과 공포감 중 어느 것을 더 느꼈을까요? 자신의 컴퓨터 앞에 앉아서 6억 달러를 훔치는 경험은 초현실적인 경험일 것입니다. 그리고 그 돈을 세탁하려는 경험도 마찬가지로 강렬할 것입니다. JPEGS외에, 당연히 tornado.cash가 그 시작점이 될 것이고, 실제로 해커는 이곳으로 향했습니다.

그들은 스스로에게 다음과 같은 메시지를 담은 트랜잭션을 보냈습니다;

왜 Tornado냐고요? 채굴자가 저를 멈출 수 있을까요? 한번 알려줘 보시죠

이것은 고도의 심리전일까요 아니면 단순히 멍청했던 것일까요? 암호화폐 세계에서는 항상 명확하지 않습니다... 6억 달러를 훔쳐서 도망가는 상황에서, 수 천명의 사람들에게 메시지를 뿌렸습니다. 해커는 과도하게 자신만만했었습니다.

그러나 @WardBradt가 다음의 내용을 트윗할 때;

폴리 네트워크 해커가 이 트랜잭션0xb12681d9e에서 실수로 틀린 전송자 주소를 사용했을까요? 전송자의 주소는 FTX, 바이낸스, Okex 계정에서 동결되었습니다.

해커의 태도가 돌연 바뀌었습니다. 이런 규모의 공격을 시도할 만큼 자신만만한 해커라면 그런 기본적인 OPSEC(Open Platform Security Certification) 오류를 범하지 않았겠죠? 아니면 가짜 KYC 문서를 사용했을 수도 있습니다... 어쨌든, 우리는 해커들이 두려움을 느끼고 있다는 것을 확인할 수 있었습니다. 해커들은 자신들은 "돈에는 큰 관심이 없으니" 토큰들을 버리거나, "토큰의 일부" 를 돌려주겠다고 제안하기 시작하였습니다 그리고 해커들은 다음의 방법을 제시하였는데,이는 도난된 자금을 나눠주기 위한 DAO를 만드는 것이었습니다. 최종적으로, 압박이 너무 심했기 때문에, 해커들은 “포기할 준비”가 되었다고 선언했습니다.

예상치 못한 전례없는 행동으로, 해커들은 폴리 네트워크(Poly Network)에 자금을 돌려주고 있습니다. 그들은 공격에서 사용된 지갑과 같은 지갑에서 전송된 이더리움 트랜잭션을 통해 "자금을 반환할 준비가 되었다!" 고 알려왔습니다. 첫 번째 반환 트랜잭션을 보내기 전에, 해커는 "해커는 항복할 준비가 되었다"라는 이름의 토큰을 만들어서 폴리 네트워크가 공지한 ‘’알려진 폴리 주소’’에 의해 관리되는 다중서명주소로 전송했습니다. 해커와 폴리 네트워크 간의 대화의 요약은 여기서 확인하실 수 있습니다.

이 글(영어 원문)을 작성할 당시, 해커는 다음의 것들을 반환했습니다: 이더리움 블록체인: $260만

BSC: $110만

폴리곤 블록체인: $100만 해커는 나머지 자산도 반환할까요? 아니면 그냥 관심을 끌고싶은 또다른 행동일까요? 그들은 정말 모든 것을 반환하고 용서받을 수 있을까요?

폴리 네트워크. 6억 1100만. DeFi의 모든 큰 프로토콜들을 알고 있다고 생각했었습니다. 이 산업은 우리가 감당할 수 없을 만큼 성장해버렸습니다. 이번이 처음인 것은 맞지만, 앞으로 몇 년 동안 우리가 보게 될 이런 크기의 해킹의 마지막은 아닐 것입니다. 시장은 아직 단계적으로 성숙해지지 못했고, 당연히 그렇습니다. 더 나은것 이든 아니면 더 못한것이든, 암호화폐는 계속 뉴스를 만들어낼 것이고, 우리의 산업이 표준이 될 때까지 세계는 계속 주목해야할 것입니다. 이것은 단지 성숙해지는 과정에서 피할 수 없는 과정입니다.


기사 공유하기

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

기부 (ETH / ERC20): 0x3C5c2F4bCeC51a36494682f91Dbc6cA7c63B514C

disclaimer:

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