

23 Tháng Tư, 2022Nền tảng nhận thức tình huống bảo mật Bing-Blockchain Chain Thành Đôtiêu đề cấp đầu tiên
#1 Thông tin liên quan đến sự kiện
Vào ngày 23 tháng 4, nhà phát triển Solidity foobar đã tweet rằng 11.539 ETH (trị giá 34 triệu USD) đã bị khóa vĩnh viễn trong hợp đồng AkuDreams và cả người dùng cá nhân cũng như nhóm phát triển đều không thể rút tiền. Đặt từng trạng thái giá thầu thành 1 sau khi hoàn trả đã được xử lý. Do đó, người dùng không thể gọi EmergencyWithdraw(). Ngoài ra, đội không thể nhận được tiền, về cơ bản tương đương với sự hủy diệt.
Nhóm kỹ thuật Thành Đô LianAn ngay lập tức tiến hành phân tích.
Hợp đồng dễ bị tổn thương:
0xf42c318dbfbaab0eee040279c6a2588fa01a961d
#2 Phân tích lỗ hổng
Lỗ hổng một:
Lỗ hổng một:
1. Lỗ hổng hợp đồng đầu tiên là ởprocessRefunds, người thiết kế thực hiện hoàn trả vòng tròn theo bộ đếm refundProgress.
2. Ở đây, chức năng gọi được sử dụng cho hoạt động hoàn trả và kết quả hoàn trả được sử dụng làm điều kiện phán quyết của yêu cầu.
3. Do đó, nếu kẻ tấn công đang thực hiện thao tác hoàn tiền trong hàng đợi vào thời điểm này, thì khi cuộc gọi hoàn tiền được gọi cho kẻ tấn công, kẻ tấn công sẽ thực hiện hoàn nguyên độc hại trong dự phòng, điều này sẽ khiến hàng đợi hoàn tiền bị kẹt tại kẻ tấn công, dẫn đến Mọi người đứng sau hàng đợi không thể được hoàn tiền.
Lỗ hổng hai:
Lỗ hổng hai:
Lỗi này cũng là thủ phạm khiến tài sản ETH trị giá khoảng 34 triệu USD bị khóa trong hợp đồng.
1. Trong chức năng ElementProjectFunds, chức năng này chủ yếu được sử dụng để rút tiền bởi các bên dự án. Để tránh việc bên dự án có quá nhiều quyền hạn và chuyển tất cả tài sản trong hợp đồng trước khi người dùng hoàn tất việc rút tiền, dẫn đến người dùng không thể nhận được tiền hoàn lại, tất cả các hoạt động hoàn tiền phải được hoàn thành trước khi dự án có thể rút tiền. Về mặt thiết kế logic nghiệp vụ, không có vấn đề gì. Tuy nhiên, trong quá trình triển khai mã cụ thể, mã hiện tại dễ bị tổn thương Lỗ hổng 1, khiến bên dự án không thể rút tiền, nhưng đây chỉ là rủi ro tiềm ẩn và thủ phạm của việc khóa quỹ lần này không phải là lý do.
2. Hãy chú ý đến dòng mã thứ 620 trong hàm: require (refundProgress >= totalBids) trong đó refundProgress cho biết số lượng tiền hoàn lại của người dùng đã được xử lý và totalBids cho biết số lượng NFT mà tất cả người dùng đã đặt giá thầu. Lưu ý rằng vì người dùng có thể đặt giá thầu cho nhiều NFT, nên tiến độ hoàn tiền có thể thấp hơn tổng giá thầu khi so sánh bằng số.
Chúng ta hãy xem quy trình chức năng hoàn tiềnRefunds: require(_refundProgress < _bidIndex); bidIndex có nghĩa là tất cả người dùng tham gia đấu thầu, refundProgress sẽ không bao giờ cao hơn bidIndex.
Tại thời điểm này, chúng ta hãy xem giá trị của bidIndex, là 3669:
Giá trị của totalBids là 5495:
3. Vì vậy, refundProgress>=5495 và refundProgresstiêu đề cấp đầu tiên
#3 Tóm tắt
Để đối phó với sự cố này, nhóm kỹ thuật Thành Đô LianAn đề nghị:
1. Các nhà phát triển cần có nhận thức cơ bản về phát triển bảo mật và làm quen với các vấn đề bảo mật cần được chú ý trong quá trình phát triển hợp đồng thông minh;
2. Khi thiết kế và thực hiện hợp đồng, hãy chú ý đến tính chính xác của việc triển khai mã, trước khi dự án trực tuyến, bạn có thể chọn một công ty kiểm toán bảo mật chuyên nghiệp để tiến hành kiểm tra bảo mật toàn diện để tránh rủi ro bảo mật.
