Chương 1: Tổng quan và thư viện gọi hoặc các hợp đồng khác. Solidity cũng cung cấp từ khóa Thư viện để hạn chế sắp xếp các vị trí biến trạng thái với các biến trạng thái của người gọi. Thư viện Solidity không thé có biến trạng thái, vì vay sẽ không có chuyền đổi ngữ cảnh và thay đổi trái phép các biến trạng thái của người gọi. e Selfdestruct Lệnh Selfdestruct trong Solidity cho phép hợp đồng bị xóa khỏi Blockchain.
Tuy nhiên, việc sử dụng lệnh này rất nguy hiểm vì nếu không cập nhật địa chỉ của hợp đồng mới, vẫn có thể có người gửi Ether đến hợp đồng đã bị xóa, dẫn đến mat mát Ether. Hơn nữa, quá trình này yêu cầu gửi số Ether còn lại trong hợp đồng đến một địa chỉ được chỉ định. Kẻ tan công nguy hiểm có thé tận dụng hành vi này dé ép buộc gửi Ether cho một số hợp đồng. Số Ether trong hợp đồng nạn nhân có thẻ bị thay đổi bằng cách sử dụng lệnh force-send này, đặc biệt là khi số Ether này được sử dụng làm điều kiện cho một số hoạt động cụ thé.
Biện pháp phòng tránh: Dé tránh tình huống Selfdestruct không mong muốn, cần can trọng khi thực hiện cuộc gọi từ bên ngoài. Trong quá trình chờ đợi, logic của hợp đồng nên không phụ thuộc vào giá trị của this. balance, vì có thé bị kẻ tấn công có tình thay đồi. e Freezing Ether Lỗ hồng này còn được gọi là "greedy contract" va "locked money".
Một hợp đồng thông minh được thiết kế để có khả năng nhận và gửi Ether. Tuy nhiên, tình huống "Freezing Ether" xảy ra khi một hợp đồng chỉ có thé nhận Ether mà không có cách nào đề gửi Ether ra bên ngoài. Nếu hợp đồng không định nghĩa bất kỳ chức năng nao dé rút tiền, Ether được gửi đến địa chỉ hợp đồng sẽ bị "đóng băng" và không thé rit ra. Biện pháp phòng tránh: Dé tránh lỗ hồng nay, trong giai đoạn thiết kế hợp đồng thông minh, cần đảm bảo rằng các hợp đồng có khả năng nhận Ether cũng có chức năng dé rút Ether ra khỏi hợp đồng khi cần thiết.
se Randomness Generation 21 Chương 1: Tổng quan Randomness Generation là một van đề đối với nhiều ngôn ngữ lập trình. Quá trình tạo giả ngẫu nhiên tận dụng một số seeds bí mật nhất định đề đạt được mức độ ngẫu nhiên. Tuy nhiên, seeds không thé được lưu trữ riêng trên chuỗi trong hợp đồng thông minh trong Solidity vì mọi thứ trên chuỗi khối đều hiển thị cho những người tham gia. Thực tiễn hiện tại đang sử dụng thông tin liên quan đến khối như block.timestamp hoặc block.
Nếu timestamp hoặc hàm băm của khối lịch sử được sử dụng, kẻ tấn công có thê sử dụng cùng một quy trình tạo số ngẫu nhiên dé thu được kết quả tương tự vì khối lich sử không bao giờ thay đổi. Nếu sử dụng các khối trong tương lai, quy trình có thể dễ bị ảnh hưởng bởi những kẻ khai thác độc hại, những người có thể cố ý chọn các giao dịch và lệnh thực hiện của chúng. Biện pháp phòng tránh: Thông tin liên quan đến khối không nên được sử dụng làm nguồn entropy cho tính ngẫu nhiên. Nguồn phải nằm ngoài môi trường blockchain.
origin là một biến toàn cục duy nhất trong Solidity. Lưu trữ địa chỉ của người gọi ban đầu của một giao dịch, không giống như msg. sender, là người gọi ngay lập tức. origin luôn là địa chỉ của tài khoản bên ngoài.
Nếu biến này được sử dụng làm tham số ủy quyền, danh tính của chủ sở hữu thực sự của hợp đồng thông minh có thé bị khai thác. Chang hạn, nếu yêu cầu (tx.origin == owner), được gọi bởi hợp đồng của kẻ tấn công, được gọi bởi chủ sở hữu thực su, kẻ tấn công có thể tiếp tục thực thi mã để tấn công. Biện pháp phòng tránh: Những kẻ tấn công có thể chạy mã dưới tên tx.origin?® của người gọi, vì vậy đừng bao giờ sử dụng tx. origin trong xác minh hoặc xác thực danh tính.
e Mishandled Exceptions Trong Solidity, require, assert, try/catch có thể được str dụng đề xác minh tat cả các loại thông tin nhằm dam bảo rằng hợp đồng thông minh hoạt động như nó được thiết kế. Tuy nhiên, một số hàm cấp thấp như address.send(), call(), 19 https://docs.org/en/develop/security-considerations.html#tx-origin 22 Chương 1: Tổng quan delegatecall(), staticcall() sẽ tìm cách khác khi gặp lỗi. Thông thường, khi tìm thấy một ngoại lệ, các giao dịch sẽ được reverted và gas bị tiêu thụ, nhưng nếu các chức năng cấp thấp gặp lỗi (ví dụ: ngăn xếp cuộc gọi đã cạn kiệt), chúng sẽ trả về giá trị sai mà không có bắt kỳ ngoại lệ nào. Bất kỳ giao dịch nào được thực hiện trước các chức năng đó sẽ không được reverted và gas sẽ được sử dụng.
Nói cách khác, khi sử dụng các hàm cấp thấp, giá trị trả về sai cần được lưu ý và xử ly đúng cách, nếu không, tính bảo mật của hợp đồng thông minh sẽ bị ảnh hưởng. Biện pháp phòng tránh: Theo đề xuất của Tài liệu Solidity'' , không nên sử dụng các chức năng cấp thấp bat cứ khi nào có thé. Chức năng chuyển có thé được sử dụng để chuyền Ether sang các tài khoản khác. Nếu phải sử dụng các hàm cấp thấp đó, tốt hơn là kiểm tra mọi giá trị trả về của các hàm đó và xử lý các giá trị sai.
e Timestamp Dependence Blocks trong Ethereum được tạo ra trong quá trình khai thác, trong đó người khai thác có một mức độ độc đoán nhất định để quyết định timestamp của toàn bộ blocks. Phạm vi thời gian trước đây là 900 giây, nhưng nó đã bị thu hẹp xuống còn vài giây sau khi nâng cấp. Tất cả các giao dịch được ghi trên block có cùng timestamp. Vì công cụ khai thác có thê quyết định timestamp cho các giao dich, nên một số ứng dụng nhất định hoạt động chính xác dưới các ràng buộc về thời gian sẽ dé bị các công cụ khai thác độc hại tan công.
Timestamp cũng được sử dụng làm hạt giống khi tạo số ngẫu nhiên. Những kẻ tấn công có thé thao ting timestamp của một khối đề kích hoạt các hành vi dự kiến từ hợp đồng thông minh. Biện pháp phòng tránh: Sử dụng block.number là lựa chọn tốt hơn block. Vì tốc độ tạo khối thường là 10 giây, nên sẽ có khoảng 60.480 khối trong một tuần.
Bằng cách chỉ định số khối trong tương lai, ước tính thời gian đi kèm với số khối trong tương lai này. e Transaction Order Dependence Vi các giao dich thay đổi trang thái của thé giới từ trạng thái này sang trang thái khác, trạng thái thế giới hoặc trạng thái của hợp đồng phụ thuộc vào thứ tự thực hiện 1! https://docs.20/ Chương 1: Tổng quan các giao dịch. Người khai thác (miner) quyết định thứ tự thực hiện một cách tùy ý, và tính không xác định của thứ tự thực hiện này làm cho việc dự đoán trạng thái trước khi các giao dịch được gửi đi trở nên khó khăn. Trong tình huống thực tế, khi một giao dịch phụ thuộc vào trạng thái của hợp đồng, một thứ tự thực hiện khác có thể gây ra những van dé nghiêm trong như mua hoặc bán các mặt hang với giá không mong đợi [6].
Biện pháp phòng tránh: Lệnh giao dịch bị ảnh hưởng bởi các tài khoản trả giá gas cao hơn hoặc những người khai thác quyết định lệnh. Nếu giới hạn trên được đặt cho giá gas, một phần giao dịch sẽ không bị khai thác bởi những kẻ tấn công sẵn sàng trả giá gas cao hơn. ¢ Default Visibility Solidity có các chỉ định khả năng hiền thị, công khai, riêng tư, bên ngoài và nội bộ dé kiểm soát khả năng hiển thị của các chức năng và biến từ bên ngoài hợp đồng. Mặc định, khi không được chỉ định, công khai được sử dụng làm mức độ hiền thị.
Nếu nhà phát triển không xác định rõ ràng chức năng chỉ được sử dụng bên trong là riêng tư, thì chức năng đó có thé được gọi từ bên ngoài hợp đồng, dẫn đến việc thực thi không mong muốn. Biện pháp phòng tránh: Một thực hành tốt là luôn xác định rõ ràng các mức độ hiển thị trong Solidity. Hơn nữa, Solidity cũng cung cấp cảnh báo cho các chức năng không có mức độ hiển thị được xác định khi biên dịch, giúp nhà phát triển phát hiện và sửa lỗi trong quá trình phát trién. e External Contract Referencing Hợp đồng thông minh đôi khi cần sử dụng lại mã của các hợp đồng khác bằng cách tham chiếu đến địa chi của chúng.
Ví dụ: một nhà phát trién có thé khởi tạo một thư viện bên ngoài trong hàm khởi tạo của hợp đồng của mình. Địa chỉ của thư viện sẽ được cung cấp trong quá trình triển khai. Điều này có vẻ hợp pháp và an toàn khi kiểm tra mã. Tuy nhiên, nếu địa chỉ sai được cung cấp trong quá trình triển khai, lỗ hồng bảo mật có thể xảy ra khi một hợp đồng độc hại (honey pot) có thé được gọi từ địa chỉ không đúng.
24 Chương 1: Tổng quan Biện pháp phòng tránh: Một biện pháp phòng tránh có thể là mã hóa cứng các địa chỉ bên ngoài thành mã của hợp đồng nếu chúng được công khai hoặc sử dụng các từ khóa mới để tạo hợp đồng thay vì nhập địa chỉ trong quá trình triển khai. e Short Address/Parameter Issues Các tham số của chức năng trong hợp đồng thông minh được mã hóa trước khi được truyền vào. Tham số được mã hóa có độ dài là 32 byte, và EVM (Ethereum Virtual Machine) sẽ ghép tat ca các tham số mã hóa lại với nhau và đệm 0 ở cuối nếu cần. Tuy nhiên, nếu tham số đầu tiên không đủ độ dài, ví dụ như chỉ 30 byte, điều này sẽ gây ra dịch chuyền 2 byte sang trái sau phần đệm của EVM.
Những thay đổi và phần đệm này có thể làm thay đổi giá trị của tham số thứ hai, điều này có thể gây ra các van dé nghiêm trọng nếu tham sé thứ hai đại diện cho số lượng mã thông báo hoặc Ether. Biện pháp phòng tránh: Để giải quyết vấn đề này, trước tiên, các tham số gửi đến hợp đồng thông minh trên Ethereum phải được xác thực. Day là một phương pháp tốt nhất dé thực hiện cho các ứng dụng của bên thứ ba tương tác với hợp đồng thông minh. Đối với các nhà phát triển hợp đồng thông minh, thứ tự của các tham số là rất quan trọng, vì phần đệm chỉ xáy ra ở cuối khi các tham số được ghép nối.
25 Chương 2: Các phương pháp và mô hình phát hiện lỗ héng bảo mật hợp đồng thông minh Chương 2 CÁC PHƯƠNG PHÁP VÀ MÔ HÌNH MÁY HỌC PHÁT HIỆN LO HONG BẢO MAT HOP DONG THONG MINH Máy học được áp dụng rộng rãi trong nhiều lĩnh vực.