Bài viết này là một bài nộp cộng đồng. Tác giả là Minzhi He, kiểm toán viên tại CertiK.

Lượt xem trong bài viết này là của người đóng góp/tác giả và không nhất thiết phản ánh quan điểm của Binance Academy.

TL;DR

Cầu nối chuỗi khối rất quan trọng trong việc đạt được khả năng tương tác trong không gian chuỗi khối. Vì vậy, an ninh cầu là hết sức quan trọng. Một số lỗ hổng bảo mật cầu nối phổ biến bao gồm xác thực yếu trên chuỗi và ngoài chuỗi, xử lý mã thông báo gốc không đúng cách và cấu hình sai. Nên kiểm tra cây cầu chống lại tất cả các vectơ tấn công có thể xảy ra để đảm bảo logic xác minh hợp lý.

Giới thiệu

Cầu blockchain là một giao thức kết nối hai blockchain để cho phép tương tác giữa chúng. Nếu bạn sở hữu bitcoin nhưng muốn tham gia hoạt động DeFi trên mạng Ethereum, cầu nối blockchain cho phép bạn làm điều đó mà không cần bán bitcoin của mình.

Cầu nối chuỗi khối là nền tảng để đạt được khả năng tương tác trong không gian chuỗi khối. Chúng hoạt động bằng cách sử dụng nhiều xác thực trên chuỗi và ngoài chuỗi khác nhau và do đó có các lỗ hổng bảo mật khác nhau.

Tại sao an ninh cầu lại quan trọng?

Cây cầu thường chứa mã thông báo mà người dùng muốn chuyển từ chuỗi này sang chuỗi khác. Thường được triển khai dưới dạng hợp đồng thông minh, cầu nối nắm giữ một lượng token đáng kể khi chuyển khoản xuyên chuỗi tích lũy, khiến chúng trở thành mục tiêu sinh lợi cho tin tặc.

Ngoài ra, các cầu blockchain có phạm vi tấn công lớn vì chúng liên quan đến nhiều thành phần. Với ý nghĩ đó, các tác nhân độc hại rất có động lực nhắm mục tiêu vào các ứng dụng chuỗi chéo để tiêu tốn số tiền lớn.

Các vụ tấn công cầu dẫn đến thiệt hại hơn 1,3 tỷ USD vào năm 2022, chiếm 36% tổng thiệt hại của năm, theo ước tính của CertiK.

Các lỗ hổng bảo mật cầu phổ biến

Để nâng cao tính bảo mật của cầu nối, việc hiểu các lỗ hổng bảo mật cầu nối phổ biến và kiểm tra các lỗ hổng bảo mật cầu nối đó trước khi khởi chạy là rất có giá trị. Những lỗ hổng này có thể được phân loại thành bốn lĩnh vực sau.

Xác thực trên chuỗi yếu

Đối với các cầu nối đơn giản, đặc biệt là các cầu nối được thiết kế cho các DApp cụ thể, việc xác thực trên chuỗi được giữ ở mức tối thiểu. Những cây cầu này dựa vào phần phụ trợ tập trung để thực hiện các hoạt động cơ bản như đúc, ghi và chuyển mã thông báo trong khi tất cả các xác minh được thực hiện ngoài chuỗi.

Ngược lại, các loại cầu nối khác sử dụng hợp đồng thông minh để xác thực tin nhắn và thực hiện xác minh trên chuỗi. Trong trường hợp này, khi người dùng gửi tiền vào chuỗi, hợp đồng thông minh sẽ tạo ra một thông báo đã ký và trả lại chữ ký trong giao dịch. Chữ ký này đóng vai trò là bằng chứng về khoản tiền gửi và được sử dụng để xác minh yêu cầu rút tiền của người dùng trên chuỗi khác. Quá trình này có thể ngăn chặn các cuộc tấn công bảo mật khác nhau, bao gồm các cuộc tấn công lặp lại và hồ sơ tiền gửi giả mạo.

Tuy nhiên, nếu có lỗ hổng trong quá trình xác thực trên chuỗi, kẻ tấn công có thể gây ra thiệt hại nghiêm trọng. Ví dụ: nếu một cây cầu sử dụng cây Merkle để xác thực bản ghi giao dịch, kẻ tấn công có thể tạo ra bằng chứng giả mạo. Điều này có nghĩa là họ có thể bỏ qua xác thực bằng chứng và đúc mã thông báo mới vào tài khoản của mình nếu quá trình xác thực dễ bị tấn công.

Một số cây cầu nhất định triển khai khái niệm “mã thông báo được bao bọc”. Chẳng hạn, khi người dùng chuyển DAI từ Ethereum sang Chuỗi BNB, DAI của họ sẽ được lấy từ hợp đồng Ethereum và một lượng DAI được gói tương đương sẽ được phát hành trên Chuỗi BNB.

Tuy nhiên, nếu giao dịch này không được xác thực chính xác, kẻ tấn công có thể triển khai một hợp đồng độc hại để định tuyến các mã thông báo được bao bọc từ cầu nối đến một địa chỉ không chính xác bằng cách thao túng chức năng.

Những kẻ tấn công cũng cần nạn nhân phê duyệt hợp đồng bắc cầu để chuyển mã thông báo bằng cách sử dụng chức năng “transferFrom” để rút tài sản khỏi hợp đồng bắc cầu.

Thật không may, điều này càng trở nên tồi tệ hơn vì nhiều cầu nối yêu cầu phê duyệt mã thông báo vô hạn từ người dùng DApp. Đây là một phương pháp phổ biến giúp giảm phí gas nhưng tạo ra rủi ro bổ sung bằng cách cho phép hợp đồng thông minh truy cập số lượng token không giới hạn từ ví của người dùng. Những kẻ tấn công có thể khai thác việc thiếu xác thực và phê duyệt quá mức để chuyển mã thông báo từ người dùng khác sang chính họ.

Xác thực ngoài chuỗi yếu

Trong một số hệ thống cầu nối, máy chủ phụ trợ ngoài chuỗi đóng vai trò quan trọng trong việc xác minh tính hợp pháp của các tin nhắn được gửi từ chuỗi khối. Trong trường hợp này, chúng tôi tập trung vào việc xác minh các giao dịch tiền gửi.

Một cầu nối chuỗi khối với xác thực ngoài chuỗi hoạt động như sau:

  1. Người dùng tương tác với DApp để gửi token vào hợp đồng thông minh trên chuỗi nguồn.

  2. Sau đó, DApp sẽ gửi hàm băm giao dịch tiền gửi đến máy chủ phụ trợ thông qua API.

  3. Băm giao dịch phải chịu một số xác nhận của máy chủ. Nếu được coi là hợp pháp, người ký sẽ ký vào tin nhắn và gửi chữ ký trở lại giao diện người dùng thông qua API.

  4. Khi nhận được chữ ký, DApp sẽ xác minh nó và cho phép người dùng rút mã thông báo của họ khỏi chuỗi nguồn.

Máy chủ phụ trợ phải đảm bảo rằng giao dịch gửi tiền mà nó xử lý đã thực sự xảy ra và không bị giả mạo. Máy chủ phụ trợ này xác định xem người dùng có thể rút mã thông báo trên chuỗi mục tiêu hay không và do đó, đây là mục tiêu có giá trị cao cho những kẻ tấn công.

Máy chủ phụ trợ cần xác thực cấu trúc của sự kiện được phát ra của giao dịch, cũng như địa chỉ hợp đồng đã phát ra sự kiện đó. Nếu điều sau bị bỏ qua, kẻ tấn công có thể triển khai một hợp đồng độc hại để giả mạo một sự kiện gửi tiền có cấu trúc giống như một sự kiện gửi tiền hợp pháp.

Nếu máy chủ phụ trợ không xác minh địa chỉ nào đã phát ra sự kiện, nó sẽ coi đây là giao dịch hợp lệ và ký vào tin nhắn. Sau đó, kẻ tấn công có thể gửi hàm băm giao dịch đến phần phụ trợ, bỏ qua xác minh và cho phép chúng rút mã thông báo khỏi chuỗi mục tiêu.

Xử lý mã thông báo gốc không đúng cách

Các cầu nối có những cách tiếp cận khác nhau để xử lý mã thông báo gốc và mã thông báo tiện ích. Ví dụ: trên mạng Ethereum, mã thông báo gốc là ETH và hầu hết các mã thông báo tiện ích đều tuân thủ tiêu chuẩn ERC-20.

Khi người dùng có ý định chuyển ETH của họ sang chuỗi khác, trước tiên họ phải gửi số tiền đó vào hợp đồng bắc cầu. Để đạt được điều này, người dùng chỉ cần gắn ETH vào giao dịch và số lượng ETH có thể được truy xuất bằng cách đọc trường “msg.value” của giao dịch.

Việc gửi mã thông báo ERC-20 khác biệt đáng kể so với việc gửi ETH. Để gửi mã thông báo ERC-20, trước tiên người dùng phải cho phép hợp đồng cầu nối chi tiêu mã thông báo của họ. Sau khi họ phê duyệt điều này và gửi mã thông báo vào hợp đồng cầu nối, hợp đồng sẽ ghi mã thông báo của người dùng bằng chức năng "burnFrom()" hoặc chuyển mã thông báo của người dùng sang hợp đồng bằng chức năng "transferFrom()".

Một cách tiếp cận để phân biệt điều này là sử dụng câu lệnh if-else trong cùng một hàm. Một cách tiếp cận khác là tạo hai hàm riêng biệt để xử lý từng tình huống. Việc cố gắng gửi ETH bằng chức năng gửi tiền ERC-20 có thể dẫn đến việc mất số tiền này.

Khi xử lý các yêu cầu gửi tiền ERC-20, người dùng thường cung cấp địa chỉ mã thông báo làm đầu vào cho chức năng gửi tiền. Điều này gây ra rủi ro đáng kể vì các cuộc gọi bên ngoài không đáng tin cậy có thể xảy ra trong quá trình giao dịch. Triển khai danh sách trắng chỉ bao gồm các mã thông báo được cầu nối hỗ trợ là một phương pháp phổ biến để giảm thiểu rủi ro. Chỉ những địa chỉ trong danh sách trắng mới được phép chuyển làm đối số. Điều này ngăn các cuộc gọi bên ngoài vì nhóm dự án đã lọc địa chỉ mã thông báo.

Tuy nhiên, các vấn đề cũng có thể phát sinh khi các cầu nối xử lý chuyển giao chuỗi chéo mã thông báo gốc vì mã thông báo gốc không có địa chỉ. Địa chỉ 0 (0x000...0) là đại diện cho mã thông báo gốc. Điều này có thể có vấn đề vì việc chuyển địa chỉ số 0 cho hàm có thể bỏ qua quá trình xác minh danh sách trắng ngay cả khi được triển khai không chính xác.

Khi hợp đồng cầu nối gọi “transferFrom” để chuyển nội dung của người dùng sang hợp đồng, lệnh gọi bên ngoài đến địa chỉ 0 sẽ trả về sai do không có chức năng “transferFrom” nào được triển khai ở địa chỉ 0. Tuy nhiên, giao dịch vẫn có thể xảy ra nếu hợp đồng không xử lý giá trị trả lại một cách thích hợp. Điều này tạo cơ hội cho kẻ tấn công thực hiện giao dịch mà không chuyển bất kỳ mã thông báo nào vào hợp đồng.

Cấu hình sai

Trong hầu hết các cầu nối blockchain, vai trò đặc quyền chịu trách nhiệm đưa mã thông báo và địa chỉ vào danh sách trắng hoặc danh sách đen, chỉ định hoặc thay đổi người ký và các cấu hình quan trọng khác. Việc đảm bảo rằng tất cả các cấu hình đều chính xác là rất quan trọng, vì ngay cả những sai sót tưởng chừng như nhỏ nhặt cũng có thể dẫn đến tổn thất đáng kể.

Trên thực tế, đã xảy ra sự cố trong đó kẻ tấn công đã vượt qua thành công quá trình xác minh hồ sơ chuyển tiền do cấu hình sai. Nhóm dự án đã triển khai nâng cấp giao thức vài ngày trước vụ hack, liên quan đến việc thay đổi một biến. Biến được sử dụng để biểu thị giá trị mặc định của tin nhắn đáng tin cậy. Thay đổi này dẫn đến tất cả các tin nhắn được tự động coi là đã được chứng minh, do đó cho phép kẻ tấn công gửi tin nhắn tùy ý và vượt qua quá trình xác minh.

Làm thế nào để cải thiện an ninh cầu

Bốn lỗ hổng cầu phổ biến được giải thích ở trên cho thấy những thách thức trong việc đảm bảo an ninh trong hệ sinh thái blockchain được kết nối với nhau. Có những cân nhắc quan trọng để xử lý từng lỗ hổng này và không có cẩm nang nào áp dụng cho tất cả các lỗ hổng đó.

Ví dụ: việc cung cấp các hướng dẫn chung để đảm bảo quy trình xác minh không có lỗi là một thách thức vì mỗi cây cầu có các yêu cầu xác minh riêng. Cách tiếp cận hiệu quả nhất để ngăn chặn việc bỏ qua xác minh là kiểm tra kỹ lưỡng cây cầu chống lại tất cả các vectơ tấn công có thể xảy ra và đảm bảo logic xác minh là hợp lý.

Tóm lại, điều cần thiết là phải thực hiện kiểm tra nghiêm ngặt trước các cuộc tấn công tiềm ẩn và đặc biệt chú ý đến các lỗ hổng bảo mật phổ biến nhất trong bridge.

Bớt tư tưởng

Do có giá trị cao, các cầu nối chuỗi từ lâu đã trở thành mục tiêu của những kẻ tấn công. Các nhà xây dựng có thể tăng cường bảo mật cho cây cầu của mình bằng cách tiến hành thử nghiệm kỹ lưỡng trước khi triển khai và tham gia kiểm tra của bên thứ ba, giảm nguy cơ xảy ra các vụ hack tàn khốc đã gây khó khăn cho các cây cầu trong vài năm qua. Các cầu nối rất quan trọng trong thế giới đa chuỗi, nhưng bảo mật phải là mối quan tâm hàng đầu khi thiết kế và xây dựng cơ sở hạ tầng Web3 hiệu quả.

Đọc thêm

Cầu Blockchain là gì?

Khả năng tương tác chuỗi chéo là gì?

Ba cầu nối tiền điện tử phổ biến và cách chúng hoạt động

Token được bọc là gì?

Tuyên bố miễn trừ trách nhiệm và cảnh báo rủi ro: Nội dung này được cung cấp cho bạn trên cơ sở “nguyên trạng” chỉ nhằm mục đích cung cấp thông tin chung và giáo dục mà không có sự đại diện hay bảo đảm dưới bất kỳ hình thức nào. Nó không nên được hiểu là lời khuyên về tài chính, pháp lý hoặc chuyên môn khác, cũng như không nhằm mục đích khuyến nghị mua bất kỳ sản phẩm hoặc dịch vụ cụ thể nào. Bạn nên tìm kiếm lời khuyên của riêng bạn từ các cố vấn chuyên môn thích hợp. Trong trường hợp bài viết được đóng góp bởi cộng tác viên bên thứ ba, xin lưu ý rằng những quan điểm thể hiện đó thuộc về cộng tác viên bên thứ ba và không nhất thiết phản ánh quan điểm của Binance Academy. Vui lòng đọc tuyên bố từ chối trách nhiệm đầy đủ của chúng tôi ở đây để biết thêm chi tiết. Giá tài sản kỹ thuật số có thể biến động. Giá trị khoản đầu tư của bạn có thể giảm hoặc tăng và bạn có thể không lấy lại được số tiền đã đầu tư. Bạn hoàn toàn chịu trách nhiệm về các quyết định đầu tư của mình và Binance Academy không chịu trách nhiệm về bất kỳ tổn thất nào bạn có thể phải gánh chịu. Tài liệu này không nên được hiểu là lời khuyên về tài chính, pháp lý hoặc chuyên môn khác. Để biết thêm thông tin, hãy xem Điều khoản sử dụng và Cảnh báo rủi ro của chúng tôi.