Khi các giao thức DeFi tiếp tục nóng lên trong hệ sinh thái Ethereum, CipherTrace đang chứng kiến ngày càng nhiều vụ khai thác và vectơ tấn công được đưa ra ánh sáng. Tuần trước, vào ngày 28 tháng 2020 năm 4.4, hợp đồng khai thác lá chắn của Cover Protocol, Blacksmith, đã được khai thác. Tin tặc đã sử dụng một lỗi trong hợp đồng khai thác để khai thác một lượng vô hạn mã thông báo COVER và rút hơn XNUMX triệu đô la từ dự án.
Giao thức bao gồm phát hành Ngày hôm qua Post-Mortem của họ nói rằng, các nhà phát triển không biết, lỗi đã xuất hiện kể từ lần triển khai đầu tiên của hợp đồng Thợ rèn, làm nổi bật tầm quan trọng của việc kiểm tra bảo mật kỹ lưỡng và dồn nén hợp đồng thông minhHợp đồng thông minh là gì? Hợp đồng thông minh là một máy tính chuyên nghiệp… Hơn.
Lịch trình của quá trình đúc tiền vô hạn
Dòng thời gian của kẻ tấn công ban đầu
- Nhóm thanh khoản Balancer mới là thêm đối với hợp đồng Blacksmith.sol.
- Kẻ tấn công tiền gửi 1,326,879.99 mã thông báo BPT vào hợp đồng Blacksmith.sol.
- Cùng một kẻ tấn công sau đó thi hành khai thác, bằng cách rút tiền từ hợp đồng.
- Kẻ tấn công đã có thể tiếp tục đúc phần thưởng và rút tiền lên tới khoảng 4.4 triệu đô la.
Trong một lượt sự kiện thú vị, các "hacker da trắng" có mục đích liên kết với Grap Finance cũng khai thác lỗi này để tạo ra các token COVER trị giá khoảng 4 triệu đô la. Grap Finance cuối cùng đã trả lại tiền cho Cover Protocol.
Tiến trình thời gian Tài khoản được sở hữu bên ngoài (EOA) của Nhà triển khai Grap Finance
- Nhóm thanh khoản mới là phê duyệt để khai thác thanh khoản.
- Nhà triển khai tài chính Grap EOA ký gửi 15,255.55 BPT (DAI / Basis) vào nhóm trên Cover thông qua hợp đồng Blacksmith.sol.
- Khoảng bốn phút sau, tiền đã rút tiền trên Bìa để lại 1 Wei trong số dư EOA của Grap Finance Deployer.
- Một người dùng bên ngoài khác rút lại phần lớn số dư của họ từ hợp đồng Blacksmith.sol vào khoảng thời gian đó, khiến Grap Finance có tất cả tính thanh khoản cho nhóm DAI / Basis trên hợp đồng Blacksmith.sol.
- Người triển khai Grap Finance ký gửi quay lại 15,255.55 BPT (DAI / Cơ sở) vào nhóm.
- Sau đó Grap Finance Deployer tuyên bố phần thưởng và do khai thác được, tiền bạc 40,796,131,214,802,500,000.21 COVER.
- Sau khi đốt một số mã thông báo được đúc, Grap Finance Deployer gửi quay lại Ether để bao gồm tuyên bố “Lần sau, hãy tự bảo vệ mình.”
Cách đúc tiền mã thông báo vô hạn — Phân tích kỹ thuật
Tiểu sử
Khai thác này đưa chúng ta trở lại các nguyên tắc cơ bản của ngôn ngữ lập trình Solidity, được sử dụng để thực hiện các hợp đồng thông minh trong Ethereum. Sau khi các hợp đồng này được biên dịch, Máy ảo Ethereum (EVM) sẽ có thể hiểu các hướng dẫn (tức là mã opcodes) được sử dụng để thực thi các chức năng khác nhau và thao tác với bộ nhớ và lưu trữ. EVM có ba khu vực khác nhau, nơi nó có thể lưu trữ dữ liệu: bộ nhớ, bộ nhớ và ngăn xếp. Hiểu được những lĩnh vực này là rất quan trọng để hiểu cách lỗi được khai thác.
Tương tự như Bộ nhớ truy cập ngẫu nhiên (RAM) trên thiết bị máy tính, “trí nhớ”Từ khóa trong Solidity cấp phát bộ nhớ cho một biến cụ thể. Trong trường hợp này, biến đó có phạm vi đến một hàm cụ thể. Bộ nhớ sẽ bị xóa sau khi hàm đã thực thi, nhưng có thể vẫn còn nếu nội dung của bộ nhớ đó được đẩy vào bộ nhớ trước khi hàm trả về.
Các "là gắn”Từ khóa trong Solidity cho phép các biến hoạt động như một con trỏ vào việc lưu trữ dữ liệu trong ánh xạ hoặc cấu trúc dữ liệu. Dữ liệu lưu trữ liên tục giữa các lệnh gọi hàm và giao dịch. Về cơ bản, bộ nhớ về cơ bản là một kho khóa-giá trị ánh xạ các từ 256 bit thành các từ 256 bit.
Lưu ý rằng EVM không phải là một máy đăng ký mà là một máy ngăn xếp — do đó tất cả các phép tính được thực hiện trên một vùng dữ liệu được gọi là ngăn xếp. Ngăn xếp có sức chứa tối đa là 1024 mục, nhưng chỉ có thể dễ dàng truy cập vào 16 mục trên cùng, có thể được sử dụng để hoán đổi phần tử trên cùng với một trong 16 phần tử bên dưới và hơn thế nữa.
Con bọ
Các tin tặc đã khai thác Blacksmith.sol của Cover Protocol — một Hợp đồng khai thác lá chắn cho phép các nhà đầu tư được thưởng bằng mã thông báo của dự án hoặc nhóm cụ thể, chẳng hạn như mã thông báo CLAIM và NOCLAIM, trong Cover Protocol.
Để hiểu rõ hơn về lỗi này, trước tiên, chúng ta hãy xem xét hồ biến là một ánh xạ (tức là lưu trữ dữ liệu):
At dòng 118, chúng tôi thấy rằng hợp đồng lưu trữ dữ liệu nhóm vào bộ nhớ thông qua từ khóa "memory".
Sau đó, trên dòng 121, hợp đồng cập nhật nhóm trong bộ nhớ dưới dạng updatePool (địa chỉ _lpToken) chức năng sử dụng Bể chứa hồ bơi biến.
Tuy nhiên, nếu bạn nhìn xa hơn trong tiền gửi (địa chỉ _lpToken, uint256 _amount) chức năng, nó sử dụng cùng một hồ bơi biến từ dòng 118 đã được lưu trong bộ nhớ trong hàm để tính toán cho pool.accRewardsPerToken. Tại thời điểm này, hồ bơi biến đã được sao chép từ hồ ánh xạ và được lưu vào bộ nhớ.
Do đó, bất kỳ thay đổi nào được thực hiện đối với hồ bơi biến trong tiền gửi (địa chỉ _lpToken, uint256 _amount) chức năng sẽ không thay đổi hồ ánh xạ trong lưu trữ trên chuỗi của hợp đồng do thực tế là các biến sử dụng từ khóa "memory" chỉ được xác định phạm vi trong chính hàm. Từ đó, hợp đồng cập nhật pool.accRewardsPerToken trong updatePool (địa chỉ _lpToken) chức năng sử dụng lưu trữ. Vì vậy, bây giờ, trong updatePool (địa chỉ _lpToken) chức năng của pool.accRewardsPerToken được cập nhật tăng lên đáng kể vì về mặt kỹ thuật, nó là một nhóm mới và không liên quan đến hồ bơi trong trí nhớ.
Sau lỗ hổng bảo mật này và việc lạm dụng giữa bộ nhớ và bộ nhớ, thợ mỏ.rewardWriteoff trong tiền gửi (địa chỉ _lpToken, uint256 _amount) chức năng được tính toán sai cũng như sử dụng pool.accRewardsPerToken, vì chúng ta vẫn ở trong hàm gửi tiền đang xử lý một phiên bản được lưu trong bộ nhớ của hồ bơi.
Ngoài chức năng gửi tiền, bất kỳ ai, chẳng hạn như Grap Finance, đều có thể nhận được một số lượng lớn mã đúc tiền khi họ thực hiện bồi thường (địa chỉ _lpToken) chức năng. Chức năng này, được sử dụng để lấy phần thưởng của họ, kết thúc cuộc gọi _claimCoverRewards (Pool memory pool, Miner memory miner) tham chiếu đến thợ mỏ.rewardWriteoff mà chúng tôi đã đánh dấu ở trên. Vì biến đó nhỏ hơn nhiều so với thực tế pool.accRewardsPerToken, hợp đồng dẫn đến việc đúc ra rất nhiều mã thông báo.
Chìa khóa chính
CipherTrace hy vọng nền tảng về lỗi được khai thác này sẽ làm sáng tỏ tầm quan trọng của việc kiểm tra bảo mật kỹ lưỡng và dồn nén các hợp đồng thông minh vào bất kỳ điều kiện nào blockchainMột blockchain — công nghệ nền tảng của bitcoin và các c… Hơn một người chọn để triển khai. Trong khi Grap Finance trả lại số tiền họ nhận được thông qua khai thác, thì hacker ban đầu vẫn có thể kiếm được hơn 4 triệu đô la từ giao thức DeFi và giá trị của mã thông báo COVER kể từ đó đã giảm mạnh gần 99%.
Nguồn: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/