Phân tích rủi ro tấn công DoS vào hợp đồng thông minh và các chiến lược phòng ngừa

robot
Đang tạo bản tóm tắt

tấn công từ chối dịch vụ trong hợp đồng thông minh

tấn công từ chối dịch vụ(DoS) có thể dẫn đến hợp đồng thông minh không thể sử dụng bình thường trong một khoảng thời gian, thậm chí là vĩnh viễn. Nguyên nhân chính bao gồm:

  1. Logic hợp đồng có sai sót. Ví dụ, một số hàm public không tính đến độ phức tạp tính toán, có thể vượt quá giới hạn Gas dẫn đến giao dịch thất bại.

  2. Trong các tình huống gọi hợp đồng chéo, việc thực hiện hợp đồng phụ thuộc vào trạng thái của hợp đồng bên ngoài. Việc thực hiện hợp đồng bên ngoài không đáng tin cậy có thể chặn việc thực hiện hợp đồng này, chẳng hạn như vốn bị khóa không thể nạp hoặc rút.

  3. Yếu tố con người, chẳng hạn như chủ hợp đồng mất chìa khóa riêng, dẫn đến trạng thái hệ thống quan trọng không thể cập nhật.

Dưới đây là phân tích lỗ hổng tấn công từ chối dịch vụ (DoS) kết hợp với các ví dụ cụ thể.

1. Lặp qua cấu trúc dữ liệu lớn có thể bị sửa đổi từ bên ngoài

Dưới đây là một hợp đồng đơn giản để "phân chia lợi nhuận" cho người dùng đã đăng ký:

Trạng thái hợp đồng bao gồm danh sách người dùng đã đăng ký và ánh xạ số dư tài khoản. Người dùng có thể đăng ký và khởi tạo thông qua register_account().

Quản trị viên thông qua distribute_token() để phân chia lợi nhuận cho người dùng, duyệt qua mảng registered và chuyển khoản một số lượng token nhất định cho mỗi người dùng.

Vấn đề là kích thước registered không bị giới hạn và có thể bị thao túng ác ý, dẫn đến việc tiêu thụ Gas quá cao vượt quá giới hạn khi duyệt.

Giải pháp được đề xuất:

  • Hạn chế kích thước cấu trúc dữ liệu, đảm bảo ngay cả khi đạt giá trị tối đa cũng không vượt quá giới hạn Gas
  • Áp dụng chế độ rút tiền, trước tiên ghi sổ, người dùng tự rút thưởng thông qua withdraw.

2. Sự phụ thuộc trạng thái giữa các hợp đồng gây tắc nghẽn

Xem xét một tình huống hợp đồng "đấu thầu":

  • Ghi lại người đặt giá cao nhất hiện tại và số tiền
  • Người dùng có thể đăng ký tài khoản để tham gia đấu giá
  • Khi giá thầu cao hơn giá cao nhất hiện tại, trả lại giá cao nhất trước đó, cập nhật trạng thái

Vấn đề là việc hoàn tiền phụ thuộc vào trạng thái hợp đồng bên ngoài. Nếu tài khoản của người trả giá cao nhất trước đó đã bị hủy, việc hoàn tiền sẽ thất bại, dẫn đến việc không thể cập nhật giá cao nhất, toàn bộ quá trình đấu giá bị tắc nghẽn.

Giải pháp: Xem xét khả năng gọi bên ngoài có thể thất bại, thực hiện xử lý lỗi hợp lý. Ví dụ, tạm giữ số tiền không thể hoàn lại, sau đó cho phép người dùng rút riêng.

3. Mất khóa riêng của quản trị viên

Một số chức năng quan trọng ( như tạm dừng/khởi động lại giao dịch ) chỉ cho phép quản trị viên gọi. Việc mất khóa riêng của quản trị viên sẽ dẫn đến việc không thể sử dụng những chức năng này, hợp đồng có thể không hoạt động bình thường trong thời gian dài.

Giải pháp: Áp dụng cơ chế ký đa để thay thế quản trị viên đơn, thực hiện quản trị phi tập trung, tránh lỗi điểm đơn.

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
  • 7
  • Chia sẻ
Bình luận
0/400
NFTFreezervip
· 07-16 03:27
Đã có dự đoán, số đã bị đánh cắp thì xong.
Xem bản gốcTrả lời0
BridgeJumpervip
· 07-15 12:26
Khóa riêng, bạn không nói là mất quần đi?
Xem bản gốcTrả lời0
AirdropF5Brovip
· 07-13 07:29
Ông chủ, hãy ký nhiều hơn một chút để đảm bảo an toàn.
Xem bản gốcTrả lời0
MetaEggplantvip
· 07-13 07:28
Chi phí thực sự cho việc kiểm tra hơi cao.
Xem bản gốcTrả lời0
Ser_This_Is_A_Casinovip
· 07-13 07:26
Quá tệ, tôi tưởng dos chỉ có thể làm web.
Xem bản gốcTrả lời0
RiddleMastervip
· 07-13 07:13
Khóa riêng bị mất thì gửi ngay!
Xem bản gốcTrả lời0
NFTBlackHolevip
· 07-13 07:13
Cậy lại đang làm chuyện trong ví tiền
Xem bản gốcTrả lời0
  • 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)