Vào ngày 9 tháng 7 năm 2025, theo hệ thống giám sát bảo mật SlowMist MistEye, nền tảng giao dịch phi tập trung có tiếng GMX (@GMX_IO) đã bị tấn công và mất tài sản trị giá hơn 42 triệu đô la Mỹ.
Tác giả: Cửu Cửu, Khổng, Lisa
Biên tập bởi: Liz
bối cảnh
Vào ngày 9 tháng 7 năm 2025, theo dữ liệu giám sát an ninh của SlowMist MistEye, nền tảng giao dịch phi tập trung có tiếng GMX (@GMX_IO) đã bị tấn công, gây thiệt hại tài sản trị giá hơn 42 triệu đô la Mỹ. Đội ngũ an ninh SlowMist đã ngay lập tức phân tích sự cố và tóm tắt kết quả như sau:

Thông tin liên quan
Địa chỉ của kẻ tấn công:
https://arbiscan.io/address/0xdf3340a436c27655ba62f8281565c9925c3a5221
Địa chỉ hợp đồng tấn công:
https://arbiscan.io/address/0x7d3bd50336f64b7a473c51f54e7f0bd6771cc355
Địa chỉ của hợp đồng dễ bị tấn công:
https://arbiscan.io/address/0x3963ffc9dff443c2a94f21b129d429891e32ec18
Giao dịch tấn công:
https://arbiscan.io/tx/0x03182d3f0956a91c4e4c8f225bbc7975f9434fab042228c7acdc5ec9a32626ef
nguyên nhân gốc rễ
Có hai lý do chính cho cuộc tấn công lần :
Một là GMX v1 cập nhật giá trị của giá trung bình đầu cơ giá xuống toàn cầu (globalShortAveragePrices) khi đầu cơ giá xuống được tạo ra, nhưng không cập nhật khi đầu cơ giá xuống được đóng lại.
Thứ hai, GMX v1 sẽ ngay lập tức tăng quy mô vị thế đầu cơ giá xuống toàn cầu (globalShortSizes) khi xử lý vị thế đầu cơ giá xuống .
Hai yếu tố này ảnh hưởng trực tiếp đến việc tính toán tổng tài sản được quản lý (AUM), từ đó dẫn đến việc thao túng giá token GLP.
Kẻ tấn công đã khai thác lỗ hổng thiết kế này và thành công trong việc tạo ra một vị thế đầu cơ giá xuống lớn bằng cách kích hoạt tính năng timelock.enableLeverage của Keeper khi thực hiện lệnh (điều kiện cần thiết để tạo lệnh short lớn), thao túng giá trung bình toàn cầu và quy mô vị thế đầu cơ giá xuống toàn cầu, tăng giá GLP một cách giả tạo trong một giao dịch duy nhất và kiếm lợi nhuận thông qua các hoạt động mua lại.
Chuẩn bị tấn công
- Kẻ tấn công đầu tiên sử dụng hai giao dịch trước để tạo vị thế long cho hợp đồng tấn công, sau đó tạo lệnh giảm vị thế có thể được Keeper thực hiện.

- Sau khi nhận được lệnh giảm vị thế, Keeper sẽ gọi hàm executeDecreaseOrder của hợp đồng PositionManager để thực hiện thao tác giảm vị thế cho hợp đồng tấn công. Trước tiên, Trong đó sẽ gọi hàm enableLeverage của hợp đồng Timelock để kích hoạt _isLeverageEnabled trong hợp đồng Vault, đây là điều kiện cần thiết để trực tiếp tạo đầu cơ giá xuống vị thế bán khống trong quá trình tấn công tiếp theo.

Sau đó, hàm executeDecreaseOrder của hợp đồng OrderBook sẽ được gọi để thực thi logic cụ thể của việc giảm vị thế. Sau khi cập nhật vị thế của hợp đồng tấn công, token thế chấp thu được từ việc giảm vị thế sẽ được chuyển sang hợp đồng tấn công. Vì token thế chấp là WETH, WETH sẽ được đổi lại thành ETH trước khi được chuyển sang hợp đồng tấn công, kích hoạt hàm dự phòng được xây dựng trong hợp đồng tấn công để thực hiện các thao tác nhập lại tiếp theo.

- Hàm dự phòng của hợp đồng tấn công trước tiên sẽ chuyển 3001 USDC vào hợp đồng Vault, và gọi hàm increasePosition của hợp đồng Vault để mở một lệnh short WBTC gấp 30 lần. Sau đó, một lệnh đóng tương ứng sẽ được tạo cho vị thế để Keeper có thể tiếp tục thực hiện lệnh sau.

Trong hàm increasePosition, hàm _validate nội bộ được gọi trước để kiểm tra xem isLeverageEnabled có đúng hay không. Chỉ khi Keeper thực thi lệnh thì _isLeverageEnabled mới được bật trước, để kiểm tra ở bước này được thông qua. Nếu hàm được gọi trực tiếp, việc mở vị thế vị thế sẽ không thể thành công. Điều này cũng cho thấy mục đích của kẻ tấn công khi tạo lệnh giảm là cho phép Keeper thực thi lệnh giảm và nhập lại hàm dự phòng để gọi hàm increasePosition, và trực tiếp tạo đầu cơ giá xuống vị thế bán khống.

Ngoài ra, do giá trị của globalShortAveragePrices được cập nhật khi mở vị thế thông qua hàm increasePosition, và giá trị của globalShortAveragePrices không được cập nhật khi giảm hoặc đóng vị thế thông qua hàm decreasePosition, kẻ tấn công có thể liên tục tạo các lệnh short với 3.000 USDC, sau đó ngay lập tức cho Keeper đóng lệnh bán khống, qua đó thao túng giá trị của globalShortAveragePrices, khiến giá trị cuối cùng thấp hơn giá WBTC thông thường khoảng 57 lần. (Lưu ý rằng tất cả các giao dịch short và bán khống trên WBTC đều được hoàn tất khi Keeper thực hiện lệnh giảm vị thế)

Giá bán đầu cơ giá xuống trung bình toàn cầu (GlobalShortAveragePrice) khi short WBTC lần đầu thông qua tái tham gia là 108757787000274036210359376021024492. Giá đầu cơ giá xuống trung bình toàn cầu (GlobalShortAveragePrice) khi short WBTC lần cuối trước khi thực hiện giao dịch tấn công chính thức là 1913705482286167437447414747675542, chênh lệch khoảng 57 lần.

Các bước tấn công chính thức
- Sau khi nhận được lệnh giảm được tạo trong lần nhập lại gần nhất, Keeper sẽ gọi hàm executeDecreaseOrder của hợp đồng OrderBook để thực hiện lệnh giảm. Khi ETH thu được từ lệnh giảm được chuyển sang hợp đồng tấn công, hàm dự phòng của nó sẽ được kích hoạt.

- Đầu tiên, trong đó sẽ vay 7,538 triệu USDC từ Khoản vay nhanh Uniswap , sau đó gọi hàm mintAndStakeGlp của hợp đồng RewardRouterV2 đúc 4,129 triệu token GLP trong đó 6 triệu USDC và thế chấp chúng.

Giá trị AumInUsdg thu được trong quá trình đúc là 46942248263037264990037614.

Kích thước vị thế đầu cơ giá xuống toàn cầu (globalShortSizes) và giá bán đầu cơ giá xuống trung bình toàn cầu (getGlobalShortAveragePrice) của WBTC lần lượt là 1537306111409295910700000000000000000 và 1913705482286167437447414747675542.

- Tiếp theo, hợp đồng tấn công gọi hàm increasePosition của hợp đồng Vault, chuyển USDC vào Vault và tạo ra một vị thế đầu cơ giá xuống WBTC lớn trị giá 15,385 triệu.

Khi kết thúc hàm increasePosition, phần này của các vị thế đầu cơ giá xuống lớn mới mở vị thế sẽ được sử dụng để cập nhật kích thước vị thế đầu cơ giá xuống toàn cầu, do đó kích thước vị thế đầu cơ giá xuống toàn cầu (globalShortSizes) sẽ được tăng lên ngay lập tức.

- Sau đó, sau khi hoàn tất vị thế đầu cơ giá xuống lớn, hợp đồng tấn công ngay lập tức gọi hàm unstakeAndRedeemGlp để hủy đặt cược và đổi token GLP.

Tuy nhiên, chúng ta có thể thấy ở đây chỉ có 386.000 GLP được đổi nhưng 9.731.000 token USDG đã bị đốt, và cuối cùng 88 WBTC đã được chuyển sang hợp đồng tấn công. Tại sao lại như vậy? Hãy tiếp tục theo dõi trong hàm _removeLiquidity của hợp đồng GlpManager:

Khi người dùng đổi token GLP, hàm sẽ sử dụng công thức sau để tính số token USDG cần đốt: usdgAmount = _glpAmount * aumInUsdg / glpSupply. Số USDG này sau đó sẽ được chuyển vào Vault và được bán để đổi lấy tài sản(WBTC) mà người dùng cần đổi. Phương pháp tính toán aum gần đúng như trong đó :
aum = ((totalPoolAmounts - totalReservedAmounts) * price) + totalGuaranteedUsd + GlobalShortLoss ( lỗ vốn vị thế bán đầu cơ giá xuống toàn cầu) - GlobalShortProfits (lợi nhuận vị thế đầu cơ giá xuống toàn cầu) - aumDeduction

Vì một vị thế đầu cơ giá xuống lớn đã được tạo ở bước trước, quy mô vị thế đầu cơ giá xuống toàn cầu đã tăng lên, và vì giá trung bình toàn cầu (getGlobalShortAveragePrice) trước đó đã bị thao túng để thấp hơn nhiều so với giá thông thường, nên phần này của vị thế đầu cơ giá xuống đã bị lỗ vốn (tức là hasProfit bị sai), khiến GlobalShortLoss ( lỗ vốn vị thế đầu cơ giá xuống toàn cầu) tăng lên hàng trăm lần, khiến AUM bị thao túng và khuếch đại (aum + delta). Cuối cùng, kẻ tấn công đã sử dụng AUM bị thao túng để mua lại tài sản vượt quá số tiền thông thường.

- Cuối cùng, kẻ tấn công tiếp tục sử dụng AUM bị thao túng để gọi hàm unstakeAndRedeemGlp nhằm đổi tài sản khác trong Vault để kiếm lời.

Phân tích MistTrack
Theo phân tích của công cụ theo dõi và chống rửa tiền Chuỗi MistTrack, địa chỉ kẻ tấn công ban đầu (0xdf3340a436c27655ba62f8281565c9925c3a5221) đã kiếm được lợi nhuận hơn 42 triệu đô la Mỹ, bao gồm:

Tình hình chuyển tiền được tóm tắt như sau:
- Sau khi địa chỉ kẻ tấn công ban đầu kiếm được lợi nhuận trên Arbitrum , kẻ tấn công này đã nhanh chóng chuyển tài sản như WETH, WBTC và Dai đến địa chỉ chuyển tiền (0x99cdeb84064c2bc63de0cea7c6978e272d0f2dae) và sử dụng nhiều DEX và cầu nối xuyên chuỗi như CoW Swap, Across Protocol, Stargate Finance và Mayan Finance để trao đổi tài sản và chuyển chúng qua Chuỗi đến Ethereum.

- Kẻ tấn công chủ yếu đổi USDC lấy Dai và sau đó lấy ETH thông qua CoW Swap .

- Lượng lớn tài sản cuối cùng đã được chuyển đổi thành ETH và hiện tại tổng cộng 11.700 ETH đã chảy vào địa chỉ (0x6acc60b11217a1fd0e68b0ecaee7122d34a784c1).

Điều đáng chú ý là số tiền ban đầu của kẻ tấn công đến từ 2 ETH được chuyển từ Tornado Cash vào ngày 7 tháng 7, sau đó 2 ETH này được chuyển qua Chuỗi đến Arbitrum thông qua Mayan Finance, cung cấp Gas ban đầu cho toàn bộ quá trình tấn công.

Tính đến thời điểm hiện tại, số dư như sau:
Địa chỉ Arbitrum 0xdf3340a436c27655ba62f8281565c9925c3a5221, số dư 10.494.796 Legacy Frax Dollar và 1,07 ETH;
Địa chỉ Ethereum 0xa33fcbe3b84fb8393690d1e994b6a6adc256d8a3, số dư 3000 ETH;
Địa chỉ Ethereum 0xe9ad5a0f2697a3cf75ffa7328bda93dbaef7f7e7, số dư 3000 ETH;
Địa chỉ Ethereum 0x69c965e164fa60e37a851aa5cd82b13ae39c1d95, số dư 3000 ETH;
Địa chỉ Ethereum 0x639cd2fc24ec06be64aaf94eb89392bea98a6605, số dư 2700 ETH.
Chúng tôi sẽ tiếp tục theo dõi nguồn quỹ.
Tóm tắt
Điểm cốt lõi của cuộc tấn công lần là kẻ tấn công đã lợi dụng hai tính năng của hệ thống Keeper: đòn bẩy được kích hoạt khi thực hiện lệnh, và giá trung bình toàn cầu được cập nhật khi short nhưng không cập nhật khi đóng các vị thế bán khống. Một vị thế đầu cơ giá xuống lớn đã được tạo ra thông qua một cuộc tấn công tái nhập, và các giá trị của giá bán đầu cơ giá xuống trung bình toàn cầu và quy mô vị thế đầu cơ giá xuống toàn cầu đã bị thao túng, do đó trực tiếp khuếch đại giá GLP để thu lợi nhuận.
Đội ngũ bảo mật SlowMist khuyến nghị chủ dự án nên bổ sung tính năng bảo vệ khóa tái nhập vào các chức năng cốt lõi dựa trên logic việc kinh doanh của riêng họ và hạn chế nghiêm ngặt tác động trực tiếp của một yếu tố duy nhất lên giá. Ngoài ra, cần tăng cường kiểm toánkiểm toán kiểm tra bảo mật đối với các quy tắc hợp đồng của dự án để tránh những tình huống tương tự.
Tuyên bố miễn trừ trách nhiệm: Là một nền tảng thông tin blockchain, các bài viết được đăng trên trang web này chỉ đại diện cho quan điểm cá nhân của tác giả và khách mời, và không liên quan gì đến quan điểm của Web3Caff. Thông tin trong bài viết chỉ mang tham khảo và không cấu thành bất kỳ lời khuyên hay ưu đãi đầu tư nào. Vui lòng tuân thủ luật pháp và quy định hiện hành của quốc gia hoặc khu vực của bạn.
Chào mừng bạn tham gia cộng đồng chính thức Web3Caff : Tài khoản X (Twitter) | Nghiên cứu Web3Caff Tài khoản X (Twitter) | Nhóm độc giả WeChat | Tài khoản công khai WeChat




