Chương 1: Giới thiệu tổng quan về dé tài của khóa luận và những nghiên cứu tương tự có liên quan. e Chương 2: Trình bày cơ sở lý thuyết và những kiến thức liên quan phục vụ cho đề tài. e Chương 3: Trình bày phương pháp phát hiên lỗ hong bảo mật hợp đồng thông minh mà chúng tôi đã nghiên cứu e Chương 4: Trình bày các thí nghiệm và đánh giá. e Chương 5: Kết luận và hướng phát triển của đề tài.
CƠ SỞ LÝ THUYẾT VÀ THÀNH PHẦN LIÊN QUAN Trong phần này chúng tôi sẽ trình bày các cơ sở lý thuyết liên quan của nghiên cứu: Bao gồm các thành phần liên quan của hợp đồng thong minh, biểu diễn đồ thị, mô hình học máy và học sâu. Các thành phần liên quan đến hợp đồng thông minh Ngôn ngữ hợp đồng: Ñgôn ngữ hợp đồng là ngôn ngữ mà hợp đồng thông minh được viết bằng. Các ngôn ngữ phổ biến trong lĩnh vực này bao gồm Solidity (cho Ethereum), Vyper, Serpent, NEO và nhiều ngôn ngữ khác. Ngôn ngữ hợp đồng định nghĩa các quy tắc và điều khoản của hợp đồng thông minh.
Môi trường blockchain: Hợp đồng thông minh hoạt động trong một môi trường blockchain phân tán. Blockchain cung cấp môi trường để triển khai và thực thi hợp đồng thông minh. Một số môi trường blockchain phổ biến bao gồm Ethereum, Bitcoin, NEO, EOS và nhiều mạng lưới blockchain khác. Mã nguồn hợp đồng: Mã nguồn hợp đồng là mã máy tính chứa quy tắc và logic của hợp đồng thông minh.
Nó được viết bằng ngôn ngữ hợp đồng tương ứng và thường được triển khai trên mạng lưới blockchain. Mã nguồn hợp đồng xác định hành vi và chức năng của hợp đồng thông minh Giao thức thực thi: Giao thức thực thi là một tập hợp các quy tắc và thuật toán được sử dụng để thực thi hợp đồng thong minh trên mạng lưới blockchain. Giao thức thực thi dam bao rằng các hành động trong hợp đồng được thực hiện một cách đáng tin cậy và an toàn. Giao dịch và sự kiện: Hợp đồng thông minh tương tác với các giao dịch va sự kiện trong mạng lưới blockchain.
Giao dịch là các hoạt động như chuyển tiền 9 hoặc thay đổi trạng thái của hợp đồng thong minh, trong khi sự kiện là các thông báo hoặc tín hiệu từ mạng lưới blockchain mà hợp đồng thông minh phan ứng và thực hiện các hành động tương ứng. Trong nghiên cứu này, chúng tôi chỉ chọn hợp đồng được viết bằng ngôn ngữ Solidity và được triển khai trên mạng Ethereum. Điều này có các lí đo sau đây: e Độ phổ biến: Solidity là ngôn ngữ hợp đồng thông minh phổ biến nhất cho mạng Ethereum và có cộng đồng lớn, đông đảo. Việc chọn Solidity đảm bảo rằng có nhiều tài liệu, ví dụ và công cụ hỗ trợ để nghiên cứu va phát triển hợp đồng thông minh.
Da dang dataset: Sự pho biến của Solidity din đến nguồn dữ liệu phong phú, cho phép thu thập, phân tích và đạt được kết quả tích cực. Tính ứng dụng cao: Ethereum là một mạng lưới blockchain có hiệu suất và tính mở rộng tương đối tốt, cho phép triển khai hợp đồng thông minh với quy mô lớn và giao dịch nhanh chóng. Việc nghiên cứu và phát triển hợp đồng thông minh trên Ethereum có thé đáp ứng được yêu cầu hiệu suất và tính mở rộng của các ứng dụng thực têœx. Các lỗ hồng phổ biến Một số lỗ hồng tồn tại phổ biến hiện nay mà chúng tôi tìm hiểu trong quá trình nghiên cứu: e Suicidal: Hacker có thể tan dụng một giao diện không được bảo vệ để phá hủy một hợp đồng bị lỗ hổng này.
Câu lệnh tiềm năng dễ bị tấn công liên quan đến lệnh selfdestruct. Hacker có thể lựa chọn bất kỳ hợp đồng nào được đặt trên blockchain. 10 e Call injection: Hacker gọi một hàm nhạy cảm, ví dụ như chuyển quyền sở hữu, của một hợp đồng nạn nhân. Các câu lệnh tiềm năng dễ bị tấn công bao gồm lệnh call, callcode và delegatecall.
e Chuyển giá trị tùy ý (ví dụ: Reentrancy) : Hacker chuyển đổi token hoặc ether từ một hợp đồng nạn nhân; nếu việc chuyển khoản được lặp lại, chúng tôi gọi đó là cuộc tấn công tái nhập. Chức năng tiếp thu lỗ hồng ở đây là cuộc gọi của call. e Integer overflow/underflow : Tran số hoặc tràn số thực cho một biến số nguyên có độ dài cố định. Các câu lệnh tiếp thu lỗ hổng là các hướng dẫn add, sub và mul.
Nếu lỗ hổng nằm trong một chức năng mà bất kỳ hợp đồng nào cũng có thể gọi, kẻ thù cũng có thể là bất kỳ hợp đồng nào nằm trên blockchain, không có quyền truy cập vào các chức năng đặc quyền, vi dụ như chức năng có modifer onlyOwner. Nếu lỗ hồng nằm trong một chức năng mà chỉ các hợp đồng đặc biệt có thể gọi, kẻ thù cũng là các hợp đồng đặc biệt đó nằm trên blockchain. Ví dụ, trong đoạn mã dưới, kẻ tấn công gọi hàm attack (dòng 23) trong hợp đồng Attack, điều này sẽ thực thi ham withdraw trong hợp đồng Reentrance tai dòng 24. Khi hợp đồng Reentrance thực thi hàm withdraw (dòng 3), nó sẽ sử dụng một câu lệnh gọi để gửi ether đến hợp đồng Attack (dòng 6).
Tuy nhiên, trong ngôn ngữ Solidity, khi một tài khoản bên ngoài hoặc hợp đồng khác gửi ether đến một địa chỉ hợp đồng, hàm fallback của hợp đồng được gọi sẽ được thực thi. Do đó, vào thời điểm này, hợp đồng Attack phản hồi việc chuyển tiền bằng hàm fallback của Attack (dòng 27). Hàm fallback của Attack gọi lại hàm withdraw của Reentrance để rút ether một lần nữa (dòng 29). Do đó, hợp đồng Attack sẽ tiếp tục rút tiền từ hợp đồng Reentrance cho đến khi hết gas và câu lệnh trừ số lượng token được giữ bởi hợp đồng Attack chỉ được thực thi một lần duy nhất.
11 | contract Reentrance{ 2 mapping (address=>uint) public balance; 3 function withdraw(uint _amount) { 4 if (balance[msg.sender] >= _amount) { 5 //reentrancy vulnerability 6 msg.value(_amount) (); 8 //deduct statement 9 balance[msg.sender] -= _amount; 10 } 11 } 12 function() public payable{} I§ contract Attack{ 19 Reentrance public entrance; 20 constructor(address _target) public{ 21 entrance = Reentrance(_target); 22 } 23 function attack() payable{ 24 entrance.5 ether); 25 } 26 /fanname function is the fallback function 27 function() public payable{ 28 // re-enter the Reentrance contract 29 entrance.1: Ví dụ vé lỗ hong Reentrancy 2. Tree-sitter Tree-sitter[1] là một công cụ hiện đại và có cách sử dung đa dạng để phân tích cú pháp, được thiết kế để tạo ra các cây cú pháp trừu tượng (AST)[14] một cách hiệu quả và chính xác. Tree-sitter có thể được sử dụng cho nhiều ngôn ngữ lập trình khác nhau và hỗ trợ nhiều tính năng tiên tiến. 12 Các đặc điềm chính của Tree-sitter: e Hiệu suất cao: Tree-sitter được thiết kế để phân tích cú pháp nhanh và hiệu quả, có khả năng xử lý mã nguồn lớn một cách nhanh chóng.
Nhờ sử dụng các kỹ thuật tiên tiến, Tree-sitter giảm thiểu thời gian phan tích và tối ưu hóa việc sử dụng tài nguyên hệ thống. e Khả năng cập nhật động (Incremental parsing): Tree-sitter hỗ trợ cập nhật động, cho phép tái phân tích chỉ các phần thay đổi của mã nguồn mà không cần phân tích lại toàn bộ tệp. Điều này rất hữu ích trong các ứng dụng biên tập mã nguồn và IDE, nơi mã nguồn thường xuyên được chỉnh sửa. e Da ngôn ngữ: Tree-sitter có khả năng hỗ trợ nhiều ngôn ngữ lập trình khác nhau thông qua việc sử dụng các ngữ pháp (grammars) cụ thể.
Các ngữ pháp này được định nghĩa dưới dạng các tệp JSON hoặc JavaScript, giúp dễ dang mở rộng và tùy chỉnh. e Cấu trúc cây cú pháp rõ ràng và có thể truy vấn: Cây cú pháp được tạo ra bởi Tree-sitter rất chỉ tiết và có thể được truy vấn dễ dàng. Tree-sitter cung cấp API để truy vấn và duyệt cây cú pháp, cho phép người dùng trích xuất thông tin cụ thể từ mã nguồn. e Tích hợp tốt với các công cụ và môi trường phát triển: Tree-sitter có thể tích hợp dễ dàng với các môi trường phát triển tích hợp (IDE) và các công cụ phân tích mã nguồn.
Nó được ứng dung rộng rãi trong các trình soạn thảo mã như Visual Studio Code, Atom, và nhiều dự án mã nguồn mở khác. Sử dụng Tree-sitter để phát hiện lỗ hổng bảo mật hợp đồng thông minh đóng vai trò quan trọng nhờ các khả năng sau: e Phân tích cú pháp hợp đồng thông minh: Tree-sitter có thể tạo ra AST từ mã nguồn của hợp đồng thông minh, giúp phân tích cú pháp và logic của 13 hợp đồng. Việc này giúp xác định các cấu trúc nguy hiểm và các hành vi không an toàn trong mã nguồn. e Phát hiện mẫu lỗ hồng: Sử dụng AST được tạo ra bởi Tree-sitter, các công cụ phân tích có thể tìm kiếm các mẫu mã tương ứng với các lỗ hồng bảo mật phổ biến.
Các mẫu này có thể bao gồm reentrancy, integer overflow, race conditions, và các lỗ hồng logic khác. e Tích hợp với học máy: AST từ Tree-sitter có thể được sử dụng làm đầu vào cho các mô hình học máy, giúp cải thiện khả năng phát hiện 16 hong bằng cách nhận diện các mẫu phức tạp và ngữ cảnh cụ thể. Các mô hình học máy có thể học từ dit liệu mã nguồn và phát hiện các lỗ hổng mới mà các phương pháp phân tích tĩnh truyền thống có thể bỏ sót. Cây cú phấp trừu tượng (AST) Cây cú pháp trừu tượng (Abstract Syntax Tree - AST) là một cấu trúc dữ liệu dạng cây dùng để biểu diễn cú pháp của mã nguồn trong một ngôn ngữ lập trình.
AST trừu tượng hóa mã nguồn bằng cách bỏ qua một số chi tiết không cần thiết và chỉ tập trung vào cau trúc logic của chương trình. Nó là một công cụ quan trọng trong các trình biên dịch, phân tích mã nguồn, và trong việc phát hiện 16 hổng bảo mật. Thành phần của AST e Nút (Nodes): Mỗi nút trong AST đại diện cho một cấu trúc cú phấp trong mã nguồn. Các nút này có thể là: — Nút gốc (Root node): Đại diện cho toàn bộ chương trình hoặc một tập hợp các biểu thức.
— Nút con (Child nodes): Đại diện cho các thành phần cấu trúc nhỏ hơn, như câu lệnh, biểu thức, biến, hàm,. 14 e Cạnh (Edges): Các cạnh trong cây nối các nút với nhau, biểu thị mối quan hệ giữa các thành phần cú pháp 2. Ví dụ vé AST Xem xét đoạn mã nguồn đơn giản sau: while b # 0: if a> b: ai=a-b else: b:=b-a return a Hình 2.2: Ví dụ vé một đoạn mã nguồn đơn giản AST tương ứng có thể được biểu diễn như sau: condition lcompare. op: # Mã onstant| branch value: 0 condition if-b else-body assign Hành 2.3: Câu cú pháp trừu tượng tương ứng 2.