Lỗ hổng của Curve pool gần đây khác với các sự cố hack tiền điện tử mà chúng ta đã thấy trước đây, bởi vì lần này vấn đề không liên quan trực tiếp đến lỗ hổng của chính hợp đồng thông minh mà liên quan đến trình biên dịch cơ bản của ngôn ngữ lập trình mà Vyper sử dụng.

Vyper là ngôn ngữ lập trình hướng đến hợp đồng thông minh áp dụng phong cách giống Python và được thiết kế đặc biệt để tương tác với Máy ảo Ethereum (EVM).

Tác động của lỗ hổng này là rất nghiêm trọng và số lượng tổn thất khổng lồ được đưa tin hàng ngày. Tình hình dường như đã được kiểm soát, nhưng không phải trước khi tin tặc đánh cắp hơn 70 triệu USD. Theo đánh giá sau của LlamaRisk, một số nhóm dự án DeFi cũng bị tin tặc tấn công, bao gồm nhóm pETH/ETH của PEGD bị mất 11 triệu USD, nhóm msETH/ETH của Metronome mất 3,4 triệu USD và nhóm alETH/ETH của Alchemix mất 11 triệu USD. triệu đô la Mỹ, trong khi nhóm Curve DAO mất khoảng 24,7 triệu đô la Mỹ.

Lỗ hổng này được gọi là lỗi reentrancy và nó chủ yếu xuất hiện trong một số phiên bản ngôn ngữ lập trình Vyper, cụ thể là v0.2.15, v0.2.16 và v0.3.0. Do đó, các dự án sử dụng các phiên bản Vyper cụ thể này có thể trở thành mục tiêu tấn công.

Sự tái nhập là gì?​

Để hiểu lý do tại sao lỗ hổng này xảy ra, trước tiên chúng ta hãy hiểu reentrancy là gì và nó hoạt động như thế nào.

Cái gọi là reentrancy có nghĩa là một chức năng có thể bị gián đoạn trong quá trình thực thi và được gọi lại một cách an toàn trước khi cuộc gọi trước đó hoàn tất. Cơ chế này thường được sử dụng trong các ứng dụng như xử lý ngắt phần cứng và đệ quy.

Để một hàm được vào lại, nó cần phải đáp ứng một số điều kiện:

Đầu tiên, nó không thể sử dụng dữ liệu toàn cầu và tĩnh. Đây là một quy ước, có nghĩa là khi hàm được thực thi, không dựa vào dữ liệu toàn cục hoặc các biến tĩnh. Bởi vì nếu một chức năng bị gián đoạn trong quá trình thực thi và sau đó được gọi lại, dữ liệu tĩnh và toàn cục có thể bị hỏng hoặc thông tin có thể bị mất.

Thứ hai, nó không thể sửa đổi mã của chính nó. Bất kể khi nào một chức năng bị gián đoạn, nó vẫn có thể tiếp tục thực thi theo cách tương tự. Nếu một hàm sửa đổi mã của chính nó trong khi thực thi thì có thể xảy ra lỗi khi gọi lại.

Cuối cùng, nó không thể gọi các chức năng khác không được cấp lại. Nghĩa là, trong một hàm được gửi lại, bạn không nên gọi các hàm khác có thể không được gửi lại. Vì nếu làm như vậy có thể gây ra kết quả không lường trước được, khiến chương trình bị treo hoặc bị lỗi.

Khó hiểu quá nên chúng ta sẽ không đi sâu vào chi tiết.

Nó đã được khai thác như thế nào?

Hãy giải thích các cuộc tấn công tái nhập đã dẫn đến việc đánh cắp tiền và mất 70 triệu USD trong cuộc tấn công Curve như thế nào.

Trước hết, chúng ta biết rằng cuộc tấn công reentrancy đề cập đến một phương thức trong đó hợp đồng độc hại liên tục gọi một chức năng trong hợp đồng thông minh. Trong cuộc tấn công Curve, chức năng này được sử dụng để rút tính thanh khoản của người dùng trong nhóm. Chức năng này có một nhược điểm là không thực hiện đủ các bước kiểm tra trước khi cập nhật số tiền.

Chúng ta hãy xem quá trình cụ thể của cuộc tấn công:

  1. Giả sử một hợp đồng thông minh dễ bị tổn thương có 10 ether.

  2. Kẻ tấn công gọi hàm gửi tiền và gửi 1 Ethereum.

  3. Kẻ tấn công sau đó gọi chức năng rút tiền và chuẩn bị rút 1 Ethereum. Trong chức năng này, nó kiểm tra xem kẻ tấn công có 1 Ethereum trong tài khoản của mình hay không.

  4. Tuy nhiên, chức năng này không cập nhật số dư trong hợp đồng trước khi chuyển 1 Ether vào tài khoản của kẻ tấn công. Điều này có nghĩa là hợp đồng vẫn cho rằng có 10 ether bên trong.

  5. Kẻ tấn công gọi lại chức năng rút tiền (re-entry) và chuẩn bị rút lại 1 Ethereum.

  6. Bởi vì hợp đồng vẫn cho rằng có 10 ether bên trong nên nó sẽ chuyển lại 1 ether cho kẻ tấn công.

  7. Quá trình này lặp lại cho đến khi hợp đồng không còn thanh khoản nữa.

Bằng cách này, kẻ tấn công có thể liên tục gọi chức năng rút tiền và chuyển gần như toàn bộ thanh khoản trong hợp đồng vào tài khoản của chính mình, khiến số tiền trong hợp đồng bị đánh cắp.

Lỗ hổng này rất có lợi cho kẻ tấn công vì số tiền trong hợp đồng không được cập nhật theo thời gian thực, cho phép kẻ tấn công lặp lại cuộc tấn công cho đến khi không còn tiền để rút trong hợp đồng. #Crv