Trước đây, nhóm CertiK đã phát hiện ra một loạt lỗ hổng từ chối dịch vụ trong chuỗi khối Sui. Trong số các lỗ hổng này, nổi bật nhất là một lỗ hổng mới có mức độ ảnh hưởng cao. Lỗ hổng này có thể khiến các nút mạng Sui không thể xử lý các giao dịch mới và hậu quả tương đương với việc toàn bộ mạng bị tắt hoàn toàn.
Mới thứ Hai tuần trước,CertiK được SUI thưởng 500.000 USD cho lỗi phát hiện lỗ hổng bảo mật nghiêm trọng. CoinDesk, một phương tiện truyền thông có uy tín trong ngành ở Hoa Kỳ, đã đưa tin về vụ việc và sau đó các phương tiện truyền thông lớn cũng đưa ra tin tức liên quan sau báo cáo của họ.
Lỗ hổng bảo mật này được gọi một cách sống động là Hamster Wheel: phương thức tấn công độc đáo của nó khác với các cuộc tấn công hiện đã biết và kẻ tấn công chỉ cần gửi tải trọng khoảng 100 byte để kích hoạt một vòng lặp vô hạn trong nút xác minh Sui, khiến nó không phản hồi đến các giao dịch mới.
Ngoài ra, thiệt hại do cuộc tấn công gây ra có thể tiếp tục xảy ra sau khi mạng được khởi động lại và có thể tự động lan truyền trong mạng Sui, khiến tất cả các nút không thể xử lý các giao dịch mới giống như những con chuột đồng chạy không ngừng nghỉ trên bánh xe. Do đó, chúng tôi gọi kiểu tấn công độc đáo này là cuộc tấn công bánh xe hamster.
Sau khi phát hiện ra lỗi, CertiK đã báo cáo cho Sui thông qua chương trình thưởng lỗi của Sui. Sui cũng phản ứng hiệu quả ngay từ đầu, xác nhận mức độ nghiêm trọng của lỗ hổng và tích cực thực hiện các biện pháp tương ứng để khắc phục sự cố trước khi ra mắt mainnet. Ngoài việc sửa lỗ hổng cụ thể này, Sui còn thực hiện các biện pháp giảm thiểu phòng ngừa để giảm thiệt hại tiềm tàng mà lỗ hổng này có thể gây ra.
Để cảm ơn nhóm CertiK vì đã tiết lộ thông tin có trách nhiệm, Sui đã trao cho nhóm CertiK khoản tiền thưởng 500.000 USD.
danh hiệu cấp một
Vai trò chính của người xác nhận trong Sui
Mô tả hình ảnh
Các mối đe dọa tải trọng độc hại trên chuỗi di chuyển
Mô tả hình ảnh
Lệnh kiểm tải của Sui
Như được hiển thị trong hình trên, hầu hết các bước kiểm tra trong trình xác minh đều thực hiện xác minh bảo mật cấu trúc đối với CompiledModule (thể hiện việc thực thi trọng tải hợp đồng do người dùng cung cấp). Ví dụ: sử dụng Trình kiểm tra trùng lặp để đảm bảo rằng không có mục nhập trùng lặp trong tải trọng thời gian chạy; sử dụng Trình kiểm tra giới hạn để đảm bảo rằng độ dài của mỗi trường trong tải trọng thời gian chạy nằm trong giới hạn mục nhập tối đa được phép.
danh hiệu cấp một
Hiểu trình thông dịch trừu tượng của Move: Phân tích tuyến tính và lặp lại
Trình thông dịch trừu tượng do Move cung cấp là một khung được thiết kế đặc biệt để thực hiện phân tích bảo mật phức tạp trên mã byte thông qua diễn giải trừu tượng. Cơ chế này làm cho quá trình xác minh trở nên chi tiết và chính xác hơn, đồng thời mỗi trình xác thực được phép xác định trạng thái trừu tượng duy nhất của mình để phân tích.
Khi khởi động, trình thông dịch trừu tượng xây dựng biểu đồ luồng điều khiển (CFG) từ các mô-đun đã biên dịch. Mỗi khối cơ bản trong các CFG này duy trì một tập hợp các trạng thái, trạng thái đặt hàng trước và trạng thái đặt hàng sau. Trạng thái đặt hàng trước cung cấp ảnh chụp nhanh trạng thái chương trình trước khi thực hiện khối cơ bản, trong khi trạng thái đặt hàng sau cung cấp mô tả về trạng thái chương trình sau khi thực hiện khối cơ bản.
Mô tả hình ảnh
Quy trình làm việc của trình thông dịch trừu tượng Move
Tuy nhiên, quá trình này trở nên phức tạp hơn khi có các vòng lặp trong luồng điều khiển. Sự xuất hiện của một chu trình có nghĩa là biểu đồ luồng điều khiển chứa cạnh nhảy lùi. Nguồn của cạnh nhảy lùi tương ứng với trạng thái tiếp theo của khối cơ bản hiện tại và khối cơ bản đích (đầu vòng lặp) của bước nhảy- cạnh sau đã được phân tích trước đó. Do đó, trình thông dịch trừu tượng cần hợp nhất cẩn thận các trạng thái của hai khối cơ bản liên quan đến bước nhảy ngược.
danh hiệu cấp một
Trình xác thực Sui IDLeak: Phân tích diễn giải tóm tắt tùy chỉnh
Không giống như thiết kế Move ban đầu, nền tảng blockchain của Sui giới thiệu một mô hình lưu trữ toàn cầu tập trung vào “mục tiêu” độc đáo. Một tính năng đáng chú ý của mô hình này là bất kỳ cấu trúc dữ liệu nào có thuộc tính khóa (được lưu trữ trên chuỗi dưới dạng chỉ mục) đều phải có loại ID làm trường đầu tiên của cấu trúc. Trường ID là bất biến và không thể chuyển sang các đối tượng khác vì mỗi đối tượng phải có một ID duy nhất trên toàn cầu. Để đảm bảo các đặc tính này, Sui đã xây dựng một bộ logic phân tích tùy chỉnh bên trên trình thông dịch trừu tượng.
Trình xác minh IDLeak, còn được gọi là id_leak_verifier, hoạt động cùng với trình thông dịch trừu tượng để phân tích. Nó có tên miền Tóm tắt duy nhất của riêng mình được gọi là Tóm tắt. Mỗi trạng thái trừu tượng bao gồm giá trị trừu tượng tương ứng với nhiều biến cục bộ. Trạng thái của từng biến cục bộ được theo dõi bởi abstractValue để theo dõi xem biến ID có phải là biến hoàn toàn mới hay không.
danh hiệu cấp một
Sui IDLeak duy trì trạng thái trình xác nhận không nhất quán
Trình xác thực IDLeak tích hợp với trình thông dịch trừu tượng Move bằng cách triển khai hàm Tóm tắt::join. Chức năng này đóng vai trò không thể thiếu trong quản lý trạng thái, đặc biệt là trong việc hợp nhất và cập nhật các giá trị trạng thái.
Kiểm tra các chức năng này một cách chi tiết để hiểu hoạt động của chúng:
Trong abstractState::join, hàm lấy một trạng thái trừu tượng khác làm đầu vào và cố gắng hợp nhất trạng thái cục bộ của nó với trạng thái cục bộ của đối tượng hiện tại. Đối với mỗi biến cục bộ ở trạng thái đầu vào, nó so sánh giá trị của biến đó với giá trị hiện tại của nó ở trạng thái cục bộ (mặc định là Tóm tắtValue::Khác nếu không tìm thấy). Nếu hai giá trị không bằng nhau, nó sẽ đặt cờ đã thay đổi làm cơ sở cho việc kết quả hợp nhất trạng thái cuối cùng có thay đổi hay không và cập nhật giá trị biến cục bộ ở trạng thái cục bộ bằng cách gọi Tóm tắtValue::join.
Trong Tóm tắtValue::join, hàm so sánh giá trị của nó với một giá trị Tóm tắt khác. Nếu chúng bằng nhau, nó sẽ trả về giá trị được truyền vào. Nếu không bằng, trả về Tóm tắtValue::Khác.
Tuy nhiên, logic duy trì trạng thái này ẩn chứa một vấn đề không nhất quán. Mặc dù Tóm tắtState::join sẽ trả về kết quả cho biết trạng thái được hợp nhất đã thay đổi (JoinResult::Changed) dựa trên sự khác biệt giữa giá trị cũ và giá trị mới, giá trị trạng thái được cập nhật sau khi hợp nhất có thể vẫn không thay đổi.
Sự không nhất quán này là do thứ tự thực hiện: quyết định thay đổi trạng thái trong Tóm tắtState::join xảy ra trước khi cập nhật trạng thái (AbstractValue::join) và quyết định này không phản ánh kết quả cập nhật trạng thái thực.
Mô tả hình ảnh
Ví dụ: Sự không mạch lạc của các kết nối có trạng thái
Điều này gây ra sự không nhất quán: kết quả của việc hợp nhất trạng thái của một khối cơ bản được đánh giá là đã thay đổi, nhưng bản thân giá trị trạng thái được hợp nhất không thay đổi. Trong quá trình phân tích diễn giải trừu tượng, những mâu thuẫn như vậy có thể gây ra hậu quả nghiêm trọng. Chúng tôi xem xét hành vi của trình thông dịch trừu tượng khi một chu trình xảy ra trong biểu đồ luồng điều khiển (CFG):
Khi gặp một vòng lặp, trình thông dịch trừu tượng sử dụng phương pháp phân tích lặp để hợp nhất trạng thái của khối cơ bản đích nhảy lùi và khối cơ bản hiện tại. Nếu trạng thái hợp nhất thay đổi, trình thông dịch trừu tượng sẽ phân tích lại bắt đầu từ mục tiêu nhảy.
danh hiệu cấp một
Việc khai thác thêm sự không nhất quán sẽ kích hoạt vòng lặp vô hạn trong trình xác thực Sui IDLeak
Mô tả hình ảnh
Trạng thái CFG+ độc hại, có thể dẫn đến vòng lặp vô hạn bên trong trình xác thực IDLeak
Quá trình này bắt đầu với BB 2, trong đó Giá trị trừu tượng của một biến cục bộ cụ thể được đặt thành ::Khác. Sau khi thực hiện BB 2, luồng chuyển sang BB 3 nơi biến tương tự được đặt thành :: Fresh. Cuối BB 3 có bước nhảy lùi, nhảy lên BB 2.
Những mâu thuẫn nói trên đóng một vai trò quan trọng trong việc giải thích trừu tượng của ví dụ này. Khi cạnh nhảy lùi được xử lý, trình thông dịch trừu tượng cố gắng kết nối trạng thái thứ tự sau của BB 3 (với biến ::Fresh) với trạng thái thứ tự trước của BB 2 (với biến ::Other). Hàm abstractState::join nhận thấy sự khác biệt giữa giá trị cũ và giá trị mới và đặt cờ thay đổi để cho biết rằng BB 2 cần được phân tích lại.
Tuy nhiên, hành vi chủ yếu của ::Other trong Tóm tắtValue::join có nghĩa là sau khi Hợp nhất giá trị trừu tượng, giá trị thực của biến trạng thái BB 2 vẫn là ::Khác và kết quả của hợp nhất trạng thái không thay đổi .
Vì vậy, khi quá trình mang tính chu kỳ này bắt đầu, tức là khi người xác thực tiếp tục phân tích lại BB 2 và tất cả các nút khối cơ bản kế nhiệm của nó (BB 3 trong trường hợp này), nó sẽ tiếp tục vô thời hạn. Vòng lặp vô hạn tiêu tốn tất cả các chu kỳ CPU có sẵn, khiến nó không thể xử lý và phản hồi các giao dịch mới, điều này vẫn tồn tại trong suốt quá trình khởi động lại trình xác thực.
Bằng cách khai thác lỗ hổng này, các nút xác thực sẽ chạy không ngừng nghỉ như những con chuột đồng trên bánh xe trong một vòng lặp vô hạn, không thể xử lý các giao dịch mới. Do đó, chúng tôi gọi kiểu tấn công độc đáo này là cuộc tấn công bánh xe hamster.
Cuộc tấn công bánh xe hamster có thể khiến các trình xác thực Sui rơi vào tình trạng bế tắc một cách hiệu quả, từ đó có thể đánh sập toàn bộ mạng Sui.
Sau khi hiểu nguyên nhân của lỗ hổng bảo mật và quy trình kích hoạt, chúng tôi đã kích hoạt thành công lỗ hổng bảo mật trong mô phỏng thế giới thực bằng cách xây dựng một ví dụ cụ thể bằng mô phỏng Move bytecode sau:
danh hiệu cấp một
Mối nguy hiểm dai dẳng của cuộc tấn công Hamster Wheel trong Sui Network
Chương trình tiền thưởng lỗi của Sui có các quy định nghiêm ngặt về đánh giá mức độ dễ bị tổn thương, chủ yếu dựa trên mức độ gây hại cho toàn bộ mạng. Các lỗ hổng đáp ứng xếp hạng nghiêm trọng phải đóng cửa toàn bộ mạng và ngăn chặn hiệu quả việc xác nhận giao dịch mới, đồng thời yêu cầu hard fork để khắc phục sự cố; lỗ hổng (trung bình)” hoặc “rủi ro cao (cao)”.
Mô tả hình ảnh
Tổng quan về tương tác gửi giao dịch trong Sui
Ban đầu, các giao dịch của người dùng được gửi qua RPC giao diện người dùng, được chuyển đến các dịch vụ phụ trợ sau khi xác thực cơ bản. Dịch vụ phụ trợ Sui chịu trách nhiệm xác thực thêm tải trọng giao dịch đến. Sau khi xác minh thành công chữ ký của người dùng, giao dịch được chuyển đổi thành chứng chỉ giao dịch (chứa thông tin giao dịch và chữ ký của Sui).
Các chứng chỉ giao dịch này là một phần cơ bản trong hoạt động của mạng Sui và có thể được phổ biến giữa các nút xác minh khác nhau trong mạng. Đối với các giao dịch tạo/nâng cấp hợp đồng, trước khi chúng có thể được tải lên chuỗi, nút xác minh sẽ gọi trình xác minh Sui để kiểm tra và xác minh tính hợp lệ của cấu trúc hợp đồng/ngữ nghĩa của các chứng chỉ này. Chính trong giai đoạn xác minh quan trọng này, lỗ hổng vòng lặp vô hạn có thể được kích hoạt và khai thác.
danh hiệu cấp một
Giải pháp của Sui
Sau phản hồi từ CertiK, Sui đã nhanh chóng xác nhận lỗ hổng và đưa ra bản sửa lỗi để giải quyết lỗ hổng nghiêm trọng. Bản sửa lỗi đảm bảo tính nhất quán giữa các thay đổi trạng thái và cờ sau thay đổi, loại bỏ ảnh hưởng nghiêm trọng của cuộc tấn công bánh xe hamster.
Để loại bỏ sự không nhất quán ở trên, bản sửa lỗi của Sui bao gồm một điều chỉnh nhỏ nhưng quan trọng đối với hàm Tóm tắt::join. Bản vá này loại bỏ logic xác định kết quả của việc hợp nhất trạng thái trước khi thực hiện Tóm tắtValue::join và thay vào đó thực thi hàm Tóm tắt::join trước để hợp nhất trạng thái và đặt xem việc hợp nhất có xảy ra hay không bằng cách so sánh kết quả cập nhật cuối cùng với giá trị trạng thái ban đầu (old_value) Thay đổi đánh dấu.
Bằng cách này, kết quả của việc hợp nhất trạng thái sẽ nhất quán với kết quả của bản cập nhật thực và vòng lặp vô hạn sẽ không xảy ra trong quá trình phân tích.
Ngoài việc sửa lỗ hổng cụ thể này, Sui còn triển khai các biện pháp giảm thiểu tác động của các lỗ hổng xác thực trong tương lai. Theo phản hồi của Sui trong báo cáo lỗi, việc giảm thiểu liên quan đến một tính năng có tên là Danh sách từ chối.
Tuy nhiên, trình xác thực có cấu hình nút cho phép họ tạm thời từ chối một số loại giao dịch nhất định. Cấu hình này có thể được sử dụng để tạm thời vô hiệu hóa việc xử lý các bản phát hành và nâng cấp gói. Vì lỗi này xảy ra khi trình xác thực Sui chạy trước khi bản phát hành hoặc bản nâng cấp gói tx được ký và danh sách từ chối sẽ ngăn trình xác thực chạy và loại bỏ tx độc hại, nên tạm thời từ chối đưa các loại tx này vào danh sách là một biện pháp giảm thiểu hiệu quả 100% (Mặc dù nó sẽ tạm thời làm gián đoạn dịch vụ đối với những người đang cố gắng phát hành hoặc nâng cấp mã).
Ngẫu nhiên thay, chúng tôi đã có tệp cấu hình danh sách từ chối TX này được một thời gian nhưng chúng tôi cũng đã thêm một cơ chế tương tự cho các chứng chỉ như một biện pháp tiếp theo để giảm thiểu lỗ hổng vòng lặp trình xác thực mà bạn đã báo cáo trước đó. Với cơ chế này, chúng tôi sẽ linh hoạt hơn trước cuộc tấn công này: chúng tôi sẽ sử dụng cấu hình danh sách từ chối chứng chỉ để làm cho người xác nhận quên đi các chứng chỉ xấu (phá vỡ vòng lặp vô hạn) và cấu hình danh sách từ chối TX để không cho phép phát hành/nâng cấp, từ đó ngăn chặn việc tạo giao dịch tấn công độc hại mới. Cảm ơn đã khiến chúng tôi suy nghĩ về điều này!
Trình xác nhận có số lượng hạn chế"ticks"(không giống như gas) Được sử dụng để xác minh mã byte, nếu tất cả mã byte được phát hành trong một giao dịch không thể được xác minh trong nhiều tích tắc này, người xác thực sẽ từ chối ký giao dịch, ngăn không cho giao dịch được thực thi trên mạng. Trước đây, việc đo lường chỉ áp dụng cho một tập hợp các thẻ xác thực phức tạp đã chọn. Để giải quyết vấn đề này, chúng tôi mở rộng việc đo lường cho từng trình xác thực để đảm bảo giới hạn công việc mà trình xác thực thực hiện trong quá trình xác thực mỗi tích tắc. Chúng tôi cũng đã sửa lỗi vòng lặp vô hạn tiềm ẩn trong trình xác thực rò rỉ ID.
- Lưu ý từ nhà phát triển Sui về việc sửa lỗi
Tóm tắt
Tóm tắt
Trong bài viết này, chúng tôi chia sẻ chi tiết kỹ thuật của cuộc tấn công hamsterwheel do nhóm CertiK Skyfall phát hiện, giải thích cách cuộc tấn công mới này khai thác một lỗ hổng nghiêm trọng nhằm khiến mạng Sui bị tắt hoàn toàn. Ngoài ra, chúng tôi cũng xem xét kỹ hơn phản hồi kịp thời của Sui để khắc phục sự cố nghiêm trọng này, đồng thời chia sẻ cách khắc phục lỗ hổng bảo mật cũng như các phương pháp giảm thiểu tiếp theo cho các lỗ hổng tương tự.