Dodging một dấu đầu dòng: Vấn đề trạng thái Ethereum

Rate this post

Với bài đăng trên blog này, mục đích là chính thức tiết lộ một mối đe dọa nghiêm trọng chống lại nền tảng Ethereum, đây là một mối nguy hiểm rõ ràng và hiện tại cho đến khi hardfork Berlin.

Tiểu bang

Hãy bắt đầu với một số thông tin cơ bản về Ethereum và State.

Trạng thái Ethereum bao gồm một bộ ba Patricia-merkle, một cây tiền tố. Bài đăng này sẽ không đi sâu vào nó quá nhiều chi tiết, đủ để nói rằng khi trạng thái phát triển, các cành trên cây này trở nên dày đặc hơn. Mỗi tài khoản được thêm vào là một lá khác. Giữa rễ cây và bản thân lá có một số nút “trung gian”.

Để tìm kiếm một tài khoản nhất định, hoặc “lá” trong cây khổng lồ này, cần phải giải quyết một nơi nào đó theo thứ tự 6-9 hàm băm, từ gốc, thông qua các nút trung gian, để cuối cùng giải quyết hàm băm cuối cùng dẫn đến dữ liệu mà chúng tôi đang tìm kiếm.

Nói một cách dễ hiểu: bất cứ khi nào thực hiện tra cứu trie để tìm tài khoản, 8-9 hoạt động giải quyết được thực hiện. Mỗi hoạt động giải quyết là một lần tra cứu cơ sở dữ liệu và mỗi lần tra cứu cơ sở dữ liệu có thể là bất kỳ số hoạt động thực tế nào trên đĩa. Rất khó để ước tính số lượng hoạt động của đĩa, nhưng vì các khóa trie là hàm băm mật mã (chống va chạm), các khóa là “ngẫu nhiên”, đề phòng trường hợp xấu nhất chính xác cho bất kỳ cơ sở dữ liệu nào.

Khi Ethereum đã phát triển, cần phải tăng giá gas cho các hoạt động tiếp cận trie. Điều này đã được thực hiện trong Quả quýt tại khối 2.463.000 vào tháng 10 năm 2016, bao gồm EIP 150. EIP 150 đã mạnh tay tăng giá xăng nhất định và đưa ra một loạt các thay đổi để bảo vệ chống lại các cuộc tấn công DoS, sau cái gọi là “các cuộc tấn công Thượng Hải”.

Một đợt tăng lương khác như vậy đã được thực hiện trong Istanbul nâng cấp, tại khối 9.069.000 vào tháng 12 năm 2019. Trong lần nâng cấp này, EIP 1884 đã được kích hoạt.

EIP-1884 đã giới thiệu thay đổi sau:

  • SLOAD đi từ 200 đến 800 khí ga,
  • CÁI CÂN đi từ 400 đến 700 gas (và rẻ hơn TỰ CÂN BẰNG) đã được thêm vào,
  • EXTCODEHASH đi từ 400 đến 700 khí ga,

Vấn đề)

Vào tháng 3 năm 2019, Martin Swende đã làm một số đo hiệu suất opcode EVM. Cuộc điều tra đó sau đó đã dẫn đến sự ra đời của EIP-1884. Một vài tháng trước khi EIP-1884 đi vào hoạt động, tờ báo Đồng hồ bị hỏng đã được xuất bản (tháng 9 năm 2019).

Hai nhà nghiên cứu bảo mật Ethereum – Hubert Ritzdorf và Matthias Egli – đã hợp tác với một trong những tác giả đằng sau bài báo; Daniel Perez, và ‘vũ khí hóa’ một khai thác mà họ đã gửi tới tiền thưởng lỗi Ethereum. Đây là vào ngày 4 tháng 10 năm 2019.

Chúng tôi khuyên bạn nên đọc nộp hồ sơ đầy đủ, đó là một báo cáo được viết tốt.

Trên một kênh dành riêng cho bảo mật khách hàng chéo, các nhà phát triển từ Geth, Parity và Aleth đã được thông báo về việc gửi, cùng ngày hôm đó.

Bản chất của việc khai thác là kích hoạt tra cứu trie ngẫu nhiên. Một biến thể rất đơn giản sẽ là:

	jumpdest     ; jump label, start of loop
	gas          ; get a 'random' value on the stack
	extcodesize  ; trigger trie lookup
	pop          ; ignore the extcodesize result
	push1 0x00   ; jump label dest
	jump         ; jump back to start

Trong báo cáo của họ, các nhà nghiên cứu đã thực hiện tải trọng này dựa trên các nút được đồng bộ hóa với mạng chính, thông qua eth_callvà đây là những con số của chúng khi được thực thi với 10 triệu khí ga:

  • 10 triệu khai thác khí sử dụng EXTCODEHASH (ở 400 gas)
  • 10 triệu khai thác khí sử dụng EXTCODESIZE (ở 700 gas)

Rõ ràng là rõ ràng, những thay đổi trong EIP 1884 chắc chắn đã tạo ra tác động làm giảm tác động của cuộc tấn công, nhưng nó không đủ.

Điều này đã xảy ra trước Devcon ở Osaka. Trong Devcon, kiến ​​thức về vấn đề này đã được chia sẻ giữa các nhà phát triển máy khách mainnet. Chúng tôi cũng đã gặp Hubert và Mathias, cũng như Greg Markou (từ Chainsafe – những người đang làm việc trên ETC). Các nhà phát triển ETC cũng đã nhận được báo cáo.

Khi năm 2019 sắp kết thúc, chúng tôi biết rằng chúng tôi gặp phải những vấn đề lớn hơn những gì chúng tôi đã dự đoán trước đó, nơi các giao dịch độc hại có thể dẫn đến thời gian khối trong phạm vi phút. Thêm vào đó, thêm vào tai họa: cộng đồng nhà phát triển đã không hài lòng về EIP-1884.

Hơn nữa, chỉ hai tháng sau, vào tháng 12 năm 2019, Parity Ethereum công bố họ rời khỏi hiện trường và OpenEthereum tiếp quản việc bảo trì cơ sở mã.

Một kênh điều phối khách hàng mới đã được tạo ra, nơi các nhà phát triển Geth, Nethermind, OpenEthereum và Besu tiếp tục phối hợp.

Bản đồ đường viền)

Chúng tôi nhận ra rằng chúng tôi sẽ phải thực hiện một cách tiếp cận theo hai hướng để xử lý những vấn đề này. Một cách tiếp cận sẽ là làm việc trên giao thức Ethereum và bằng cách nào đó giải quyết vấn đề này ở lớp giao thức; tốt hơn là không vi phạm hợp đồng và tốt hơn là không bị phạt hành vi ‘tốt’, nhưng vẫn quản lý để ngăn chặn các cuộc tấn công.

Cách tiếp cận thứ hai sẽ là thông qua kỹ thuật phần mềm, bằng cách thay đổi các mô hình và cấu trúc dữ liệu bên trong các máy khách.

Giao thức làm việc

Lần lặp lại đầu tiên về cách xử lý các kiểu tấn công này là nơi đây. Vào tháng 2 năm 2020, nó được chính thức ra mắt với tên EIP 2583. Ý tưởng đằng sau nó chỉ đơn giản là thêm một hình phạt mỗi khi tra cứu trie gây ra lỗi.

Tuy nhiên, Peter đã tìm ra một giải pháp cho ý tưởng này – đòn tấn công ‘tiếp sức được che chắn’ – đặt giới hạn trên (khoảng ~ 800) về mức độ hiệu quả của một hình phạt như vậy.

Vấn đề với hình phạt khi bỏ lỡ là việc tra cứu cần phải được thực hiện trước, để xác định rằng một hình phạt phải được áp dụng. Nhưng nếu không còn đủ xăng cho khoản phạt thì việc tiêu thụ chưa thanh toán đã được thực hiện. Mặc dù điều đó dẫn đến một lần ném, những lần đọc trạng thái này có thể được gói thành các cuộc gọi lồng nhau; cho phép người gọi bên ngoài tiếp tục lặp lại cuộc tấn công mà không phải trả (đầy đủ) hình phạt.

Do đó, EIP đã bị bỏ rơi, trong khi chúng tôi đang tìm kiếm một giải pháp thay thế tốt hơn.

  • Alexey Akhunov đã khám phá ý tưởng về Dầu – một nguồn “khí” thứ cấp, nhưng về bản chất nó khác với khí gatrong đó nó sẽ vô hình đối với lớp thực thi và có thể gây ra hoàn nguyên giao dịch toàn cầu.
  • Martin đã viết một đề xuất tương tự, về Nghiệp chướngvào tháng 5 năm 2020.

Trong khi lặp lại các kế hoạch khác nhau này, Vitalik Buterin đề xuất chỉ tăng chi phí khí đốt và duy trì danh sách truy cập. Vào tháng 8 năm 2020, Martin và Vitalik bắt đầu lặp lại những gì sẽ trở thành EIP-2929 và eip đồng hành của nó, EIP-2930.

EIP-2929 đã giải quyết hiệu quả nhiều vấn đề trước đây.

  • Trái ngược với EIP-1884, vốn làm tăng chi phí một cách vô điều kiện, thay vào đó, nó chỉ tăng chi phí cho những thứ chưa được truy cập. Điều này dẫn đến một tăng phần trăm phụ trong chi phí ròng.
  • Ngoài ra, cùng với EIP-2930, nó không phá vỡ bất kỳ luồng hợp đồng nào,
  • Và nó có thể được điều chỉnh thêm với các tấm đệm khí nâng lên (mà không làm hỏng mọi thứ).

Vào ngày 15 tháng 4 năm 2021, cả hai đều phát trực tiếp với Berlin nâng cấp.

Công tác phát triển

Nỗ lực của Peter để giải quyết vấn đề này là ảnh chụp nhanh trạng thái độngvào tháng 10 năm 2019.

Ảnh chụp nhanh là một cấu trúc dữ liệu thứ cấp để lưu trữ trạng thái Ethereum ở định dạng phẳng, có thể được xây dựng hoàn toàn trực tuyến, trong quá trình hoạt động trực tiếp của nút Geth. Lợi ích của ảnh chụp nhanh là nó hoạt động như một cấu trúc tăng tốc cho các truy cập trạng thái:

  • Thay vì làm O (log N) đĩa đọc (x Chi phí LevelDB) để truy cập tài khoản / khe lưu trữ, ảnh chụp nhanh có thể cung cấp trực tiếp, O (1) thời gian truy cập (x Chi phí LevelDB).
  • Ảnh chụp nhanh hỗ trợ lặp lại tài khoản và bộ nhớ tại O (1) độ phức tạp trên mỗi mục nhập, cho phép các nút từ xa truy xuất dữ liệu trạng thái tuần tự rẻ hơn đáng kể so với trước đây.
  • Sự hiện diện của ảnh chụp nhanh cũng cho phép các trường hợp sử dụng kỳ lạ hơn như cắt bỏ trie trạng thái ngoại tuyến hoặc di chuyển sang các định dạng dữ liệu khác.

Nhược điểm của ảnh chụp nhanh là tài khoản thô và dữ liệu lưu trữ về cơ bản bị trùng lặp. Trong trường hợp của mainnet, điều này có nghĩa là một 25GB dung lượng SSD được sử dụng.

Ý tưởng ảnh chụp nhanh động đã được bắt đầu vào giữa năm 2019, mục đích chủ yếu là trở thành người hỗ trợ búng tay đồng bộ hóa. Vào thời điểm đó, có một số “dự án lớn” mà đội geth đang thực hiện.

  • Cắt tỉa trạng thái ngoại tuyến
  • Ảnh chụp nhanh động + đồng bộ hóa chụp nhanh
  • Phân phối trạng thái LES qua trạng thái phân đoạn

Tuy nhiên, nó đã được quyết định ưu tiên hoàn toàn cho các bức ảnh chụp nhanh, tạm thời hoãn các dự án khác. Những điều này đã đặt nền móng cho những gì sau này trở thành snap / 1 đồng bộ hóa thuật toán. Nó được hợp nhất vào tháng 3 năm 2020.

Với chức năng “ảnh chụp nhanh động” được phát hành vào tự nhiên, chúng tôi đã có một chút không gian để thở. Trong trường hợp mạng Ethereum bị tấn công, điều đó sẽ rất đau đớn, vâng, nhưng ít nhất sẽ có thể thông báo cho người dùng về việc bật ảnh chụp nhanh. Toàn bộ quá trình tạo ảnh chụp nhanh sẽ mất rất nhiều thời gian và chưa có cách nào để đồng bộ hóa các ảnh chụp nhanh, nhưng mạng ít nhất có thể tiếp tục hoạt động.

Ràng buộc các chủ đề

Vào tháng 3 đến tháng 4 năm 2021, snap / 1 giao thức đã được triển khai trong geth, giúp nó có thể đồng bộ hóa bằng cách sử dụng thuật toán dựa trên ảnh chụp nhanh mới. Mặc dù vẫn không phải là chế độ đồng bộ hóa mặc định, nhưng đây là một bước (quan trọng) hướng tới việc làm cho ảnh chụp nhanh không chỉ hữu ích như một biện pháp bảo vệ chống tấn công mà còn là một cải tiến lớn cho người dùng.

Về mặt giao thức, Berlin nâng cấp xảy ra vào tháng 4 năm 2021.

Dưới đây là một số điểm chuẩn được thực hiện trên môi trường giám sát AWS của chúng tôi:

  • Pre-berlin, không có ảnh chụp nhanh, 25 triệu khí ga: 14.3 giây
  • Pre-berlin, với ảnh chụp nhanh, 25 triệu khí ga: 1,5 giây
  • Hậu berlin, không có ảnh chụp nhanh, 25 triệu khí ga: ~ 3.1 giây
  • Hậu berlin, với ảnh chụp nhanh, 25 triệu khí ga: ~ 0,3 giây

Các con số (thô) chỉ ra rằng Berlin giảm hiệu quả của cuộc tấn công bởi 5xvà ảnh chụp nhanh làm giảm nó xuống 10xtổng cộng thành một 50x giảm va đập.

Chúng tôi ước tính rằng hiện tại, trên Mainnet (15 triệu gas), có thể tạo ra các khối sẽ mất 2,5-3 giây để thực hiện trên một geth nút không có ảnh chụp nhanh. Con số này sẽ tiếp tục giảm (đối với các nút không chụp nhanh), khi trạng thái tăng lên.

Nếu tiền hoàn lại được sử dụng để tăng mức sử dụng khí hiệu quả trong một khối, thì điều này có thể trầm trọng hơn nữa bởi hệ số (tối đa) 2x . Với EIP 1559giới hạn khí khối sẽ có độ đàn hồi cao hơn và cho phép 2x (các ELASTICITY_MULTIPLIER) trong các đợt bùng nổ tạm thời.

Đối với tính khả thi của việc thực hiện cuộc tấn công này; chi phí để kẻ tấn công mua một khối đầy đủ sẽ là một vài ether (15 triệu khí tại 100Gwei1,5 ête).

Tại sao phải tiết lộ ngay bây giờ

Mối đe dọa này đã là một “bí mật mở” trong một thời gian dài – nó thực sự đã được tiết lộ công khai do nhầm lẫn ít nhất một lần và nó đã được tham chiếu trong các cuộc gọi ACD nhiều lần mà không có chi tiết rõ ràng.

Vì việc nâng cấp Berlin hiện đang ở phía sau chúng tôi và vì các nút địa lý theo mặc định đang sử dụng ảnh chụp nhanh, chúng tôi ước tính rằng mối đe dọa đủ thấp để tính minh bạch vượt trội và đã đến lúc tiết lộ đầy đủ về các hoạt động đằng sau hậu trường.

Điều quan trọng là cộng đồng có cơ hội hiểu được lý do đằng sau những thay đổi ảnh hưởng tiêu cực đến trải nghiệm người dùng, chẳng hạn như tăng chi phí gas và hạn chế hoàn lại tiền.


Bài đăng này được viết bởi Martin Holst Swende và Peter Szilagyi 2021-04-23. Nó đã được chia sẻ với các dự án dựa trên Ethereum khác vào 2021-04-26 và được tiết lộ công khai vào 2021-05-18.

Thuc Quyen

Leave a Reply

Your email address will not be published. Required fields are marked *