1 điểm bởi GN⁺ 2024-10-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 cnames hiện có bị loại bỏ, thay bằng ring buffer 256 mục dựa trên dnsList, dnsDict, dnsWritePtr và bộ nhớ đệm TTL 60000ms
  • Truy vấn DNS dùng browser.dns.resolve(hn, [ 'canonical_name' ]), sử dụng canonicalNameaddresses[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ên 67.0, và giá trị mặc định cnameMaxTTL trong 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 cnameUncloakEnabled và Map cnames, bộ nhớ đệm được quản lý bằng các trường sau
    • dnsList: ring buffer
    • dnsWritePtr: vị trí ghi tiếp theo
    • dnsMaxCount: tối đa 256
    • dnsDict: ánh xạ từ tên máy chủ sang chỉ mục ring buffer
    • dnsEntryTTL: 60000ms
  • Trong constructor, canUncloakCnamescnameUncloakEnabled đượ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ằng dnsFromCache(hn)
  • Nếu mục DNS trong bộ nhớ đệm có ip, thiết lập vào details.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ằng onAfterDNSResolution(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ỉ IPv4
  • dnsResolve(hn, details) đăng ký tên máy chủ vào vị trí hiện tại của ring buffer và gọi dnsAPI.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ằng dnsToCache(hn)
  • dnsToCache lưu hn và thời điểm hết hạn vào mục bộ nhớ đệm mới
    • Nếu cnameFromRecord trả về giá trị, lưu vào dnsEntry.cname
    • Nếu ipFromRecord trả về giá trị, lưu vào dnsEntry.ip
  • dnsFromCache trả 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ỏi dnsListdnsDict

Điều kiện phản ánh CNAME và IP

  • cnameFromRecord(hn, record, details) không trả về CNAME nếu record.canonicalName khô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ủa details.documentUrl || details.url
  • ipFromRecord(record) trả về địa chỉ đầu tiên addresses[0] khi record.addresses là mảng và không rỗng

Viết lại URL và lọc tiếp theo

  • onAfterDNSResolution viết lại URL bằng uncloakURL nế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ào details.url
  • Nếu mục DNS có IP và khác với details.ip hiện tại, cập nhật details.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ở
  • uncloakURL tì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ý cnameMaxTTL bị loại bỏ khỏi setOptions
  • Khi tùy chọn thay đổi, thay vì khởi tạo lại Map cnames cũ, bộ nhớ đệm DNS được làm rỗng bằng dnsList.fill(null)dnsDict.clear()
  • cnameMaxTTL: 120 bị xóa khỏi giá trị mặc định của thiết lập ẩn trong src/js/background.js
  • minimum_chrome_version trong platform/chromium/manifest.json được đổi từ 73.0 thành 80.0
  • minimum_opera_version trong platform/opera/manifest.json được đổi từ 60.0 thành 67.0

1 bình luận

 
GN⁺ 2024-10-08
Ý 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

    • Hiện vẫn hỗ trợ, trước đây cũng đã hỗ trợ rồi :P
    • Có vẻ hơn cả refactor đơn thuần. Giờ có vẻ có thể thực hiện chặn theo IP ở giai đoạn sớm hơn, trước khi request thực sự được gửi đ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
    • Đã đổi tiêu đề lại theo tiêu đề trang. Tiêu đề lúc gửi là “uBlock Origin supports filtering CNAME cloaking sites on Firefox now”
      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

    • Không phải là chuyện “nếu” mà là “khi nào”. Từ năm 2020 đã là “khi nào” rồi, và nó đang thực sự xảy ra
      Nó sẽ tới trong vài bản phát hành nữa, nên cần chuẩn bị
    • Tôi đang chuyển gia đình sang Brave. Họ hầu như không nhận ra khác biệt, và tôi tin chắc hơn rằng trình duyệt này sẽ tiếp tục hỗ trợ lọc nội dung theo hướng có lợi cho người dùng
    • Nó đã bị loại bỏ trong bản phát hành Canary rồi
    • Tôi không hiểu “viết lại extension cho Firefox” nghĩa là gì. Firefox cũng dùng cùng API
      Nhiều lắm chỉ là đổi background.service_worker thành background.scripts, đúng nghĩa là chỉ đổi tên khóa
    • Hỏi cho những người chưa rõ: uBO là gì và nó ảnh hưởng thế nào tới phần lớn extension?
  • uBlock 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

    • Tôi đã chuyển sang tổ hợp này vài năm trước và chưa từng thấy lý do để rời đi. Trên điện thoại Android cũng vậy, đó là trải nghiệm web di động duy nhất tôi thấy dùng đượ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
    • Điều đó có thể thay đổi, vì Mozilla đang dần trở thành công ty quảng cáo
    • Tôi đã dùng cả Brave lẫn Firefox và thật lòng không thấy khác biệt lớn. Dù vậy, vì triết lý và việc nó xuất phát từ một tổ chức phi lợi nhuận, tôi vẫn thích Firefox 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?

    • Đó là một phần
      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
    • Đúng. Các nhà cung cấp quảng cáo và phân tích bắt đầu dùng cách này để né cơ chế bảo vệ cookie bên thứ ba
  • Đâ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

    • Không có lý do gì API khai báo của Manifest V3 lại không thể cung cấp chức năng kiểu này. Nếu tôi đọc đúng nội dung commit, nó thậm chí có thể hoạt động tốt hơn bằng cách tích hợp tốt hơn vào luồng request trước khi gửi bất cứ thứ gì tới server thật, rồi chặn dựa trên địa chỉ IP thực tế sẽ được dù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ề mặt kỹ thuật, bản thân Manifest V3 tách biệt với API mà trình duyệt cung cấp cho extension. Trên Firefox, Manifest V3 được hỗ trợ cùng với web request dạng chặn[1], vốn là API lọc có từ trước “Manifest V3”
      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...
    • Chỉ cần bỏ Chrome và đón nhận Firefox là được
  • 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.example
    Khi đó 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.example và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

    • Chính xác thì hơi khác một chút. Đúng như tên gọi, nó dùng CNAME, tức là bản ghi trỏ đến một bản ghi khác, chứ không phải bản ghi A trỏ đến IP
      Ví dụ media.q-company.example là CNAME trỏ đến q-company.ads-tracking.example, rồi q-company.ads-tracking.example có bản ghi A trả về IP
      Tô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.example
      Dù 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
    • Đây là lý do trong chế độ nâng cao của uBlock, việc chặn toàn bộ JavaScript rồi từ từ đưa các script hiện ra vào danh sách cho phép cho đến khi site hoạt động đúng là một cách hay
      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 đó

    • Không phải là chặn chính uBO, mà là khi đưa ra API plugin mới Manifest V3, họ loại bỏ những tính năng trình duyệt từng cho phép uBO hoạt động
      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
    • Không cập nhật trình duyệt cũng nguy hiểm. Chuyển sang Firefox để vừa được cập nhật vừa được hỗ trợ uBO đầy đủ sẽ tốt hơn nhiều
    • Họ đang loại bỏ dần dần trong thời gian dài để tránh dư luận xấu về độc quyền trình duyệt bùng lên cùng lúc. Nhưng lịch trình đó đã bắt đầu từ tháng 6 rồi
      https://developer.chrome.com/docs/extensions/develop/migrate...
      https://www.bleepingcomputer.com/news/google/google-chrome-w...
    • Hiện tại, uBlock Origin vẫn còn trên Chrome Web Store cho các trình duyệt Chromium hỗ trợ Manifest V2
      Nếu dùng phiên bản Chromium chỉ hỗ trợ Manifest V3 thì nó sẽ bị ẩn
    • Nói thật, khả năng cao là còn tùy vào việc Mỹ có tiếp tục giữ một chính quyền muốn đưa các công ty độc quyền trắng trợn ra tòa hay không
  • 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

    • Có vẻ bạn đang nói đến bản ghi ALIAS
  • 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?

    • Tôi không quan tâm đến hai trình duyệt độc quyền đã nhắc, nhưng Brave dự định sẽ hỗ trợ một phần Manifest V2 lâu nhất có thể và duy trì khả năng tương thích với uBO
      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ự