- uBlock Origin 커밋은 Firefox 네트워크 처리에서 CNAME uncloaking 흐름을 재작성하고, DNS 조회로 얻은 IP를
details.ip에 반영하도록 바꿈 - 기존
cnamesMap 캐시는 사라지고,dnsList,dnsDict,dnsWritePtr기반의 256개 링 버퍼와60000msTTL 캐시로 대체됨 - DNS 조회는
browser.dns.resolve(hn, [ 'canonical_name' ])를 사용하며, 결과의canonicalName과addresses[0]를 각각 CNAME과 IP로 활용함 - CNAME 예외 처리는 1st-party, ignore list, root document 조건을 유지하고, IPv4 주소나
[로 시작하는 호스트명은 재조회에서 제외함 - Chromium 최소 버전은
80.0, Opera 최소 버전은67.0으로 올라가며, 숨김 설정의cnameMaxTTL기본값은 제거됨
Firefox DNS 캐시 구조 재작성
platform/firefox/vapi-background-ext.js의 CNAME uncloaking 관련 코드가 전역 Map 중심 구조에서 클래스 내부 DNS 캐시 구조로 바뀜- 기존
cnameUncloakEnabled전역 상태와cnamesMap 대신 다음 필드로 캐시를 관리함dnsList: 링 버퍼dnsWritePtr: 다음 쓰기 위치dnsMaxCount: 최대256dnsDict: 호스트명에서 링 버퍼 인덱스로 매핑dnsEntryTTL:60000ms
- 생성자에서는
canUncloakCnames와cnameUncloakEnabled가true로 초기화됨
요청 처리 흐름
onBeforeSuspendableRequest(details)는 요청 URL에서 호스트명을 뽑은 뒤dnsFromCache(hn)로 캐시를 먼저 확인함- 캐시된 DNS 항목에
ip가 있으면details.ip에 설정함 - 기본
super.onBeforeSuspendableRequest(details)호출 결과가 취소나 리다이렉트 등으로 끝나면 그 결과를 그대로 반환함 - 캐시된 DNS 항목이
Promise가 아니면onAfterDNSResolution(hn, details, dnsEntry)로 후속 처리를 이어감 - DNS 재조회 조건을 만족하지 않거나
details.proxyInfo?.proxyDNS가 있으면 추가 DNS 처리를 하지 않음
DNS 조회와 저장 방식
dnsShouldResolve(hn)은 빈 호스트명,[로 시작하는 호스트명, IPv4 주소 형태를 DNS 조회 대상에서 제외함dnsResolve(hn, details)는 링 버퍼의 현재 위치에 호스트명을 등록하고dnsAPI.resolve(hn, [ 'canonical_name' ])를 호출함- 조회 성공 시
dnsToCache(hn, rec, details)가 실행되고, 실패하면dnsToCache(hn)로 빈 항목을 캐시에 남김 dnsToCache는 새 캐시 항목에hn과 만료 시각을 저장함cnameFromRecord가 값을 반환하면dnsEntry.cname에 저장함ipFromRecord가 값을 반환하면dnsEntry.ip에 저장함
dnsFromCache는 캐시 항목이Promise이면 그대로 반환하고, 만료된 항목은dnsList와dnsDict에서 제거함
CNAME과 IP 반영 조건
cnameFromRecord(hn, record, details)는record.canonicalName이 없거나 원래 호스트명과 같으면 CNAME을 반환하지 않음cnameIgnore1stParty가 켜져 있으면 CNAME과 원래 호스트명의 도메인이 같은 경우를 제외함cnameIgnoreList가 있으면 해당 정규식에 매칭되지 않는 CNAME은 제외됨cnameIgnoreRootDocument가 켜져 있으면 요청 호스트명이details.documentUrl || details.url의 호스트명과 같을 때 제외함ipFromRecord(record)는record.addresses가 배열이고 비어 있지 않을 때 첫 번째 주소addresses[0]를 반환함
URL 재작성과 후속 필터링
onAfterDNSResolution은 DNS 항목에 CNAME이 있고cnameUncloakEnabled가 켜져 있으면uncloakURL로 URL을 재작성함- URL을 바꿀 때 기존 URL은
details.aliasURL에 저장하고, 새 URL은details.url에 반영함 - DNS 항목의 IP가 있고 현재
details.ip와 다르면details.ip를 갱신함 - CNAME 재작성이나 IP 변경이 발생한 경우에만 기본 클래스의
onBeforeSuspendableRequest(details)를 다시 호출함 uncloakURL은 URL 안의 호스트명 위치를 찾아 CNAME으로 바꾸며,cnameReplayFullURL값에 따라 전체 URL을 이어 붙이거나 경로 앞부분까지만 유지함
설정과 manifest 변경
setOptions에서cnameMaxTTL처리가 제거됨- 옵션 변경 시 기존
cnamesMap 초기화 대신dnsList.fill(null)과dnsDict.clear()로 DNS 캐시를 비움 src/js/background.js의 숨김 설정 기본값에서cnameMaxTTL: 120이 삭제됨platform/chromium/manifest.json의minimum_chrome_version은73.0에서80.0으로 변경됨platform/opera/manifest.json의minimum_opera_version은60.0에서67.0으로 변경됨