- Bản cập nhật MV3 của Chrome đã loại bỏ quyền
webRequestBlockingnhằm làm suy yếu chức năng của các trình chặn quảng cáo hiện có - Tác giả đã phát hiện vào năm 2023 một lỗi có thể vượt qua
webRequestBlockingngay cả trong môi trường MV3 - Lỗi này xảy ra do cấu trúc lỏng lẻo của JavaScript binding và việc mã cũ vẫn còn được giữ lại
- Bằng cách thao túng ID instance WebView để vượt qua kiểm tra quyền, vẫn có thể dùng chức năng chặn trong môi trường MV3
- Hiện tại bản vá đã được áp dụng, nên cách vượt qua này không còn hoạt động nữa
MV3 và những thay đổi với trình chặn quảng cáo
- Chrome đang dần loại bỏ extension MV2 và chuyển sang MV3
- MV3 loại bỏ quyền
webRequestBlocking, ngăn các trình chặn quảng cáo chặn động các yêu cầu mạng bằng script - Thay cho quyền đó, API
declarativeNetRequestđược bổ sung, nhưng không hỗ trợ mức độ linh hoạt tương đương - Vì thay đổi này, hiệu năng của các trình chặn quảng cáo đã giảm đi đáng kể
Giới hạn của cấu trúc JavaScript binding
- Phần lõi của Chrome được phát triển bằng C++, nhưng extension hoạt động bằng JavaScript, và API mở rộng cũng được truy cập thông qua JS binding
- Cho đến giai đoạn 2015~2016, API được khởi tạo và kiểm tra bằng cách chèn các tệp JS (module binding của extension) vào trang
- Cách làm này dễ bị tấn công bởi việc override hàm toàn cục và prototype trong JS, dẫn đến nhiều lỗi Universal XSS
- Sau đó Google đã chuyển các binding chính sang C++, nhưng một số tệp JS binding vẫn còn tồn tại
- Cho đến nay, một số API như
chrome.webRequestvẫn sử dụng cấu trúc JS binding
Vượt qua bằng cách tận dụng lớp sự kiện web request
-
Trong MV2, chặn web request có thể được triển khai bằng đoạn mã dưới đây
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Trong MV3, tùy chọn
blockingbị cấm nên không thể chặn theo cách thông thường -
Tuy nhiên, có thể tạo một đối tượng sự kiện tùy ý thông qua
.constructorcủa sự kiệnwebRequest -
Về mặt nội bộ, một lớp wrapper đặc biệt của JS binding quản lý đối tượng sự kiện này
-
Nếu chỉ định
opt_webViewInstanceId, một trong các tham số của constructor, có thể vượt qua logic cho phép chỉ dành cho platform app và bỏ qua kiểm tra quyền chặnlet WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Ban đầu nó được thiết kế để chỉ platform app mới dùng được, nhưng do việc xác thực WebView ID không chặt chẽ nên extension thông thường cũng có thể lạm dụng
Kết quả và bản vá bảo mật
- Với lỗ hổng này, trên thực tế vẫn có thể phát triển một trình chặn quảng cáo hoàn chỉnh trong môi trường MV3
- Tác giả đã báo cáo lỗi này cho Google vào năm 2023, và trong Chrome 118 nó đã được vá bằng cách kiểm tra đúng quyền sở hữu WebView
- Không có tiền thưởng được chi trả, vì về mặt cấu trúc đây chỉ là hành vi vượt quyền mà không làm lộ thêm dữ liệu
- Trường hợp này cho thấy chỉ vài chục dòng mã sửa đổi cũng có thể vô hiệu hóa bản cập nhật bảo mật của một tập đoàn lớn
Kết luận và tham khảo
- Lỗi hiện đã được vá và không còn hoạt động nữa
- Một ví dụ tương tự thú vị về lỗ hổng liên quan đến Chrome extension là một vấn đề từng thực sự nhận được mã CVE và khoản thưởng $10,000 (xem bài blog riêng)
4 bình luận
Có lẽ sau bản cập nhật đó, các công ty adblock đã tăng doanh thu nhiều hơn.
Những ứng dụng độc lập chặn hẳn ở tầng mạng thì chỉ dùng được bản trả phí, nên chắc cũng bán được khá nhiều.
Đăng một lỗ hổng đã mất hết ý nghĩa từ tận 2 năm trước, lại còn phải cố nhấn mạnh chuyện không được trả tiền nữa sao... Cá nhân tôi thấy thế không hẳn là ngầu lắm.
Nhưng chắc cũng phải viết những thứ như thế lên blog thì mới chứng minh được giá trị của bản thân nhỉ?
Thật lòng mà nói, tôi cũng muốn học kiểu tư duy này để viết blog nhiều hơn một chút.
Cứ dùng Firefox thôi. 1–2 năm gần đây nó đã nhanh hơn rất nhiều nên không tệ đâu.
Tôi đã dùng Firefox làm trình duyệt chính nhiều năm và thỉnh thoảng so sánh với Chrome; đặc biệt gần đây tôi cảm thấy Firefox đã đủ tốt để dùng hằng ngày.
Ngay cả những trang web trước đây phớt lờ chuẩn web như các ngân hàng Hàn Quốc thì gần đây cũng đã sửa khá nhiều, nên đa số giờ đều hoạt động tốt trên Firefox.
Việc tùy biến cũng dễ hơn nhiều trên Firefox.
Ý kiến Hacker News
Dù cũng muốn thử dùng Firefox, trở ngại lớn nhất là các lỗi tải trang web thỉnh thoảng xuất hiện, cùng với việc không thể cài PWA (Progressive Web Apps). Chrome và các trình duyệt cùng họ đã hỗ trợ tính năng này từ lâu, nên tôi không rõ vì sao Firefox vẫn chưa triển khai. Tôi cũng đã tìm thấy một tiện ích bên thứ ba (PWAs for Firefox), nhưng lại ngần ngại dùng nó vì lý do quyền riêng tư
Dù có cách lách hành vi của Google đi nữa, tôi vẫn nghĩ đó không phải hướng đi đúng. Nếu mọi người không đồng ý với động thái của Google, thì cách đúng duy nhất là bỏ Chrome và toàn bộ các trình duyệt dựa trên Chromium. Điều quan trọng là phải giáng đòn vào thế độc quyền của Google và tước đi quyền chi phối của họ đối với tương lai của web
Cách lách thực sự là dùng Firefox. uBlock Origin hoạt động tốt nhất trên Firefox
uBlock Origin works best on Firefox
Tôi cũng nghi ngờ liệu MV3 có thực sự an toàn hơn MV2 như Google nói hay không. Chuyển sang MV3 dường như không khiến bảo mật được tăng cường về bản chất
Về trường hợp có người tìm ra cách lách adblocker rồi báo cho Google, có phản ứng kiểu: "Tìm ra xong liền mách Google, tuyệt thật đấy"
OP đã báo cho Google một "issue" chẳng gây vấn đề gì cho họ, khiến nhà phát triển addon mất đi một cách vượt qua các giới hạn của MV3. Hy vọng nó đáng giá $0
Từ khi bắt đầu dùng Brave, tôi hoàn toàn không nhớ Chrome chút nào
Brave
Stop using Brave browser
Trước ý kiến kiểu "adblocker nhất định cần webRequestBlocking, Google kiếm tiền từ quảng cáo nên việc loại bỏ tính năng này là rất có chủ đích", cũng có người nói rằng: "Điều đó không đúng; ai cũng có thể dùng uBlock Origin Lite trên Chrome và manifest v3, hiệu năng tốt và tôi không cảm thấy khác biệt với uBlock Origin cũ. Mọi thứ đều được lọc trong C++ nên nhanh hơn nhiều. Tất nhiên có giới hạn số rule tối đa, nhưng hiện tại vẫn hoàn toàn đủ dùng"
Ngoài laptop công việc ra thì tôi không có lý do gì để dùng Chrome, và bình thường vẫn tiếp tục dùng Firefox. Dù vậy, tôi vẫn thấy tiếc vì không thể dùng uBlock Origin trong công việc lướt web như tra cứu tài liệu hay đọc tài liệu
Nếu chỉ đơn giản muốn lách thì cứ cài Firefox là được