閃貸安全注意事項和攻擊
開發人員需要注意什麼才能使他們的契約和系統免受閃電貸的影響?
他們必須考慮和防範什麼?
當我們處理快速貸款攻擊情況匯報時,我們可以收集很多關於可以採取哪些預防措施的資訊。在深入研究根本原因和分析之前,了解這些閃電貸款的運作方式非常重要。
快速貸款是在沒有抵押品的情況下發放的貸款,並在他們藉出的同一筆交易中歸還。這在智能合約的世界中是可能的,因為程式碼可以驗證它是否能夠在區塊結束時歸還貸款。如果是,它可以根據使用者的需要藉出多少。這就是攻擊向量的用武之地。
我們可以藉鑑倫敦帝國理工學院的學者所做的一項研究,該研究特別關注了兩次臭名昭著的襲擊。他們的主要發現如下:
閃電貸攻擊通常是價格預言機攻擊/預言機操縱
到目前為止,這似乎是目前攻擊的第一大原因。需要注意的是,去中心**化交易所不是去中心化的預言機。**使用 Uniswap、Sushiswap 或 Curve 獲取定價資訊以執行交易是從價格完全取決於流動性的協議中提取數據。看看引發這波攻擊的臭名昭著的零地 bZx 攻擊,我們可以確切地看到發生了什麼。這些閃電貸款用於破壞和操縱這些去中心化交易所的價格,大多數項目認為這些交易所可以安全使用。這裡的問題在於這些協議的價格完全取決於流動性。這基本上是它的工作原理:
- 使用者獲得巨額貸款
- 使用者使用該貸款購買流動性池一側的所有流動性,導致價格大幅下跌
- 另一個協議正在使用此價格來確定或執行某些程式碼,即,他們將其資產的價格與協議資產掛鉤。因此,使用者幾乎不換任何東西以獲得巨額利潤。
- 然後償還原始貸款,並獲得巨額收益
審計師和軟體工程師需要做的是確保他們不會獲得依賴 DEX 的定價或數據。Uniswap 是一個去中心化的交易所,而不是一個去中心化的定價預言機,它們都是一個中心化的數據點,使用它們是很危險的,在過去的 2 個月裡,大約 5 個協議被黑客入侵,總價值超過 3000 萬美元。
預防
綜上所述,為了防止這些攻擊的發生,您需要確保當您獲取定價資訊或任何數據時,它需要來自去中心化的預言機並從去中心化的Chainlink Price Feeds獲取數據,如果是價格數據。對於任何其他數據,您需要從Chainlink Oracles 的去中心化網路獲取數據。作為工程師,任何人都可以自定義他們的預言機網路,使其隨心所欲地變寬或變窄。
綜上所述,在這一點上,有足夠的資訊表明,如果協議被黑客入侵並且該協議向審計員支付了費用,那麼審計員也需要承擔責任,因為在審計審查中缺少集中的價格預言將會使這種情況不斷發生。許多被黑客入侵的項目都集成了 Chainlink 價格饋送作為數據可靠性的支柱,並且已經穩定下來。
第二個最流行的攻擊是重入攻擊
去引用:
當您創建一個在解決任何影響之前對另一個不受信任的合約進行外部呼叫的函式時,可能會發生重入攻擊。如果攻擊者可以控制不受信任的合約,他們可以對原始函式進行遞歸呼叫,重複在效果解決後不會執行的互動。
幸運的是,我們知道備份功能已被修補為僅使用 2300 gas,因此這在這裡會有所幫助。Consensys 建議使用
call
來代替transfer
或send
保護自己免受這些影響。我認為這是一個錯誤,我認為轉接實際上更安全,只要您在撥打外部電話之前完成所有工作,即採取以下方式:
func withdraw() public { token.transfer(to_address, amount); balance = 0; }
並將其更改為:
func withdraw() public { balance = 0; token.transfer(to_address, amount); }
其他注意事項
應該提到的是,有一些“黑客”也可以解決這個問題。讓你所有的重要交易在 2 個或更多塊的過程中發生可能是解決其中一些問題的一種巧妙方法。此外,在處理大量整數時,您總是希望使用
safeMath
,並且需要確保您的溢出不會破壞您的協議。注:我是 Alpha Chain CEO & Chainlink DevRel
閃電貸違反了兩個常見的直覺假設。
1.“沒有人有那麼多 ETH”
例如,在以下情況下可能會出現問題:
- 您的合約使用以 ETH 金額為參數的非線性公式
- 你的合約依賴於沒有人擁有超過一定數量的 ETH 來防止整數溢出
- 地址的餘額(以及從地址收到的 ETH)歸該地址所有
例如,在以下情況下可能會出現問題:
- 您的合約通過簡單地檢查其目前餘額來驗證地址是否具有最低餘額
- 你的合約通過接收最低餘額並在同一筆交易中將其發回來驗證地址是否有最低餘額
- 您的合約具有基於 ETH 金額的控制流(例如,為大量購買代幣提供折扣,並提供部分退款以便可以償還閃電貸款)