Trong 9 tháng đầu năm 2026, tài chính phi tập trung đã mất khoảng 1,1-1,3 tỷ USD trong hơn 120 sự cố – và mặc dù các tin tức lớn nhất thuộc về các cuộc tấn công hạ tầng tỷ đô, một câu chuyện yên tĩnh hơn diễn ra bên dưới. defi hacks 2026 bao gồm một chuỗi liên tục các lỗ hổng toán học: một sự rút tiền 1,73 triệu USD của hệ thống bảo lãnh của Notional Finance và một sự rút tiền 234.000 USD từ một nhóm Balancer V1 được triển khai vào năm 2020. Cả hai đều do cùng một loại lỗi đã ám ảnh DeFi kể từ năm 2021 – lỗi tròn và các điều kiện giới hạn nguyên tử – và cả hai đều có thể tránh được bằng các kỹ thuật đã được ghi lại từ nhiều năm trước. Bài tổng hợp YTD này theo dõi khung cảnh năm 2026, phân tích hai cuộc tấn công toán học và giải thích lý do tại sao sự mất chính xác vẫn tiếp tục làm suy giảm các nhóm bất kể bao nhiêu lần kiểm tra mà một quy trình thông qua.
Khung cảnh tấn công DeFi năm 2026: một câu chuyện song song
Các nhà theo dõi tổng hợp không đồng ý về con số chính xác, nhưng hình dạng của năm vẫn tương đồng. CertiK và Forbes ước tính tổng số thiệt hại của tiền điện tử là khoảng 1,3 tỷ USD trong 8 tháng đầu tiên. Immunefi ghi nhận 972 triệu USD trong 207 sự cố chỉ trong H1 – số lượng sự cố cao nhất mà nó từng ghi nhận. CryptoRank thống kê 121 vụ tấn công đặc trưng cho DeFi với tổng số tiền khoảng 942 triệu USD, và shattered.io theo dõi 816,9 triệu USD trong thiệt hại của DeFi vào đầu tháng 9. Cuối năm 2021 là quý hoạt động nhất (85–99 sự cố, ~746–775 triệu USD), và tháng 8 lập kỷ lục một tháng với 50 vụ tấn công.
Câu chuyện chủ đạo là sự xâm phạm cơ sở hạ tầng. Đầu tiên trong lịch sử, các cuộc tấn công bằng khóa riêng và cơ sở hạ tầng đã vượt qua các lỗi trong smart contract để trở thành vector chính. Hai sự kiện lớn nhất trong năm – Drift Protocol (285 triệu USD, ngày 1 tháng 4) và KelpDAO (292 triệu USD, ngày 18 tháng 4) – đều được cho là do nhóm Lazarus của Triều Tiên (TraderTraitor), cộng lại chiếm khoảng 44% tổng số thiệt hại. Drift bị tấn công thông qua kỹ thuật kỹ thuật xã hội và xâm phạm khóa quản trị thông qua nonce bền vững; KelpDAO thông qua 1-of-1 LayerZero DVN và độc hại RPC.
Nhưng ngay dưới những tiêu đề gây chú ý, các lỗi tròn số và tính chính xác vẫn liên tục xảy ra. Sự xâm nhập vào Notional Finance và Balancer V1 là những sự cố nhỏ về số tiền nhưng có ý nghĩa lớn: chúng cho thấy hệ sinh thái DeFi vẫn có những mã không thể thay đổi được và vẫn để chạy mã đó, vi phạm các quy tắc an toàn tính toán cơ bản nhất.
| Ngày | Protokol | Thiệt hại | Vectơ |
|---|---|---|---|
| 4/4/2019 | Protokol Drift | 285 triệu USD | Kỹ thuật kỹ thuật xã hội, khóa quản trị (nonces bền vững) |
| 18/4 | KelpDAO | 292 triệu USD | LayerZero 1-of-1 DVN, độc hại RPC (Lazarus) |
| 20–25 tháng 8 | Cosmos EVM (MANTRA, TAC, KiiChain) | ~$14.8 triệu | Sự thiếu hụt số nguyên trong đồng bộ hóa cân bằng |
| 31/8 | Balancer V1 | 234.000 USD | Lỗi tròn tránh trong phép toán kết hợp |
| 3–4 tháng 9 | Tài chính lý thuyết V1 | $1.73 triệu | Truy cập quá mức trong kiểm tra bảo đảm |
Hacker tài chính ảo: Khi số nguyên vượt quá làm xóa đi nợ
Vào ngày 3 và 4 tháng 9 năm 2026, một kẻ tấn công đã rút tiền từ hợp đồng V1 Escrow của Notional Finance với số tiền 1,658,524 USDC và 69,257 DAI – khoảng 1,73 triệu USD – sau đó chuyển đổi số tiền này thành khoảng 689,2 ETH và chuyển qua Tornado Cash. Câu giao dịch chuẩn bị được thực hiện vào lúc 23:58 UTC ngày 3 tháng 9 (block 25,900,220); việc rút tiền diễn ra vào lúc 00:01 UTC ngày 4 tháng 9 (block 25,900,234).
V1 lý thuyết đại diện cho các vị trí cho vay với lãi suất cố định dưới dạng fCash, các token ERC1155 mã hóa một bên thanh toán và một bên nhận. Hình thức mintfCashPair() tạo ra cả hai bên trong một lần gọi nhưng chỉ kiểm tra tài sản đảm bảo miễn phí bên phía bên thanh toán. Người tấn công đã khai thác sự bất đối xứng này bằng hai lần gọi chia sẻ cùng một tài khoản thanh toán: lần đầu với notional = 1, lần thứ hai với notional = uint128.max (2^128 − 1). Cộng lại, số nợ tổng hợp bằng chính xác 2^128, được ghi nhận dưới dạng số nguyên ký hiệu là −2^128.
Lỗi Downcast uint128
Bước nguy hiểm xảy ra trong Escrow.convertBalancesToETH(), nơi mà giá trị tuyệt đối của một số dư ký được chuyển đổi thành uint128 thông qua một chuyển đổi trực tiếp. Trong Solidity 0.6.x – phiên bản ngôn ngữ mà Notional V1 được viết – không có kiểm tra tràn vượt tích hợp. abs(−2^128) bằng 2^128, và khi chuyển đổi 2^128 thành uint128, nó sẽ bị cắt bỏ thành 0 một cách im lặng. Tài khoản hiện có vẻ như không có nợ nào. Với kiểm tra tài sản thế chấp bị phá vỡ, kẻ tấn công đã rút các token thực được giữ trong escrow.
Điều ngớ ngẩn là Notional đã sử dụng các phương thức an toàn, kiểm tra chuyển đổi ở các vị trí khác trong cùng một tệp. Đường dẫn mã này – convertBalancesToETH – đã bị bỏ qua. Nguyên nhân gốc không phải là một đột phá về mật mã mới; nó là một điều kiện giới hạn số nguyên thuộc loại đã được ghi nhận từ những lần khai thác EVM đầu tiên. Danh mục Top 10 smart contract của OWASP năm 2026 đã phân loại nó là SC07 – Lỗi toán học: cắt giảm, quy đổi và quy đổi đơn vị dẫn đến kết quả có thể khai thác.
Balancer V1 Hack: Lỗi tròn trượt trong mã nguồn cũ
Ba ngày trước đó, vào ngày 31 tháng 8 năm 2026, một kẻ tấn công đã lấy được khoảng 234.000 USD từ Balancer V1 BPool – mã gốc của Balancer được triển khai lần đầu tiên vào năm 2020. Balancer Labs đã tắt V1, nhưng các hợp đồng là bất biến: chúng không thể được sửa chữa, chỉ có thể bỏ rơi. Bể chứa có DPI, USDC, WETH và WBTC.
Nguyên nhân chính là lỗi tròn số trong joinswapPoolAmountOut, chức năng cho phép người gọi chỉ định một số lượng BPT (token của nhóm) mong muốn và cho hợp đồng tính toán ngược lại số lượng đầu vào cần thiết. Công thức tính toán nội bộ calcSingleInGivenPoolOut sử dụng toán học số thập phân cố định có 18 chữ số. Tuy nhiên, WBTC chỉ có 8 chữ số thập phân. Sự không đồng nhất này trở nên nguy hiểm khi các dự trữ được đẩy đến gần bằng 0.
Bảo lưu nén và tăng cường trạng thái bụi
Hacker đã sử dụng các khoản vay flash được chồng lên nhau – lấy từ Spark, Aave, Morpho và Uniswap V3 – để thu nhỏ các dự trữ WBTC của nhóm xuống còn rất ít. Với các dự trữ chỉ còn một số satoshi, đầu vào được tính ngược lại đã được tròn xuống thành một satoshi WBTC. Sau đó, hợp đồng đã tạo ra 4,408.8 BPT để đổi lấy 1 satoshi đó. Hacker đã rời khỏi nhóm, đổi các BPT này thành các tài khoản token thực – có giá trị nhiều hơn rất nhiều so với những satoshi mà họ đã đưa vào.
Ba biện pháp bảo vệ đã bị bỏ sót: không có đầu vào tối thiểu có hiệu lực, không có việc thực thi hạn mức tối thiểu trong các hoạt động kết hợp (thử nghiệm _MIN_BALANCE chỉ được thực hiện trong bind/rebind), và không có xác nhận sai số tương đối. Cụm lỗi tương tự đã xuất hiện trong Balancer V2 vào tháng 11 năm 2025: cả hai đều thực hiện tròn xuống trong toán học số cố định, ưu tiên cho người gọi hơn là cho kho.
Đây là "amplifier trạng thái bụi". Mỗi lỗ hổng tròn chia sẻ một điều kiện tiên quyết chung: đưa hệ thống vào một trạng thái số học cực đoan - dự trữ gần bằng 0, giá trị nguyên số tối đa hoặc tần số giới hạn. Khi dự trữ bằng 10 wei, một lỗi tròn 1 wei là một sự thay đổi 10%. Trong một hồ chứa sâu gồm 10^20 wei, lỗi 1 wei tương tự là không đáng kể. Cách phòng thủ không chỉ là sửa hướng tròn mà còn là ngăn cản hệ thống không bao giờ đạt trạng thái bụi.
Tại sao lỗi tròn số tiếp tục làm suy giảm các hồ chứa DeFi
Các lỗ hổng liên quan đến tròn số và độ chính xác không phải là mới. Chúng đã được ghi nhận từ ít nhất năm 2021, và chúng tiếp tục xuất hiện vì bốn lý do cơ bản: mã nguồn cũ không thể thay đổi và không thể được sửa chữa; các fork kế thừa các lỗi của cha mẹ; các kiểm toán viên thường kiểm tra các phạm vi hoạt động bình thường hơn là các trường hợp đặc biệt; và bề mặt tấn công ngày càng lớn mỗi khi một giao thức mới tạo ra toán học số cố định trên nền tảng các nguyên mẫu hiện có. Kết quả là một chu kỳ "lỗi đã biết, nạn nhân mới" đã trải qua ba năm.
KyberSwap, Cetus, Balancer V2 – cùng một gia đình lỗi
- KyberSwap Elastic (Tháng 11 năm 2023, ~$48 triệu): Một lỗi mất cài đặt chính xác trong
computeSwapStep()tại các giới hạn tick.calcReachAmount()đã tính toán một số lượng trao đổi là 1,056,056,735,638,220,800,000; số lượng trao đổi thực tế là 1,056,056,735,638,220,799,999 – sai một đơn vị. Sự khác biệt 0,00000000001% đã vượt qua kiểm tra_updateLiquidityAndCrossTick, lượng likudity không được loại bỏ và một lần trao đổi thứ hai đã tính lại cho đến khi hồ chứa bị cạn.
- Cetus Protocol (Tháng 5 năm 2025, ~$200–223 triệu): Một tình trạng tràn số nguyên trong hàm
checked_shlwcủaclmm_math.movetrên Sui. Tỉ lệ kiểm tra tràn số đã sai 2^64, do đó các phép toán dịch sang trái được thực hiện một cách không phát hiện. Người tấn công đã gửi 1 đơn vị của một token và nhận được lượng likidty tương đương 10^37. Move là an toàn về bộ nhớ, nhưng các phép toán dịch sang trái không được bảo vệ tự động – một lời nhắc rằng "ngôn ngữ an toàn" không có nghĩa là "toán học an toàn."
- Balancer V2 Composable Stable Pools (Tháng 11 năm 2025, ~$116–128 triệu): Một lỗi về hướng tròn trong hàm
_upscale. Nó tròn xuống (mulDown) khi thực sự nên tròn lên cho các số lượng đầu ra. Người tấn công đã cạn kiệt một hồ chứa vào trạng thái có lượng thanh khoản thấp, sau đó thực hiện 65+ giao dịch nhỏ; mỗi giao dịch này gây ra sự không phù hợp nhỏ trong việc ghi sổ, và việc phân loại làm tăng thêm sự mất đi độ chính xác cho đến khi giá BPT bị kìm hãm và người tấn công rút ra nhiều giá trị hơn số tiền họ đã gửi vào.
Các lỗ hổng Notional và Balancer V1 năm 2026 mở rộng dòng thời gian này. Notional là một tình trạng tràn số nguyên dẫn đến việc làm tan biến một khoản nợ khổng lồ thành 0; Balancer V1 là một phương pháp tròn xuống cho phép người gọi thanh toán bằng các token thực. Các cơ chế khác nhau, cùng một lớp: toán học ở biên giới.
Toán học về lỗi tròn số
Để hiểu lý do tại sao các cuộc tấn công này có hiệu quả, bạn phải hiểu cách các smart contract thực hiện toán học. EVM và hầu hết các máy ảo blockchain chỉ hỗ trợ toán học số nguyên – không có toán học số thập phân. Toán chia sẽ bị cắt giảm về phía 0 theo mặc định, bỏ qua phần dư một cách không được biết đến. Để biểu diễn các số phân số, các giao thức sử dụng toán học số cố định: nhân với một nhân số quy đổi (thường là 1e18), thực hiện toán học trong không gian số nguyên, và chia lại ở cuối. Mỗi bước chia sẽ mất một chút độ chính xác.
Thiệt hại đó thường không gây hại. Nó trở thành một điểm tấn công khi ba điều kiện hợp nhất: sự không đồng bộ về độ chính xác (token có số thập phân khác nhau, như 8 thập phân của WBTC so với toán học nội bộ có 18 thập phân), trạng thái được nén (đá dự trữ giảm gần đến mức 0, do đó lỗi 1 wei là một sai số tương đối lớn) và sự thiên hướng theo hướng (tròn số theo một cách liên tục có lợi cho người gọi hơn là cho quy trình). Khi tất cả ba điều kiện này được duy trì, các hoạt động lặp lại – 65 lần trao đổi nhỏ, hoặc một chu kỳ kết hợp/ra khỏi trạng thái bụi – sẽ thu được giá trị thực.
Quy tắc vàng về hướng tròn
Khi ở mức toán học, chiến lược bảo vệ là một quy tắc duy nhất: khi tròn số, chúng ta luôn phải ưu tiên cho giao thức, không bao giờ ưu tiên cho người gọi. Số tiền chảy vào từ người dùng nên được tròn lên, vì vậy người gọi phải trả thêm một chút. Số tiền chảy ra cho người dùng nên được tròn xuống, vì vậy người gọi nhận được ít hơn một chút. Trong nhiều hoạt động, xu hướng này tích lũy theo lợi thế của giao thức và tính không đổi của kho không bao giờ giảm đi sau một hành động của người dùng.
Cả 2025 Balancer V2 và 2026 Balancer V1 đều vi phạm quy tắc này: V2 tròn số lượng đầu ra xuống (lợi thế cho người gọi), và V1 tròn số lượng đầu vào cần thiết xuống (lợi thế cho người gọi). Bug của Notional là một đặc điểm liên quan nhưng khác biệt – không phải là vấn đề về hướng tròn, mà là một tình trạng tràn số nguyên dẫn đến giá trị giới hạn biến thành 0. Nó thuộc cùng một gia đình OWASP SC07 vì cơ chế khai thác là giống nhau: phép tính ở biên của phạm vi có thể biểu diễn tạo ra kết quả mà nhà phát triển không có ý định.
Bảo vệ chống lại các lỗ hổng gây mất chính xác
Các sửa lỗi đã được biết đến, được ghi lại và trong hầu hết các trường hợp chỉ là một vài dòng mã. Sự bất cân xứng giữa chi phí khai thác và chi phí sửa lỗi là đáng kinh ngạc: Notional đã mất 1,73 triệu USD từ một lỗi không được kiểm tra; Balancer V1 đã mất 234.000 USD do thiếu kiểm tra số dư tối thiểu. Cả hai sửa lỗi đều rất đơn giản. Bài toán khó là tìm ra con đường dễ bị tấn công trước khi kẻ tấn công làm được điều đó.
Kiểm vệ cấp mã:
- Rounding thuận lợi cho pool. Luôn thực hiện tròn theo hướng bảo vệ giao thức. Sử dụng thư viện làm rõ hướng đó –
FixedPoint.mulDown/mulUpcủa OpenZeppelin hoặc PRBMath – để một nhà phát triển không thể vô tình tròn theo hướng sai.
Kiểm tra hệ thống phòng thủ:
- Kiểm tra không thay đổi. Định nghĩa các tính chất không thay đổi về mặt toán học – "giá trong kho không bao giờ giảm từ một giao dịch" – và kiểm tra chúng bằng các công cụ như các bài kiểm tra tính không thay đổi của Foundry hoặc Recon.
Kinh tế phòng thủ:
- Giảm sự cần thiết của mã nguồn cũ. Balancer V1 được triển khai vào năm 2020 và không được duy trì. Các hợp đồng không thể thay đổi không thể được sửa chữa – biện pháp duy nhất là di chuyển nguồn cung và tắt bể. 2. Theo dõi sự thu nhỏ dự trữ. Gửi cảnh báo khi dự trữ của bể giảm dưới các giới hạn an toàn; trạng thái bụi là điều kiện tiên quyết cho mọi vụ tấn công tròn số. 3. Circuit breakers. Ngừng hoạt động bể khi phát hiện các mẫu thay đổi bất thường. Các validator Cetus đã đóng băng 162 triệu USD trên Sui trong giai đoạn tấn công; hành động nhanh hạn chế phạm vi nổ. 4. Cấu hình cầu kiểm chứng đa người. 1-of-1 DVN của KelpDAO là một điểm rủi ro duy nhất – nhắc nhở rằng thiết kế cơ sở hạ tầng quan trọng như toán học hợp đồng.
Bomb thời gian Fork
Một rủi ro hệ thống đáng chú ý là thuật toán join/exit của Balancer V1 đã được fork (tách ra) trong DeFi. Những hợp đồng này là không thể thay đổi. Mỗi fork giữ nguyên hành vi tròn xuống và kiểm tra tối thiểu về số dư thiếu là một quả bom định thời, đang chờ một ai đó thu gom các nguồn vốn và kích hoạt quá trình rút tiền tương tự. Điều này không phải là giả định: sự cố Balancer V2 năm 2025 và sự cố Balancer V1 năm 2026 đều là lỗi tương tự trong hai thế hệ của cùng một cơ sở mã. Cách phòng thủ cho các fork không phải là sửa lỗi – điều này không thể thực hiện được – mà là đánh giá thấp, di chuyển nguồn vốn, và cảnh báo bất kỳ quy trình nào vẫn đang chạy thuật toán được thừa kế.
Hỏi đáp
Làm thế nào để khai thác lỗi tròn trong DeFi? Lỗ tròn là một lỗi mà các máy ảo blockchain sử dụng toán học số nguyên và chia sẽ bị cắt giảm về phía 0. Khi toán học số cố định của một quy trình tròn theo hướng có lợi cho người gọi – và hệ thống bị đẩy đến trạng thái cực đoan như số dự trữ gần 0 – một kẻ tấn công có thể lấy ra giá trị thực bằng cách lặp lại các hoạt động có lợi cho việc tròn. Sự tấn công vào Balancer V1 năm 2026 là một ví dụ điển hình.
Cách tấn công Notional Finance hoạt động như thế nào? Tấn công viên đã gọi mintfCashPair() hai lần với cùng một người thanh toán - một lần với notional = 1 và một lần với notional = uint128.max. Tiền nợ tổng cộng 2^128 được lưu trữ dưới dạng âm là -2^128. Khi convertBalancesToETH() chuyển đổi abs(-2^128) thành uint128, giá trị bị cắt bỏ thành 0 trong Solidity 0.6.x (không có kiểm tra tràn). Tài khoản trông như không có nợ và người tấn công đã rút các token thực.
Tại sao lỗi tròn số liên tục xảy ra trong DeFi? Có bốn lý do: mã không thể thay đổi không thể được sửa chữa; các fork thừa hưởng các lỗi của cha mẹ; các kiểm toán kiểm tra các phạm vi bình thường thay vì các trường hợp đặc biệt như bụi/MAX_UINT; và bề mặt tấn công ngày càng tăng khi có nhiều quy trình sử dụng toán học số cố định. Kết quả là một chu kỳ "lỗi đã biết, nạn nhân mới" được thấy từ KyberSwap (2023) qua Cetus và Balancer V2 (2025) đến Notional và Balancer V1 (2026).
Quy tắc vàng về hướng tròn số là gì? Tròn số luôn phải ưu tiên cho giao thức, không bao giờ ưu tiên cho người gọi. Số tiền chảy vào từ người dùng sẽ được tròn lên (người gọi phải trả nhiều hơn); số tiền chảy ra cho người dùng sẽ được tròn xuống (người gọi nhận được ít hơn). Các vi phạm – như việc tròn số đầu ra của Balancer V2 tròn xuống, hoặc phép tính kết hợp của Balancer V1 tròn xuống – sẽ cho phép giá trị rò rỉ từ kho đến người gọi.
Làm thế nào các giao thức có thể ngăn chặn các lỗ hổng gây mất độ chính xác? Hãy sử dụng thư viện tròn số có lợi cho kho, toán học được kiểm tra (Solidity 0.8+ hoặc SafeMath), các giới hạn tối thiểu được áp dụng trong tất cả các hoạt động, xác minh sai số tương đối và kiểm tra không đổi trong thời gian chạy. Thực hiện thử nghiệm với các trường hợp đặc biệt (số 0, 1 wei, MAX_UINT) thông qua phương pháp fuzzing không đổi, và sử dụng xác minh chính thức để chứng minh các đặc tính về hướng tròn số. Trong thực tế, hãy loại bỏ mã không thể thay đổi cũ và theo dõi việc nén dự trữ.
Có phải các cuộc tấn công vào 2026 Notional và Balancer V1 có liên quan với nhau không? Đó là hai sự kiện khác nhau – các giao thức khác nhau, các cơ chế chính xác khác nhau – nhưng chúng thuộc cùng một gia đình OWASP SC07 (Lỗi toán học). Cả hai đều khai thác toán học ở biên giới của phạm vi có thể đại diện: Notional thông qua tình trạng tràn số nguyên làm cho nợ giảm xuống bằng 0, Balancer V1 thông qua việc tròn xuống khiến người gọi phải trả phí cho các token thực. Kết hợp lại, chúng cho thấy rằng sự mất chính xác vẫn là một vectơ tấn công DeFi lâu dài ngay cả khi các cuộc tấn công vào cơ sở hạ tầng chiếm lĩnh các tiêu đề.
Kết luận
Kết quả hack Defi 2026 cho đến nay kể hai câu chuyện. Câu chuyện lớn là vi phạm cơ sở hạ tầng: 577 triệu đô la bị đánh cắp bởi Lazarus thông qua việc đánh cắp khóa và cấu hình sai của cầu, một vector lần đầu tiên vượt qua lỗi của smart contract. Câu chuyện nhỏ hơn là toán học. 1,73 triệu đô la của Notional và 234.000 đô la của Balancer V1 là nhỏ bé so với Drift và KelpDAO, nhưng chúng hoàn toàn có thể tránh được bằng các kỹ thuật đã được ghi lại từ nhiều năm trước – tròn theo hướng thuận lợi cho nhóm, toán học kiểm tra, thực thi giới hạn tối thiểu, kiểm tra không thay đổi ở các giới hạn. Sự bất cân xứng về chi phí là khốc liệt: chỉ vài dòng mã so với hàng triệu đô la. Cho đến khi hệ sinh thái ngừng để các phép toán không thể thay đổi chạy và ngừng kiểm tra chỉ đường đi thuận lợi, các lỗi tròn sẽ tiếp tục xảy ra.
