Hợp đồng tấn công của hacker 2: strong> p>0x617432Fc98c1fFaAB62B8cB94Cef6D75ABD95598
Hợp đồng tấn công của hacker 3:
0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974
Địa chỉ của kẻ tấn công:
0xbbcc139933D1580e7c40442E09263e90E6F1D66D p>
Hợp đồng dễ bị tổn thương:
0x36016C4F0E0177861E6377f73C380c70138E13EE (Nhóm khai thác)
Phân tích tấn công
Bằng cách phân tích dữ liệu giao dịch trên chuỗi, chúng tôi tiến hành Sắp xếp và tổng hợp.
Kẻ tấn công lần đầu tiên gây quỹ cho cuộc tấn công thông qua nhiều khoản vay nhanh, vay tổng cộng 2.753.399 USDT Token.
130.000 USDT Token ngay lập tức được chuyển đổi thành đơn vị tối thiểu là USDT Token và 27.264 OKC Token.
Vì PancakeSwapv2 sử dụng AMM (nhà tạo lập thị trường hàm không đổi), nên trong mô hình này, tích của số lượng hai mã thông báo trong nhóm giao dịch là một hằng số. Nó có thể được biểu thị bằng công thức sau:
Trong đó:
→ x là số lượng token đầu tiên trong nhóm giao dịch.
^ y là số lượng token thứ hai trong nhóm giao dịch.
^ k là hằng số đại diện cho tích của số lượng hai token trong pool.
Khi một nhà giao dịch muốn trao đổi một mã thông báo này lấy một mã thông báo khác, họ sẽ tăng số lượng (dx) của một mã thông báo trong nhóm giao dịch trong khi giảm số lượng mã thông báo còn lại. số lượng (dy) để duy trì sự bất biến. Quá trình này thay đổi giá tương đối của các token.
Giả sử người giao dịch muốn đổi mã thông báo A lấy mã thông báo B thì công thức tích không đổi phải giữ nguyên đúng trước và sau giao dịch:
Vì k không đổi, điều này có nghĩa là x·y trước và sau giao dịch Giống nhau. Tuy nhiên, do người giao dịch tăng số lượng Token A (dx) và giảm số lượng Token B (dy), điều này sẽ khiến giá Token B tăng lên.
Giá tức thời của một mã thông báo có thể được tính bằng cách tính tỷ lệ giữa số lượng hai mã thông báo trong nhóm. Nếu mã thông báo A là x và mã thông báo B là y thì giá của mã thông báo B so với mã thông báo A là y/x. Sau giao dịch, số lượng token B giảm và số lượng token A tăng lên, do đó giá mới trở thành (y-dy)/(x+dy). Vì tử số giảm và mẫu số tăng nên tỷ lệ trở nên nhỏ hơn, nghĩa là giá Token B tăng.
Trong trường hợp giao dịch lớn, dx và dy có thể rất lớn, điều này có thể dẫn đến sự thay đổi đáng kể về giá. Điều này là do để giữ k không đổi, một lượng lớn dy phải được loại bỏ khỏi nhóm để bù đắp cho sự gia tăng của dx. Tác động to lớn của giao dịch lớn này đến số lượng token trong nhóm đã dẫn đến những thay đổi đáng kể về giá.
Vậy kẻ tấn công đã sử dụng một lượng lớn quỹ flash loan để mua OKC, dẫn đến số lượng OKC giảm, từ đó đẩy giá OKC Token lên, nâng giá 1 OKC = 0,3 USDT đến 1 OKC = 68,9 USDT.
Sau đó, kẻ tấn công đã tạo hai địa chỉ hợp đồng và gửi lần lượt 0,01 OKC và 0,0001 USDT cùng một đơn vị OKC tối thiểu đến hai địa chỉ đó.
Sau đó, hacker sử dụng hợp đồng tấn công chính đã bổ sung các hoạt động thanh khoản vào nhóm PancakePair_USDT_OKC và thu được khoảng 225.705 LP Token.
Sau đó, tất cả Mã thông báo LP được chuyển đến 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 do kẻ tấn công tạo. Sau đó, hợp đồng tấn công ngay lập tức gọi hàm processLPReward trong hợp đồng dễ bị tấn công để phân bổ phần thưởng cho địa chỉ lpHolder được lưu trữ trong hợp đồng. Mặc dù hoạt động của kẻ tấn công ở đây chỉ là chuyển tiền vào hợp đồng MinerPool nhưng hợp đồng này gọi hàm processLPReward trong hàm gọi lại chấp nhận chuyển tiền.
Theo hình bên dưới, chúng ta biết rằng hợp đồng tấn công 0x28e7c8337373C81bAF0A4FE88ee6E33d3C23E974 đã nhận được 77.890 OKC Token trong bộ sưu tập phần thưởng.
Kẻ tấn công sau đó đã chuyển mã thông báo LP của hợp đồng tấn công 0x28e7..E974 và phá hủy nó để loại bỏ tính thanh khoản, lấy được 1.884.223 USDT Token và 27.264 OKC Token.
Và chuyển tất cả các token trong hai hợp đồng tấn công còn lại sang hợp đồng tấn công chính
0xD5d8c2fd8A743A89BC497B2F180C52d719a007B9, tương ứng: 272 và 77.890 OKC Token.
Kẻ tấn công đã trao đổi tất cả OKC, khoảng 104.610 OKC Token, lấy khoảng 136.518 USDT Token. Tại thời điểm này, hacker nắm giữ tổng cộng khoảng 2.759.918 USDT Token.
Cuối cùng, hacker đã trả lại toàn bộ tiền gốc và lãi của khoản vay flash, để lại khoảng 6.268 USDT Token, tất cả số tiền này đã được chuyển đến địa chỉ của kẻ tấn công
0xbbcc139933D1580e7c40442E09263e90E6F1D66D.
Phân tích lỗ hổng
Qua phân tích tấn công, người ta biết rằng quỹ lợi nhuận chính của tin tặc là từ hàm processLPReward trong hợp đồng MinerPool. Logic của hàm này là chủ yếu là lấy lpHolder và tính giá trị LP dựa trên LP của nó, số tiền sẽ được thưởng trực tiếp theo tỷ lệ.
Chúng ta có thể xem logic thực thi trong hợp đồng tấn công thứ ba do kẻ tấn công tạo ra:
Từ logic ở đây, chúng ta có thể thấy rằng extcodesize( được sử dụng trong hàm addHolder) để tính kích thước hiện tại của địa chỉ và xác định xem địa chỉ đó có phải là địa chỉ hợp đồng hay không. Tuy nhiên, khi kẻ tấn công tạo hợp đồng thông qua CREATE2, do hợp đồng được khởi tạo nên kích thước địa chỉ vẫn là 0, do đó kẻ tấn công gọi địa chỉ trong hàm tạo của nó. Hàm này bỏ qua các hạn chế của lệnh gọi hợp đồng.
Nó gọi hàm addHolder trong quá trình chuyển để thêm địa chỉ hợp đồng vào danh sách lpHolder, nhờ đó hợp đồng có thể nhận được phần thưởng OKC kịp thời bằng cách nhận phần thưởng.
Theo phân tích logic mã hàm processLPReward, có thể thấy từ hình bên dưới rằng mặc dù thời gian khóa để nhận phần thưởng được đặt nhưng việc giữ LP thời gian không được thiết lập. Việc xác minh hoặc các hạn chế được thực hiện, khiến tin tặc có được một lượng lớn tiền tạm thời thông qua các khoản vay nhanh, chuyển đổi chúng thành LP và tiêu hủy chúng ngay sau khi nhận được phần thưởng.
Tóm tắt
Nói một cách đơn giản, hacker đã vay một lượng lớn USDT thông qua các khoản vay chớp nhoáng và trao đổi một lượng lớn OKC, do đó làm tăng giá OKC. Và do dự án OKC không đặt ra yêu cầu khóa đối với việc phát hành phần thưởng LP nên hacker đã ngay lập tức rút thanh khoản sau khi nhận được phần thưởng, từ đó nhận được phần thưởng nhà cung cấp thanh khoản do bên dự án phát hành. Và bán OKC Token do bên dự án OKC thưởng. Lợi nhuận cuối cùng là 6.268 USDT.