作者:極光 @ 知道創宇404區塊鏈安全研究團隊
時間:2020年8月31日
前言
昨晚突然看到群里的一個消息,揭秘uniswap-defi項目漏洞-割韭菜新手法,心想還有這事?而且還是中英文介紹。

到底什么是DeFi?,網絡上有很多關于 DeFi的定義,目前通用的定義是這樣的:DeFi是自己掌握私鑰,以數字貨幣為主體的金融業務這個定義包含三個層面的意思:
- 自己掌握私鑰
- 以數字貨幣為主體
- 金融業務
DeFi是Decentralized Finance(去中心化金融)的縮寫,也被稱做Open Finance。它實際是指用來構建開放式金融系統的去中心化協議,旨在讓世界上任何一個人都可以隨時隨地進行金融活動。
在現有的金融系統中,金融服務主要由中央系統控制和調節,無論是最基本的存取轉賬、還是貸款或衍生品交易。DeFi則希望通過分布式開源協議建立一套具有透明度、可訪問性和包容性的點對點金融系統,將信任風險最小化,讓參與者更輕松便捷地獲得融資。
幾年前區塊鏈行業還沒有DeFi這個概念,從默默無聞,一躍成為區塊鏈行業的熱門話題,DeFi只用了短短幾年時間。Uniswap作為完全部署在以太坊鏈上的DEX平臺,促進ETH和ERC20 代幣數字資產之間的自動兌換交易,為DeFi發展提供了良好的支持。
作者抓住當下區塊鏈熱門話題DeFi作為文章主題介紹如何利用
uniswap-defi項目漏洞割韭菜。很顯然經過精心思考。
分析
打開教程鏈接,原文教程提醒
Full open source code----only for research and testing, don't cheat using this method

作者特別提醒:完全開放源碼----僅用于研究和測試,不要使用這種方法作弊。
教程中提到合約代碼可以在如下鏈接下載
Click to enter edit mode and copy the code into it
(download address of the contract code:https://wwr.lanzous.com/i4MJOg6f2rg)

根據教程提供的鏈接,下載代碼查看

首先看到onlyOwner函數,而且條件判斷中的address是硬編碼的,這里說一下以太坊中的地址
- 以太坊地址
以太坊中的地址的長度為20字節,一字節等于8位,一共160位,所以address其實亦可以用uint160來聲明。以太坊錢包地址是以16進制的形式呈現,我們知道一個十六進制的數字占4位,160 / 4 = 40,所以錢包地址ca35b7d915458ef540ade6068dfe2f44e8fa733c的長度為40。
很明顯,攻擊者特意使用uint160來編碼地址,起到了障眼法作用。如果不認真看,不會注意到這個address函數轉換后的地址。
通過對地址進行轉換

即:address(724621317456347144876435459248886471299600550182) 對應地址:0x7eed24C6E36AD2c4fef31EC010fc384809050926,這個地址即位合約實際控制賬戶地址。
繼續往下看原文教程
首先部署合約

然后添加到 Uniswap v1 資金池

這里介紹下 Uniswap
- Uniswap V1
Uniswap V1基于以太坊區塊鏈為人們提供去中心化的代幣兌換服務。Uniswap V1提供了ETH以及ERC20代幣兌換的流動性池,它具有當前DeFi項目中最引人注目的去中心化、無須許可、不可停止等特性。
Uniswap V1實現了一種不需要考慮以上特點的去中心化交易所。它不需要用戶進行掛單(沒有訂單),不需要存在需求重疊,可以隨買隨賣。得益于 ERC20 代幣的特性,它也不需要用戶將資產存入特定的賬戶。Uniswap V1模型的優點在于根據公式自動定價,通過供需關系實現自動調價。
Uniswap V1的運行機制的關鍵在于建立了供給池,這個供給池中存儲了 A 和 B 兩種貨幣資產。用戶在用 A 兌換 B 的過程中,用戶的 A 會發送到供給池,使供給池中的 A 增多,同時,供給池的 B 會發送給用戶。這里的關鍵的問題在于如何給 A 和 B 的兌換提供一個匯率(定價)。 Uniswap V1定價模型非常簡潔,它的核心思想是一個簡單的公式 x * y = k 。其中 x 和 y 分別代表兩種資產的數量,k 是兩種資產數量的乘積。
假設乘積 k 是一個固定不變的常量,可以確定當變量 x 的值越大,那么 y 的值就越小;相反 x 的值越小,y 的值就越大。據此可以得出當 x 被增大 p 時,需要將 y 減少 q 才能保持等式的恒定。 為了做一些更實用的工作,將 x 和 y 替換為貨幣儲備金的儲備量,這些儲備金將被存儲在智能合約中。
即用戶可以把部署的合約可以添加到Uniswap V1中,通過充入資產提供流動性,獲得該資金池(交易對)產生的交易手續費分紅,過程完全去中心化、無審核上幣。
接著
You don't have to worry that you will lose money, because other people can only buy and can't sell it in this contract. When the trading pair is created, you can change for another wallet (the wallet address of the contract can be bought and sold) to buy it, and then test whether it can be sold. Here's the information for selling`

這是為什么?看看代碼

合約代幣101行,require(allow[_from] == true),即轉賬地址from需要在allow這個mapping中為布爾值true。

而修改allow在addAllow函數中,且需要合約Owner權限。

通過合約Ownable代碼第13行可知,onlyOwner屬性中,只有地址為724621317456347144876435459248886471299600550182即前面提到的0x7eed24C6E36AD2c4fef31EC010fc384809050926用戶可以通過校驗,而且是硬編碼。這也是原文攻擊者為什么使用了以太坊地址的uint160格式來編碼地址,而不是直觀的十六進制地址。

最終部署的合約SoloToken直接繼承了Ownable合約

即只要用戶部署該合約,合約Owner權限都在攻擊者0x7eed24C6E36AD2c4fef31EC010fc384809050926手中。攻擊者可以隨時轉移合約權限。
在教程中攻擊者還提到

如果你想吸引買家,資金池必須足夠大,如果只投入1-2個ETH,其他人將無法購買它,因為基金池太小。即希望部署合約的用戶在資金池中添加更多的eth數量。攻擊者為什么要單獨Notice呢?

合約代碼第124行,mint函數,Owner權限用戶可以直接增發代幣。這是合約最關鍵部分。即攻擊者可以直接在合約中給指定地址增發代幣,然后利用增發得來的代幣去Uniswap V1直接兌換合約部署用戶存放在 Uniswap V1 資金池中的 eth 。這也是為啥教程作者著重提示多添加 eth 數量的根本原因。
截止目前,攻擊者地址0x7eed24C6E36AD2c4fef31EC010fc384809050926中已經獲利大約36eth。

總結
Uniswap 因無需訂單薄即可交易的模型創新引來贊譽,也因投機者和詐騙者的涌入遭到非議,在業內人士看來,Uniswap 的自動做市商機制有著特別的價值,作惡的不是Uniswap,但惡意與貪婪正在這個去中心化協議中一覽無余。
流動性挖礦點燃DeFi烈火,火勢燒到去中心化交易所Uniswap。它憑借支持一鍵兌幣、做市可獲手續費分紅,迅速成為最炙手可熱的DeFi應用之一。
財富故事在這里上演,某個新幣種可能在一天之內制造出數十倍的漲幅,讓參與者加快實現「小目標」;泡沫和罪惡也在此滋生,完全去中心化、無審核上幣,讓Uniswap成了人人可發幣割韭菜的溫床。
DeFi作為當下區塊鏈熱門話題,很容易吸引人們的注意。攻擊者利用人們貪圖便宜的好奇心理。使用所謂的 uniswap-defi項目漏洞 教程一步一步帶用戶入坑。以當下區塊鏈中最火的DeFi類為主題,分享了 揭秘uniswap-defi項目漏洞-割韭菜新手法 教程。如果用戶不注意看合約代碼,很容易掉入攻擊者精心構造的陷阱中去。成為真正的韭菜。
REF
[1] UNISWAP issuing tokens-enhancing tokens (consumers can only buy but can not sell)
https://note.youdao.com/ynoteshare1/index.html?id=a41d926f5bcbe3f69ddef765ced5e27b&type=note?auto
[2] 代幣合約
https://wwr.lanzous.com/i4MJOg6f2rg
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1323/
暫無評論