Chuyển đến nội dung
FinGuard

Hướng dẫn bảo mật

Danh sách kiểm tra bảo mật Web3: 15 bước bảo vệ hợp đồng

Danh sách đầy đủ, có thể làm ngay — từ kiểm soát truy cập đến giám sát — để bắt lỗ hổng trước kẻ tấn công.

Danh sách kiểm tra bảo mật trước khi triển khai

Hoàn thành 15 mục này trước khi đưa bất kỳ hợp đồng thông minh nào lên mainnet.

01

Áp dụng kiểm soát truy cập theo vai trò

Dùng AccessControl hoặc Ownable2Step của OpenZeppelin thay vì kiểm địa chỉ thô. Định nghĩa vai trò riêng cho admin, operator và pauser. Không bao giờ dùng tx.origin để ủy quyền.

02

Phòng tái nhập (reentrancy)

Áp dụng mẫu checks-effects-interactions cho mọi lời gọi ngoài. Dùng ReentrancyGuard cho hàm chuyển ETH hoặc tương tác hợp đồng không tin cậy. Kiểm thử với hợp đồng callback cố ý độc hại.

03

Xác thực mọi đầu vào bên ngoài

Kiểm địa chỉ zero, giá trị tràn, mảng rỗng và tham số ngoài phạm vi ngay cửa hàm. Đừng tin caller sẽ đưa dữ liệu hợp lý — ép ràng buộc on-chain.

04

Xử lý số nguyên an toàn

Solidity 0.8+ có kiểm tràn sẵn, nhưng khối unchecked bỏ qua. Kiểm toán mọi khối unchecked về rủi ro overflow/underflow. Để ý chia cho không và mất độ chính xác trong toán fixed-point.

05

Bảo vệ phụ thuộc oracle

Dùng giá trung bình theo thời gian (TWAP) hoặc nhiều nguồn oracle để chống thao túng flash loan. Thêm kiểm độ cũ, ngưỡng phản hồi tối thiểu và logic dự phòng khi oracle lỗi.

06

Khóa và xác minh phiên bản trình biên dịch

Ghim phiên bản Solidity bằng pragma cụ thể (ví dụ 0.8.20) thay vì pragma nổi (^0.8.0). Bảo đảm mọi hợp đồng trong dự án biên dịch cùng phiên bản để tránh khác biệt hành vi tinh tế.

07

Thu hẹp bề mặt nâng cấp

Nếu dùng proxy nâng cấp được, hạn chế quyền nâng cấp bằng timelock và quản trị multisig. Ngăn va chạm layout lưu trữ. Cân nhắc có thật sự cần nâng cấp — hợp đồng bất biến dễ lập luận hơn.

08

Cơ chế dừng khẩn cấp

Thêm khả năng tạm dừng cho thao tác then chốt. Thiết kế pause sao cho không bị lạm dụng kiểm duyệt nhưng vẫn dừng được khi đang bị khai thác. Kiểm thử pause thật sự chặn mọi đường then chốt.

09

Chống front-running

Dùng commit-reveal, mempool riêng (Flashbots Protect) hoặc hạn chót cho thao tác nhạy thời gian. Giảm giá trị có thể trích từ giao dịch đang chờ.

10

Rà soát mẫu phê duyệt token

Tránh phê duyệt vô hạn khi có thể. Triển khai EIP-2612 permit cho phê duyệt không tốn gas. Kiểm điều kiện đua phê duyệt và dùng decreaseAllowance thay vì approve(0) rồi approve(newAmount).

11

Kiểm thử fork mô phỏng thực tế

Chạy kiểm thử tích hợp trên fork mainnet để bắt lỗi với số dư token, trạng thái pool và giá oracle thật. Hardhat và Foundry đều hỗ trợ kiểm thử fork — dùng để mô phỏng điều kiện triển khai thực.

12

Cân gas so với an toàn

Mã tối ưu gas có thể đưa lỗ hổng tinh tế. Đừng bỏ kiểm an toàn để tiết gas. Ghi chú mọi khối unchecked hoặc assembly kèm lý do an toàn rõ ràng.

13

Xác minh nguồn trên block explorer

Công bố và xác minh mã nguồn trên Etherscan hoặc explorer tương ứng ngay sau khi triển khai. Việc này cho phép rà soát công khai và xây dựng tin cậy. Bảo đảm nguồn đã xác minh khớp chính xác bytecode đã triển khai.

14

Thiết lập giám sát và cảnh báo

Triển khai giám sát on-chain trước khi launch, không phải sau. Theo dõi mẫu chuyển bất thường, leo thang đặc quyền, đề xuất quản trị và đổi tham số. Lớp giám sát 24/7 của FinGuard bắt khai thác đang diễn ra theo thời gian thực.

15

Thuê kiểm toán bảo mật độc lập

Rà soát nội bộ cần nhưng chưa đủ. Thuê kiểm toán viên độc lập sẽ thử khai thác hợp đồng trong sandbox. Đòi bằng chứng khai thác cho phát hiện, không chỉ danh sách rủi ro lý thuyết.

Lỗ hổng thường gặp cần để ý

Các lớp lỗ hổng này chiếm phần lớn khai thác DeFi năm 2024–2025.

Tấn công tái nhập

Lỗ hổng hợp đồng thông minh kinh điển nhất. Kẻ tấn công vào lại hàm trước khi lần gọi đầu kết thúc, rút quỹ qua lời gọi đệ quy. Vụ DAO năm 2016 mất 60 triệu USD vì mẫu này.

Thao túng oracle

Kẻ tấn công dùng flash loan để tạm thao túng nguồn giá on-chain, rồi khai thác giao thức dựa vào giá spot. Đây là vector khai thác hàng đầu trên DeFi từ 2020.

Lỗi kiểm soát truy cập

Thiếu hoặc sai kiểm quyền trên hàm đặc quyền — ai cũng gọi được thao tác admin, đổi tham số hoặc rút quỹ. Thường do phủ modifier không đủ.

Khai thác flash loan

Vay lượng lớn trong một giao dịch nguyên tử để thao túng phiếu quản trị, tỷ lệ pool hoặc cơ chế giá. Phòng thủ cần giá trị theo thời gian và xác nhận nhiều khối.

Lỗi logic quy tắc nghiệp vụ

Triển khai sai lãi cho vay, tính thưởng hoặc ngưỡng thanh lý. Các lỗi này gắn từng giao thức — vì vậy công cụ tự động một mình không đủ; lập luận người bắt được lỗi thiết kế.

Yêu cầu kiểm thử

Chuẩn kiểm thử tối thiểu trước khi đưa hợp đồng thông minh lên mainnet.

Unit test (phủ ≥ 90%)

Mọi hàm public và external nên có case dương và âm. Nhắm ít nhất 90% phủ nhánh. Dùng forge coverage của Foundry hoặc plugin coverage Hardhat để đo.

Kiểm thử tích hợp trên fork mainnet

Kiểm toàn bộ luồng triển khai trên trạng thái mainnet đã fork. Xác nhận tương tác với pool DEX, giao thức cho vay và oracle đúng như kỳ vọng với dữ liệu on-chain thật.

Fuzz testing với bất biến thuộc tính

Định nghĩa bất biến (ví dụ tổng cung không vượt trần, số dư người dùng không âm) rồi để fuzzer sinh hàng nghìn đầu vào ngẫu nhiên. Foundry và Echidna là công cụ hàng đầu.

Xác minh hình thức cho đường then chốt

Với hợp đồng giá trị cao quản lý TVL lớn, dùng công cụ xác minh hình thức (Certora, Solidity SMTChecker) để chứng minh toán học rằng thuộc tính then chốt giữ với mọi đầu vào khả dĩ.

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

Hoàn thành danh sách này mất bao lâu?

Dự án có cấu trúc tốt và đã có độ phủ kiểm thử: khoảng 2–5 ngày để làm hệ thống qua 15 mục. Dự án làm từ đầu: dành 1–2 tuần cho kiểm soát truy cập đúng, hạ tầng kiểm thử và thiết lập giám sát.

Công cụ tự động có thay rà soát bảo mật thủ công không?

Công cụ tự động (phân tích tĩnh, fuzzer, xác minh hình thức) bắt mẫu lỗ hổng đã biết hiệu quả nhưng bỏ sót lỗi logic nghiệp vụ, vấn đề thiết kế kinh tế và vector tấn công mới. Cách tốt nhất kết hợp công cụ cho phủ rộng với rà soát chuyên gia cho độ sâu — đúng như quy trình 7 lớp của FinGuard.

Mục nào trên danh sách quan trọng nhất?

Nếu chỉ làm được một việc, hãy thuê kiểm toán bảo mật độc lập (mục 15). Kiểm toán viên giàu kinh nghiệm sẽ bắt hầu hết mục còn lại khi rà soát. Nhưng chỉ dựa vào kiểm toán mà bỏ các mục kia nghĩa là bạn tự tạo việc và rủi ro thừa.

Làm danh sách này trước hay sau kiểm toán?

Trước. Hoàn thành danh sách nghĩa là kiểm toán viên dành thời gian tìm vấn đề sâu, không lộ rõ, thay vì gắn cờ lỗi vệ sinh cơ bản. Bạn nhận được nhiều giá trị hơn cho mỗi đồng chi cho kiểm toán. Giống dọn nhà trước khi thanh tra tới.

Sẵn sàng cho kiểm toán chuyên nghiệp?

Hoàn thành danh sách, rồi để công cụ AI 7 lớp của FinGuard xác minh bằng khai thác sandbox thật.