ZenGo là ví Web 3 an toàn sử dụng công nghệ tính toán đa bên (MPC).
Gần đây, nhóm SkyFall của CertiK đã tiến hành kiểm tra và nghiên cứu kỹ lưỡng nhiều ví di động và nhận thấy rằng giải pháp MPC của ZenGo cung cấp khả năng bảo vệ mạnh mẽ hơn so với ví di động thông thường – Người dùng ví ZenGo, đặc biệt là những người có ví giá trị cao được bảo vệ trước các cuộc tấn công trực tiếp từ những kẻ tấn công nâng cao: ví dụ: khai thác lỗ hổng zero-day hoặc phần mềm độc hại nâng cao để giành quyền truy cập root trên thiết bị của người dùng.
Mối đe dọa này là mối đe dọa mới nhất và chỉ được phát hiện bởi nhóm CertiK, vì vậy các nhà phát triển ví MPC phải chú ý đến chi tiết của cuộc tấn công!
Bảo vệ chống lại những kẻ tấn công đặc quyền là một thách thức. Chúng tôi đề xuất phương thức tấn công mới và vectơ tấn công cho phương thức MPC trong ZenGo trong kết quả báo cáo. Vì vậy, chúng tôi đã ngay lập tức báo cáo vấn đề bảo mật này cho ZenGo và ZenGo đã phản hồi nhanh chóng và khắc phục sự cố.
Trong bài viết này, chúng tôi sẽ đi sâu vào chi tiết kỹ thuật của phát hiện này và chia sẻ cách chúng tôi hợp tác với ZenGo để cải thiện tính bảo mật tổng thể của ví MPC.
Dựa trên đánh giá kỹ lưỡng của chúng tôi về thiết kế bảo mật của ZenGo và phản hồi chuyên nghiệp của họ đối với các vấn đề, CertiK tin rằng ZenGo có thể được gọi là giải pháp ví an toàn nhất hiện có trên thị trường.
MPC là gì?
Tính toán đa bên (MPC), đôi khi còn được gọi là tính toán đa bên an toàn (SMPC), là một lĩnh vực mật mã. Nó cho phép nhiều bên cùng ký kết giao dịch trong khi vẫn đảm bảo rằng khóa của mỗi bên không bị xâm phạm.
Bởi vì công nghệ MPC có thể phân phối khóa giữa nhiều bên do đó loại bỏ bất kỳ điểm lỗi nào, nên nó cho phép người dùng bảo vệ khóa riêng của Web 3 tốt hơn. Phương pháp này cũng thường được gọi là "ký ngưỡng" và hiện đang được nhiều Web 3 áp dụng. người giám sát và nhà phát triển ví để bảo vệ tài sản Web 3. Trong số đó, ZenGo là một trong những nhà phát triển ví MPC nổi tiếng và được sử dụng nhiều nhất.
Như được hiển thị trong hình bên dưới, ví không sử dụng khóa riêng truyền thống để kiểm soát việc ký giao dịch. Thay vào đó, nhiều khóa riêng được phân chia để tham gia vào quá trình ký giao dịch và tạo chữ ký cuối cùng để xác minh.
Thiết kế MPC phổ biến tạo chữ ký
Thông qua nghiên cứu này, chúng tôi đã nhận ra những thách thức và rủi ro bảo mật tiềm ẩn liên quan đến phương pháp MPC cũng như tầm quan trọng của việc bảo vệ tài sản Web 3. Vì vậy, chúng tôi muốn bảo vệ người dùng Web3 tốt hơn bằng cách khám phá và giải quyết những thách thức này.
Vì vậy, chúng ta có thể suy nghĩ về câu hỏi này: Tại sao ví MPC có thể cung cấp tính bảo mật cao hơn so với ví tiền điện tử truyền thống? Nó được thực hiện như thế nào?
Thiết kế ZenGo MPC và đảm bảo an toàn
Thông qua nghiên cứu này, chúng tôi đã nhận ra những thách thức và rủi ro bảo mật tiềm ẩn liên quan đến phương pháp MPC cũng như tầm quan trọng của việc bảo vệ tài sản Web 3. Vì vậy, chúng tôi muốn bảo vệ người dùng Web3 tốt hơn bằng cách khám phá và giải quyết những thách thức này.
Vì vậy, chúng ta có thể suy nghĩ về câu hỏi này: tại sao ví MPC có thể cung cấp tính bảo mật cao hơn so với ví tiền điện tử truyền thống? Nó được thực hiện như thế nào?
Sau khi đánh giá thiết kế của các ví Web 3 khác nhau, chúng tôi đã xem xét ví Web 3 của MPC – chúng tôi đã đánh giá một trong những ví MPC được đánh giá cao nhất trên thị trường và ví MPC tự lưu trữ hàng đầu – ZenGo.
Để đánh giá này, chúng tôi đã sử dụng mô hình mối đe dọa tương tự như đã nêu trong nghiên cứu trước: “Nếu thiết bị của bạn bị nhiễm phần mềm độc hại, liệu ví này có còn bảo vệ tài sản của bạn không?”
Tổng quan về kiến trúc bảo mật ZenGo
Như trong hình trên, ví ZenGo có thiết kế bảo mật độc đáo, kiến trúc bảo mật và quy trình khôi phục có nhiều lớp hơn so với ví truyền thống. Các tính năng bảo mật do ZenGo cung cấp bao gồm nhưng không giới hạn ở:
Sơ đồ chữ ký hai bên: Thiết kế MPC của ZenGo triển khai sơ đồ chữ ký hai bên. Mỗi người dùng sử dụng hai phân đoạn khóa khi tạo chữ ký giao dịch: một phân đoạn được lưu trữ trên máy chủ của ZenGo (khóa chính ①) và phân đoạn còn lại được lưu trữ trên thiết bị của người dùng (khóa chính ②). Cả ZenGo và người dùng đều không biết người kia giữ phím gì.
Bảo vệ dựa trên TEE: Ngoài ra, để ngăn chặn các cuộc tấn công "man-in-the-middle" và "APP hijacking", ứng dụng ZenGo sử dụng giải pháp TEE (Môi trường thực thi tin cậy) và sử dụng khóa riêng TEE để ký HTTPS nội dung giao tiếp để yêu cầu các API liên quan. Khóa thiết bị dựa trên TEE này được tạo trong TEE khi người dùng thiết lập thiết bị và ngay cả chính hệ điều hành cũng không thể trích xuất được.
Với các tính năng bảo mật này, kẻ tấn công không còn có thể đánh cắp khóa riêng của người dùng từ bộ nhớ hoặc tệp lưu trữ cũng như kiểm soát tài sản của người dùng ZenGo nữa. ZenGo cũng sử dụng TEE để bảo vệ sự tương tác giữa máy chủ và máy khách khỏi bị giả mạo. Điều này cũng có nghĩa là các cuộc tấn công "trung gian" và "chiếm quyền điều khiển ứng dụng" được ngăn chặn và bảo vệ một cách hiệu quả.
Quá trình kiểm tra của chúng tôi đã xác nhận rằng ZenGo có thiết kế và triển khai an toàn có thể chống lại các cuộc tấn công này và đây là thiết kế bảo mật cấp cao nhất trong số các ví được kiểm toán mà chúng tôi đã tiếp xúc.
Thiết kế và triển khai bảo mật của ZenGo bảo vệ thành công trước các cuộc tấn công bao gồm các đặc quyền và các cuộc tấn công nêu trên. Tuy nhiên, việc xử lý tất cả các kiểu tấn công đặc quyền không phải là điều dễ dàng, đặc biệt khi xét đến việc kẻ tấn công có thể đọc (và trong một số trường hợp ghi) bộ nhớ tùy ý.
Bằng cách kiểm tra toàn bộ ví, chúng tôi có thể phát hiện ra một vấn đề triển khai trong ZenGo cho phép chúng tôi hoạt động như kẻ tấn công đặc quyền và bỏ qua một số biện pháp bảo vệ nhất định.
Nhưng trước khi thảo luận chi tiết, chúng ta hãy xem lại cơ chế bảo mật của ví ZenGo.
Các biện pháp an toàn cho Ví ZenGo
Thông qua nghiên cứu này, chúng tôi đã nhận ra những thách thức và rủi ro bảo mật tiềm ẩn liên quan đến phương pháp MPC cũng như tầm quan trọng của việc bảo vệ tài sản Web 3. Vì vậy, chúng tôi muốn bảo vệ người dùng Web3 tốt hơn bằng cách khám phá và giải quyết những thách thức này.
Vì vậy, chúng ta có thể suy nghĩ về câu hỏi này: Tại sao ví MPC có thể cung cấp tính bảo mật cao hơn so với ví tiền điện tử truyền thống? Nó được thực hiện như thế nào?
Ví Web 3 cổ điển chỉ yêu cầu khóa riêng. Tuy nhiên, luôn có khả năng người dùng sẽ tiết lộ khóa riêng hoặc cụm từ ghi nhớ. Vì vậy, họ có thể mất khóa riêng và sau đó chứng kiến kẻ tấn công chiếm hữu tài sản.
Ví MPC hoạt động khác nhau. Ví không có một khóa riêng nào. Người dùng hiện chỉ giữ một phân đoạn khóa riêng và không biết gì về các phân đoạn khóa riêng còn lại. Từ góc độ này, ngay cả khi kẻ tấn công lấy được khóa cá nhân của người dùng, hắn cũng không thể trực tiếp chuyển tiền. Để bảo vệ người dùng hơn nữa, ZenGo sử dụng nhiều phương tiện khác nhau để tăng cường thiết kế bảo mật của họ: không chỉ sơ đồ chữ ký hai bên nêu trên và bảo vệ thiết bị dựa trên TEE mà còn cả xác thực sinh trắc học dựa trên quét khuôn mặt và mã hóa khóa bổ sung.
Các biện pháp bảo vệ trong quá trình đăng ký người dùng và khôi phục tài khoản người dùng
Trong quá trình đăng ký người dùng và khôi phục tài khoản, ZenGo áp dụng các biện pháp bảo vệ sau để bảo vệ tài sản của người dùng.
Bảo vệ nhận dạng người dùng: Sơ đồ chữ ký hai bên yêu cầu người dùng chỉ có thể sử dụng tiền của mình khi họ tương tác với một bên khác (phía máy chủ trong cài đặt của ZenGo). Để có thể xác định người dùng và các khóa chia sẻ liên quan được lưu trữ trên máy chủ, ZenGo yêu cầu email của người dùng để đăng ký tài khoản.
Để tránh bị hack email, ZenGo sử dụng công nghệ quét khuôn mặt (Zoom by FaceTec) để liên kết thông tin sinh trắc học với tài khoản người dùng. Trong quá trình khôi phục tài khoản sau khi đăng ký và xác minh email, người dùng cần “vuốt mặt” để xác thực.
Bảo vệ liên lạc giữa ứng dụng-máy chủ: Để đảm bảo rằng máy chủ ZenGo tương tác với thiết bị của người dùng hợp pháp, ZenGo tạo và đăng ký khóa bất đối xứng trong môi trường TEE trong quá trình đăng ký và khôi phục tài khoản. Tất cả các tương tác giữa ứng dụng ZenGo và máy chủ cần phải được ký bằng khóa cụ thể này. Vì được bảo vệ bằng giải pháp bảo mật dựa trên phần cứng nên kẻ tấn công không thể đọc trực tiếp khóa này và khóa này rất khó lạm dụng.
Quá trình đăng ký người dùng ZenGo và quá trình khôi phục tài khoản
Bảo vệ chia sẻ khóa người dùng: Việc cho phép người dùng lưu trữ và sao lưu các phân đoạn khóa của họ là rất rủi ro vì điều này có thể ảnh hưởng đến tất cả các biện pháp bảo mật do ZenGo cung cấp. Để giải quyết vấn đề bảo mật này, ZenGo tạo khóa mã hóa trong quá trình đăng ký. Khóa mã hóa mã hóa chia sẻ khóa của người dùng và lưu trữ văn bản mật mã trên máy chủ của nó.
Tuy nhiên, các khóa mã hóa không được chia sẻ với ZenGo mà buộc phải đồng bộ hóa với Google Drive hoặc iCloud của người dùng. Khóa mã hóa chỉ có thể được chia sẻ và giải mã thêm sau khi người dùng đã vượt qua quá trình xác minh email và xác thực sinh trắc học dựa trên máy chủ. Trong số đó, xác thực sinh trắc học dựa trên máy chủ (nhận dạng khuôn mặt FaceTec) gần như không thể bị “đánh lừa” bởi việc tái tạo khuôn mặt 2D/3D thông thường.
Quá trình tạo chữ ký giao dịch ZenGo
Để ký giao dịch, ứng dụng ZenGo tiến hành một loạt tương tác với máy chủ ZenGo. Trong quá trình tương tác, ZenGo sử dụng giải pháp chữ ký hai bên nguồn mở và phân đoạn khóa người dùng để tạo chữ ký hai bên. Sau đó, máy chủ ZenGo tiến thêm một bước nữa là ký và truyền phát giao dịch. Tất cả các yêu cầu trong quy trình này đều được đánh dấu thời gian và ký trong TEE để duy trì tính toàn vẹn và không thể lặp lại của thông tin.
Phát hiện vấn đề trong thiết kế ZenGo MPC
Như chúng ta đã thảo luận trước đây, thiết kế bảo mật của ZenGo bao gồm nhiều khóa mã hóa, mỗi khóa có trách nhiệm khác nhau. Trong bảng bên dưới, chúng tôi hiển thị những khóa nào được ZenGo sử dụng và cách chúng được bảo vệ.
Qua bảng này, chúng ta có thể thấy ba khóa được sử dụng ở phía máy khách: khóa chính ②, khóa thiết bị và khóa mã hóa. Kẻ tấn công cần lấy cả khóa chính② và khóa thiết bị để tương tác với máy chủ ZenGo và đánh cắp tiền của người dùng.
Như đã giới thiệu ở phần chi tiết giao dịch trước, khóa chính ② tham gia vào việc tạo chữ ký của cả hai bên dưới dạng văn bản trong bộ nhớ, cho phép kẻ tấn công đọc bộ nhớ quy trình và trích xuất khóa chính ②. Là một giải pháp một phần, tất cả các yêu cầu giao dịch đến máy chủ ZenGo cần phải được ký bằng khóa thiết bị, khóa này không thể đọc hoặc trích xuất được. Quá trình này được thực hiện trong TEE và không có quyền kiểm soát kẻ tấn công.
Tuy nhiên, bất chấp nhiều khía cạnh trong thiết kế bảo mật của ZenGo, nhóm SkyFall của CertiK vẫn phát hiện ra một lỗ hổng trong đó. Sau khi tiến hành kiểm tra chi tiết tất cả các API trong ứng dụng ZenGo, chúng tôi nhận thấy rằng một số API nhất định cho phép kẻ tấn công giả mạo máy chủ ZenGo và dễ dàng tạo khóa thiết bị mới để sử dụng trên các thiết bị khác.
API đã đăng ký khóa thiết bị này thiếu các biện pháp bảo vệ bảo mật cần thiết: kẻ tấn công có thể tạo khóa đường cong elip NIST P-256 mới trên một thiết bị khác, sau đó kẻ tấn công có thể tận dụng API đã đăng ký khóa thiết bị và đăng ký Tạo cặp khóa mới , giả vờ là một thiết bị người dùng mới và yêu cầu giao dịch.
Chúng tôi đặt tên cho thiết bị tấn công này là tấn công forking.
Tấn công giả mạo thiết bị trên ví ZenGo
Như đã đề cập ở trên, kẻ tấn công cần có khóa chính ② của người dùng ZenGo và khóa thiết bị hợp lệ để đánh cắp tài sản của họ.
Khóa chính ②: Khóa chính ② là khóa cố định được sử dụng dưới dạng văn bản thuần túy trong bộ nhớ để tham gia vào quá trình chữ ký của cả hai bên. Do tính phức tạp và tính duy nhất của thuật toán chữ ký của cả hai bên, quá trình này không thể hoàn thành trong TEE. Do đó, kẻ tấn công đặc quyền có thể chỉ cần kết xuất bộ nhớ xử lý hoặc chiếm quyền điều khiển các API hệ thống nhất định để trích xuất khóa chính. Ảnh chụp màn hình bên dưới hiển thị khóa chính mà chúng ta có thể trích xuất trên nền tảng iOS ②.
Khóa thiết bị: Trong quá trình đăng ký hoặc khôi phục tài khoản, một khóa thiết bị hợp lệ sẽ được tạo trên thiết bị của người dùng trong TEE như một giải pháp cho mối đe dọa trích xuất văn bản gốc nói trên. Kẻ tấn công có đặc quyền không thể đọc được khóa thiết bị. Tuy nhiên, kẻ tấn công có thể sử dụng cùng một API đăng ký khóa thiết bị để đăng ký một cặp khóa khác và sử dụng nó.
API đăng ký khóa thiết bị chỉ có một cơ chế xác thực rất cơ bản: kẻ tấn công có thể sử dụng mã thông báo JWT văn bản gốc được lưu trữ cục bộ và khóa chính được trích xuất ② để xác thực API. Theo thiết kế, mã máy chủ liên quan đến API này cũng phải được xác thực sinh trắc học Face tec. Tuy nhiên, trên thực tế, mã không thực hiện được bước này do lỗi logic.
Trong cuộc tấn công mô phỏng của chúng tôi, chúng tôi đã mô phỏng kẻ tấn công có đặc quyền và liên tục theo dõi thiết bị của nạn nhân. Ngay sau khi ứng dụng ZenGo được khởi chạy, chúng tôi sẽ trích xuất khóa chính từ bộ nhớ và đọc mã thông báo API từ cơ sở dữ liệu cục bộ. Và thông tin này đủ để kẻ tấn công đánh cắp toàn bộ tiền của người dùng!
Sau khi có mã thông báo API, chúng tôi sẽ tạo khóa thiết bị mới và gọi API đăng ký khóa thiết bị để đăng ký khóa thiết bị với máy chủ ZenGo. Sau đó, chúng tôi đã xây dựng tất cả các yêu cầu API để tương tác với máy chủ ZenGo nhằm bắt đầu giao dịch. Đối với ví MPC, việc tạo chữ ký từ cả hai bên là một quá trình rất độc đáo và phức tạp. May mắn thay, quá trình phát triển của ZenGo luôn tuân thủ tinh thần nguồn mở nên chúng tôi có thể biên soạn thư viện chữ ký của hai bên được sử dụng trong ứng dụng ZenGo chính thức và chạy nó cục bộ.
Hình ảnh trên cho thấy cách chúng tôi trích xuất khóa chính ② và thay mặt nạn nhân đăng ký khóa thiết bị mới. Sau đó, chúng tôi sử dụng hai khóa này để gửi 0,00222 ETH đến "tài khoản của kẻ tấn công". Toàn bộ quá trình chỉ diễn ra trong vài giây và nạn nhân hoàn toàn không hề hay biết.
Để giải quyết vấn đề này, ZenGo đã triển khai xác thực sinh trắc học FaceTec ở phía máy chủ để đăng ký thiết bị. Các giải pháp ở cấp độ API máy chủ sẽ loại bỏ khả năng xảy ra cuộc tấn công này và không yêu cầu cập nhật mã máy khách.
Tóm tắt
Trong đánh giá của CertiK về ZenGo, chúng tôi đã kiểm tra và kiểm tra kỹ lưỡng tất cả các biện pháp bảo mật được áp dụng để bảo vệ tài sản của người dùng. Chúng bao gồm các sơ đồ chữ ký chung, bảo vệ thiết bị dựa trên TEE và sinh trắc học để đăng ký và khôi phục tài khoản.
Mặc dù ZenGo có nhận thức bảo mật cao và đã thực hiện nhiều biện pháp để cải thiện tính bảo mật của mình nhưng CertiK đã phát hiện ra một rủi ro xác thực truy cập API quan trọng có thể khai thác được trong quá trình triển khai ZenGo. Lỗ hổng này có thể cho phép kẻ tấn công đặc quyền vượt qua các biện pháp bảo mật hiện có và đánh cắp tiền của người dùng nếu thiết bị của họ bị xâm phạm.
ZenGo đã nhanh chóng giải quyết vấn đề và triển khai một bản vá. CeritK sau đó đã tiến hành kiểm tra kỹ lưỡng hơn và xác định rằng bản vá đã khắc phục các rủi ro được đề cập trong báo cáo.
Với việc triển khai các bản vá, chúng tôi tin rằng ZenGo có thể ngăn chặn một cách hiệu quả những người dùng có đặc quyền truy cập trái phép vào quỹ của người dùng trong tương lai. Bảo vệ chống lại những kẻ tấn công có đặc quyền là một nhiệm vụ khó khăn và các biện pháp bảo mật của ZenGo cho chúng ta thấy cách tiếp cận toàn diện để bảo vệ người dùng. Ví này làm được nhiều việc hơn hầu hết các ví thông thường hiện có trên thị trường.
Chúng tôi tự hào được hợp tác với ZenGo và tự hào được hợp tác cùng ZenGo để bảo vệ tính bảo mật của người dùng Web 3 và giải quyết các thách thức bảo mật. Chúng tôi cũng xin cảm ơn ZenGo vì đã phản hồi kịp thời các lỗ hổng mà chúng tôi phát hiện và các hoạt động vá lỗi hiệu quả.
Với tư cách là những người hoạt động trong ngành bảo mật, chúng tôi rất vui khi thấy một công ty ví Web 3 hàng đầu rất coi trọng vấn đề bảo mật và có tinh thần trách nhiệm cao đối với người dùng và tiền của người dùng. Chúng tôi hy vọng rằng trên con đường hướng tới sự an toàn trong tương lai, chúng tôi có thể cải thiện sự an toàn cho nhiều dự án hơn và mang lại cho người dùng sự "yên tâm".
