Khi kỷ nguyên chuỗi khối 2.0 tập trung vào hợp đồng thông minh (Hợp đồng thông minh) và ứng dụng chuỗi khối (DApps) dần trở thành xu hướng, tính bảo mật của hợp đồng thông minh và ứng dụng chuỗi khối ngày càng trở thành tâm điểm chú ý trong ngành.
Đặc biệt, sau khi trải qua các sự cố như THE DAO và vụ đánh cắp Binance, làm thế nào để xác minh và đảm bảo tính bảo mật của các hợp đồng thông minh và ứng dụng blockchain đã trở thành một điểm nhức nhối cấp bách trong ngành công nghiệp blockchain hiện tại.
Tác giả đã thống kê đơn giản, từ tháng 9 năm 2017 đến tháng 9 năm 2018, các lỗ hổng liên quan đến hợp đồng thông minh và ứng dụng chuỗi khối cho thấy mô hình bùng phát thường xuyên và hậu quả rất sâu rộng. Nó không chỉ trực tiếp gây ra một lượng tiền thất thoát khổng lồ mà từ góc độ phát triển lâu dài, nó còn ảnh hưởng đến sự phát triển bền vững của công nghệ blockchain mới nổi trong tương lai.
Ngoài ra, mặc dù các lỗ hổng tiềm ẩn của các hợp đồng thông minh và ứng dụng blockchain hiện tại vẫn chưa được giải quyết triệt để, nhưng hiện trạng là số lượng hợp đồng thông minh và ứng dụng blockchain vẫn đang tăng nhanh với tốc độ tăng trưởng trung bình hàng chục nghìn mỗi ngày.
Không khó để thấy rằng tốc độ tăng trưởng và tính bảo mật của hợp đồng thông minh và ứng dụng chuỗi khối đang cùng tồn tại trong một mối quan hệ không lành mạnh. Nếu chúng ta so sánh cung và cầu (tốc độ tăng trưởng là "cung"; bảo mật là "cầu"), tình trạng chung hiện tại của các hợp đồng thông minh và ứng dụng blockchain là trạng thái "cung vượt cầu".
Dựa trên điều này, làm thế nào để đảm bảo tính bảo mật của các hợp đồng thông minh lớn và ứng dụng chuỗi khối đã trở thành vấn đề cốt lõi đối với các doanh nghiệp và cá nhân hướng tới tương lai trong ngành công nghiệp chuỗi khối. Trên thực tế, hiện tại có các phương pháp đặc biệt trong ngành để khắc phục điểm khó khăn này, chẳng hạn như khớp mã tính năng, kiểm tra tự động dựa trên thực thi ký hiệu và trừu tượng hóa ký hiệu cũng như kiểm tra tự động dựa trên xác minh chính thức. Trong số đó, sau khi khám phá và thực hành rộng rãi trong ngành, "kiểm toán tự động dựa trên xác minh chính thức" đã trở thành một phương pháp tương đối trưởng thành và chủ đạo trong ngành.
Do đó, tác giả đặc biệt tập trung vào "xác minh chính thức", chọn hai công cụ xác minh chính thức chính (VaaS & Mythril) trong ngành hiện tại và tiến hành so sánh thử nghiệm đơn giản. Đặc biệt, phiên bản mà công cụ Mythril dùng để thử nghiệm là "0.21.12".
tiêu đề phụ
Giới thiệu về Công cụ VaaS & Mythril
01. Giới thiệu về công cụ VaaS
Công cụ VaaS là một công cụ xác minh chính thức tự động do Beosin Chengdu Lianan phát triển độc lập bằng cách sử dụng quyền sở hữu trí tuệ của riêng mình. Nó có thể cung cấp các dịch vụ xác minh chính thức "cấp độ quân sự" cho các hợp đồng thông minh và ứng dụng chuỗi khối, đồng thời có thể định vị chính xác các mã rủi ro Vị trí và nguyên nhân của rủi ro được chỉ ra và các lỗ hổng bảo mật thông thường, thuộc tính bảo mật và tính chính xác về chức năng của hợp đồng thông minh được phát hiện một cách hiệu quả với độ chính xác trên 95%.
02. Giới thiệu Công cụ Mythril
tiêu đề phụ
Thành phần trường hợp thử nghiệm
Trường hợp thử nghiệm hợp đồng bao gồm 260 hợp đồng mã thông báo và 20 hợp đồng kinh doanh.
- Hợp đồng mã thông báo bao gồm hợp đồng mã thông báo Top200 và 60 hợp đồng mã thông báo điển hình để kiểm tra, bao gồm các chức năng như ICO, khóa, đúc và đốt. 
- tiêu đề phụ 
Tổng quan về kết quả kiểm tra
Các công cụ VaaS có thể phát hiện tất cả các trường hợp thử nghiệm hợp đồng của mã thông báo và các lớp kinh doanh; tuy nhiên, các công cụ Mythril chỉ có thể phát hiện các hợp đồng mã thông báo chứ không phải hợp đồng kinh doanh. Do đó, cần lưu ý rằng tổng quan về kết quả thử nghiệm này chỉ là một phân tích so sánh về danh sách các hợp đồng mã thông báo.
Các công cụ VaaS có tổng cộng 28 lần kiểm tra lỗ hổng nhưng công cụ Mythril chỉ có 9 lần kiểm tra lỗ hổng so với các công cụ VaaS. Do đó, các mục phát hiện của các công cụ VaaS nhiều hơn nhiều so với các công cụ Mythril. Các hạng mục phát hiện cụ thể được so sánh như sau:
So sánh các mục phát hiện VaaS & Mythril


01. Kết quả xét nghiệm cùng hạng mục xét nghiệm
Đối với 260 trường hợp thử nghiệm mã thông báo đã chọn, công cụ Mythril có thể chạy 184 kết quả hợp đồng trong vòng 15 phút và 76 trường hợp không có kết quả phát hiện; trong khi công cụ VaaS có thể chạy tất cả các kết quả. Lấy 184 kết quả mà cả công cụ Mythril và công cụ VaaS chạy được để so sánh, ta có kết quả như sau.
- Tỷ lệ trúng & Tỷ lệ tích cực sai 
Thông qua so sánh kết quả phát hiện, so với các mục phát hiện tương tự, khả năng phát hiện của các công cụ VaaS cao hơn nhiều so với các công cụ Mythril. Theo tính toán, độ chính xác phát hiện của công cụ VaaS là 96,9%; độ chính xác phát hiện của công cụ Mythril là 36,6%; tỷ lệ dương tính giả của công cụ VaaS là 15,3%; tỷ lệ dương tính giả của công cụ Mythril là 48,5%. Xem hình bên dưới để biết chi tiết.

Cần lưu ý rằng các công thức tính tỷ lệ trúng và tỷ lệ cảnh báo sai là:
- Tỷ lệ trúng = số lượng trúng/tổng số câu hỏi 
- Tỷ lệ dương tính giả = số lần dương tính giả/(số lần dương tính giả + số lần truy cập) 
Theo thống kê của tác giả, các hạng mục dò tìm được thực hiện bởi cả công cụ VaaS và công cụ Mythril có tổng cộng 655 câu hỏi:
- Công cụ VaaS đã phát hiện tổng cộng 635 sự cố, với tỷ lệ thành công là 96,9%; tổng cộng 115 lỗi xác thực, với tỷ lệ xác thực sai là 15,3%. 
- Công cụ Mythril đã phát hiện tổng cộng 240 vấn đề, với tỷ lệ thành công là 36,6%; tổng cộng có 226 trường hợp dương tính giả, với tỷ lệ dương tính giả là 48,5%. Trong số đó, tấn công vào lại công cụ Mythril và tỷ lệ cảnh báo sai từ chối dịch vụ tương đối cao, chiếm 93,3% tổng số. 
Tổng giá trị phát hiện được so sánh trong bảng sau:

- giới hạn thời gian thử nghiệm 
Thời gian thử nghiệm trung bình của công cụ Mythril là 226,2 giây trong khi thời gian thử nghiệm trung bình của công cụ VaaS là 164,4 giây. Nó cho thấy hiệu quả hoạt động của các công cụ VaaS tốt hơn so với các công cụ Mythril.
02. Kết quả phát hiện các mục phát hiện cụ thể cho các công cụ VaaS
Xem bảng dưới đây để biết chi tiết:
tiêu đề phụ

trình bày trường hợp
01. Trường hợp đối tượng phát hiện giống nhau
- nhập cảnh lại 
trường hợp:

interface TEST {
function test123() external view returns (uint256);
function getBlocknumber() external view returns (uint256);
}
contract test2 {
function testCalling(address _testAdddress) public {
TEST t = TEST(_testAdddress);
t.test123();//mythril dương tính giả
}
function testFormal(address _testAdddress) public view returns(uint256 time){
TEST t = TEST(_testAdddress);
t.getBlocknumber();//mythril dương tính giả
return time;
}
}
contract Reentrancy {
mapping(address => uint256) public balances;
event WithdrawFunds(address _to,uint256 _value);
function depositFunds() public payable {
balances[msg.sender] += msg.value;
}
function showbalance() public view returns (uint256 ){
return address(this).balance;
}
function withdrawFunds (uint256 _weiToWithdraw) public {
require(balances[msg.sender] >= _weiToWithdraw);
require(msg.sender.call.value(_weiToWithdraw)());
balances[msg.sender] -= _weiToWithdraw;//mythril rõ ràng là dương tính giả
emit WithdrawFunds(msg.sender,_weiToWithdraw);
}
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 


▷ Theo phân tích của tác giả, công cụ VaaS đã báo cáo vị trí của cuộc tấn công quay lại; trong khi công cụ Mythril đưa ra cảnh báo cho cuộc gọi bên ngoài, có tổng cộng 4 cảnh báo, 2 trong số đó là cuộc gọi bên ngoài bình thường và cảnh báo còn lại là một báo động sai rõ ràng, với tỷ lệ dương tính giả cao.
- TXOriginAuthentication (lỗi sử dụng tx.origin) 
trường hợp:

contract TxUserWallet {
address owner;
constructor() public {
owner = msg.sender;
}
function transferTo(address dest, uint amount) public {
require(tx.origin == owner);
dest.transfer(amount);
}
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 

▷ Theo phân tích của tác giả, cả công cụ VaaS và công cụ Mythril đều có thể phát hiện và cảnh báo từ khóa tx.origin.
- Gọi các cuộc gọi cấp thấp (cuộc gọi cuộc gọi, cuộc gọi ủy nhiệm, cuộc gọi chức năng tự sát) 
trường hợp:

contract Delegatecall{
uint public q;
bool public b;
address addr = 0xde6a66562c299052b1cfd24abc1dc639d429e1d6;
function Delegatecall() public payable {
}
function call1() public returns(bool) {
b = addr.delegatecall
(bytes4(keccak256("fun(uint256,uint256)")),2,3);
return b;
}
function call2(address add) public returns(bool){
b=add.delegatecall
(bytes4(keccak256("fun(uint256,uint256)")),2,3);
return b;
}
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 

▷ Theo phân tích của tác giả, có hai cuộc gọi delegetacall trong trường hợp này, trong khi công cụ Mythril chỉ báo cáo một lần nên có nguy cơ báo cáo thiếu.
- Thao tác BlockMembers (phụ thuộc tham số khối) 
trường hợp:

function createTokens() payable external {
if (isFinalized) throw;
if (block.number < fundingStartBlock) throw;
if (block.number > fundingEndBlock) throw;
if (msg.value == 0) throw;
uint256 tokens = safeMult(msg.value, tokenExchangeRate);
uint256 checkedSupply = safeAdd(totalSupply, tokens);
if (tokenCreationCap < checkedSupply) throw;
totalSupply = checkedSupply;
balances[msg.sender] += tokens;
CreateBAT(msg.sender, tokens);
}
function finalize() external {
if (isFinalized) throw;
if (msg.sender != ethFundDeposit) throw;
if(totalSupply < tokenCreationMin) throw;
if(block.number <= fundingEndBlock && totalSupply != tokenCreationCap) throw;
// move to operational
isFinalized = true;
if(!ethFundDeposit.send(this.balance)) throw;
}
function refund() external {
if(isFinalized) throw;
if (block.number <= fundingEndBlock) throw;
if(totalSupply >= tokenCreationMin) throw;
if(msg.sender == batFundDeposit) throw;
uint256 batVal = balances[msg.sender];
if (batVal == 0) throw;
balances[msg.sender] = 0;
totalSupply = safeSubtract(totalSupply, batVal);
uint256 ethVal = batVal / tokenExchangeRate;
LogRefund(msg.sender, ethVal);
if (!msg.sender.send(ethVal)) throw;
}
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 

▷ Theo phân tích của tác giả, cả công cụ VaaS và công cụ Mythril đều có thể phát hiện các phụ thuộc tham số khối; tuy nhiên, công cụ Mythril có nguy cơ dương tính giả.
- Từ chối dịch vụ 
trường hợp:

contract Auction {
address public highestBidder = 0x0;
uint256 public highestBid;
function Auction(uint256 _highestBid) {
require(_highestBid > 0);
highestBid = _highestBid;
highestBidder = msg.sender;
}
function bid() payable {
require(msg.value > highestBid);
highestBidder.transfer(highestBid);
highestBidder = msg.sender;
highestBid = msg.value;
}
function auction_end() {
}
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 

▷ Theo phân tích của tác giả, cả công cụ VaaS và công cụ Mythril đều có thể thực hiện phát hiện rủi ro từ chối dịch vụ. Tuy nhiên, trong trường hợp này, Nhà thầu cao nhất có thể đã tấn công ác ý vào hợp đồng, dẫn đến việc chuyển nhượng liên tục không thành công, dẫn đến hợp đồng từ chối chấp nhận dịch vụ.Trong trường hợp này, công cụ VaaS có thể phát hiện nguy cơ từ chối dịch vụ, nhưng công cụ Mythril đã không phát hiện ra nó.
- Unchecked Call Or Send Return Values (gọi và gửi giá trị trả về phát hiện) 
trường hợp:

if (lastTimeOfNewCredit + TWELVE_HOURS < block.timestamp) {
msg.sender.send(amount);
creditorAddresses[creditorAddresses.length - 1].send(profitFromCrash);
corruptElite.send(this.balance);
...
return true;
}
else {
msg.sender.send(amount);
return false;
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 

▷ Theo phân tích của tác giả, cả công cụ VaaS và công cụ Mythril đều có thể phát hiện giá trị trả về của lệnh gọi không được kiểm tra; tuy nhiên, công cụ Mythril có nguy cơ dương tính giả.
- Tràn số nguyên 
Trường hợp 1:

function distributeBTR(address[] addresses) onlyOwner {
for (uint i = 0; i < addresses.length; i++) {
balances[owner] -= 2000 * 10**8;
alances[addresses[i]] += 2000 * 10**8;
Transfer(owner, addresses[i], 2000 * 10**8);
}
}

▷ Theo phân tích của tác giả, trường hợp trên không check giá trị balances[chủ sở hữu] có thể gây chảy tràn, nhưng Mythrill tool sẽ không báo lỗi, nghĩa là Mythrill tool sẽ không check hoạt động liên tục.
Trường hợp 2:

contract A {
uint c;
function add(uint8 a,uint8 b){
uint8 sum = a+b;
c=sum;
}
}

- Kết quả kiểm tra công cụ VaaS: 

- Kết quả kiểm tra công cụ Mythril: 

▷ Theo phân tích của tác giả, khả năng phát hiện tràn của công cụ Mythrill đối với các loại dữ liệu không phải uint256 là không chính xác.
Trường hợp 3:
- Một số kết quả phát hiện của công cụ Mythril: 


▷ Theo phân tích của tác giả, công cụ Mythrill đã không xử lý một số biến cụ thể dẫn đến kết quả dương tính giả. Chẳng hạn như mảng, msg.value, now, v.v.
02. Các trường hợp hạng mục phát hiện cụ thể đối với công cụ VaaS
Trường hợp 1:

...
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) constant returns (uint);
function transferFrom(address from, address to, uint value);
function approve(address spender, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}
...
function transfer(address _to, uint _value) onlyPayloadSize(2 * 32) {
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
}

- Kết quả kiểm tra: 


Trường hợp 2:

contract A {
B b;
uint c;
function test(uint a){
b = new B(a);
c = b.get(200);
}
}
contract B {
uint b;
function B(uint e){
b=100;
}
function get(uint a)returns(uint){
require(a<100);
return a;
}
}

- Kết quả kiểm tra: 

▷ Theo phân tích của tác giả, ở trường hợp 2, về việc gọi giữa các hợp đồng, nếu có mã nguồn thì công cụ VaaS có thể gọi và test thành công, còn công cụ Mythril thì không. Đây là một trong những lý do khiến công cụ Mythril không thể thực hiện xác minh hợp đồng kinh doanh.

Thông qua phân tích so sánh đơn giản ở trên về logic, kích thước và dữ liệu của công cụ VaaS và công cụ Mythril, tác giả tin rằng người đọc sẽ có thể đưa ra những nhận định và đánh giá tương ứng dựa trên định hướng và trọng tâm kinh doanh của bản thân sau khi đọc.
Bất kể hợp đồng thông minh và ứng dụng chuỗi khối hay thậm chí là tính bảo mật của toàn bộ ngành công nghiệp chuỗi khối, trong tương lai, chúng tôi sẽ cần phát triển theo mô hình cân bằng mối quan hệ giữa cung (tốc độ tăng trưởng) và nhu cầu (bảo mật) và chúng tôi cần nhiều hơn nữa Biết rõ đâu là điểm đau của hiện trạng, và làm thế nào để cải thiện và đổi mới để đối phó với điểm đau.
Dù là người ủng hộ công nghệ tiên tiến hay người đam mê công nghệ chuỗi khối, bất kỳ ai có cái nhìn sâu sắc, có tư duy phi tập trung và nhận ra rằng các hợp đồng thông minh và ứng dụng chuỗi khối sẽ có ảnh hưởng sâu rộng trong tương lai đều có thể hiểu được mục đích của tác giả đối với "hình thức" hóa học. xác minh" là mục đích của báo cáo thử nghiệm này.
Đúng là mặc dù hiện đang chú ý nhiều hơn đến cách thúc đẩy triển khai các hợp đồng thông minh và ứng dụng chuỗi khối cũng như việc xây dựng tổng thể hệ sinh thái chuỗi khối, nhưng vẫn còn nhiều lỗ hổng và rủi ro trong kiến trúc kỹ thuật cơ bản chưa được giải quyết , nó sẽ là quá tham vọng.
Do đó, tác giả gợi ý rằng để đảm bảo tính bảo mật của các hợp đồng thông minh lớn và ứng dụng chuỗi khối, cũng như duy trì hoạt động tốt và duy trì hệ sinh thái chuỗi khối, "xác minh chính thức" đã trở thành một cách quan trọng để kiểm toán tự động.
Đây là giai đoạn cần thiết để phát triển các hợp đồng thông minh và ứng dụng chuỗi khối hiện tại để đánh giá tính khả thi của một công cụ kiểm toán và xác minh nhất định thông qua các khía cạnh đánh giá như tỷ lệ âm tính giả, tỷ lệ dương tính giả, tỷ lệ trúng và giới hạn thời gian thử nghiệm. nghiêm túc thực hiện sứ mệnh.


