logo
  • Tin tức
  • Báo cáo
  • Sự kiện
  • Nổi bật
  • Coin68 TV
  • E-Magazine
  • Góc nhìn
  • Báo cáo
  • Sự kiện
  • Nổi bật
  • Coin68 TV
  • E-Magazine
  • Góc nhìn
ads

Hacker đã tấn công Alpha Homora như thế nào?

-14/02/2021

Vụ exploit diễn ra với Alpha Homora mới đây đã khiến nền tảng thiệt hại khoảng 37,5 triệu USD. Tuy nhiên, điều làm người ta choáng ngợp đó chính là các bước thao tác được tính toán tỉ mỉ của hacker, bao gồm tận 9 giao dịch phức tạp. Hãy cùng điểm lại thủ thuật trong vụ exploit này dưới đây nhé.

Hacker đã tấn công Alpha Homora như thế nào?
Hacker đã tấn công Alpha Homora như thế nào?

Tuy nhiên cần phải lưu ý trước với quý bạn đọc đó là nội dung dưới đây hết sức phức tạp và phần nào đó là nặng về kỹ thuật. Quý độc giả cân nhắc trước khi tiến vào nội dung chính.

Những lỗ hổng đã bị lợi dụng:

  1. Smart Contract cho phép bất cứ ai cũng có thể tương tác.
  2. Pool sUSD vẫn chưa chính thức đi vào hoạt động, song vẫn cho phép tương tác, giúp hacker dễ dàng chiếm quyền kiểm soát pool.
  3. Cơ chế làm tròn bị lợi dụng, khiến hệ thống vô tình làm tròn số dư vay, trả và bị đánh lừa bởi thủ thuật của hacker.

Các bước tấn công

Bước 1: Hacker tạo một spell (spell tạm coi như giống một chiến lược đầu tư trong các vault của Yearn).

Bước 2: Swap ETH ra UNI, cung cấp ETH và UNI vào các pool thanh khoản để nhận token LP là ETH-UNI. Trong cùng giao dịch này, hacker lập trình thêm một bước là đổi ETH ra sUSD trên Uniswap và nạp sUSD vào hệ thống Iron Bank để lấy token cysUSD (yearn-synth-sUSD).

Bước 3: Kích hoạt chiến lược spell (tới hợp đồng của Alpha Homora V2) với các khâu:

  • Mượn 1.000 sUSD
  • Nạp token LP UNI-WETH vào dưới dạng WERC-20, sau đó dùng khoản thế chấp này để vượt qua điều kiện “thế chấp > tổng giá trị vay”.
  • Vào thời điểm này, hacker có debt share là 1.000 sUSD. Điều này là vì pool sUSD chưa được chính thức đi vào hoạt động và đây là lỗ hổng đầu tiên được đề cập ở đầu bài.

Bước 4: Kích hoạt spell một lần nữa tới hợp đồng của Alpha Homora V2:

  • Hoàn trả 1000000098548938710983 sUSD, trong khi tổng số tiền phải trả đính kèm lãi suất sẽ là 1000000098548938710984 sUSD. 
  • Bây giờ hacker sẽ có 1 minisUSD nợ (gọi là mini vì nó là số dư phần trăm rất nhỏ) và 1 debt share.

Bước 5: Gọi hàm “resolveReserve” đến quỹ sUSD, vay thêm 19709787742196 debt, tổng Share (totalShare) giờ vẫn là 1.

  • Tổng số vay = 19709787742197 (do cộng thêm 1 minisUSD) và totalShare = 1

Bước 6: Tiếp tục gọi spell (tái lập bước này đến 16 lần, lần sau sẽ vay gấp đôi lần trước).

  • Vay 19709787742196 minisUSD và lần này trực tiếp chuyển vào tài khoản của hacker.
  • Mỗi lần vay, số lượng sẽ gấp đôi lần trước. Ví dụ:
Lần Vay TotalDebt – Tổng giá trị vay Borrow share
1 19709787742196 19709787742197 1
2 19709787742196 19709787742197 * 2 1
3 19709787742196 * 2 19709787742197 * 4 1
16 19709787742196 * 2^14 19709787742197 * 2^15 1

Tại sao vay thêm nhưng borrow share không tăng? Đó là vì thuật toán bị đánh lừa bởi cách làm tròn (như lỗ hổng thứ 2 đã được nêu ở đầu bài) và hệ thống xem việc vay này như không vay. So sánh có thể khập khiễng, nhưng nó có thể giống như việc bạn mượn ai đó 500 đồng gửi xe lần 1, họ xí xoá, bạn tiếp tục lần 2, 3, 4…Đến khi mượn được 10 lần thì có được 5.000 dư ra. Nhưng với trường hợp của vụ hack, đó là cấp số mũ, do đó khoản tiền dôi ra là rất lớn.

Cuối giao dịch, hacker gửi 19,54 sUSD tới Iron Bank của Cream.

Bước 7: Hacker tiếp tục triển khai spell đến Alpha Homora, lần sau vay gấp đôi lần trước.

  • Cuối giao dịch, hacker gửi 1.321 sUSD vào Iron Bank của Cream.

Bước 8:

  • Thực hiện Flashloan (vay nóng) 1.800.000 USDC từ Aave.
  • Swap 1.800.000 USDC thành 1.770.757,56254472419047906 sUSD, tiếp tục nạp lượng tiền này vào Cream để có đủ tài sản thế chấp nhằm thực hiện khoản vay với spell đã được thiết lập ở các bước trước. (bước b).
  • Tiếp tục tăng gấp đôi lượng sUSD vay (thực hiện 10 lần), từ 1.322,7 sUSD lên 677.223,15 sUSD.
  • Swap 1.353.123,59 sUSD sang 1.374.960,72 USDC trên nền tảng Curve.
  • Vay 426.659,27 USDC từ Cream (vì trước đó hacker đã nạp thế chấp bằng sUSD ở bước b).

Bước 9: Thực hiện lại bước 8 với giá trị USDC là xấp xỉ 10 triệu đô. Song có điểm khác biệt là sẽ không vay thêm USDC từ Cream ở cuối giao dịch.

Bước 10: 

  • Mượn 13.244,63 WETH + 3,6 triệu USDC + 5,6 triệu USDT + 4,26 triệu DAI.
  • Nạp stablecoin vào Aave (để nhận aToken và giúp USDC cùng USDT không bị đóng băng).
  • Cung cấp aDAI, aUSDT và aUSDC tới pool a3Crv của Curve.

Pool này là pool thanh khoản cho nạp cả 3 loại stablecoin của Curve.

Bước 11: Sau khi cung cấp stablecoin vào pool Curve, nhận về LP token a3Crv và nạp vào gauge thanh khoản của Curve.

Tổng thiệt hại theo từng bước:

+ Bước 8: 426.659,27 USDC

+ Bước 10: 

  • 4.263.138,929122643119834654 DAI
  • 3.997.921,01617 USDC
  • 5.647.242,107646 USDT
  • 13.244,630331762545750401 WETH

Coin68 tổng hợp

Có thể bạn quan tâm:

-14/02/2021
logo-footer
Kết nối với chúng tôi
    Coin68 là nơi cung cấp cái nhìn tổng quan nhanh và chính xác nhất về tiến bộ công nghệ blockchain trên toàn cầu.
      Copyright © 2016 by Coin68