專輯簡介:
技術派是 PANews 推出的與技術相關的文章的集合地,如果你是研究技術的個人或團隊,內容包括但不限於與智能合約相關的,與各大公鏈技術相關的,與安全相關的,歡迎點擊此處下載PANews註冊投稿,在這裡讓你技術文章讓更多人受益,在這裡你也能交到同好互相交流。
作者: Fairyproof
前兩天, Solana區塊鏈上出現了安全預警,有⼀篇⽂章指出⼀個名為
https://officialsolanarares.net/mint/釣⻥⽹站在⽤戶批准之後,可以將⽤戶的原⽣代幣轉⾛ 。在該⽂章中提到了⼀點:
惡意合約在⽤戶批准(Approve)後,可以轉⾛⽤戶的原⽣資產(這⾥是SOL) ,這點在以太坊上是不可能的,以太坊的授權釣⻥釣不⾛以太坊的原⽣資產(ETH) ,但可以釣⾛其上的Token 。於是這⾥就存在“常識違背”現象,導致⽤戶容易掉以輕⼼ 。
其實該⽂章這⾥的說法是不甚準確的,混淆了批准交易和Solidity中ERC-20代幣授權這兩個不同的概念。
真實情況是通過Solana的簽名擴散機制,惡意合約直接盜取了⽤戶的SOL資產,和通常意義上的授權並沒有什麼關聯。
1. 以太坊中的授權
在以太坊中,通常意義上授權是指⽤戶調⽤代幣合約,向其它地址(合約)授權⼀定處理額度,這樣我們在和其它合約交易時,可以⽅便的⽀付ERC-20代幣。
在這⾥ ,授權是必須的,否則第三⽅合約⽆權處理⽤戶的代幣資產。同時,這種機制也伴⽣了⼤量的授權攻擊,只要你授權了惡意合約,惡意合約就可以轉⾛你的ERC-20代幣。
2. Solana中的授權
在Solana中,代幣⼀般為官⽅提供的spl-token合約,它模擬了ERC-20代幣的⾏為,因此也存在類似的ERC-20授權概念。同樣授權第三⽅合約後第三⽅合約可以處理⽤戶的代幣(注意不是原⽣幣SOL) 。這點同以太坊是⼀致的,並沒有什麼反常識。
3. Approve的涵義
不管在以太坊中還是在Solana中,我們習慣將Approve當作授權( ERC-20協議⾥有approve函數),因此⾃然⽽然的會認為是代幣授權。當我們使⽤ MetaMask錢包時,如果是代幣授權交易會明確提示授權,並且所有交易彈出的是⼀個確認按鈕。然⽽在Solana的Phantom錢包⾥ ,彈出的是⼀個Approve (批准)按鈕,讓⼈很容易以為是授
權交易。但真實情況是批准⼀次交易⽽並不是進⾏代幣授權。所以安全預警中出現的被盜⾏為,是⽤戶批准了⼀個未知交易, ⽽不是⽤戶進⾏了SOL的授權操作,當然也就不能說是授權偷⾛了原⽣幣。
4.交易直接轉⾛原⽣貨幣
交易轉⾛批准者的原⽣貨幣,例如SOL和ETH ,是⾮常簡單的。在以太坊上的Solidity中,只要調⽤⼀個payabletransfe的函數就可以轉⾛交易⽤戶的ETH ;在Solana中,相應的,只要調⽤系統合約的戶的SOL資產,這和我們平常講的代幣授權概念是沒有任何關係的。
函數也能轉移⾛交易⽤不同的是,在Solidity中, ETH轉移發⽣在合約調⽤的時候,因此錢包可以提前知道要轉移的ETH數量並顯示出來, ⽽在Solana中,轉移是發⽣在合約內部的,因此錢包⽆法提前知曉你會被轉⾛多少SOL ,當然也會⽆法顯示。只要你簽名認同了這筆惡意交易,你就相當於簽名認同了這次SOL轉移,這正是這次Solana上釣⻥盜取的問題所在。
⼀段類似如下的代碼就可以在合約內部轉移user的SOL 。
5. Solana中的簽名擴散機制
在Solana中,有⼀個簽名擴散機制。 ⽤戶調⽤合約A ,此時合約A中⽤戶是簽名批准的。當合約A內部調⽤合約B時, ⽤戶的簽名會隨著跨合約調⽤⼀起擴散到合約B 。因此,在合約B中, ⽤戶也是簽名批准的。所以這⾥存在⼀個安全⻛險,當簽名⼀個惡意合約時,惡意合約就獲取了我們這個簽名,然⽽它可以拿我們這個簽名做任何事情! ! ! ! ! ! !
在上述的偷盜事件中, ⽤戶同惡意合約3VtjHnDuDD1QreJiYNziDsdkeALMT6b2F9j3AXdL4q8v進⾏交易,該合約直接調⽤系統合約轉移⽤戶的SOL ,因為簽名隨著調⽤⼀起擴散到了系統合約,因此系統合約認為該筆交易也是批准過的,是正常的,所以就轉⾛了⽤戶的資產。
6. 具體被盜交易
其中⼀筆被盜交易:
我們可以看到該交易涉及的輸⼊賬號:
這其中:
⽤戶賬號: 4XF4wyjein7ZN4RPM6YK2mC2mC6T41cZAoKjJqpP19fR
SOL轉移賬號:BepccLHDcXqqHi6MfpTDo9Sfc5tmRjmSC1XY48Tb8HuY
惡意合約地址:3VtjHnDuDD1QreJiYNziDsdkeALMT6b2F9j3AXdL4q8v
從上可以看出, ⽤戶賬號調⽤合約後轉移了1.2545 SOL到轉移賬號。同時我們可以看到並沒有涉及到spl-token代幣合約,出產沒有通常意義上的授權這麼回事。
其交易打印出的⽇志為:
從⽇誌中也可以判斷,惡意合約僅是簡單的調⽤了系統合約轉⾛了⽤戶的SOL ,因此⽤戶簽名批准了對惡意合約的交易,這個簽名也擴散到了系統合約,因此判定有效。
7. 結論
在Solana中,不要輕易確認或者批准任何來歷不明的交易,因為它可以拿你的簽名代表你做任何事情。