Bối cảnh và vấn đề nghiên cứu

Với sự phát triển mạnh mẽ của công nghệ blockchain và các ứng dụng tài chính phi tập trung (DeFi), hợp đồng thông minh (smart contract) ngày càng đóng vai trò trung tâm trong việc tự động hóa các giao dịch và thỏa thuận số. Đặc thù của hợp đồng thông minh là không thể sửa đổi sau khi đã được triển khai lên mạng blockchain, do đó bất kỳ lỗ hổng bảo mật nào tiềm ẩn trong mã nguồn đều có thể bị kẻ tấn công khai thác, gây mất mát tài sản số hoặc dẫn đến các hậu quả pháp lý nghiêm trọng. Tác giả xác định rằng các phương pháp phát hiện lỗ hổng truyền thống — chủ yếu dựa trên kỹ thuật thống kê hoặc so sánh ký tự — tỏ ra kém hiệu quả khi mã nguồn được mã hóa hoặc biến đổi. Trong bối cảnh đó, việc ứng dụng học máy và biểu diễn đồ thị để tự động phát hiện lỗ hổng là hướng tiếp cận được cộng đồng nghiên cứu ngày càng quan tâm.

Mục tiêu nghiên cứu: Nghiên cứu và xây dựng phương pháp phát hiện lỗ hổng bảo mật trong mã nguồn hợp đồng thông minh sử dụng cách tiếp cận học máy và biểu diễn đồ thị.

Đối tượng nghiên cứu bao gồm: (1) các thành phần cấu tạo nên hợp đồng thông minh; (2) cách triển khai hợp đồng trên Private chain; (3) tiếp cận học máy; (4) các loại lỗ hổng phổ biến như reentrancy, integer overflow/underflow, denial-of-service (DoS); (5) các mô hình đồ thị và học máy liên quan như GraphSAGE, GCN, CNN, GNN.

Phạm vi nghiên cứu: Khóa luận giới hạn phạm vi ở hợp đồng thông minh được viết bằng ngôn ngữ Solidity và triển khai trên mạng Ethereum, với lý do Solidity là ngôn ngữ phổ biến nhất cho nền tảng này, có cộng đồng lớn, tài liệu phong phú và nguồn dữ liệu đa dạng. Phạm vi kỹ thuật gồm việc trích xuất các thuộc tính và hàm của hợp đồng, xây dựng mô hình phát hiện lỗ hổng và đánh giá khả năng phát hiện của phương pháp đề xuất.


Cơ sở lý thuyết và phương pháp

Khung lý thuyết và mô hình sử dụng

Khóa luận xây dựng nền tảng lý thuyết từ hai nhóm tri thức chính:

Nhóm biểu diễn mã nguồn:

  • Cây cú pháp trừu tượng (Abstract Syntax Tree — AST): Được tạo ra bằng thư viện Tree-sitter, AST chuyển đổi mã nguồn Solidity qua bốn bước — chia token, xây dựng cây cú pháp, tạo AST, gắn thông tin vị trí — nhằm biểu diễn cú pháp và cấu trúc logic của hợp đồng.
  • Đồ thị dòng dữ liệu (Data Flow Graph — DFG): Biểu diễn mối quan hệ phụ thuộc giữa các biến chương trình thông qua các cạnh có hướng.
  • Đồ thị dòng dữ liệu quan trọng (Crucial Data Flow Graph — CDFG): Dạng rút gọn của DFG, tập trung vào các nút và cạnh liên quan đến thông tin nhạy cảm như call.value, phục vụ phát hiện lỗ hổng tái nhập (reentrancy).

Nhóm mô hình học máy và học sâu:

  • GraphCodeBERT: Mô hình ngôn ngữ mã nguồn xây dựng trên kiến trúc Transformer, cụ thể là BERT (Bidirectional Encoder Representations from Transformers). GraphCodeBERT kết hợp thông tin ngữ nghĩa từ văn bản mã nguồn với thông tin cấu trúc từ đồ thị dữ liệu.
  • Graph Convolutional Network (GCN): Mạng tích chập đồ thị xử lý dữ liệu ở dạng đồ thị có hướng, học đặc trưng thông qua các lớp tích chập trên đồ thị (GraphConvolutionLayer).
  • Ensemble Learning (kết hợp mô hình): Phương pháp trung bình hóa (averaging) kết quả đầu ra của hai mô hình GraphCodeBERT và GCN để đưa ra phán đoán cuối cùng về lỗ hổng.

Các kiến trúc mạng nơ-ron bổ trợ được trình bày trong cơ sở lý thuyết gồm: CNN, RNN, LSTM, GRU, GAN, Siamese Neural Network. Các hàm kích hoạt được đề cập: Sigmoid, Tanh, ReLU, Leaky ReLU, Softmax. Các hàm tính khoảng cách: khoảng cách Euclidean, Manhattan (L1 norm), Cosine.

Phương pháp nghiên cứu

Khóa luận sử dụng phương pháp thiết kế và thực nghiệm hệ thống, gồm các bước: tiền xử lý dữ liệu, xây dựng và huấn luyện mô hình, đánh giá và so sánh hiệu quả. Đây là nghiên cứu ứng dụng kỹ thuật học sâu (deep learning) vào bài toán phân loại nhị phân (hợp đồng có/không có lỗ hổng).

Nguồn dữ liệu

Tác giả sử dụng tập dữ liệu hợp đồng thông minh viết bằng Solidity, được biên dịch và lưu dưới dạng tệp JSONL. Khóa luận không công bố tên cụ thể của tập dữ liệu công khai được sử dụng, nhưng mô tả rõ quy trình xử lý dữ liệu riêng biệt cho từng mô hình.


Nội dung chính theo từng chương

Chương 1: Tổng quan đề tài

Chương này đặt vấn đề nghiên cứu, phân tích bối cảnh và điểm qua các nghiên cứu liên quan. Tác giả điểm lại ba hướng tiếp cận đã có:

Nhóm nghiên cứu Phương pháp Năm
Yuan Zhuang và cộng sự Graph Neural Networks (GNNs) + Temporal Message Propagation Network (TMP) để học đồ thị hợp đồng ~2021
Lejun Zhang và cộng sự Đồ thị thông tin (information graph) + kết hợp CNN, RNN, Transformer và 4 mô hình khác (7 loại tổng cộng) Không ghi năm
Lei Zhang và cộng sự AST + Control Flow Graph (CFG) để hợp nhất đặc điểm cú pháp và ngữ nghĩa 2023

Bốn thách thức chính được chỉ ra: (1) sự đa dạng ngôn ngữ viết hợp đồng (Solidity, Vyper...); (2) khả năng hợp đồng bị sửa đổi sau khi triển khai; (3) độ phức tạp của môi trường blockchain phân tán; (4) phạm vi kiểm thử hạn chế do tính phức tạp của hợp đồng.

Chương 2: Cơ sở lý thuyết và thành phần liên quan

Chương này trình bày nền tảng lý thuyết toàn diện gồm bốn nhóm: (1) các thành phần hợp đồng thông minh (ngôn ngữ Solidity, môi trường Ethereum, mã nguồn, giao thức thực thi, giao dịch/sự kiện); (2) các lỗ hổng phổ biến; (3) cấu trúc biểu diễn mã nguồn; (4) kiến trúc mạng nơ-ron.

Trong phần lỗ hổng phổ biến, tác giả mô tả chi tiết bốn loại: Suicidal (khai thác lệnh selfdestruct), Call injection (khai thác lệnh call, callcode, delegatecall), Reentrancy (tấn công tái nhập qua call.value, minh họa bằng ví dụ mã Solidity cụ thể với hợp đồng Reentrance và Attack), và Integer overflow/underflow (các lệnh add, sub, mul).

Đối với biểu diễn đồ thị, chương phân biệt rõ DFG và CDFG: DFG biểu diễn toàn bộ mối quan hệ dữ liệu, trong khi CDFG chỉ giữ lại các nút và cạnh quan trọng có thể gây ra lỗ hổng. Bảng 3.1 (đặt trong Chương 3) tổng kết bốn loại cạnh ngữ nghĩa trong đồ thị: luồng điều khiển, luồng dữ liệu, chuyển tiếp và dự phòng.

Chương 3: Tổng quan về mô hình

Chương này mô tả kiến trúc tổng thể và quy trình ba bước của hệ thống đề xuất:

Bước 1 — Tiền xử lý dữ liệu:

Đối với GraphCodeBERT: Mã nguồn → phân tích thành AST bằng Tree-sitter → trích xuất chuỗi biến → xây dựng DFG → rút gọn thành CDFG theo thông tin quan trọng (call.value). Thư viện Tree-sitter tạo AST qua bốn bước: chia token → xây dựng cây cú pháp → tạo AST → gắn thông tin vị trí.

Đối với GCN: Mã nguồn được chuyển đổi thành đồ thị có hướng (directed graph) dạng vector, thông qua các bước: xác định cạnh đặc trưng → xác định nút đặc trưng → chuẩn hóa đồ thị thành dạng vector. Công cụ Graph2vec được sử dụng trong nhánh này.

Bước 2 — Huấn luyện mô hình:

GraphCodeBERT: Kiến trúc gồm lớp RobertaClassificationHead cho phân loại và lớp Model tổng thể. Mô hình được huấn luyện với các thông số cấu hình (config) và theo dõi training loss và F1 score theo từng epoch/steps.

GCN: Kiến trúc gồm lớp GraphConvolutionLayer (thực hiện phép tích chập trên đồ thị) và lớp GCN (xử lý toàn bộ đồ thị). Hàm huấn luyện riêng biệt được xây dựng cho mô hình này.

Bước 3 — Kết hợp và đánh giá: Kết quả từ hai mô hình được kết hợp bằng Ensemble Learning (averaging) để đưa ra phán đoán cuối cùng.

Chương 4: Thí nghiệm và đánh giá

Chương trình bày môi trường cài đặt, quy trình xử lý dữ liệu cụ thể và kết quả thực nghiệm. Nội dung được tổ chức theo từng mô hình: xử lý dữ liệu cho GraphCodeBERT (bao gồm xóa comment, tạo tệp JSONL, biên dịch thành DFG, xác định nút quan trọng, loại bỏ điểm độc lập, rút gọn DFG thành CDFG), xử lý dữ liệu cho GCN (trích xuất cạnh đặc trưng, cạnh nút đặc trưng, chuẩn hóa đồ thị thành vector), huấn luyện từng mô hình, và cuối cùng phân loại và đánh giá hợp đồng tổng hợp. Chương cũng hiển thị biểu đồ training loss và F1 score của GraphCodeBERT theo epoch và steps.

Chương 5: Kết luận

Chương tổng kết kết quả đạt được và đề xuất hướng cải thiện, phát triển trong tương lai.


Thiết kế và triển khai

Kiến trúc hệ thống

Hệ thống được thiết kế theo kiến trúc hai nhánh song song hội tụ:

  • Nhánh 1 (GraphCodeBERT): Mã nguồn Solidity → Tree-sitter (AST) → DFG → CDFG → GraphCodeBERT (Transformer-based) → xác suất phân loại
  • Nhánh 2 (GCN): Mã nguồn Solidity → đồ thị có hướng → Graph2vec (vector hóa) → GCN → xác suất phân loại
  • Tổng hợp: Ensemble Learning (averaging) → kết quả cuối (có/không có lỗ hổng)

Công nghệ sử dụng

Thành phần Công nghệ/Thư viện
Phân tích cú pháp Tree-sitter
Ngôn ngữ hợp đồng Solidity (Ethereum)
Mô hình ngôn ngữ GraphCodeBERT (BERT/Transformer)
Mạng đồ thị GCN (Graph Convolutional Network)
Vector hóa đồ thị Graph2vec
Kết hợp mô hình Ensemble Learning (averaging)
Định dạng dữ liệu JSONL

Quy trình tiền xử lý

Đối với GraphCodeBERT, quy trình tiền xử lý gồm: (1) xóa comment không cần thiết; (2) tạo tệp JSONL chứa dữ liệu các hợp đồng; (3) biên dịch hợp đồng thành DFG; (4) xác định các nút quan trọng; (5) loại bỏ điểm độc lập không phụ thuộc vào nút quan trọng; (6) rút gọn DFG thành CDFG.

Đối với GCN, quy trình tiền xử lý gồm: (1) trích xuất cạnh đặc trưng; (2) trích xuất nút đặc trưng; (3) chuẩn hóa đồ thị biểu diễn thành dạng vector.

Các lớp mô hình chính

  • RobertaClassificationHead: Lớp đầu ra phân loại của GraphCodeBERT, xử lý các tác vụ phân loại câu
  • Model: Kiến trúc tổng thể của mô hình GraphCodeBERT
  • GraphConvolutionLayer: Lõi của GCN, thực hiện phép tích chập trên đồ thị
  • GCN: Mô hình mạng nơ-ron xử lý dữ liệu dạng đồ thị

Đánh giá mô hình

Khóa luận sử dụng bộ chỉ số đánh giá chuẩn cho bài toán phân loại nhị phân, bao gồm: True Positive (TP), True Negative (TN), False Positive (FP), False Negative (FN), cùng các độ đo accuracy, precision, recall và F1-score. Kết quả được trực quan hóa qua biểu đồ training loss và F1 score theo từng epoch và steps trong quá trình huấn luyện GraphCodeBERT. Bảng 4.1 trong văn bản tổng kết các chỉ số đánh giá của mô hình.


Kết quả và đóng góp

Kết quả chính

Tác giả đề xuất và hiện thực hóa hệ thống phát hiện lỗ hổng bảo mật hợp đồng thông minh kết hợp hai mô hình: GraphCodeBERT và GCN, tổng hợp qua Ensemble Learning. Kết quả thực nghiệm được đánh giá và trực quan hóa qua biểu đồ training loss theo epoch và F1 score theo steps. Văn bản không công bố giá trị số cụ thể của các chỉ số cuối cùng (accuracy, F1, precision, recall) trong phần tóm tắt có thể trích dẫn trực tiếp.

Giải pháp và kiến nghị kỹ thuật

Hệ thống đề xuất có khả năng phân loại hợp đồng thông minh thành hai nhóm: có lỗ hổng hoặc không có lỗ hổng. Quy trình CDFG được thiết kế để tập trung học vào các vùng mã nhạy cảm, giúp mô hình tránh nhiễu từ các phần mã không liên quan đến bảo mật. Việc kết hợp Ensemble Learning được đề xuất như giải pháp tận dụng sức mạnh của cả hai nhánh mô hình nhằm đạt độ chính xác cao hơn so với chạy từng mô hình riêng lẻ.

Đóng góp so với nghiên cứu trước

So với các nghiên cứu được điểm luận, đóng góp đặc trưng của khóa luận là:

  • Kết hợp GraphCodeBERT và GCN trong một pipeline thống nhất cho bài toán phát hiện lỗ hổng hợp đồng thông minh — hướng tiếp cận mà các nghiên cứu trước (Yuan Zhuang, Lejun Zhang, Lei Zhang) chưa áp dụng theo cấu hình này.
  • Xây dựng quy trình CDFG từ DFG để lọc thông tin đồ thị, tập trung vào dữ liệu quan trọng liên quan trực tiếp đến lỗ hổng bảo mật, thay vì sử dụng toàn bộ đồ thị dữ liệu có thể gây nhiễu.
  • Ứng dụng Tree-sitter như công cụ phân tích cú pháp để tạo AST, tích hợp vào pipeline học sâu cho hợp đồng Solidity.

Hạn chế và hướng nghiên cứu tiếp

Chương 5 đề cập đến hướng cải thiện và phát triển, nhưng không liệt kê các hạn chế cụ thể theo từng mục riêng. Dựa trên phạm vi nghiên cứu được nêu trong văn bản, có thể xác định một số giới hạn thực tế:

  • Phạm vi chỉ bao phủ hợp đồng viết bằng Solidity trên Ethereum, chưa mở rộng sang các ngôn ngữ hợp đồng khác (Vyper, Serpent) hoặc các nền tảng blockchain khác (NEO, EOS).
  • Bài toán phân loại được thiết kế ở mức nhị phân (có/không có lỗ hổng), chưa phân loại chi tiết từng loại lỗ hổng cụ thể trong cùng một luồng.
  • Tác giả ghi nhận hướng phát triển tiếp theo tập trung vào cải thiện mô hình, mở rộng khả năng phát hiện và nâng cao hiệu suất hệ thống — chi tiết cụ thể không được liệt kê trong phần văn bản cung cấp.

Giá trị tham khảo

Khóa luận phù hợp để tham khảo cho các đối tượng sau:

  • Sinh viên ngành An toàn thông tin và Khoa học máy tính đang tìm hiểu ứng dụng học sâu và mạng nơ-ron đồ thị (GNN, GCN) vào bài toán phân tích mã nguồn. Phần cơ sở lý thuyết Chương 2 cung cấp tổng quan có hệ thống về AST, DFG, CDFG và các kiến trúc mạng nơ-ron phổ biến.
  • Sinh viên, nghiên cứu sinh làm đề tài về blockchain và DeFi có thể tham khảo phần phân loại lỗ hổng hợp đồng thông minh (Suicidal, Call injection, Reentrancy, Integer overflow/underflow) cùng ví dụ mã Solidity minh họa.
  • Người thực hành an ninh phần mềm quan tâm đến quy trình xây dựng pipeline phát hiện lỗ hổng tự động, đặc biệt là quy trình tạo CDFG từ mã nguồn và tích hợp với mô hình học sâu.
  • Nhà nghiên cứu quan tâm đến NLP cho mã nguồn có thể tham khảo cách triển khai GraphCodeBERT trong bối cảnh phân tích hợp đồng thông minh, khác với các ứng dụng NLP ngôn ngữ tự nhiên thông thường.

Phần đáng tham khảo nhất là Chương 3 (quy trình tiền xử lý dữ liệu và kiến trúc mô hình tổng quan) và Chương 4 (các đoạn mã minh họa cụ thể cho từng bước xử lý).


Câu hỏi thường gặp

1. Tại sao khóa luận chọn Solidity và Ethereum thay vì các ngôn ngữ/nền tảng blockchain khác? Tác giả nêu ba lý do: Solidity là ngôn ngữ hợp đồng thông minh phổ biến nhất trên Ethereum với cộng đồng lớn và nhiều tài liệu hỗ trợ; sự phổ biến của Solidity tạo ra nguồn dữ liệu phong phú cho việc thu thập và phân tích; Ethereum có hiệu suất và tính mở rộng tương đối tốt, phù hợp với các ứng dụng thực tế quy mô lớn.

2. CDFG khác DFG ở điểm nào và tại sao khóa luận ưu tiên sử dụng CDFG? DFG biểu diễn toàn bộ mối quan hệ phụ thuộc dữ liệu giữa các biến trong chương trình. CDFG là dạng rút gọn của DFG, chỉ giữ lại các nút và cạnh liên quan đến thông tin nhạy cảm (ví dụ: call.value trong lỗ hổng reentrancy). Tác giả nhận định rằng thông tin đồ thị quan trọng giúp mô hình tập trung vào các lỗ hổng bảo mật chính xác hơn, trong khi cấu trúc thông tin quá phức tạp không thúc đẩy quá trình học mô hình.

3. Vai trò của Ensemble Learning trong hệ thống là gì và phương pháp kết hợp cụ thể được sử dụng là gì? Ensemble Learning được sử dụng để kết hợp kết quả đầu ra từ hai mô hình GraphCodeBERT và GCN. Phương pháp kết hợp cụ thể là averaging (trung bình hóa), tức là lấy trung bình xác suất đầu ra của hai mô hình để đưa ra phán đoán cuối cùng về việc hợp đồng có chứa lỗ hổng hay không. Tác giả lập luận rằng cách này tận dụng được thế mạnh của cả hai nhánh mô hình.

4. Tree-sitter được sử dụng như thế nào trong pipeline của khóa luận và tại sao lại chọn công cụ này? Tree-sitter được dùng làm công cụ biên dịch tiêu chuẩn để phân tích mã nguồn Solidity thành AST. Quy trình gồm bốn bước: chia mã nguồn thành token, xây dựng cây cú pháp từ token, tạo AST với các nút và cạnh, gắn thông tin vị trí cho từng nút. AST này sau đó được dùng để xác định chuỗi biến và trích xuất DFG. Tree-sitter được chọn nhờ các đặc điểm: hiệu suất cao, hỗ trợ cập nhật động (incremental parsing), đa ngôn ngữ, cấu trúc cây có thể truy vấn và tích hợp tốt với IDE.

5. Những loại lỗ hổng nào trong hợp đồng thông minh được khóa luận nghiên cứu và cơ chế tấn công của Reentrancy là gì? Khóa luận xác định bốn loại lỗ hổng chính: Suicidal (khai thác lệnh selfdestruct), Call injection (khai thác call, callcode, delegatecall), Reentrancy (tấn công tái nhập), và Integer overflow/underflow (tràn số qua lệnh add, sub, mul). Cụ thể với Reentrancy, tác giả minh họa qua hai hợp đồng Reentrance và Attack: kẻ tấn công gọi hàm attack() → kích hoạt withdraw() trong Reentrance → hợp đồng gửi ether về Attack → fallback function của Attack gọi lại withdraw() trước khi lệnh trừ số dư được thực thi → lặp lại cho đến khi hết gas, khiến câu lệnh trừ token chỉ thực thi một lần duy nhất.


Kết luận

Khóa luận của Trần Xuân Nam (MSSV 20521637, Trường Đại học Công Nghệ Thông Tin — ĐHQG TP.HCM, 2024) đề xuất và hiện thực hóa một hệ thống phát hiện lỗ hổng bảo mật hợp đồng thông minh kết hợp hai mô hình học sâu — GraphCodeBERT và GCN — thông qua cơ chế Ensemble Learning. Điểm kỹ thuật nổi bật là quy trình chuyển đổi mã nguồn Solidity thành CDFG nhằm lọc thông tin đồ thị quan trọng trước khi đưa vào huấn luyện, giúp mô hình tập trung vào các vùng mã có nguy cơ bảo mật cao. Khóa luận cũng xây dựng nền tảng lý thuyết có hệ thống về AST, DFG, CDFG, các kiến trúc mạng nơ-ron đồ thị và các loại lỗ hổng phổ biến trong hợp đồng thông minh, phục vụ tốt cho người đọc mới tiếp cận lĩnh vực này. Phạm vi nghiên cứu giới hạn ở Solidity/Ethereum và bài toán phân loại nhị phân, để ngỏ hướng mở rộng sang phân loại đa loại lỗ hổng và các nền tảng blockchain khác.