Trong Web3, khái niệm “niềm tin” không còn đặt vào con người hay tổ chức trung gian, mà được chuyển giao gần như tuyệt đối cho mã nguồn. Smart contract – những chương trình tự động chạy trên blockchain – không chỉ đảm nhiệm vai trò thực thi giao dịch, mà còn thay thế luật lệ, quy trình và cả cơ chế bảo vệ tài sản. Khi code trở thành luật, mọi sai sót dù nhỏ nhất cũng có thể dẫn đến những tổn thất không thể đảo ngược.


Về bản chất, smart contract là các đoạn mã được triển khai lên blockchain và tự động thực thi khi thỏa mãn những điều kiện đã được lập trình sẵn. Người dùng không cần biết phía sau là ai vận hành, không cần xin phép và cũng không thể can thiệp thủ công. Khi một giao dịch được gửi đi, mạng lưới blockchain sẽ xác minh, thực thi logic trong smart contract và ghi kết quả vĩnh viễn lên sổ cái phân tán. Không có khái niệm “xử lý ngoại lệ”, không có bộ phận hỗ trợ khách hàng, và cũng không tồn tại nút hoàn tác nếu có sai sót xảy ra.
Chính đặc điểm bất biến này khiến smart contract trở thành con dao hai lưỡi. Trong thế giới Web2, phần mềm nếu phát sinh lỗi có thể được vá, cập nhật hoặc rollback trên máy chủ tập trung. Ngược lại, một khi smart contract đã được triển khai, việc chỉnh sửa gần như là bất khả thi. Dù một số dự án áp dụng các mô hình nâng cấp thông qua proxy, cách tiếp cận này lại mở ra những rủi ro mới, đòi hỏi thiết kế phức tạp và dễ tạo thêm lỗ hổng nếu đội ngũ thiếu kinh nghiệm. Trên thực tế, phần lớn các vụ mất tiền trong DeFi đều xuất phát từ những hợp đồng không thể sửa chữa sau khi lỗi đã bị khai thác.
Vấn đề nằm ở chỗ, smart contract không chỉ xử lý logic, mà còn trực tiếp nắm giữ tài sản thật. Khi người dùng gửi tiền vào contract, số tài sản đó nằm hoàn toàn dưới quyền kiểm soát của code. Không có ngân hàng đứng sau, không có cơ chế phong tỏa hay hoàn trả khi xảy ra sự cố. Điều này lý giải vì sao chỉ một lỗi nhỏ trong mã nguồn cũng có thể dẫn đến thiệt hại lên tới hàng triệu, thậm chí hàng chục triệu USD chỉ trong vài phút.


Một trong những lỗ hổng nổi tiếng nhất là reentrancy, từng gây ra vụ hack DAO năm 2016 và làm rung chuyển toàn bộ hệ sinh thái Ethereum. Lỗi này xuất hiện khi smart contract gửi tài sản ra ngoài trước khi kịp cập nhật trạng thái nội bộ. Kẻ tấn công lợi dụng khoảng trống đó để gọi ngược trở lại hàm rút tiền nhiều lần, khiến contract liên tục chi trả cho cùng một giao dịch. Chỉ vài dòng code sắp xếp sai thứ tự, nhưng hậu quả là hàng chục triệu USD bị rút cạn và Ethereum buộc phải hard fork, dẫn tới sự ra đời của Ethereum Classic.
Không phải mọi vụ hack đều cần kỹ thuật phức tạp. Nhiều tổn thất nghiêm trọng lại bắt nguồn từ các lỗi logic đơn giản. Smart contract có thể chạy đúng cú pháp, không báo lỗi biên dịch, nhưng tư duy thiết kế lại sai. Một hàm thưởng không giới hạn số lần gọi, một điều kiện kiểm tra thiếu chặt chẽ, hay một cơ chế phân phối token không có trần kiểm soát đều có thể bị khai thác hợp pháp theo đúng logic mà lập trình viên đã viết. Trong những trường hợp này, hacker thậm chí không cần “hack”, mà chỉ cần đọc code và tận dụng chính những gì contract cho phép.
Bên cạnh đó, oracle cũng là một điểm yếu mang tính hệ thống của Web3. Smart contract không thể tự truy cập dữ liệu bên ngoài blockchain, chẳng hạn như giá tài sản hay tỷ giá thị trường, nên phải phụ thuộc vào oracle. Nếu nguồn dữ liệu này dễ bị thao túng, hoặc lấy giá từ các thị trường có thanh khoản thấp, kẻ tấn công có thể tạo ra mức giá giả trong thời gian ngắn để vay hoặc rút tài sản vượt xa giá trị thực. Nhiều vụ tấn công DeFi trong những năm gần đây không xuất phát từ lỗi code cốt lõi, mà đến từ việc thiết kế oracle thiếu an toàn.
Một nhóm lỗi khác, tưởng chừng rất cơ bản, lại xuất hiện với tần suất đáng báo động là kiểm soát quyền truy cập. Việc quên giới hạn quyền cho các hàm quan trọng, để bất kỳ ai cũng có thể gọi hàm rút tiền hoặc thay đổi cấu hình, đã khiến không ít dự án sụp đổ chỉ sau một giao dịch. Đây không phải vấn đề của công nghệ cao, mà là hệ quả của sự cẩu thả trong khâu phát triển.
Điểm chung của các vụ tấn công smart contract là tốc độ và tính không thể đảo ngược. Một giao dịch khai thác thành công không cần kéo dài hàng giờ, không cần tấn công liên tục. Chỉ một lần gọi hàm đúng thời điểm, chi phí gas có thể chỉ vài trăm USD, nhưng số tiền chiếm đoạt được có thể lên tới hàng triệu USD. Khi giao dịch đã được xác nhận trên blockchain, mọi thứ kết thúc. Không có cơ quan nào có thể can thiệp, và cũng không có cách nào buộc kẻ tấn công hoàn trả tài sản.
Smart Contract Hack: Vì sao chỉ 1 dòng code có thể mất triệu USD?
Nhìn rộng hơn, bảo mật smart contract không phải là một tính năng cộng thêm, mà là nền móng sống còn của Web3. Một dự án có thể thất bại vì thị trường, vì chiến lược kinh doanh, nhưng nếu thất bại vì lỗ hổng bảo mật, cái giá phải trả không chỉ là tiền bạc mà còn là niềm tin của cộng đồng. Trong môi trường nơi “code là luật”, mọi sai lầm đều được thực thi một cách lạnh lùng và tuyệt đối.
Web3 hứa hẹn một hệ thống tài chính không cần trung gian, minh bạch và tự do hơn. Tuy nhiên, tự do đó chỉ tồn tại khi mã nguồn đủ an toàn. Khi luật được viết bằng code, viết sai luật đồng nghĩa với việc chấp nhận trả giá bằng tài sản thật.
Bài viết này là một phần trong chuỗi phân tích về Web3 Security.
Xem đầy đủ tại: Web3 Security: Trustless Infrastructure Defense
