PolyNetwork事件調査資料(JPYC社)
スピード重視での事件調査のため、一部不正確な情報が含まれている場合がございます。ご了承ください。(修正が必要であることが判明次第都度対応いたします)
事件概要
犯人は、PolyNetwork(※1)というクロスチェーンプラットフォーム(※2)の潜在的な脆弱性を利用し、プラットフォームに預けられた資産を扱うための権限を取得して、6億ドル近くの資産を盗んだ。 犯人から返金開始されてる模様。
※1 https://twitter.com/PolyNetwork2
※2 パブリックブロックチェーン間で資産を移動するプラットフォーム。
経緯(日本時間)
8/10 19:08
- 犯人によりPolyNetworkに預けられた資産6億ドル近くが盗まれた。
8/10 21:38 - PolyNetworkによりハッキングされたと公式アナウンス
Important Notice:
— Poly Network (@PolyNetwork2) August 10, 2021
We are sorry to announce that #PolyNetwork was attacked on @BinanceChain @ethereum and @0xPolygon Assets had been transferred to hacker's following addresses:
ETH: 0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963
BSC: 0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71
8/10 22時頃
- 犯人が盗んだUSDTがテザー社によって凍結される。↓テザー社CTOが発表
. @Tether_to just froze ~33M $USDt on 0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963 as part of the #PolyNetwork hack https://t.co/EviPTAkQJD
— Paolo Ardoino (@paoloardoino) August 10, 2021
8/10 22:46
- 犯人がブロックチェーン上の分散型取引所へ0.97億ドルを流動性提供(資金洗浄が目的か?)
8/11 00:26
- 犯人がブロックチェーン上にメッセージを記録
8/11 00:53
- PolyNetworkがハッカーに対してTwitterでメッセージを投稿
— Poly Network (@PolyNetwork2) August 10, 2021
- 8/11 12:48
- 犯人が資産を返却する旨、ブロックチェーン上にメッセージを記録
-
8/11午後 PolyNetwork
-
hacker
-
Poly側と攻撃者で資金返還に関するコミュニケーションが進行中
-
8/11 17時頃 犯人からPolyNetworkに返金開始
https://etherscan.io/address/0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963#tokentxns https://polygonscan.com/address/0x5dc3603C9D42Ff184153a8a9094a73d461663214#tokentxns https://bscscan.com/address/0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71#tokentxns
- 8月11日時点で、犯人は既に2.6億ドル程度の資産をPoly Networkへ返却しており、残りの資産分は約3.5億ドル
$260 million (As of 11 Aug 04:18:39 PM +UTC) of assets had been returned:
— Poly Network (@PolyNetwork2) August 11, 2021
Ethereum: $3.3M
BSC: $256M
Polygon: $1M
The remainings are $269M on Ethereum, $84M on Polygon
- 8月12日chainnewsによると、3.4億ドルは既に返還済みで、BSC、Polygonの資産はほとんどPoly Networkに返還している状況です。
TL;DR(技術的な概要まとめ)
- PolyNetwork は、クロスチェーンプラットフォーム。異なるチェーン間で暗号資産を移動できる
- 資産を別チェーンに移動したい場合、まずデポジットとしてコントラクトに送金する。別チェーンで同様に逆方向の送金をしたい人が現れ、そのチェーンからメッセージが来た場合に初めて、そのデポジットした資金が送金される。
- PolyNetwork では、そのメッセージが BookKeepers と呼ばれる権限を持った複数人(今回は4人)によって署名されたことが確認できた場合、送金が行われる。
- 具体的には
ConKeepersPkBytes
という変数に BookKeepers の公開鍵リストがあり、コードの脆弱性を突くことで、EthCrossChainData
コントラクトのオーナーのみが変更できるこの値をハッカー自身の公開鍵に変更した。
EthCrossChainManager
がEthCrossChainData
のオーナー。今回はEthCrossChainManager
のコードの脆弱性を突いた。- BookKeepr が攻撃者1人になったので、別のチェーンに送金可能になった。
犯人のトランザクション一覧
- 0xb1f70464bd95b774c6ce60fc706eb5f9e35cb5f06e6cfe7c17dcda46ffd59581
- 0xad7a2c70c958fcd3effbf374d0acf3774a9257577625ae4c838e24b0de17602a
- 0x5a8b2152ec7d5538030b53347ac82e263c58fe7455695543055a2356f3ad4998
- 0x3f55ff1fa4eb3437afe42f4fea57903e8e663bc3b17cb982f1c8d4c8f03a2083
- 0xa7c56561bbe9fbd48e2e26306e5bb10d24786504833103d3f023751bbcc8a3d9
- 0xc917838cc3d1edd871c1800363b4e4a8eaf8da2018e417210407cc53f94cd44e
- 0xe05dcda4f1b779989b0aa2bd3fa262d4e6e13343831cb337c2c5beb2266138f5
- 0x06aca16c483c3e61d5cdf39dc34815c29d6672a77313ec36bf66040c256a7db3
- 0xc797aa9d4714e00164fcac4975d8f0a231dae6280458d78382bd2ec46ece08e7
- 0xd8c1f7424593ddba11a0e072b61082bf3d931583cb75f7843fc2a8685d20033a
- 0x6c0b80ddb2d706a1e4bfcdb1815e6d5999443f863a7e96b37460bde75b99683d
- 0xa51979f54f6c9a2883712f5e694d9c23cf11394982cce4119b70c254624b52ea
- 0x4e0a951ce13c62f48dd67bb883e39cc8c4a9d9afee3ff653a0c4ee469162f342
- 0xaf01334b1cef2c78c32c5f881087be5ccff509a7dc9c98871d4b37210d307f2b
- 0xcde0cd8177209888d5baa071a313822151cb1c8b652e4b69c8663d3744a97845
- 0x4f7b57062d53d5ca4960206c11ad6850598609c248126bdd3e8e606341173373
- 0xbc54deb446c8daa623611c062e2e49f374ef3a04ddb2a8f4b788c9e54eb14485
- 0xdf3afc47c7914e06ddb1be19afcd769e558111d353e55273a62c4a96e6a6090f
- 0x2465d4cf19d3bf557ea5eec8d57b1ad75c8378e68ba242139e7e186bf463c1a1
- 0x93bacc30f19e46ae40d6a7f38d8a7f8fbc49c979a454dd6d9a4b2577d317636d
- 0x3a09c98f99edd9601ed017ff269652fd80c7e9aedcea57126990031128851043
- 0x552bc0322d78c5648c5efa21d2daa2d0f14901ad4b15531f1ab5bbe5674de34f
- 0x4c102e972301b999318df70e3d3a067994dcc83951f07f7f37c45ff7e922beec
- 0x7b6009ea08c868d7c5c336bf1bc30c33b87a0eedd59dac8c26e6a8551b20b68a
- 0x79245fb1d1ae48a214118e25d6ad2f9324f514ec6708135a19ba9d4cfa6344f6
- 0xd239b01026c49b234d075e3d23a07efd1c3234239cfb440c0f90d5e84836fbe2
関連するメッセージ
Aug-10-2021 03:26:28 PM +UTC
WONDER WHY TORNADO? WILL MINER STOP ME? TEACH ME PLZ!
tornadoはどうだろうか。マイナーは私を止めるでしょうか?私に教えてください。
https://etherscan.io/tx/0x3a09c98f99edd9601ed017ff269652fd80c7e9aedcea57126990031128851043
Aug-10-2021 04:05:47 PM +UTC
IT WOULD HAVE BEEN A BILLION HACK IF I HAD MOVED REMAINING SHITCOINS! DID I JUST SAVE THE PROJECT?
NOT SO INTERESTED IN MONEY, NOW CONSIDERING RETURNING SOME TOKENS OR JUST LEAVING THEM HERE
残ったshitコインを動かしていたら大金のハッキングになっていた!?私はこのプロジェクトを救ったのか?
お金にはあまり興味がないので、トークンを返すか、ここに置いておくか検討中です。
https://etherscan.io/tx/0x552bc0322d78c5648c5efa21d2daa2d0f14901ad4b15531f1ab5bbe5674de34f
Aug-10-2021 04:39:03 PM +UTC
WHAT IF I MAKE A NEW TOKEN AND LET THE DAO DECIDE WHERE THE TOKENS GO
新しいトークンを作って、トークンの行き先をdaoに決めてもらうのはどうでしょう?
https://etherscan.io/tx/0x4c102e972301b999318df70e3d3a067994dcc83951f07f7f37c45ff7e922beec
Aug-11-2021 03:48:18 AM +UTC
READY TO RETURN THE FUND!
資金を返す準備ができました!
https://etherscan.io/tx/0x7b6009ea08c868d7c5c336bf1bc30c33b87a0eedd59dac8c26e6a8551b20b68a
Aug-11-2021 03:49:11 AM +UTC
FAILED TO CONTACT THE POLY. I NEED A SECURED MULTISIG WALLET FROM YOU
polyへの連絡が取れませんでした。安全なマルチシグ・ウォレットが必要です。
https://etherscan.io/tx/0x79245fb1d1ae48a214118e25d6ad2f9324f514ec6708135a19ba9d4cfa6344f6
Aug-11-2021 04:02:06 AM +UTC
IT’S ALREADY A LEGEND TO WIN SO MUCH FORTUNE. IT WILL BE AN ETERNAL LEGEND TO SAVE THE WORLD. I MADE THE DECISION, NO MORE DAO
これだけの幸運を勝ち取ったことは、すでに伝説となっています。世界を救うのは永遠の伝説となるだろう。私は決断した、もうダオはいらない
https://etherscan.io/tx/0xd239b01026c49b234d075e3d23a07efd1c3234239cfb440c0f90d5e84836fbe2
Aug-11-2021 16:50:12 PM
ACCEPT DONATIONS TO "THE HIDDEN SIGNER" NOW. ENCRYPT YOUR MSG WITH HIS PUBKEY.
「隠された署名者」への寄付を今すぐ受け入れます。 マルチシグを彼の公開鍵で暗号化します。
https://etherscan.io/tx/0x160231043b80c7824f658b3621163ebcc537ff29ad1dfb3572e658ebf0ddc2fd
God-like Natural Number Creator Person (TM, R)氏のTweet解説
Ok here's how the Poly Network hack actually worked. If I'm reading the contracts correctly, it's pretty genius.
— God-like Natural Number Creator Person (TM, R) (@kelvinfichter) August 10, 2021
Poly has this contract called the "EthCrossChainManager". It's basically a privileged contract that has the right to trigger messages from another chain. It's a pretty standard thing for cross-chain projects.
— God-like Natural Number Creator Person (TM, R) (@kelvinfichter) August 10, 2021
概要
- "EthCrossChainManager"は特権のあるコントラクトで、他のコントラクトにメッセージをトリガーする権利がある。
- " veriifyHeaderAndExecuteTx"関数があり、誰でも呼び出せてクロスチェーントランザクションを発行できます。
- "_executeCrossChainTx"を呼び出してさらにターゲットコントラクトを呼び出す。
- Poly networkはここでとても重要な"EthCrossChainData"コントラクトへの呼び出しを止める対策をとっていなかった。(→なぜ重要か?"EthCrossChainData"は他のチェーンからのデータを認証するpublic keyのリストを管理している。これの管理権限が有れば、private keyをハッキングする必要がなくなり、ここを改ざんすればよい)
- そこで誰かがこの裏口("EthCrossChainData"を呼び出せる)に気づいて、"EthCrossChainManager"を使って"EthCrossChainData"コントラクトを呼び出し、onlyOwnerの条件をもクリア出来てしまう。("EthCrossChainData"のownerは"EthCrossChainManager")→ここで犯人が直面する課題は如何にして正しいデータを入れてfunctionをトリガーしてpublic keyを書き換えること
- 犯人はここでトランザクションの一番最初の4バイトはsolidityに何をしたいかを伝えるためのもの。色々試せば、ほしい最初の4バイトのsighashが見つかるので、犯人はこれ('0x41973cd9')を見つけて関数の呼び出しに成功した。
- 今回の教訓として、クロスチェーンのリレーコントラクトを作っている場合、他の特別なコントラクトを呼び出せないようにすることが大切だ。今回だと"EthCrossDomainManager"が"EthCrossDomainData"コントラクトのownerになるべきではない。
詳細
-
悪用されたコントラクト1:EthCrossChainManager
-
悪用されたコントラクト2:EthCrossChainData
詳細(deepLによるツイート翻訳)
Poly Networkのハッキングは実際にどのように行われたかを説明します。私が契約書を正しく読んでいれば、かなり天才的な技術だと思います。
Polyには "EthCrossChainManager "というコントラクトがあります。これは基本的に、他のチェーンからのメッセージをトリガーする権利を持った特権的なコントラクトです。これはクロスチェーンプロジェクトではかなり標準的なものです。
クロスチェーンのトランザクションを実行するために、誰でも呼べる関数verifyHeaderAndExecuteTxがあります。基本的には、(1)署名をチェックすることでブロックヘッダが正しいかどうかを検証し(他のチェーンはpoaのサイドチェーンか何かだったようです)、(2)Merkle証明を使ってそのブロック内にトランザクションが含まれているかどうかをチェックします。これがそのコードで、とてもシンプルです。 https://github.com/polynetwork/eth-contracts/blob/d16252b2b857eecf8e558bd3e1f3bb14cff30e9b/contracts/core/cross_chain_manager/logic/EthCrossChainManager.sol#L127
この関数が最後に行うことは、_executeCrossChainTxを呼び出すことで、実際にターゲットコントラクトへの呼び出しを行います。ここに重大な欠陥があります。Polyはターゲットがコントラクトであるかどうかをチェックしますが...。 https://github.com/polynetwork/eth-contracts/blob/d16252b2b857eecf8e558bd3e1f3bb14cff30e9b/contracts/core/cross_chain_manager/logic/EthCrossChainManager.sol#L185
しかし、Polyはユーザーが非常に重要なターゲットであるEthCrossChainDataコントラクトを呼び出さないようにすることを忘れていました。 https://github.com/polynetwork/eth-contracts/blob/master/contracts/core/cross_chain_manager/data/EthCrossChainData.sol
なぜこのターゲットが重要なのか?このターゲットは、他のチェーンから送られてくるデータを認証する公開鍵のリストを記録しています。もしこのリストを変更できれば、秘密鍵をハックする必要はありません。自分の秘密鍵に合わせて公開鍵を設定するだけです。 そのリストがどこで追跡されているかについては、ここを参照してください。 https://github.com/polynetwork/eth-contracts/blob/d16252b2b857eecf8e558bd3e1f3bb14cff30e9b/contracts/core/cross_chain_manager/data/EthCrossChainData.sol#L22
誰かがEthCrossChainDataコントラクトに直接クロスチェーンメッセージを送れることに気づきました。それが何の役に立つのでしょうか?さて、どのコントラクトがEthCrossChainDataコントラクトを所有しているかというと......そうです。EthCrossChainManagerです。
このクロスチェーンメッセージを送ることで、ユーザーはEthCrossChainManagerを騙してEthCrossChainDataコントラクトを呼び出させ、onlyOwnerチェックを通過させることができました。あとはユーザーが公開鍵を変更する関数を起動できるように、正しいデータを作成するだけです。
その関数へのリンクはこちらです。 https://github.com/polynetwork/eth-contracts/blob/d16252b2b857eecf8e558bd3e1f3bb14cff30e9b/contracts/core/cross_chain_manager/data/EthCrossChainData.sol#L45 残る課題は、EthCrossChainManagerがどのようにして正しい関数を呼び出すかということでした。ここで、Solidityがどの関数を呼び出そうとしているかを選択する方法について、少し複雑になります。1/n
トランザクション入力データの最初の4バイトは、「シグネチャーハッシュ」(略して「sighash」)と呼ばれます。これは、Solidityのコントラクトにあなたが何をしようとしているかを伝える短い情報です。
関数のsighashは、「<関数名>(<関数入力タイプ>)」のハッシュの最初の4バイトを取ることで計算されます。例えば、ERC20の転送関数のsighashは、"transfer(address,uint256) "のハッシュの最初の4バイトです。
Polyのコントラクトは、あらゆるコントラクトを呼び出すことを望んでいました。しかし、次のようなsighashに対応するコントラクト関数しか呼び出さない。
えー、でも待ってください。ここでの"_method "はユーザーの入力です。正しい関数を呼び出すために攻撃者がすべきことは、"_method "の値として、他の値と組み合わせてハッシュ化したときに、ターゲット関数のsighashと同じ先頭4バイトを持つものを*見つけ出すことでした。
ほんの少しの努力で、正しいsighashを生成する入力を簡単に見つけることができます。完全なハッシュの衝突を見つける必要はなく、最初の4バイトをチェックするだけでいいのです。では、この理論は正しいのでしょうか?
さて...対象となる関数の実際のsighashは以下の通りです。 http://ethers.utils.id('putCurEpochConPubKeyBytes(bytes)').slice(0, 10) '0x41973cd9' そして、攻撃者が細工したsighashは・・・。 http://ethers.utils.id('f1121318093(bytes,bytes,uint64)').slice(0, 10) '0x41973cd9' 素晴らしい。秘密鍵の漏洩は必要ありません。適切なデータを作成すれば、あとは勝手にハックしてくれます。
ここから得られる最大の設計上の教訓の一つは、このようなクロスチェーンリレーコントラクトを持つ場合は、特別なコントラクトを呼び出すために使用できないようにすることです。EthCrossDomainManagerはEthCrossDomainDataコントラクトを所有すべきではありませんでした。
懸念事項を分けてください。もしコントラクトにこのような特別な権限が絶対に必要な場合は、ユーザーがその特別なコントラクトを呼び出すためにクロスチェーンメッセージを使用できないようにしてください。
念のため、クロスチェインメッセージをトリガーする関数を以下に示します。https://github.com/polynetwork/eth-contracts/blob/d16252b2b857eecf8e558bd3e1f3bb14cff30e9b/contracts/core/cross_chain_manager/logic/EthCrossChainManager.sol#L91 ここでは、EthCrossChainDataコントラクトにメッセージを送ることを妨げるものは何もありません。
これを100%確認するために必要なのは、他のチェーンからのオリジナルメッセージです。残念ながら、そのメッセージはOntologyネットワークから送信されているようなので、コントラクト/トランザクションがそのネットワーク上でどのように機能するかをもっと理解して、開始のtxを見つける必要があります。
以上のことから、これはどのネットワークからでも引き起こされる可能性があったと思われます。私の推測では、Ontologyが意図的に選ばれたのは、全体を追跡するのを難しくするためだと思います。はっきりとはわかりませんが。
公式情報
- 日本時間2021年8月10日21:38 ハックされたとアナウンス
- Ethereum, BinanceChain, Polygon の3つのチェーンで被害
- 被害にあったトークン => DAI, UNI, SHIB, FEI
- それぞれのプラットフォームにアドレスをブラックリストに追加せよと呼びかけ
- Tether 社は 33,000,000 USDT を凍結
- ハッカーに直接「返してください」と呼びかけ(新しい) https://twitter.com/PolyNetwork2/status/1425123153009803267?s=20
- 被害額6億ドルほど
- オンチェーン、Twitter上の双方でhackerに「アドレスを用意したので資金を返還してほしい」と呼びかけ
ある程度ハッカーとPoly側のコミュニケーションは成立している、近々資金の返還があるものと推察される
各方面の対応まとめ
- Tether 社は 33,000,000 USDT を凍結
- BinanceのCEOは対応を表明
We are aware of the https://t.co/IgGJ0598Q0 exploit that occurred today. While no one controls BSC (or ETH), we are coordinating with all our security partners to proactively help. There are no guarantees. We will do as much as we can. Stay #SAFU. 🙏 https://t.co/TG0dKPapQT
— CZ 🔶 Binance (@cz_binance) August 10, 2021
- Etherscanでは攻撃者のアドレスにラベル付け