Giới thiệu dự án

Hệ sinh thái tài chính phi tập trung (Decentralized Finance - DeFi) và ứng dụng phi tập trung (dApps) trên nền tảng Blockchain Ethereum đang quản lý hàng chục tỷ USD giá trị tài sản khóa (Total Value Locked - TVL). Tuy nhiên, tính chất bất biến (immutability) của hợp đồng thông minh (Smart Contract) biến các lỗ hổng mã nguồn thành mục tiêu tấn công nghiêm trọng. Theo các báo cáo an ninh mạng blockchain, thiệt hại do khai thác lỗ hổng hợp đồng thông minh lên tới hàng tỷ USD mỗi năm, điển hình từ các lỗi kinh điển như Reentrancy (tấn công tái nhập) hay Suicidal Contract (lỗ hổng hàm tự hủy không kiểm soát).

Vấn đề cốt lõi (Problem Statement) nằm ở chỗ các công cụ kiểm thử tự động hiện tại (fuzzing ngẫu nhiên hoặc symbolic execution đơn thuần) gặp khó khăn lớn khi phải xác định chính xác thứ tự thực thi của các lời gọi hàm (transaction sequence). Một hợp đồng thông minh chứa nhiều hàm phụ thuộc trạng thái; việc chọn sai thứ tự hoặc tham số sẽ dẫn đến ngoại lệ revert, dừng chuỗi giao dịch và thất bại trong việc phát hiện lỗi.

Đồ án khóa luận tốt nghiệp kỹ sư An toàn Thông tin của tác giả Nguyễn Phạm Lâm Duy (MSSV: 19521429), dưới sự hướng dẫn của ThS. Nguyễn DuyThS. Trần Tuấn Dũng, đã nghiên cứu và phát triển công cụ RLSCexploit. Đây là giải pháp ứng dụng học tăng cường (Reinforcement Learning - RL) nhằm tự động sinh chuỗi giao dịch khai thác lỗ hổng bảo mật trên Smart Contract một cách có chọn lọc và tối ưu.

Mục tiêu nghiên cứu cụ thể

  1. Xây dựng môi trường mô phỏng tương tác hợp đồng thông minh hỗ trợ trích xuất trạng thái thực thi EVM (Ethereum Virtual Machine) và đo đạc độ bao phủ mã nguồn (code coverage).
  2. Thiết kế không gian vector đặc trưng kết hợp xử lý ngôn ngữ tự nhiên (Word2Vec) trên Abstract Syntax Tree (AST) và tần suất Opcode để biểu diễn trạng thái hợp đồng (340 chiều).
  3. Triển khai và tối ưu hóa thuật toán học tăng cường Proximal Policy Optimization (PPO)Policy Gradient để huấn luyện tác tử (Agent) lựa chọn chuỗi giao dịch khai thác mục tiêu.
  4. Đánh giá thực nghiệm khả năng phát hiện hai nhóm lỗ hổng nguy hiểm hàng đầu: ReentrancySuicidal Contract, so sánh hiệu năng trực tiếp với các công cụ học thuật tiêu biểu như ContraMaster và Exgen.

Phạm vi và giới hạn

  • Phạm vi: Tập trung vào các hợp đồng thông minh viết bằng ngôn ngữ Solidity (phiên bản ^0.4.x đến ^0.8.x) trên mạng Ethereum.
  • Giới hạn: Nghiên cứu tập trung vào việc tự động sinh chuỗi giao dịch xác minh tính khả thi của lỗ hổng (Defensive Verification) nhằm phục vụ kiểm thử bảo mật trước khi triển khai (pre-deployment audit), không mở rộng ra toàn bộ các biến thể logic nghiệp vụ đa chuỗi (cross-chain).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Các phương pháp phân tích bảo mật Smart Contract hiện nay phân hóa thành ba trường phái chính:

Phương pháp Công cụ tiêu biểu Ưu điểm Nhược điểm
Fuzzing & Symbolic Execution Echidna, ContractFuzzer, Manticore Khám phá nhánh thực thi tốt, phát hiện vi phạm bất biến nhanh Bùng nổ không gian trạng thái (path explosion), sinh chuỗi giao dịch ngẫu nhiên thiếu định hướng
Khai thác tự động động Exgen, ContraMaster Kết hợp giải ràng buộc (constraint solving) và đồ thị tương tác Tỷ lệ sinh chuỗi gọi hàm hợp lệ thấp khi hợp đồng có cấu trúc phụ thuộc phức tạp
Học tăng cường định hướng (Đề xuất) RLSCexploit Học chính sách tối ưu qua phản hồi phần thưởng; chọn hàm thông minh dựa trên ngữ cảnh 340D Cần thời gian huấn luyện ban đầu cho môi trường mô phỏng

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must have: Mô-đun phân tích cú pháp AST; bộ vector hóa trạng thái hàm và hợp đồng; thuật toán PPO/Policy Gradient; bộ xác thực giao dịch qua máy ảo EVM.
  • Should have: Phân loại nhóm hành động tự động (Nạp tiền, Rút tiền, Tự hủy, Cập nhật trạng thái - Setter); bộ sinh hợp đồng tấn công (Attack Contract generator).
  • Could have: Tích hợp mô hình FastText bổ trợ cho Word2Vec trong việc xử lý tên hàm đa nghĩa.
  • Won't have: Hỗ trợ hợp đồng viết bằng ngôn ngữ Vyper hoặc Rust/Wasm trong giai đoạn hiện tại.

Thiết kế hệ thống

Kiến trúc của RLSCexploit bao gồm 4 thành phần tương tác chặt chẽ theo chu trình Markov Decision Process (MDP):

Không gian trạng thái (State Space - 340 chiều)

Không gian trạng thái $S$ được cố định thành vector 340 chiều, cấu thành từ:

  1. Đặc trưng hàm (331 chiều):
    • Tên hàm (Name - 300 chiều): Nhúng vector thông qua mô hình Word2Vec đã huấn luyện tiền kỳ để nắm bắt ngữ nghĩa hàm (ví dụ: withdraw, transfer, drain, deposit).
    • Tần suất Opcode (25 chiều): Tần suất xuất hiện của 25 opcode EVM phổ biến nhất trong hàm.
    • Thuộc tính thực thi (6 chiều): Số lượng tham số đầu vào (Argument), tần suất gọi (Call), cờ ngoại lệ (Revert, Return, Assert), và độ bao phủ mức khối lệnh (Block-level Coverage).
  2. Đặc trưng hợp đồng (9 chiều): Đếm tần suất các Opcode trọng yếu gồm SHA3, CALL, CREATE, SELFDESTRUCT, JUMP, JUMPI, SLOAD, SSTORE kết hợp cùng độ bao phủ toàn hợp đồng (Contract Coverage).

Không gian hành động (Action Space - 4 nhóm)

Không gian hành động $A$ phân loại các hàm trên hợp đồng thông qua bộ lọc AST:

  • Nhóm nạp tiền (Deposit): Nhận diện qua chỉ thị msg.value, hàm payable.
  • Nhóm rút tiền (Withdraw): Nhận diện qua các lời gọi chuyển số dư như msg.sender.call.value, transfer(), send().
  • Nhóm tự hủy (Selfdestruct): Nhận diện qua opcode hoặc hàm selfdestruct().
  • Nhóm gán giá trị (Setter): Nhận diện qua các lệnh ghi biến trạng thái (SSTORE), thay đổi quyền sở hữu (owner).
// Trích đoạn nhận diện nhóm nạp và rút tiền từ AST
contract TargetContract {
    mapping(address => uint256) public balances;
    
    // Nhóm 1: Nạp tiền (Deposit Action)
    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }
    
    // Nhóm 2: Rút tiền (Withdraw Action - Nguy cơ Reentrancy)
    function withdraw(uint256 _amount) public {
        require(balances[msg.sender] >= _amount);
        (bool success, ) = msg.sender.call.value(_amount)("");
        require(success);
        balances[msg.sender] -= _amount;
    }
}

Thiết kế hàm phần thưởng (Reward Design)

Hàm phần thưởng $R_t$ được cấu trúc nhằm dẫn đường cho tác tử vừa tối đa hóa độ phủ mã nguồn, vừa kích hoạt thành công trạng thái mất an toàn:

$$R_t = w_1 \cdot \Delta \text{Coverage} + w_2 \cdot R_{\text{valid_call}} + w_3 \cdot R_{\text{exploit}}$$

Trong đó:

  • $\Delta \text{Coverage}$: Mức độ tăng thêm về độ bao phủ khối lệnh.
  • $R_{\text{valid_call}}$: Phần thưởng dương nhỏ khi lời gọi hàm không bị revert.
  • $R_{\text{exploit}}$: Phần thưởng đột biến (giá trị rất lớn) khi số dư hợp đồng mục tiêu bị rút cạn trái phép (đối với Reentrancy) hoặc trạng thái hợp đồng chuyển sang is_destroyed (đối với Suicidal).

Implementation và kết quả

Development process & Core Algorithms

Dự án triển khai mô hình học tăng cường chính sách tối ưu Proximal Policy Optimization (PPO) với hàm mất mát Clip Surrogate Objective nhằm đảm bảo tính ổn định trong quá trình cập nhật tham số mạng neural:

$$L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min\left( r_t(\theta)\hat{A}_t, , \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t \right) \right]$$

Với $r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$ là tỷ số xác suất giữa chính sách mới và chính sách cũ, $\hat{A}_t$ là hàm ước lượng ưu thế (Advantage function) thu được từ mạng Critic, và ngưỡng $\epsilon = 0.2$.

import torch
import torch.nn as nn
import torch.optim as optim

class ActorCritic(nn.Module):
    def __init__(self, state_dim=340, action_dim=4):
        super(ActorCritic, self).__init__()
        # Mạng chia sẻ đặc trưng trạng thái
        self.feature_extractor = nn.Sequential(
            nn.Linear(state_dim, 256),
            nn.ReLU(),
            nn.Linear(256, 128),
            nn.ReLU()
        )
        # Nhánh Actor: Phân phối xác suất chọn nhóm hành động
        self.actor = nn.Sequential(
            nn.Linear(128, action_dim),
            nn.Softmax(dim=-1)
        )
        # Nhánh Critic: Ước tính giá trị trạng thái V(s)
        self.critic = nn.Linear(128, 1)

    def forward(self, state):
        feat = self.feature_extractor(state)
        action_probs = self.actor(feat)
        state_value = self.critic(feat)
        return action_probs, state_value
This request was blocked by Gemini's filters. They can occasionally trigger by mistake on safe coding, security, or biology-related queries. Please try rephrasing your prompt. You can [send feedback](https://ai.google.dev/gemini-api/docs/troubleshooting#file-bug) or read more about [our policies here](https://policies.google.com/terms/generative-ai/use-policy).