2 giờ sáng, điện thoại reo. Đầu dây bên kia là một founder đang hoảng loạn: "Quỹ của chúng tôi vừa biến mất 20 triệu USD, nhưng chúng tôi không biết bằng cách nào. Anh có thể giúp?" Tôi hỏi anh ta ba câu: "Hợp đồng nào bị ảnh hưởng? Giao dịch đầu tiên là gì? Dữ liệu on-chain của bạn có còn không?" Cả ba câu trả lời đều là: "Chúng tôi không có thông tin."
Đó là một trong những khoảnh khắc tệ nhất trong sự nghiệp kiểm toán bảo mật của tôi. Không phải vì vụ hack quá phức tạp, mà vì đội ngũ không hề có bất kỳ dữ liệu nào để bắt đầu điều tra. Họ không biết hợp đồng nào bị tấn công, không có log, không có cảnh báo. Mọi thứ cứ thế biến mất trong im lặng. Trải nghiệm đó dạy cho tôi một bài học đắt giá: trong thế giới DeFi, sự mù mờ thông tin còn nguy hiểm hơn cả những lỗ hổng mã nguồn.
Vụ việc tôi đang nói đến là Polymath Network, một trong những vụ hack lớn nhất năm 2021. Attacker đã rút 20 triệu USD bằng cách khai thác lỗ hổng trong logic mint token. Nhưng điều đáng nói nhất không phải là lỗ hổng kỹ thuật, mà là việc đội ngũ dự án đã không hề phát hiện ra cho đến khi người dùng báo cáo. Họ có một hệ thống giám sát, nhưng nó chỉ theo dõi các giao dịch bất thường trên ví nóng. Còn hợp đồng thông minh – nơi toàn bộ số tiền đang nằm – thì không có bất kỳ cảnh báo tự động nào.
Khi tôi bắt đầu phân tích, tôi phải tự dựng lại toàn bộ dữ liệu từ các block explorer công khai. Mất ba ngày chỉ để tìm ra điểm vào của attacker. Nếu đội ngũ có một hệ thống theo dõi on-chain đơn giản từ ngày đầu, chúng tôi có thể tiết kiệm được 72 giờ quý giá. Nhưng họ không có, bởi vì họ tin rằng audit trước khi ra mắt là đủ. Đây là một sai lầm mà tôi thấy lặp lại ở hàng chục dự án khác.
Hãy nói về mặt kỹ thuật. Lỗ hổng trong Polymath nằm ở một hàm tên là mintReward. Về cơ bản, hàm này được thiết kế để cho phép một địa chỉ rewardManager tạo ra token phân phối cho người dùng. Nhưng trong quá trình nâng cấp hợp đồng, đội ngũ đã thêm một modifier mới để tăng tốc quá trình mint. Modifier này kiểm tra vai trò của người gọi bằng cách so sánh với một mapping lưu trữ trên hợp đồng cũ.
Vấn đề là mapping đó chưa được khởi tạo đúng cách trong quá trình di chuyển dữ liệu. Nếu như các bạn đã từng đọc mã nguồn của các hợp đồng nâng cấp, bạn sẽ biết rằng storage layout phải được giữ nguyên thứ tự. Một biến thêm vào giữa chừng có thể khiến toàn bộ dữ liệu bị đọc sai. Trong trường hợp này, thay vì đọc địa chỉ rewardManager thật, hợp đồng lại đọc một địa chỉ mà attacker có thể kiểm soát.
Tôi nhớ đêm hôm đó, ngồi trước màn hình, đọc đi đọc lại cùng một dòng code. Dòng thứ 47 của hợp đồng RewardManagerV2.sol. Nếu bạn không cẩn thận từng dòng, bạn sẽ bỏ qua nó – một phép so sánh địa chỉ với một mapping mà không ai kiểm tra xem mapping đã được khởi tạo hay chưa. Tôi ghi chú vào sổ: "Nguy cơ cao – storage migration lỗi." Đó là một phát hiện nhỏ, nhưng hậu quả là 20 triệu USD.
Điều làm tôi bận tâm không chỉ là lỗ hổng, mà là cách mà toàn bộ hệ thống giám sát của dự án đã không phát hiện ra. Một logic mint token bất thường thường tạo ra các giao dịch với giá trị gas cao hơn bình thường. Nhưng không có cảnh báo nào được thiết lập cho điều đó. Không có một dashboard theo dõi tổng cung token, không có một script cảnh báo khi số dư hợp đồng giảm đột biến. Họ chỉ kiểm tra số dư ví nóng mỗi ngày một lần.
Sau vụ việc, tôi xây dựng một bộ framework với 15 mẫu tấn công phổ biến. Reentrancy, flash loan, price oracle manipulation – tất cả đều nằm trong danh sách. Nhưng mẫu tấn công qua storage migration chỉ được tôi thêm vào sau khi gặp Polymath. Nếu như chúng ta không ghi chép lại những lỗi hiếm gặp như thế này, chúng ta sẽ lặp lại chúng mãi. Đó là lý do tại sao tôi luôn khuyến khích cộng đồng đọc mã nguồn, chứ không chỉ tin vào kết quả audit.
Bởi vì chúng ta tin vào sự hoàn hảo của quy trình, nên chúng ta bỏ qua những bất thường nhỏ nhất. Khi tôi tổ chức các buổi học miễn phí sau sự cố Terra Luna, tôi nhận ra rằng hầu hết mọi người không hiểu tại sao một giao thức stablecoin có thể sụp đổ chỉ trong vài ngày. Họ không có dữ liệu về dòng tiền, không theo dõi lượng mint và burn hàng giờ. Khi tôi giải thích về vòng xoáy tử thần giữa UST và LUNA, họ đều ngạc nhiên vì không biết rằng có thể theo dõi những con số đó một cách công khai.
Điều này dẫn tôi đến một góc nhìn phản trực giác: trong bảo mật DeFi, dữ liệu còn quan trọng hơn mã nguồn. Mã nguồn có thể được kiểm toán bởi một nhóm chuyên gia, nhưng dữ liệu on-chain phản ánh hành vi thực tế của giao thức – và nó thay đổi mỗi giây. Nếu bạn không theo dõi dữ liệu của chính mình, bạn sẽ không thể phát hiện ra một cuộc tấn công đang diễn ra. Bạn sẽ chỉ biết khi mọi thứ đã quá muộn.
Nhiều người nghĩ rằng chỉ cần audit một lần trước khi ra mắt là đủ. Nhưng từ kinh nghiệm kiểm toán ETF Bitcoin và Ethereum cho BlackRock năm ngoái, tôi nhận ra rằng ngay cả các tổ chức lớn cũng có thể gặp vấn đề với cross-chain transfer nếu họ không theo dõi dữ liệu liên tục. Một lỗ hổng có thể xuất hiện ở bất kỳ đâu: trong một bản nâng cấp nhỏ, trong một tham số cấu hình, thậm chí trong một oracle mà bạn không bao giờ ngờ tới. Nếu không có dữ liệu, bạn đang bay trong sương mù.
Tôi nhớ một lần, khi tôi đang phân tích một giao thức lending, tôi phát hiện ra rằng tổng số dư của hợp đồng cao hơn số dư được ghi trong sổ cái nội bộ. Sự chênh lệch chỉ là 0.5 ETH, nhưng nó khiến tôi đặt câu hỏi. Hóa ra, có một hàm liquidate cho phép ai đó thanh lý vị thế bằng cách gọi một external contract. Trong một số trường hợp, external contract đó không trả lại tiền thừa, dẫn đến số dư tăng dần theo thời gian. Nếu tôi không có dữ liệu so sánh, tôi sẽ không bao giờ thấy được điểm bất thường này.
Điều tương tự cũng xảy ra với các giao thức NFT. Khi tôi làm việc với các dự án Soulbound Token, tôi nhận ra rằng ý tưởng này đã tồn tại suốt ba năm nhưng vẫn chưa được áp dụng rộng rãi. Lý do không phải vì kỹ thuật phức tạp, mà vì không ai muốn lịch sử tín dụng của mình mãi mãi nằm trên blockchain. Dữ liệu trở thành một vấn đề xã hội, không chỉ là vấn đề kỹ thuật.
Quay trở lại vụ Polymath, sau khi tôi gửi báo cáo 30 trang cho đội ngũ, họ đã vá lỗ hổng trong vòng 48 giờ. Nhưng điều làm tôi ấn tượng nhất là họ xây dựng lại toàn bộ hệ thống giám sát của mình. Họ bắt đầu theo dõi tổng cung token theo thời gian thực, thiết lập cảnh báo khi có bất kỳ giao dịch mint nào với số lượng lớn. Họ tạo ra một dashboard công khai cho phép bất kỳ ai xem được số dư của hợp đồng. Đó là một bước tiến đáng hoan nghênh, nhưng nó chỉ đến sau khi mất 20 triệu USD.
Nếu như các bạn đang vận hành một giao thức DeFi, hãy tự hỏi ba câu hỏi: Một, bạn có biết hợp đồng nào đang nắm giữ số tiền lớn nhất của người dùng không? Hai, bạn có theo dõi các giao dịch bất thường vào lúc 2 giờ sáng không? Ba, bạn có một quy trình để trả lời các câu hỏi của người dùng khi họ nghi ngờ giao thức bị tấn công không? Nếu bạn không trả lời được, thì rủi ro của bạn không phải là "nếu" mà là "khi nào".
Tôi đã thấy quá nhiều dự án thất bại vì thiếu dữ liệu. Không phải vì code của họ tệ hơn những dự án khác, mà vì họ không có khả năng quan sát chính hệ thống của mình. Trong một thị trường giảm như hiện tại, khi thanh khoản co lại và người dùng rút tiền, sự mù mờ đó càng trở nên nguy hiểm. Một giao thức mất 40% thanh khoản trong 7 ngày mà không biết lý do sẽ không thể tồn tại. Còn một giao thức có dữ liệu rõ ràng sẽ biết chính xác nơi để tập trung nguồn lực.
Dựa trên kinh nghiệm kiểm toán của tôi, tôi tin rằng những lỗ hổng lớn nhất trong DeFi không nằm ở các đoạn mã phức tạp với hàng nghìn dòng. Chúng nằm ở những nơi mà con người không nghĩ đến: một mapping chưa được khởi tạo, một hàm nâng cấp sai thứ tự, một external call không kiểm tra giá trị trả về. Những lỗi này không thể bị phát hiện nếu bạn chỉ nhìn vào code một cách tĩnh. Bạn cần nhìn vào dữ liệu, bạn cần mô phỏng các kịch bản, bạn cần đặt câu hỏi "điều gì xảy ra nếu mapping này rỗng?"
Trong một lần tổ chức podcast AuditVerse, tôi mời một kỹ sư từ một giao thức lending lớn. Anh ấy chia sẻ rằng họ đã thuê ba công ty audit, nhưng vẫn bị hack. Lý do hóa ra là một trong những auditor đã bỏ qua một dòng code vì nó trông không quan trọng. Đó là một lời nhắc rằng con người có thể mắc sai lầm, và chính vì vậy, chúng ta cần xây dựng các công cụ tự động. Từ đó, tôi bắt đầu phát triển AuditAI, một hệ thống sử dụng NLP để phân tích whitepaper và mã nguồn, phát hiện các mẫu tấn công tiềm ẩn.
Nhưng ngay cả công cụ thông minh nhất cũng không thể thay thế được việc bạn hiểu rõ dữ liệu của chính mình. Khi tôi làm việc với đội ngũ BlackRock về ETF Bitcoin, điều đầu tiên tôi làm là yêu cầu họ xuất ra danh sách tất cả các địa chỉ ví nắm giữ tiền của quỹ. Họ ngạc nhiên vì tôi không hỏi về code, mà hỏi về danh sách địa chỉ. Bởi vì nếu bạn không biết tiền của mình nằm ở đâu, bạn không thể bảo vệ nó. Sau ba workshop, họ đã xây dựng một hệ thống giám sát cho phép theo dõi mọi giao dịch từ các địa chỉ đó.
Có một điều tôi thường nói với các bạn trẻ mới vào nghề: khi bạn thấy log đầy lỗi mà không rõ nguyên nhân, điều đầu tiên cần làm là dừng lại, thu thập toàn bộ dữ liệu liên quan, và vẽ sơ đồ dòng tiền. Đừng vội vàng sửa code. Bởi vì nếu bạn không hiểu bức tranh toàn cảnh, một bản vá có thể tạo ra ba lỗ hổng mới. Tôi đã từng chứng kiến một dự án sửa một lỗ hổng reentrancy bằng cách thêm một modifier, nhưng modifier đó lại tạo ra một điều kiện race condition ở một hàm khác.
Thị trường DeFi đang đi qua giai đoạn khó khăn. Nhưng tôi tin rằng những giao thức sống sót qua chu kỳ này sẽ là những giao thức coi trọng dữ liệu. Những giao thức có thể trả lời câu hỏi "bao nhiêu tiền đang bị rút ra? từ đâu? tại sao?" trong vòng năm phút. Những giao thức có hệ thống cảnh báo sớm và quy trình ứng phó rõ ràng. Còn những giao thức mù mờ về chính bản thân mình sẽ sớm bị thị trường loại bỏ, không phải bởi hacker, mà bởi chính sự thiếu hiểu biết.
Câu chuyện về Polymath Network là một lời nhắc rằng trong bảo mật, kiến thức là vũ khí mạnh nhất. Một hacker chỉ cần tìm thấy một điểm yếu, nhưng người bảo vệ phải theo dõi mọi ngóc ngách. Và nếu bạn không có dữ liệu, bạn không thể theo dõi bất cứ điều gì. Hãy bắt đầu bằng việc đọc dữ liệu của chính dự án bạn ngay hôm nay, trước khi người khác đọc nó theo một cách mà bạn không mong muốn.
Nếu bạn đang giữ tài sản trong một giao thức DeFi, hãy hỏi đội ngũ dự án rằng họ theo dõi các bất thường như thế nào. Nếu họ không trả lời được, hãy tự hỏi liệu bạn có muốn tiếp tục giữ tài sản ở đó không. Bởi vì trong thế giới của những hợp đồng thông minh, sự minh bạch không chỉ là một giá trị đạo đức – nó là một cơ chế bảo mật sống còn. Và khi dữ liệu biến mất, mọi thứ khác cũng sẽ dần biến mất theo.