GMX đã遭遭 tấn công bởi hacker, thiệt hại hơn 40 triệu đô la. Kẻ tấn công đã lợi dụng một lỗ hổng có thể tái nhập và thực hiện tấn công trong trường hợp hợp đồng kích hoạt chức năng đòn bẩy để mở vị thế bán.
Nguyên nhân của vấn đề nằm ở việc hàm executeDecreaseOrder bị sử dụng sai. Tham số đầu tiên của hàm này đáng lẽ phải là tài khoản bên ngoài (EOA), nhưng kẻ tấn công đã truyền vào một địa chỉ hợp đồng thông minh. Điều này cho phép kẻ tấn công có thể quay trở lại hệ thống trong quá trình thanh lý, thao túng trạng thái nội bộ, và cuối cùng tài sản được thanh lý vượt xa giá trị GLP thực tế mà họ nắm giữ.
Cơ chế hoàn trả GLP bình thường
Trong GMX, GLP là token của nhà cung cấp thanh khoản, đại diện cho tỷ lệ sở hữu tài sản trong kho (như USDC, ETH, WBTC). Khi người dùng gọi unstakeAndRedeemGlp, hệ thống sẽ sử dụng công thức sau để tính toán số lượng tài sản sẽ được hoàn trả:
AUM = Tổng giá trị của tất cả các hồ token + Lỗ chưa thực hiện toàn cầu - Lợi nhuận chưa thực hiện toàn cầu - Số tiền đã dự trữ - Giảm trừ đã thiết lập (aumDeduction)
Cơ chế này đảm bảo rằng những người nắm giữ GLP sẽ nhận được phần tài sản thực tế của kho theo tỷ lệ.
Vấn đề sau khi mở đòn bẩy
Khi enableLeverage được bật, người dùng có thể mở vị thế đòn bẩy (mua hoặc bán). Kẻ tấn công đã mở một vị thế bán lớn WBTC trước khi rút GLP.
Do việc mở vị thế bán làm tăng quy mô vị thế bán toàn cầu, trong khi giá vẫn chưa thay đổi, hệ thống mặc định coi vị thế bán này là lỗ, và phần lỗ chưa thực hiện này sẽ được tính là "tài sản" của kho quỹ, dẫn đến AUM tăng lên một cách nhân tạo. Mặc dù kho quỹ không thực sự có giá trị bổ sung, nhưng việc tính toán hoàn lại sẽ dựa trên AUM cao hơn này, do đó khiến kẻ tấn công nhận được tài sản nhiều hơn so với những gì họ đáng được.
Quy trình tấn công
tấn công giao dịch
Viết ở phần cuối
Cuộc tấn công này đã phơi bày những thiếu sót nghiêm trọng trong cơ chế đòn bẩy và thiết kế bảo vệ chống gọi lại của GMX. Vấn đề cốt lõi nằm ở chỗ logic thu hồi tài sản quá tin tưởng vào AUM, không thực hiện kiểm tra an toàn thận trọng đủ đối với các thành phần của nó (như thua lỗ chưa thực hiện). Đồng thời, giả định về danh tính của người gọi trong các hàm quan trọng (EOA so với hợp đồng) cũng thiếu kiểm tra bắt buộc. Sự kiện này một lần nữa nhắc nhở các nhà phát triển rằng, khi thực hiện các giao dịch nhạy cảm về tài chính, họ phải đảm bảo rằng trạng thái hệ thống không thể bị thao túng, đặc biệt là khi đưa vào các logic tài chính phức tạp (như đòn bẩy, sản phẩm phái sinh), cần phải phòng ngừa rủi ro hệ thống do gọi lại và ô nhiễm trạng thái.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
BlockSec:Phân tích nguyên lý tấn công GMX
Tác giả: BlockSec
GMX đã遭遭 tấn công bởi hacker, thiệt hại hơn 40 triệu đô la. Kẻ tấn công đã lợi dụng một lỗ hổng có thể tái nhập và thực hiện tấn công trong trường hợp hợp đồng kích hoạt chức năng đòn bẩy để mở vị thế bán.
Nguyên nhân của vấn đề nằm ở việc hàm executeDecreaseOrder bị sử dụng sai. Tham số đầu tiên của hàm này đáng lẽ phải là tài khoản bên ngoài (EOA), nhưng kẻ tấn công đã truyền vào một địa chỉ hợp đồng thông minh. Điều này cho phép kẻ tấn công có thể quay trở lại hệ thống trong quá trình thanh lý, thao túng trạng thái nội bộ, và cuối cùng tài sản được thanh lý vượt xa giá trị GLP thực tế mà họ nắm giữ.
Cơ chế hoàn trả GLP bình thường
Trong GMX, GLP là token của nhà cung cấp thanh khoản, đại diện cho tỷ lệ sở hữu tài sản trong kho (như USDC, ETH, WBTC). Khi người dùng gọi unstakeAndRedeemGlp, hệ thống sẽ sử dụng công thức sau để tính toán số lượng tài sản sẽ được hoàn trả:
redeem_amount = (user_GLP / total_GLP_supply) * AUM
Trong đó cách tính AUM (Tổng tài sản quản lý) là:
AUM = Tổng giá trị của tất cả các hồ token + Lỗ chưa thực hiện toàn cầu - Lợi nhuận chưa thực hiện toàn cầu - Số tiền đã dự trữ - Giảm trừ đã thiết lập (aumDeduction)
Cơ chế này đảm bảo rằng những người nắm giữ GLP sẽ nhận được phần tài sản thực tế của kho theo tỷ lệ.
Vấn đề sau khi mở đòn bẩy
Khi enableLeverage được bật, người dùng có thể mở vị thế đòn bẩy (mua hoặc bán). Kẻ tấn công đã mở một vị thế bán lớn WBTC trước khi rút GLP.
Do việc mở vị thế bán làm tăng quy mô vị thế bán toàn cầu, trong khi giá vẫn chưa thay đổi, hệ thống mặc định coi vị thế bán này là lỗ, và phần lỗ chưa thực hiện này sẽ được tính là "tài sản" của kho quỹ, dẫn đến AUM tăng lên một cách nhân tạo. Mặc dù kho quỹ không thực sự có giá trị bổ sung, nhưng việc tính toán hoàn lại sẽ dựa trên AUM cao hơn này, do đó khiến kẻ tấn công nhận được tài sản nhiều hơn so với những gì họ đáng được.
Quy trình tấn công
tấn công giao dịch
Viết ở phần cuối
Cuộc tấn công này đã phơi bày những thiếu sót nghiêm trọng trong cơ chế đòn bẩy và thiết kế bảo vệ chống gọi lại của GMX. Vấn đề cốt lõi nằm ở chỗ logic thu hồi tài sản quá tin tưởng vào AUM, không thực hiện kiểm tra an toàn thận trọng đủ đối với các thành phần của nó (như thua lỗ chưa thực hiện). Đồng thời, giả định về danh tính của người gọi trong các hàm quan trọng (EOA so với hợp đồng) cũng thiếu kiểm tra bắt buộc. Sự kiện này một lần nữa nhắc nhở các nhà phát triển rằng, khi thực hiện các giao dịch nhạy cảm về tài chính, họ phải đảm bảo rằng trạng thái hệ thống không thể bị thao túng, đặc biệt là khi đưa vào các logic tài chính phức tạp (như đòn bẩy, sản phẩm phái sinh), cần phải phòng ngừa rủi ro hệ thống do gọi lại và ô nhiễm trạng thái.