Các sự cố bảo mật có thể xảy ra với ERC777 và các hợp đồng cuộc gọi tùy ý

Gần đây, khi làm việc với một trong những khách hàng của mình, chúng tôi đã phát hiện ra một lỗi thú vị có khả năng trở thành phương tiện tấn công đối với một số dự án DeFi. Lỗi này đặc biệt liên quan đến tiêu chuẩn mã thông báo ERC777 nổi tiếng. Ngoài ra, nó không chỉ là một vấn đề vào lại đơn giản phổ biến giữa các tin tặc nổi tiếng.

Bài viết này cung cấp giải thích toàn diện về ERC777, bao gồm tất cả các chi tiết cần thiết. Có rất ít tài nguyên để đi sâu vào các chi tiết cụ thể của mã thông báo ERC777 và bài viết này là một hướng dẫn chi tiết có giá trị cho bất kỳ ai quan tâm đến việc tìm hiểu thêm về mã thông báo ERC777.

Trong phần cuối của bài viết, những phát hiện gần đây của chúng tôi sẽ được giải thích.

Một mô tả ngắn về vectơ tấn công

Lỗ hổng này tận dụng các đặc điểm của ERC777 và có thể thiết lập chức năng nhận Hook. Bằng cách sử dụng khả năng thực hiện các cuộc gọi tùy ý trong hợp đồng đích, kẻ gọi độc hại có thể gọi hợp đồng đăng ký ERC777 và chỉ định một địa chỉ Hook cụ thể cho hợp đồng đích. Do đó, bất cứ khi nào hợp đồng mục tiêu nhận được mã thông báo ERC777 trong tương lai, hợp đồng Hook của kẻ tấn công sẽ được kích hoạt. Móc này có thể bị khai thác theo nhiều cách khác nhau: cho các cuộc tấn công vào lại để đánh cắp mã thông báo hoặc đơn giản là để khôi phục các giao dịch, ngăn hợp đồng mục tiêu gửi hoặc nhận mã thông báo ERC777.

ERC777 và Móc của nó

ERC777 là gì

ERC777 là một trong những tiêu chuẩn mã thông báo có Móc chuyển. Đây là mô tả EIP: , và đây là thực hành ERC777 [4] 。

Động lực chính để triển khai mã thông báo ERC777 là bắt chước hành vi chuyển mã thông báo gốc. Bằng cách kích hoạt hợp đồng thông minh khi nhận được mã thông báo, nhà phát triển có thể thực thi logic cụ thể để nâng cao chức năng và tạo ra các tương tác mã thông báo năng động hơn.

Tuy nhiên, các cuộc gọi bổ sung này trong quá trình chuyển khiến ERC777 khác với mã thông báo ERC20. Các hook này giới thiệu một vectơ tấn công mới có thể ảnh hưởng đến các hợp đồng thông minh không được thiết kế để xử lý các cuộc gọi bổ sung trong quá trình chuyển mã thông báo. Hành vi bất ngờ như vậy tạo ra rủi ro bảo mật cho các hợp đồng này.

Sau đây là danh sách một số mã thông báo ERC777 có một số thanh khoản trên mạng chính Ethereum:

Kp6OQ2xMxjKs5X4G5V33hmMqR8TSwawzldCaPOtL.png

Khi Hook xảy ra

Mã thông báo ERC20 chỉ cần cập nhật số dư trong quá trình chuyển. Nhưng mã thông báo ERC777 làm điều này:

  1. Thực hiện cuộc gọi Hook đến địa chỉ của người khởi tạo mã thông báo

  2. Cập nhật số dư

  3. Thực hiện cuộc gọi Hook đến địa chỉ người nhận mã thông báo

Điều này được minh họa rõ ràng trong mã thông báo VRA:

mã nguồn:

Bây giờ, hãy kiểm tra mã cho các cuộc gọi này:

Như bạn đã thấy:

  1. Chức năng này đọc một hợp đồng được gọi là người triển khai từ _ERC1820_REGISTRY
  2. Nếu hàm tìm thấy một trình triển khai, thì trình triển khai đó được gọi.

Hãy khám phá sổ đăng ký này và xem những người triển khai là gì.

Cơ quan đăng ký và người triển khai

Tất cả các mã thông báo ERC777 đều liên quan đến hợp đồng của Cơ quan đăng ký:

Địa chỉ này được mã thông báo ERC777 sử dụng để lưu trữ những người nhận Hook đã đặt. Những bộ thu Hook này được gọi là "bộ triển khai giao diện".

Điều này có nghĩa là Alice có thể chọn Bob làm người triển khai giao diện của mình. Nếu Alice nhận hoặc gửi mã thông báo ERC777, Bob sẽ nhận được Móc.

Alice có thể quản lý các loại Hook khác nhau. Do đó, khi Alice gửi mã thông báo, cô ấy có thể chọn Bob làm người triển khai giao diện và chỉ khi Alice nhận được mã thông báo, cô ấy mới chọn Tom làm người triển khai.

Cô ấy cũng có thể chọn các trình triển khai giao diện khác nhau cho các mã thông báo khác nhau trong hầu hết các trường hợp.

Các tùy chọn này được lưu trữ trong sổ đăng ký được ánh xạ này:

_interfaceHash là ID của trình triển khai giao diện được Alice chọn cho một sự kiện.

Và bất kỳ ai cũng có thể đọc trình triển khai giao diện của Alice với chức năng này:

Như bạn có thể thấy, đây là chức năng mà chúng ta đã gặp trước đó trong mã VRA.

Biến _TOKENS_SENDER_INTERFACE_HASH được sử dụng làm _interfaceHash, có thể là bất kỳ byte nào. Nhưng mã thông báo VRA sử dụng các byte này để xác định loại Móc này:

Nhận Móc

Để thiết lập chức năng nhận Hook, Alice chỉ cần gọi chức năng này trên sổ đăng ký và nhập địa chỉ của Bob làm tham số _implementer.

Cô ấy cũng phải chỉ định một _interfaceHash. Cô ấy sẽ nhận được _TOKENS_SENDER_INTERFACE_HASH này từ mã thông báo VRA.

Còn một chi tiết quan trọng nữa.

Sau khi thiết lập trình triển khai cho VRA ở trên, Alice cũng sẽ biết rằng ngay cả khi các mã thông báo ERC777 khác được chuyển, Bob sẽ nhận cuộc gọi. Chẳng hạn như imBTC [5] , imBTC có cùng _interfaceHash trên các mã thông báo đã gửi.

Điều này là do tất cả các mã thông báo ERC777 đều có chung một hợp đồng đăng ký để lưu trữ các tùy chọn Hook. Nhưng tùy thuộc vào mã thông báo ERC777 để gán tên cho các Móc của chúng và trong khi đôi khi chúng giống nhau, không phải lúc nào cũng vậy.

Cách tìm mã thông báo ERC777

Gọi sổ đăng ký là một tính năng của tất cả các ERC777. Vì vậy, chúng ta có thể thử dune.com [6] để gọi tất cả các hợp đồng thông minh gọi sổ đăng ký.

Chúng ta có thể sử dụng tập lệnh SQL này. Trên thực tế, lẽ ra chúng tôi nên lọc thêm các địa chỉ mã thông báo, nhưng ít nhất chúng tôi đã có một khởi đầu hoàn hảo và kết thúc với 78 địa chỉ.

Ghi chú của người dịch: bảng dấu vết cồn cát [7] Sẽ ghi âm cuộc gọi nội bộ ghi âm giao dịch.

Đăng ký này có phải là khả năng duy nhất không?

Về mặt lý thuyết, không ai có thể đảm bảo rằng một số mã thông báo sẽ sử dụng hợp đồng 0x1820 này làm sổ đăng ký. Nhưng chúng ta có thể sử dụng dune.com [8] Hãy đến kiểm tra.

nó trả về những địa chỉ này

0x1820a4b7618bde71dce8cdc73aab6c95905fad24 0xc0ce3461c92d95b4e1d3abeb5c9d378b1e418030 0x820c4597fc3e4193282576750ea4fcfe34ddf0a7

Chúng tôi đã kiểm tra và 0x1820 là sổ đăng ký duy nhất có mã thông báo ERC777 có giá trị. Mã thông báo của các cơ quan đăng ký khác không có giá trị bằng.

Tình hình chung của Hookable token

ERC777 không chỉ là một tiêu chuẩn với Móc. Ngoài ra ERC223, ERC995 hoặc ERC667. Họ không phải là bất thường. Chắc hẳn bạn đã nghe nói về mã thông báo LINK triển khai ERC667 [9] 。

Tấn công vector sử dụng lời gọi tùy ý

Đây là một vectơ tấn công được phát hiện gần đây cho một trong những khách hàng của chúng tôi.

Các nhà nghiên cứu thường cho rằng mã thông báo ERC777 thực hiện cuộc gọi đến người gọi và người nhận. Nhưng trên thực tế, người khởi xướng và người nhận có thể chọn bất kỳ "Bob" nào làm người nhận Hook.

Vì vậy, hãy tưởng tượng điều gì sẽ xảy ra khi kết hợp với những hợp đồng thực hiện các cuộc gọi tùy ý đến bất kỳ địa chỉ nào với bất kỳ dữ liệu nào?

Có các chức năng gọi tùy ý có thể được sử dụng rộng rãi trong các công cụ tổng hợp DEX, ví và hợp đồng nhiều lệnh gọi.

Ghi chú của người dịch: Hàm gọi tùy ý có nghĩa là có một hàm như thế này trong hợp đồng:

hàm ute(địa chỉ đích, giá trị uint, chữ ký bộ nhớ chuỗi, dữ liệu bộ nhớ byte, uint eta) phải trả công khai;

Nó có thể gọi bất kỳ phương thức nào khác.

Phương pháp tấn công:

  1. Kẻ tấn công tìm thấy một hợp đồng mục tiêu (Target) cho phép gọi hàm tùy ý
  2. Kẻ tấn công gọi mục tiêu:
  3. registery1820.setInterfaceImplementer(Target, hookHash, Attacker)
  4. Bây giờ, Kẻ tấn công của chúng ta là người thực hiện Mục tiêu
  5. Kẻ tấn công sẽ được gọi bằng hookHash được sử dụng trong mã thông báo ERC777.
  6. Bất cứ khi nào hợp đồng mục tiêu (Target) nhận được mã thông báo ERC777, Kẻ tấn công sẽ nhận được cuộc gọi Hook.
  7. Các cuộc tấn công sau đây khác nhau tùy thuộc vào mã Mục tiêu:
  • Kẻ tấn công có thể vào lại khi một số người dùng thực hiện các chức năng trong hợp đồng mục tiêu
  • Kẻ tấn công có thể quay lại trực tiếp, do đó giao dịch của người dùng sẽ được khôi phục trực tiếp

Nếu công cụ tổng hợp DEX tính toán rằng đường dẫn chuyển đổi tốt nhất là thông qua một cặp giao dịch DEX với mã thông báo ERC777, thì công cụ này có thể gặp sự cố.

Bảo vệ

Sau nhiều giờ thảo luận với khách hàng, chúng tôi đã tìm ra giải pháp không phá vỡ các cuộc gọi tùy ý.

Tốt nhất là bên dự án nên hạn chế sử dụng Registry1820 làm địa chỉ của bất kỳ cuộc gọi nào. Do đó, không kẻ tấn công nào có thể khai thác các cuộc gọi tùy ý để đặt trình triển khai giao diện.

Nói từ kinh nghiệm

Các dự án và kiểm toán viên phải chú ý đến hành vi Hook được mô tả trong ERC777. Các mã thông báo này thực hiện cuộc gọi không chỉ đến người nhận và người khởi xướng mà còn cho một số người nhận Hook khác.

Theo nghĩa này, các dự án cho phép các cuộc gọi tùy ý phải đặc biệt quan tâm và xem xét một vectơ tấn công khác cho ERC777.

Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • Bình luận
  • Chia sẻ
Bình luận
0/400
Không có bình luận
  • Ghim
Giao dịch tiền điện tử mọi lúc mọi nơi
qrCode
Quét để tải xuống ứng dụng Gate
Cộng đồng
Tiếng Việt
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)