paint-brush
Fuzzing Around: Thử nghiệm hợp đồng thông minh thông qua đầu vào ngẫu nhiêntừ tác giả@alvinslee
1,165 lượt đọc
1,165 lượt đọc

Fuzzing Around: Thử nghiệm hợp đồng thông minh thông qua đầu vào ngẫu nhiên

từ tác giả Alvin Lee5m2023/04/24
Read on Terminal Reader

dài quá đọc không nổi

Fuzzing là một cách để bắn phá mã của bạn bằng một loạt các đầu vào ngẫu nhiên chỉ để xem điều gì sẽ xảy ra. Đó là một cách nhanh chóng, hiệu quả, mạnh mẽ để thử nghiệm các trường hợp và tình huống khó khăn mà bạn có thể không nghĩ tới. Diligence Fuzzing cung cấp 10 giờ fuzzing miễn phí để thử mọi thứ.
featured image - Fuzzing Around: Thử nghiệm hợp đồng thông minh thông qua đầu vào ngẫu nhiên
Alvin Lee HackerNoon profile picture
0-item
1-item

Thử nghiệm hợp đồng thông minh thực sự quan trọng. Tại sao? Hợp đồng thông minh nói chung là bất biến trong sản xuất, công khai , mục tiêu của tin tặc và thường liên quan đến các tác động tài chính quan trọng . Câu chuyện ngắn? Với hợp đồng thông minh, bạn không muốn làm hỏng việc. Bạn cần kiểm tra nhiều, kiểm tra thường xuyên và kiểm tra kỹ lưỡng. Thử nghiệm hợp đồng thông minh liên quan đến tất cả các nghi phạm thông thường—thử nghiệm đơn vị, thử nghiệm tích hợp, thử nghiệm tự động—nhưng cũng rất được khuyến khích là làm mờ—một cách bắn phá mã của bạn bằng một loạt các đầu vào ngẫu nhiên chỉ để xem điều gì sẽ xảy ra.


Chúng ta hãy xem chính xác fuzzing là một phương pháp kiểm thử và cách bạn có thể dễ dàng đưa nó vào quy trình kiểm thử phần mềm của mình bằng cách sử dụng các công cụ như ConsenSys Diligence Fuzzing . Chúng ta sẽ xem qua hướng dẫn bằng cách sử dụng ví dụ liên hệ thông minh defi để xem nó được thực hiện như thế nào.


Thử nghiệm fuzzing là gì và tại sao tôi nên sử dụng nó?

Thử nghiệm mờ (hoặc thử nghiệm mờ) liên quan đến việc gửi hàng triệu dữ liệu không hợp lệ, không mong muốn và (bán) ngẫu nhiên đối với một hợp đồng thông minh nhằm nỗ lực gây ra hành vi không mong muốn và phát hiện các lỗ hổng. Đó là một cách nhanh chóng, hiệu quả, mạnh mẽ để kiểm tra các trường hợp và tình huống khó khăn mà bạn có thể không nghĩ tới. Nó bổ sung cho các luồng thử nghiệm khác và kiểm toán của bạn.


Fuzzing đã xuất hiện được một thời gian trong quá trình phát triển full-stack truyền thống, nhưng ở đây có một loại công cụ mới có thể áp dụng fuzzing để thử nghiệm hợp đồng thông minh trong web3. Một số công cụ làm mờ bao gồm mã nguồn mở EchidnaMythX .


Tuy nhiên, trong bài viết này, tôi sẽ đi sâu vào Diligence Fuzzing , dịch vụ cung cấp fuzzing như một dịch vụ—một cách khá thú vị và dễ dàng để tạo fuzzing.


Để sử dụng Diligence Fuzzing, bạn chú thích các hợp đồng thông minh của mình bằng Scribble . Về cơ bản, bạn sử dụng các chú thích Scribble trong mã của mình để báo cho fuzzer biết loại đầu ra mong đợi cho chức năng đó.


Nó trông giống như thế này:


 /// #invariant {:msg "balances are in sync"} unchecked_sum(_balances) == _totalSupply;


Bạn gọi fuzzer từ giao diện người dùng web nơi bạn gửi mã hợp đồng thông minh. Bạn nhấn chạy và khoảng 10 phút sau, bạn nhận được báo cáo về các sự cố đã tìm thấy, vị trí của sự cố, % mức độ phù hợp, v.v.


Đây là một cách dễ dàng và mạnh mẽ để kiểm tra một số trường hợp cạnh.

Thử nghiệm hợp đồng thông minh DeFi

Giả sử chúng ta có một giao thức DeFi mới và mã thông báo tương ứng mà chúng ta muốn khởi chạy. DeFi là tài chính tiên tiến, viết rất thú vị và điều quan trọng là chúng tôi không có bất kỳ lỗi nào. Hợp đồng thông minh DeFi thường liên quan đến hàng triệu (hoặc nhiều hơn) tiền của người dùng. Vì vậy, chúng tôi muốn đảm bảo rằng các hợp đồng thông minh của chúng tôi được kiểm tra (và kiểm toán) kỹ càng nhất có thể.


LƯU Ý QUAN TRỌNG: Mã này có lỗ hổng TRÊN MỤC ĐÍCH! Đó là để chúng tôi có thể chỉ ra cách fuzzing có thể bắt được những lỗi này. Xin vui lòng không thực sự sử dụng mã này cho bất cứ điều gì.


Bắt đầu nào.


Một ví dụ sử dụng Diligence Fuzzing (FaaS)

Bước 1: Thiết lập tài khoản Diligence.

Đầu tiên, chúng ta cần tài khoản Diligence. Đăng ký tại Diligence . Bạn có 10 giờ fuzzing miễn phí để thử mọi thứ.

Bước 2: Tạo khóa API mới.

Nhấp vào tên tài khoản của bạn ở trên cùng bên phải, nhấp vào “tạo khóa API mới” và đặt tên cho nó. Khóa API này cho phép chúng tôi kết nối với FaaS.





Bước 3: Thiết lập môi trường cục bộ của bạn.

Sao chép kho lưu trữ sau:

https://github.com/ConsenSys/scribble-exercise-1.git


Từ dòng lệnh, điều hướng đến thư mục kho lưu trữ, giờ đây sẽ là thư mục gốc của dự án của bạn. Nếu cần thiết cho máy của bạn, hãy kích hoạt Python venv. Sau đó, chạy các lệnh sau để cài đặt các phụ thuộc dự án của bạn:


 $ npm i -g eth-scribble ganache truffle $ pip3 install diligence-fuzzing

Bước 4: Nhập khóa API của bạn.

Chỉnh sửa tệp .fuzz.yml để sử dụng khóa API tài khoản Diligence của bạn cho giá trị của khóa.

Tệp kết quả của bạn sẽ trông như thế này:


 .fuzz.yml fuzz: # Tell the CLI where to find the compiled contracts and compilation artifacts build_directory: build/contracts ... campaign_name_prefix: "ERC20 campaign" # Point to your ganache node which holds the seed rpc_url: "http://localhost:8545" key: "DILIGENCE API KEY GOES HERE" ...

Bước 5: Viết và chú thích hợp đồng của bạn.

Bây giờ, hãy kiểm tra hợp đồng thông minh của chúng tôi tại contracts/vulnerableERC20.sol . Ở đây, chúng tôi có một mã thông báo dễ bị tổn thương (như tên của nó!) Cho giao thức DeFi mới của chúng tôi. Chúng tôi rõ ràng cần phải kiểm tra nó càng nhiều càng tốt. Vì vậy, hãy thêm một kiểm tra bằng cách sử dụng Scribble mà hy vọng người làm mờ sẽ bắt được.


Phía trên định nghĩa hợp đồng, thêm:


 /// #invariant "balances are in sync" unchecked_sum(_balances) == _totalSupply;


Và phía trên hàm truyền, thêm:


 /// #if_succeeds msg.sender != _to ==> _balances[_to] == old(_balances[_to]) + _value; /// #if_succeeds msg.sender != _to ==> _balances[msg.sender] == old(_balances[msg.sender]) - _value; /// #if_succeeds msg.sender == _to ==> _balances[msg.sender] == old(_balances[_to]); /// #if_succeeds old(_balances[msg.sender]) >= _value;


Vì vậy, bây giờ hãy xem liệu fuzzing tester có nắm bắt được điều gì không. Lưu ý các chú thích mà chúng tôi đã thêm vào hợp đồng để giúp người thử nghiệm hiểu những gì chúng tôi mong đợi sẽ xảy ra. Và lưu ý trong cấu hình, trình kiểm tra được thiết lập để chạy tối đa trong 10 phút, vì vậy nó có thể không nắm bắt được mọi thứ.

Bước 6: Fuzz xung quanh.

Bây giờ chúng tôi đã sẵn sàng để thử nghiệm! Từ thư mục gốc của dự án, hãy chạy make fuzz để gọi tệp tạo, tệp này sẽ biên dịch, xây dựng và gửi mọi thứ đến FaaS.

Bước 7: Xem kết quả.

Quay trở lại bảng điều khiển của bạn và bạn sẽ thấy một cái gì đó tương tự như bên dưới. Đợi vài giây để chiến dịch bắt đầu.



Sau khi nó được tạo xong, bạn sẽ thấy một cái gì đó tương tự như những gì được hiển thị bên dưới:

Chúng tôi thậm chí còn thấy phạm vi bảo hiểm mã!



Và sau một vài phút, chúng ta thấy một sự thất bại!


Nhấp qua các thuộc tính, chúng tôi thấy bất kỳ vi phạm nào. Và vâng, chúng tôi có một lỗi! Nhấp vào vị trí dòng để xem chi tiết về các lỗ hổng mã tiềm năng của chúng tôi.



Chúng tôi sẽ dừng lại ở đó, nhưng nếu bạn để bộ làm mờ tiếp tục chạy, nó có thể tìm thấy nhiều hơn nữa!


Phần kết luận

Làm mờ có thể là một bước quan trọng trong quy trình thử nghiệm và phát triển phần mềm của bạn. Nó giúp bạn xác định các lỗ hổng tiềm ẩn có thể không được chú ý. Bằng cách sử dụng nó, bạn bắt đầu nhận ra và hiểu những cạm bẫy và thách thức phổ biến. Tận dụng các công cụ như Diligence Fuzzing , viết hợp đồng thông minh tốt hơn và trở thành nhà phát triển giỏi hơn!