0

Khi dùng AI, thông tin quan trọng có bị lộ ra ngoài không? Tiện ích mở rộng trình duyệt đọc được gì

Khi dùng AI, thông tin quan trọng có bị lộ ra ngoài không? Tiện ích mở rộng trình duyệt đọc được gì

Quyền truy cập của tiện ích và những trang nó thực sự đọc

Khi dùng AI, thông tin quan trọng có bị lộ ra ngoài không? Tiện ích mở rộng trình duyệt đọc được gì

Hình do tác giả vẽ. Không phải ảnh chụp màn hình của dịch vụ nào.

Khi dùng AI, câu hỏi hay được đặt ra là mô hình có nhớ tài liệu của mình hay không. Câu trả lời là không. Mô hình không lưu nội dung giữa hai lần gọi: nó đọc phần văn bản được gửi tới, trả lời, rồi trở về trạng thái ban đầu.

Thứ thật sự đọc được nội dung nằm ở chỗ khác, và một trong những chỗ đó là tiện ích mở rộng bạn đã cài vào trình duyệt. Tiện ích phải đọc trang web thì mới làm được việc, và nội dung nó đọc được có thể vượt xa phạm vi bạn tưởng.

Điểm thuận lợi là tiện ích không mặc nhiên có quyền đọc mọi trang. Nó phải khai báo quyền trong tệp manifest.json, và tệp đó nằm trên chính máy của bạn. Nghĩa là bạn đọc được nó trước khi quyết định có tin nó hay không.

Bước 1: Liệt kê tiện ích đã cài

Trên Windows, tiện ích đã cài nằm trong thư mục người dùng của trình duyệt:

%LOCALAPPDATA%\Google\Chrome\User Data\Default\Extensions
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Extensions

Mỗi thư mục con là một mã tiện ích, bên trong là thư mục phiên bản, và trong thư mục phiên bản có manifest.json. Đọc trực tiếp bằng thư viện chuẩn, không cần mở trình duyệt:

import json, os
from pathlib import Path

root = Path(os.environ["LOCALAPPDATA"]) / "Google/Chrome/User Data/Default/Extensions"
for ext in sorted(root.iterdir()):
    for ver in sorted(ext.iterdir()):
        manifest = ver / "manifest.json"
        if manifest.exists():
            data = json.loads(manifest.read_text(encoding="utf-8", errors="ignore"))
            print(data.get("name"), data.get("version"))

Ba mục khai báo quyết định tiện ích đọc được gì

Hình do tác giả vẽ. Không phải ảnh chụp màn hình của dịch vụ nào.

Bước 2: Đọc ba mục khai báo quyền

Ba mục quyết định phạm vi đọc của một tiện ích.

permissions là danh sách quyền gọi theo tên. Trong đó tabs đáng chú ý: nó cho tiện ích truy cập thông tin về tab, gồm tiêu đề và địa chỉ URL, nhưng bản thân nó không mở nội dung trang.

host_permissions là danh sách tên miền tiện ích được phép đọc. Đây là mục quyết định phạm vi thật. Một tên miền cụ thể nghĩa là chỉ trang đó; <all_urls> nghĩa là mọi trang, kể cả trang nội bộ của công ty.

content_scripts.matches là danh sách trang mà mã của tiện ích được tự động chèn vào. Mục này khác với host_permissions: chèn mã là hành động chủ động trên trang, còn quyền máy chủ là quyền đọc.

Kết quả đo trên máy này

Tôi chạy đoạn mã trên với hai thư mục của Chrome và Edge. Kết quả nguyên văn:

=== Chrome ===
- __MSG_APP_NAME__
    manifest_version : 2
    permissions      : ['identity', 'webview', 'https://www.google.com/', 'https://www.googleapis.com/*', 'https://payments.google.com/payments/v4/js/integrator.js', 'https://sandbox.google.com/payments/v4/js/integrator.js']
    host_permissions : []
    content_scripts  : []
    broad hosts      : none
  installed extensions: 1

=== Edge ===
- __MSG_extName__
    manifest_version : 3
    permissions      : ['alarms', 'storage', 'unlimitedStorage', 'offscreen']
    host_permissions : ['https://docs.google.com/*', 'https://drive.google.com/*']
    content_scripts  : []
    broad hosts      : none
- Edge relevant text changes
    manifest_version : 3
    permissions      : []
    host_permissions : []
    content_scripts  : ['https://chrome.google.com/webstore/*', 'https://chromewebstore.google.com/*']
    broad hosts      : none
  installed extensions: 2

Ba điều đọc được từ kết quả này.

Không tiện ích nào khai báo <all_urls>. Trên máy này không có tiện ích nào đọc được mọi trang. Đó chính là giá trị của việc kiểm tra: mất một phút để biết là có hay không, thay vì đoán.

Phạm vi được khai báo hẹp và cụ thể. Tiện ích trên Edge chỉ xin hai tên miền của Google, không xin cả web. Một khai báo hẹp như vậy là bằng chứng đọc được, không phải lời hứa.

Có tiện ích khai báo tên bằng biến __MSG_...__. Tên hiển thị nằm ở tệp ngôn ngữ khác, nên riêng manifest.json không cho biết đó là tiện ích gì. Muốn biết phải mở thêm thư mục _locales. Đây là chi tiết nhỏ nhưng hay gặp khi tự kiểm tra.

Bốn chỗ dễ hiểu sai

Bảng dưới đây là bốn giá trị hay gặp và phạm vi thật của từng giá trị.

Giá trị khai báo Nghĩa Phạm vi thực tế
activeTab Mở quyền đọc sau khi người dùng bấm vào tiện ích Chỉ trang hiện tại, chỉ trong lúc đó
tabs Cho thông tin về tab Tiêu đề và URL, không có nội dung trang
host_permissions cụ thể Chỉ những tên miền đã liệt kê Hẹp, nhưng đọc được cả ở chế độ nền
<all_urls> Mọi trang Rộng nhất, gồm cả trang nội bộ

activeTab không giống <all_urls>. activeTab chỉ mở quyền đọc trang hiện tại sau khi người dùng bấm vào tiện ích, và chỉ trong lúc đó. Nhìn thấy activeTab thì phạm vi hẹp hơn nhiều so với <all_urls>.

Có quyền tabs không có nghĩa là đọc được nội dung. Quyền này cho thông tin về tab, không cho nội dung trang. Hai chuyện khác nhau, dễ gộp thành một.

manifest_version 2 ghi tên miền ngay trong permissions. Ở bản 2, quyền theo tên miền nằm chung với quyền theo tên; ở bản 3 chúng tách sang host_permissions. Đọc theo một mẫu cố định sẽ bỏ sót đúng mục cần xem.

Cập nhật tiện ích có thể đổi quyền. Bản mới có thể xin thêm tên miền. Kiểm tra một lần không thay được cho việc xem lại định kỳ.

Ranh giới của cách kiểm tra này

manifest.json cho biết tiện ích đọc được gì. Nó không cho biết tiện ích gửi những gì đã đọc đi đâu. Trong tệp khai báo không có mục nào nói về máy chủ nhận dữ liệu. Muốn biết phải xem hành vi mạng hoặc chính sách của nhà phát triển, và cả hai đều nằm ngoài phạm vi phép đo này.

Cũng cần nói rõ một điều nữa: tiện ích chỉ là một chặng trên đường đi. Nếu nội dung được gửi qua một công cụ khác, máy chủ của công cụ đó cũng đọc được toàn văn. Và dù đi đường nào, các bản sao vẫn nằm lại trên những máy nằm trên đường đi đó.

Đọc được gì và gửi đi đâu là hai câu hỏi khác nhau

Hình do tác giả vẽ. Không phải ảnh chụp màn hình của dịch vụ nào.

Kết

Danh sách quyền không thay đổi được sự thật rằng dữ liệu đã rời khỏi máy. Nó chỉ cho bạn biết ai có thể đọc dữ liệu đó trước khi bạn bấm gửi.

Nếu công việc buộc phải gửi nội dung ra ngoài, bước chọn mô hình xử lý có thể xem ở danh sách mô hình hội thoại. Tôi dùng Crazyrouter làm một đầu mối để đổi mô hình mà không phải sửa lại phần gọi. Nhưng cần nhớ: một đầu mối chung vẫn nằm trên cùng đường đi và đọc cùng nội dung. Crazyrouter không làm đoạn đường đó ngắn hơn.

Câu hỏi để lại: lần cuối bạn mở danh sách quyền của tiện ích mình đang dùng là khi nào?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí