智慧合約檢測工具Mythril掃描合約教學以及如何安裝到docker

閱讀時間約 10 分鐘
Mythril 是可以對Solidity 程式碼及EVM 字節碼的安全分析工具,使用符號執行等方式檢測合約,可以幫助開發和安全人員發現合約中潛在的漏洞和弱點。
Mythril是由ConsenSys Diligence所開發,檢測為乙太坊、Hedera、Quorum、Vechain、Roostock、Tron 和其他與 EVM 兼容的區塊鏈構建的智慧合約中的安全漏洞,目前為免費的開源工具,可以在GitHub找到相關的原始碼。
Mythril

安裝方式:

docker

docker pull mythril/myth

pip

pip3 install mythril
其他安裝方式可以查看文件
使用docker 運行mythril並分析本地合約的方式:
docker run -v $(pwd): (path) mythril/myth analyze /(path)/(contract name).sol
這邊提供一個有重入漏洞的合約範例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract EtherStore {
  mapping(address => uint) public balances;
  function deposit() public payable {
  balances[msg.sender] += msg.value;
  }  
function withdraw() public {
  uint bal = balances[msg.sender];
  require(bal > 0);
  (bool sent, ) = msg.sender.call{value: bal}("");
  require(sent, "Failed to send Ether");
  balances[msg.sender] = 0;
  }
// Helper function to check the balance of this contract
function getBalance() public view returns (uint) {
  return address(this).balance;
  }
}
使用docker運行Mythril分析合約之畫面
完整掃描結果如下:
==== External Call To User-Supplied Address ====
SWC ID: 107
Severity: Low
Contract: EtherStore
Function name: withdraw()
PC address: 368
Estimated Gas Usage: 7278 - 62222
A call to a user-supplied address is executed.
An external message call to an address specified by the caller is executed. Note that the callee account might contain arbitrary code and could re-enter any function within this contract. Reentering the contract in an intermediate state may lead to unexpected behaviour. Make sure that no state modifications are executed after this call and/or reentrancy guards are in place.
--------------------
In file: /Downloads/reentrancy.sol:42
msg.sender.call{value: bal}("")
--------------------
Initial State:
Account: [CREATOR], balance: 0x21000537b4, nonce:0, storage:{}
Account: [ATTACKER], balance: 0x20200000000000000, nonce:0, storage:{}
Transaction Sequence:
Caller: [CREATOR], calldata: , value: 0x0
Caller: [ATTACKER], function: deposit(), txdata: 0xd0e30db0, value: 0x1
Caller: [ATTACKER], function: withdraw(), txdata: 0x3ccfd60b, value: 0x0
==== State access after external call ====
SWC ID: 107
Severity: Medium
Contract: EtherStore
Function name: withdraw()
PC address: 556
Estimated Gas Usage: 7278 - 62222
Write to persistent state following external call
The contract account state is accessed after an external call to a user defined address. To prevent reentrancy issues, consider accessing the state only before the call, especially if the callee is untrusted. Alternatively, a reentrancy lock can be used to prevent untrusted callees from re-entering the contract in an intermediate state.
--------------------
In file: /Downloads/reentrancy.sol:45
balances[msg.sender] = 0
--------------------
Initial State:
Account: [CREATOR], balance: 0x21200082d2d9, nonce:0, storage:{}
Account: [ATTACKER], balance: 0x4801000000228c000, nonce:0, storage:{}
Transaction Sequence:
Caller: [CREATOR], calldata: , value: 0x0
Caller: [ATTACKER], function: deposit(), txdata: 0xd0e30db0, value: 0x1
Caller: [ATTACKER], function: withdraw(), txdata: 0x3ccfd60b, value: 0x0

掃描鏈上合約:

mythril可以藉由設定rpc掃描鏈上的智慧合約。

掃描主網(mainnet)合約

Mythril 默認會嘗試查詢infura,因此需要前往infura註冊帳號。
Step 1 : create new api key
create new api key
Step 2 : manage key
manage key
Step 3 :  api key
api key
docker run --rm mythril/myth analyze -a [contract address] --rpc infura-mainnet https://mainnet.infura.io/v3/0df6422189fd41f7bf22587cb3d9bda2 --rpctls True --infura-id [yourApiKey]

掃描BSC(Binance Smart Chain)合約

docker run --rm mythril/myth analyze -a [contract address] --rpc bsc-dataseed1.binance.org:443 --rpctls True --infura-id [yourApiKey]

掃描本地鏈上的合約 (以下以Ganache舉例)

在docker中使用時,與文件有些許不同,需要使用以下指令。
Step 1 : 下載Ganache並在Remix上設定環境
選擇Ganache Provider
Step 2 : 發布合約後執行以下指令
docker run --rm mythril/myth analyze -a [contract address] --rpc host.docker.internal:[portNumber]

輸出格式

Mythril預設將掃描結果呈現在終端機,可以使用 -o 修改輸出格式。
輸出的檔案格式為text、markdown、json和jsonv2。

結論

Mythril旨在發現常見漏洞,並無法精確發現應用程序業務邏輯中的問題,自動化工具有助於檢查常見的 Solidity 漏洞或缺少​​的智慧合約最佳實踐的案例,檢測工具容易受到誤報的影響,需要藉由手動驗證進行協助。
作者Alice目前為區塊鏈安全從業人員,將來也會持續在Vocus以及medium上分享相關的研究,如果喜歡我的文章歡迎追蹤我的帳號喔!
另外,我已經加入由趨勢科技防詐達人所成立的方格子專題-《區塊鏈生存守則》,在那裡我會跟其他優質的創作者一起帶大家深入瞭解區塊鏈,並隨時向大家更新區塊鏈資安事件
> 追蹤《區塊鏈生存守則》學習如何在區塊鏈的世界保護自己
> 關注防詐達人獲得其他最新詐騙情報
avatar-img
33會員
176內容數
我們整理了web3相關的熱門資安問題,包含加密貨幣投資詐騙、盜版NFT、空投釣魚和區塊鏈重大資安事件懶人包等等,並提供最完整的辨識方法教學,讓大家從0到1學習如何保護自己
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
Kylin Oracle是一个通用的预言机协议,其主要功能是通过去中心化和去信任化构建链上数据仓库,很多投资者还不知道这个KYL币在哪里买?下面就让小编为大家盘点一下这个KYL币上线的交易所, 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 �
了解智能合约形式化验证方法的重要性和应用,确保加密货币交易的安全和可靠性。 引言 智能合约的出现改变了加密货币市场的游戏规则,但同时也带来了新的风险和挑战。为了确保智能合约的安全和可靠性,形式化验证方法变得越来越重要。本文将深入探讨智能合约形式化验证方法的概念、技术和应用,帮助读者更好地理解加密
Thumbnail
为了编写智能合约,开发人员往往需要选择一种适合的编程语言,目前市场上有几种常用的智能合约编程语言,比如Solidity、Vyper、Michelson等,那么具体智能合约常用语言有哪些,让我们一起来看看吧 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续
这篇文章主要介绍了智能合约地址什么意思?智能合约安全吗?的相关资料,智能合约是表示为一段代码的合约,旨在执行一组指令。很多人不知道是智能合约地址什么意思,下面小编带大家深入的了解一下,一起来看看吧! 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣
Thumbnail
DYDX链是基于Cosmos SDK和TendermintPoS共识协议,这一决定是基于dYdX对完全去中心化的努力,也是基于这一新区块链的可定制性,如果你还不清楚DYDX是公链吗?DYDX是什么链?下面就带大家详细讲解一下 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注
Thumbnail
USDT 是 Tether 的符号,Tether 是一种与美元挂钩的加密货币。这意味着 USDT 是一种稳定币,其价值随美元波动,并由 Tether 的美元储备支持。
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
msg.sender 定義:msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
Thumbnail
以太坊上隱私協議@dop_org白皮書內測試網明牌空投- Tomi代幣持有者- Tomi Pioneers系列NFT持有者-測試網參與者流程:創建錢包領取測試代幣加密-發送-解密代幣Let's go 1⃣創建錢包 網址:https://doptest.dop.org?id=b5tWpB9 流程
Thumbnail
Kylin Oracle是一个通用的预言机协议,其主要功能是通过去中心化和去信任化构建链上数据仓库,很多投资者还不知道这个KYL币在哪里买?下面就让小编为大家盘点一下这个KYL币上线的交易所, 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 �
了解智能合约形式化验证方法的重要性和应用,确保加密货币交易的安全和可靠性。 引言 智能合约的出现改变了加密货币市场的游戏规则,但同时也带来了新的风险和挑战。为了确保智能合约的安全和可靠性,形式化验证方法变得越来越重要。本文将深入探讨智能合约形式化验证方法的概念、技术和应用,帮助读者更好地理解加密
Thumbnail
为了编写智能合约,开发人员往往需要选择一种适合的编程语言,目前市场上有几种常用的智能合约编程语言,比如Solidity、Vyper、Michelson等,那么具体智能合约常用语言有哪些,让我们一起来看看吧 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续
这篇文章主要介绍了智能合约地址什么意思?智能合约安全吗?的相关资料,智能合约是表示为一段代码的合约,旨在执行一组指令。很多人不知道是智能合约地址什么意思,下面小编带大家深入的了解一下,一起来看看吧! 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣
Thumbnail
DYDX链是基于Cosmos SDK和TendermintPoS共识协议,这一决定是基于dYdX对完全去中心化的努力,也是基于这一新区块链的可定制性,如果你还不清楚DYDX是公链吗?DYDX是什么链?下面就带大家详细讲解一下 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注
Thumbnail
USDT 是 Tether 的符号,Tether 是一种与美元挂钩的加密货币。这意味着 USDT 是一种稳定币,其价值随美元波动,并由 Tether 的美元储备支持。
0. 大綱Outline 以太坊交易 發起交易 與智能合約互動 receive & fallback function 1. 舊以太坊交易 Ethereum Gas Tracker - 7 Gwei - Etherscan //交易技術, 表示特定帳戶的交易數量,是計數器, 每發一筆交
Overview 1. Request Wallet Connection from Metamask get account function get account function 2. Set your smart contract address injected provide
msg.sender 定義:msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
Thumbnail
以太坊上隱私協議@dop_org白皮書內測試網明牌空投- Tomi代幣持有者- Tomi Pioneers系列NFT持有者-測試網參與者流程:創建錢包領取測試代幣加密-發送-解密代幣Let's go 1⃣創建錢包 網址:https://doptest.dop.org?id=b5tWpB9 流程