How I Found a High-Severity Rounding Vulnerability in Morpho Midnight (Tenor Labs) – Toàn cảnh & Đánh giá

⚡ Tài nguyên & Đối tác Đề xuấtSponsored / AdSense
☁️DigitalOcean Cloud VPS & GPU Droplets🎁 Tặng $200 Credit (60 ngày)

Hạ tầng Cloud VPS tốc độ cao cho lập trình viên: triển khai Docker, Kubernetes, WordPress và hệ thống High-Availability chỉ trong 55 giây.

Nhận $200 Free Credit →

Một lỗ hổng bảo mật mức độ nghiêm trọng cao (High-Severity) vừa được nhà nghiên cứu bảo mật VaultVult phát hiện trong chương trình Bug Bounty của Tenor Labs — giao thức tài chính phi tập trung (DeFi) xây dựng trên nền tảng Morpho Midnight. Sự cố xuất phát từ một phép toán làm tròn xuống (rounding down) tưởng chừng đơn giản trong thư viện CollateralTransferLib.sol, cho phép kẻ tấn công thổi vồng tỷ lệ Loan-to-Value (LTV) của nạn nhân lên vô tận và kích hoạt lệnh thanh lý tài sản thế chấp ngay lập tức. Đáng chú ý, đoạn mã nguồn này từng chứa ghi chú (comment) của chính nhóm phát triển nhưng họ lại đánh giá sai tầm ảnh hưởng thực tế của nó.

1. Bối cảnh & Chi tiết kỹ thuật: Lỗi làm tròn từ 1 Wei lãi phát sinh

Tenor Labs cung cấp giải pháp cho phép người vay di chuyển vị thế (gồm nợ và tài sản thế chấp) giữa các thị trường khác nhau trên Morpho Midnight thông qua hợp đồng BorrowMidnightRenewalCallback.sol và thư viện CollateralTransferLib.sol. Quá trình tái cấu trúc khoản vay dựa trên nguyên tắc tỷ lệ thuận (pro-rata): số lượng tài sản thế chấp dịch chuyển phải tương ứng với số nợ được trả.

Để tính toán lượng tài sản thế chấp cần chuyển (collateralToTransfer), mã nguồn sử dụng hàm mulDivDown với công thức:

collateralToTransfer = mulDivDown(totalCollateral, repayAmount, totalDebt)

Trong môi trường DeFi, nợ (debt) liên tục tích lũy lãi suất theo từng block. Giả định vị thế của người dùng ban đầu có 1.000 ETH tài sản thế chấp (1000e18) và 1.000 ETH tiền nợ (1000e18). Chỉ sau một block, tổng nợ tăng thêm 1 wei do lãi suất, trở thành (1000e18 + 1) wei.

Kịch bản khai thác “Dust Fill” diễn ra như sau:

  • Kẻ tấn công thực hiện lệnh di chuyển khoản vay với số tiền trả nợ cực nhỏ (repayAmount = 1 wei).
  • Phép tính trở thành: 1000e18 * 1 / (1000e18 + 1) = 0.999999...
  • Do hàm mulDivDown bắt buộc làm tròn xuống số nguyên gần nhất, kết quả trả về của collateralToTransfer chính xác bằng 0.

Hệ quả là 1 wei nợ được xóa bỏ khỏi vị thế cũ nhưng không có bất kỳ tài sản thế chấp nào được chuyển sang thị trường mới. Khi lặp lại hoặc kết hợp thao tác này, kẻ tấn công cô lập khoản nợ mới mà không có tài sản bảo đảm (unbacked debt), đẩy LTV vượt mốc an toàn và kích hoạt bot thanh lý (liquidation bot) chiếm đoạt tài sản thế chấp gốc của nạn nhân.

Chuyên gia VaultVult đã dựng một Proof of Concept (PoC) hoàn chỉnh bằng Foundry framework, mô phỏng lại giao diện Morpho Midnight để chứng minh khoản nợ phát sinh bị đẩy LTV lên vô cực chỉ qua thao tác khớp lệnh lẻ (dust fill).

⚡ Tài nguyên & Đối tác Đề xuấtSponsored / AdSense
📚Chứng Chỉ Kỹ Sư AI, Full-Stack & DevOps Quốc Tế🎓 Lộ trình chuẩn Thung lũng Silicon

Khóa học thực chiến từ Google, DeepLearning.AI, IBM & AWS giúp làm chủ kiến trúc Microservices, System Design, RAG và Prompt Engineering.

Khám Phá Khóa Học →

2. Phân tích Đa chiều: Tối ưu UX đối đầu với Rủi ro Hệ thống

Lỗi bảo mật này phản ánh xung đột kinh điển trong thiết kế Smart Contract: cân bằng giữa trải nghiệm di chuyển vị thế mượt mà và tính chính xác tuyệt đối của toán học tài chính.

Ưu điểm của cơ chế di chuyển linh hoạt (Renewal Callback)

  • Trải nghiệm người dùng tối ưu: Giúp người vay đảo nợ hoặc tối ưu hóa lãi suất giữa các pool tài sản mà không cần qua nhiều bước rút/nạp thủ công.
  • Phân bổ vốn hiệu quả: Cho phép thanh toán từng phần khoản vay (partial migration) thay vì bắt buộc xử lý 100% vị thế cùng lúc.

Đánh đổi & Rủi ro tiềm ẩn từ giả định sai lầm

Điều nguy hiểm nhất trong sự cố Tenor Labs là lập trình viên đã biết về hành vi làm tròn. Đoạn comment trong mã nguồn ghi rõ: “hành vi làm tròn này tạm thời làm tăng LTV của vị thế đích cho đến khi vị thế được di chuyển hoàn toàn”. Tuy nhiên, họ mắc phải 2 sai lầm chiến lược:

  • Giả định về tính thời điểm: Đội ngũ phát triển cho rằng trạng thái “tạm thời” này không thể bị can thiệp. Thực tế trong môi trường Blockchain, kẻ tấn công có thể chèn giao dịch (front-run/back-run) ngay trong cùng một block để trục lợi trước khi vị thế kịp di chuyển xong.
  • Không kiểm soát giá trị biên (Edge Cases): Việc làm tròn xuống (round down) vốn được dùng để tránh thất thoát tài sản cho protocol, nhưng khi áp dụng sai vị trí trong công thức pro-rata, nó lại tạo ra lỗ hổng tạo tiền nợ ảo.

3. Góc nhìn & Khuyến nghị Thực chiến từ ZunLiz

Từ góc độ kỹ thuật và kiểm thử bảo mật Web3, vụ việc của Tenor Labs mang lại những bài học xương máu cho cả developer lẫn các security researcher.

Khuyến nghị cho Lập trình viên Smart Contract (Devs)

  • Xử lý triệt để giá trị 0 (Zero-check & Revert): Trong hàm CollateralTransferLib.sol, cần bổ sung điều kiện kiểm tra ngưỡng tối thiểu. Nếu phép tính collateralToTransfer trả về 0 trong khi repayAmount > 0, giao dịch phải bị revert ngay lập tức: require(collateralToTransfer > 0, "Collateral transfer too small");
  • Nguyên tắc làm tròn trong DeFi: Luôn ghi nhớ quy tắc vàng — Làm tròn có lợi cho Protocol nhưng phải triệt tiêu khả năng tạo ra nợ không tài sản đảm bảo. Khi tính lượng tài sản rút ra, hãy làm tròn xuống; nhưng khi tính nghĩa vụ nợ hoặc thế chấp tối thiểu, hãy làm tròn lên (mulDivUp).
  • Kiểm thử với biến số Dust (1 wei): Các bộ test suite (Foundry/Hardhat) bắt buộc phải bao phủ kịch bản nợ/tài sản bị lệch 1 wei do tích lũy lãi suất theo thời gian block.

Khuyến nghị cho Nhà nghiên cứu Bảo mật (Auditors / Researchers)

  • Đọc kỹ Developer Comments: Những ghi chú giải thích logic phức tạp của lập trình viên chính là “bản đồ kho báu”. Nơi nào dev ghi “tạm thời” (temporarily) hoặc “dự kiến” (assumes), nơi đó rất có thể chứa giả định sai về dòng tiền.
  • Khai thác trạng thái trung gian (State Invariants): Hãy luôn đặt câu hỏi: “Tôi có thể đóng băng hoặc trục lợi từ trạng thái trung gian này trước khi giao dịch hoàn tất không?”. Trong DeFi, không có khái niệm an toàn “tạm thời” nếu trạng thái đó có thể bị đọc bởi một hợp đồng thông minh khác.

Sự cố trên Morpho Midnight một lần nữa khẳng định: Bảo mật Smart Contract không chỉ nằm ở việc tránh các lỗi kinh điển như Reentrancy hay Overflow, mà nằm ở sự chính xác tuyệt đối của toán học trong mọi điều kiện biên.


🔗 Nguồn tin gốc & Thảo luận: How I Found a High-Severity Rounding Vulnerability in Morpho Midnight (Tenor Labs) (Ghi nhận từ Dev.to Latest Engineering).
💼 Dịch Vụ Kỹ Thuật & Hợp Tác Doanh Nghiệp

Cần triển khai AI Chatbot, tối ưu Cloud/DevOps hoặc đặt Quảng cáo trên ZunLiz.com?

Đội ngũ kỹ sư ZunLiz nhận tư vấn, xây dựng hệ thống tự động hóa AI, cấu hình máy chủ High-Availability và hợp tác truyền thông công nghệ.

🚀 Xem Bảng Giá Dịch Vụ
ZunLiz
Tác giả: ZunLiz✓ Verified Creator

Kỹ sư phần mềm, nhà sáng tạo nội dung công nghệ & AI. Chuyên nghiên cứu các giải pháp tối ưu hệ thống, Cloudflare, Docker và tích hợp trí tuệ nhân tạo vào sản phẩm số.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *