uBlock Origin chỉnh sửa mã CNAME uncloaking để phản ánh tùy chọn ipaddress=
(github.com/gorhill)- Commit của uBlock Origin đã viết lại luồng CNAME uncloaking trong xử lý mạng của Firefox, và thay đổi để phản ánh IP lấy được từ truy vấn DNS vào
details.ip - Bộ nhớ đệm Map
cnameshiện có bị loại bỏ, thay bằng ring buffer 256 mục dựa trêndnsList,dnsDict,dnsWritePtrvà bộ nhớ đệm TTL60000ms - Truy vấn DNS dùng
browser.dns.resolve(hn, [ 'canonical_name' ]), sử dụngcanonicalNamevàaddresses[0]trong kết quả lần lượt làm CNAME và IP - Xử lý ngoại lệ CNAME vẫn giữ các điều kiện 1st-party, ignore list, root document; tên máy chủ là địa chỉ IPv4 hoặc bắt đầu bằng
[sẽ bị loại khỏi truy vấn lại - Phiên bản Chromium tối thiểu tăng lên
80.0, Opera tối thiểu tăng lên67.0, và giá trị mặc địnhcnameMaxTTLtrong thiết lập ẩn bị loại bỏ
Viết lại cấu trúc bộ nhớ đệm DNS của Firefox
- Mã liên quan đến CNAME uncloaking trong
platform/firefox/vapi-background-ext.jsđược đổi từ cấu trúc xoay quanh Map toàn cục sang cấu trúc bộ nhớ đệm DNS bên trong lớp - Thay cho trạng thái toàn cục
cnameUncloakEnabledvà Mapcnames, bộ nhớ đệm được quản lý bằng các trường saudnsList: ring bufferdnsWritePtr: vị trí ghi tiếp theodnsMaxCount: tối đa256dnsDict: ánh xạ từ tên máy chủ sang chỉ mục ring bufferdnsEntryTTL:60000ms
- Trong constructor,
canUncloakCnamesvàcnameUncloakEnabledđược khởi tạo làtrue
Luồng xử lý yêu cầu
onBeforeSuspendableRequest(details)trích xuất tên máy chủ từ URL yêu cầu, rồi kiểm tra bộ nhớ đệm trước bằngdnsFromCache(hn)- Nếu mục DNS trong bộ nhớ đệm có
ip, thiết lập vàodetails.ip - Nếu kết quả gọi
super.onBeforeSuspendableRequest(details)mặc định kết thúc bằng hủy, chuyển hướng, v.v., trả nguyên kết quả đó - Nếu mục DNS trong bộ nhớ đệm không phải là
Promise, tiếp tục xử lý hậu kỳ bằngonAfterDNSResolution(hn, details, dnsEntry) - Nếu không thỏa điều kiện truy vấn lại DNS, hoặc có
details.proxyInfo?.proxyDNS, sẽ không xử lý DNS bổ sung
Cách truy vấn và lưu DNS
dnsShouldResolve(hn)loại khỏi đối tượng truy vấn DNS các tên máy chủ rỗng, tên máy chủ bắt đầu bằng[, và dạng địa chỉ IPv4dnsResolve(hn, details)đăng ký tên máy chủ vào vị trí hiện tại của ring buffer và gọidnsAPI.resolve(hn, [ 'canonical_name' ])- Khi truy vấn thành công,
dnsToCache(hn, rec, details)được chạy; nếu thất bại, để lại một mục rỗng trong bộ nhớ đệm bằngdnsToCache(hn) dnsToCachelưuhnvà thời điểm hết hạn vào mục bộ nhớ đệm mới- Nếu
cnameFromRecordtrả về giá trị, lưu vàodnsEntry.cname - Nếu
ipFromRecordtrả về giá trị, lưu vàodnsEntry.ip
- Nếu
dnsFromCachetrả nguyên mục bộ nhớ đệm nếu đó làPromise, còn các mục hết hạn sẽ bị xóa khỏidnsListvàdnsDict
Điều kiện phản ánh CNAME và IP
cnameFromRecord(hn, record, details)không trả về CNAME nếurecord.canonicalNamekhông tồn tại hoặc giống tên máy chủ gốc- Nếu
cnameIgnore1stPartyđược bật, loại trừ trường hợp CNAME và tên máy chủ gốc có cùng domain - Nếu có
cnameIgnoreList, các CNAME không khớp với biểu thức chính quy đó sẽ bị loại trừ - Nếu
cnameIgnoreRootDocumentđược bật, loại trừ khi tên máy chủ của yêu cầu giống tên máy chủ củadetails.documentUrl || details.url ipFromRecord(record)trả về địa chỉ đầu tiênaddresses[0]khirecord.addresseslà mảng và không rỗng
Viết lại URL và lọc tiếp theo
onAfterDNSResolutionviết lại URL bằnguncloakURLnếu mục DNS có CNAME vàcnameUncloakEnabledđược bật- Khi đổi URL, URL cũ được lưu vào
details.aliasURL, còn URL mới được phản ánh vàodetails.url - Nếu mục DNS có IP và khác với
details.iphiện tại, cập nhậtdetails.ip - Chỉ khi xảy ra viết lại CNAME hoặc thay đổi IP mới gọi lại
onBeforeSuspendableRequest(details)của lớp cơ sở uncloakURLtìm vị trí tên máy chủ trong URL và thay bằng CNAME; tùy theo giá trịcnameReplayFullURL, nó nối toàn bộ URL hoặc chỉ giữ đến phần đầu của đường dẫn
Thay đổi thiết lập và manifest
- Việc xử lý
cnameMaxTTLbị loại bỏ khỏisetOptions - Khi tùy chọn thay đổi, thay vì khởi tạo lại Map
cnamescũ, bộ nhớ đệm DNS được làm rỗng bằngdnsList.fill(null)vàdnsDict.clear() cnameMaxTTL: 120bị xóa khỏi giá trị mặc định của thiết lập ẩn trongsrc/js/background.jsminimum_chrome_versiontrongplatform/chromium/manifest.jsonđược đổi từ73.0thành80.0minimum_opera_versiontrongplatform/opera/manifest.jsonđược đổi từ60.0thành67.0
1 bình luận
Ý kiến trên Hacker News
Có vẻ tiêu đề sai. uBlock Origin đã hỗ trợ tính năng này từ nhiều năm trước, chỉ là chỉ trên Firefox
Vụ này trông giống một đợt refactor mã đó hơn là một tính năng hoàn toàn mới
Tuy nhiên không hoàn hảo, vì khi một domain có nhiều IP thì không biết trình duyệt sẽ chọn IP nào
Nếu đề xuất được một tiêu đề chính xác và trung lập hơn thì có thể đổi lại. Tuy vậy, các commit GitHub không có thêm ngữ cảnh thường không thật sự phù hợp làm thread trên HN
Dù chưa trực tiếp bị ảnh hưởng, tôi đã chỉnh lại các extension của mình cho Firefox để có thể chuyển sang nếu Chrome thực sự loại bỏ uBO
Nó sẽ tới trong vài bản phát hành nữa, nên cần chuẩn bị
Nhiều lắm chỉ là đổi
background.service_workerthànhbackground.scripts, đúng nghĩa là chỉ đổi tên khóauBlock Origin là một yếu tố khiến Firefox tốt hơn, và là một trong những lý do lớn để dùng Firefox thay vì Chrome và các trình duyệt khác
Nó khiến Internet trở thành nơi thực sự có thể duyệt được
Hơn 10 năm qua có vài trang gặp vấn đề hiển thị, nhưng các trang đó cũng gặp vấn đề trên Chrome
Cá nhân tôi xem quảng cáo như căn bệnh ung thư của xã hội hiện đại. Nó trộn lẫn những lời nói dối vô hại, những lời nói dối không vô hại, và thao túng; việc có lượng tiền khổng lồ chảy vào đó lại càng khiến nó chẳng có gì đáng tôn trọng hơn
Brave cũng là một dự án chất lượng tốt nên tôi dùng làm phương án dự phòng, và đôi khi tôi cũng dùng xen Vivaldi vì chia cửa sổ và quản lý tab tốt hơn nhiều
CNAME cloaking có phải là việc các trang quảng cáo dùng những subdomain được tạo ngẫu nhiên trỏ tới bản ghi wildcard không?
Thông thường khi truy cập contentsite.com, quảng cáo được cung cấp từ adsite.com. Quy tắc chặn quảng cáo chỉ cần chặn adsite.com là quảng cáo không hiện
CNAME cloaking là cách trang chính khiến một subdomain như adsite.contentsite.com trỏ tới adsite.com. Khi đó trình chặn quảng cáo phải làm một việc gần như bất khả thi: chặn hàng triệu subdomain trông như thuộc về site hợp lệ
Site hợp lệ có thể liên tục đổi subdomain, và trình chặn quảng cáo không có cách nào biết subdomain nào là nội dung hợp lệ, subdomain nào là quảng cáo. Hơn nữa, vì nội dung được cung cấp từ cùng domain, nó còn có thể né một số chính sách cookie để theo dõi người dùng tốt hơn
Bản cập nhật này cho phép thiết lập các quy tắc lọc dựa trên IP đã phân giải
Đây là ví dụ rất rõ cho thấy vì sao Manifest V3 không hay. Theo định nghĩa, nó không thể làm những việc như vậy, và cũng không thể có heuristic dựa trên mã chạy lúc thực thi
Đây là cuộc chạy đua leo thang với giới quảng cáo, còn Google là tay buôn vũ khí bán cho cả hai phía. Họ sẽ không đưa cho người dùng thứ cần thiết để giành phần thắng
Tất nhiên, tất cả điều này phụ thuộc vào việc nhà cung cấp trình duyệt, tức Google, có muốn thêm API này hay không. Nếu có thể xử lý theo kiểu mệnh lệnh bằng “mã chạy lúc thực thi”, người dùng có thể đổi mới ở tầng user-space trước khi nhà sản xuất trình duyệt đưa hỗ trợ tích hợp sẵn vào
Vì vậy nói rằng một chức năng cụ thể là bất khả thi “theo định nghĩa” là sai
[1] https://blog.mozilla.org/addons/2022/05/18/manifest-v3-in-fi...
CNAME cloaking chẳng hạn, giả sử nhà cung cấp SaaS A muốn cung cấp cho công ty Q một phần mềm theo dõi quảng cáo thật xịn
Theo cách cũ, A có lẽ sẽ bảo công ty Q chèn một script từ ví dụ https://A-ads-tracking.example vào website của công ty Q tại
https://q-company.exampleKhi đó trong các danh sách chặn mà uBlock Origin dùng sẽ có quy tắc kiểu “chặn các request đến domain A-ads-tracking.example”, và quảng cáo sẽ bị chặn
CNAME cloaking là cách nhà cung cấp SaaS A đặt dịch vụ theo dõi quảng cáo không ở domain A-ads-tracking.example mà ở một địa chỉ IP cụ thể, ví dụ 29.1.2.3. Và điểm quan trọng là SaaS A yêu cầu công ty Q tạo một subdomain của q-company.example và để bản ghi CNAME của nó trỏ đến 23.1.2.3. Họ đặt một cái tên trông hợp lý như media.q-company.example
Sau khi công ty Q thiết lập CNAME đó rồi thêm thẻ script
media.q-company.examplevào website, SaaS A có thể theo dõi mọi người dùng của site đó. Vì lớp né tránh này, trên thực tế sẽ nảy sinh một trò mèo vờn chuột vô hạn giữa chủ sở hữu công ty Q và các danh sách chặn công khaiĐể tránh vấn đề này, phần mềm chạy extension như uBlock Origin cần có khả năng thấy không chỉ domain đích của request trình duyệt mà cả địa chỉ IP thực tế của domain đó. Commit này có vẻ liên quan đến việc cho phép hành vi đó, hoặc ít nhất là làm cho phần code đó hoạt động tốt hơn
Ví dụ
media.q-company.examplelà CNAME trỏ đếnq-company.ads-tracking.example, rồiq-company.ads-tracking.examplecó bản ghi A trả về IPTôi không biết trình duyệt có cung cấp tên DNS trung gian cho extension hay không. Vì vậy những thứ như uBlock có thể phải dựa vào danh sách IP, nhưng lọc dựa trên DNS như pihole thì có thể chặn thẳng bằng quy tắc cho
ads-tracking.exampleDù sao thì dùng cả trình chặn độc hại dựa trên trình duyệt lẫn dựa trên DNS vẫn là tốt
Chậm và dễ mắc lỗi, nhưng khi quen rồi thì khá dễ, và hoàn toàn miễn nhiễm với mấy trò vớ vẩn kiểu này
Chrome có định chặn uBO không? Tôi không phải lúc nào cũng theo sát tình hình mới nhất
Tôi hiểu là cookie bên thứ ba giờ được cho phép rồi, nên có lẽ vẫn có khả năng nào đó
Họ đang loại bỏ API cốt lõi cần thiết để uBO xác định những thứ không nên được tải, rồi ngăn chúng được tải
Google tuyên bố việc này là vì “hiệu năng” hoặc “bảo mật”. Tất nhiên, “hiệu năng” hoặc “bảo mật” duy nhất thực sự bị ảnh hưởng lớn là khả năng nhận diện, chặn bắt và dừng các lượt tải độc hại hoặc liên quan đến quảng cáo trước khi chúng bắt đầu
https://developer.chrome.com/docs/extensions/develop/migrate...
https://www.bleepingcomputer.com/news/google/google-chrome-w...
Nếu dùng phiên bản Chromium chỉ hỗ trợ Manifest V3 thì nó sẽ bị ẩn
Chẳng phải một số DNS server có tính năng hoạt động giống như CNAME do server phân giải sao? Kiểu quản trị viên thêm bản ghi trỏ đến một tên DNS khác, nhưng client chỉ thấy bản ghi A hoặc AAAA thôi ấy
uBO đã có tính năng này từ khá lâu rồi. Từ 1.34.0, còn trong phần cài đặt nâng cao thì từ 1.25.0
https://github.com/gorhill/uBlock/wiki/Dashboard:-Settings#u...
Tôi nhớ đại khái là khoảng năm 2021
Tình trạng uBO trên Brave, Edge, Opera thì sao?
https://brave.com/blog/brave-shields-manifest-v3/
Tuy nhiên điều đó không hẳn là cần thiết. Brave có trình chặn quảng cáo tích hợp riêng khá mạnh, và lần cuối tôi kiểm tra thì nó được biên dịch thành native code nên hiệu năng cũng cao hơn uBO, đồng thời hỗ trợ đầy đủ các danh sách quảng cáo tương tự