Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 057dbb3

Browse files
committed
Bug 1974972 - block LNA access for channel annotated with CLASSIFIED_ANY_BASIC_TRACKING and CLASSIFIED_ANY_SOCIAL_TRACKING. r=timhuang,necko-reviewers,kershaw
Differential Revision: https://phabricator.services.mozilla.com/D255870
1 parent fd1f9f7 commit 057dbb3

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed

netwerk/protocol/http/nsHttpChannel.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1857,10 +1857,12 @@ nsresult nsHttpChannel::InitTransaction() {
18571857
// So we pretend that the permission for these has already been denied
18581858
// in order to avoid prompting.
18591859
uint32_t flags = 0;
1860+
using CF = nsIClassifiedChannel::ClassificationFlags;
18601861
if (StaticPrefs::network_lna_block_trackers() &&
18611862
NS_SUCCEEDED(
18621863
mLoadInfo->GetTriggeringThirdPartyClassificationFlags(&flags)) &&
1863-
flags != 0) {
1864+
(flags & (CF::CLASSIFIED_ANY_BASIC_TRACKING |
1865+
CF::CLASSIFIED_ANY_SOCIAL_TRACKING)) != 0) {
18641866
perms.mLocalHostPermission = LNAPermission::Denied;
18651867
perms.mLocalNetworkPermission = LNAPermission::Denied;
18661868

netwerk/test/unit/test_local_network_access.js

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,40 @@ const { HttpServer } = ChromeUtils.importESModule(
55
);
66

77
function makeChannel(url) {
8+
let uri2 = NetUtil.newURI(url);
9+
// by default system principal is used, which cannot be used for permission based tests
10+
// because the default system principal has all permissions
11+
var principal = Services.scriptSecurityManager.createContentPrincipal(
12+
uri2,
13+
{}
14+
);
815
return NetUtil.newChannel({
916
uri: url,
10-
loadUsingSystemPrincipal: true,
17+
loadingPrincipal: principal,
18+
securityFlags: Ci.nsILoadInfo.SEC_REQUIRE_SAME_ORIGIN_INHERITS_SEC_CONTEXT,
19+
contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
1120
}).QueryInterface(Ci.nsIHttpChannel);
1221
}
1322

23+
var ChannelCreationObserver = {
24+
QueryInterface: ChromeUtils.generateQI(["nsIObserver"]),
25+
observe(aSubject, aTopic) {
26+
if (aTopic == "http-on-opening-request") {
27+
var chan = aSubject.QueryInterface(Ci.nsIHttpChannel);
28+
if (chan.URI.spec.includes("test_lna_social_tracker")) {
29+
chan.loadInfo.triggeringThirdPartyClassificationFlags =
30+
Ci.nsIClassifiedChannel.CLASSIFIED_ANY_SOCIAL_TRACKING;
31+
} else if (chan.URI.spec.includes("test_lna_basic_tracker")) {
32+
chan.loadInfo.triggeringThirdPartyClassificationFlags =
33+
Ci.nsIClassifiedChannel.CLASSIFIED_ANY_BASIC_TRACKING;
34+
} else if (chan.URI.spec.includes("test_lna_content_tracker")) {
35+
chan.loadInfo.triggeringThirdPartyClassificationFlags =
36+
Ci.nsIClassifiedChannel.CLASSIFIED_TRACKING_CONTENT;
37+
}
38+
}
39+
},
40+
};
41+
1442
ChromeUtils.defineLazyGetter(this, "H1_URL", function () {
1543
return "http://localhost:" + httpServer.identity.primaryPort;
1644
});
@@ -28,6 +56,8 @@ function pathHandler(metadata, response) {
2856
}
2957

3058
add_setup(async () => {
59+
Services.prefs.setBoolPref("network.lna.block_trackers", true);
60+
Services.obs.addObserver(ChannelCreationObserver, "http-on-opening-request");
3161
// H1 Server
3262
httpServer = new HttpServer();
3363
httpServer.registerPathHandler("/test_lna", pathHandler);
@@ -46,7 +76,7 @@ add_setup(async () => {
4676
await httpServer.stop();
4777
} catch (e) {
4878
// Ignore errors during cleanup
49-
console.error("Error during cleanup:", e);
79+
info("Error during cleanup:", e);
5080
}
5181
});
5282
await server.registerPathHandler("/test_lna", (req, resp) => {
@@ -99,10 +129,63 @@ add_task(async function lna_blocking_tests() {
99129
[false, Ci.nsILoadInfo.Public, "/test_lna", Cr.NS_OK, H2_URL],
100130
[false, Ci.nsILoadInfo.Private, "/test_lna", Cr.NS_OK, H2_URL],
101131
[false, Ci.nsILoadInfo.Local, "/test_lna", Cr.NS_OK, H2_URL],
132+
// Test cases for local network access from trackers
133+
// NO LNA then request should not be blocked
134+
[false, Ci.nsILoadInfo.Local, "/test_lna_basic_tracker", Cr.NS_OK, H2_URL],
135+
[false, Ci.nsILoadInfo.Local, "/test_lna_social_tracker", Cr.NS_OK, H2_URL],
136+
[
137+
false,
138+
Ci.nsILoadInfo.Local,
139+
"/test_lna_content_tracker",
140+
Cr.NS_OK,
141+
H2_URL,
142+
],
143+
[
144+
false,
145+
Ci.nsILoadInfo.Public,
146+
"/test_lna_basic_tracker",
147+
Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED,
148+
H2_URL,
149+
],
150+
[
151+
false,
152+
Ci.nsILoadInfo.Public,
153+
"/test_lna_social_tracker",
154+
Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED,
155+
H2_URL,
156+
],
157+
[
158+
false,
159+
Ci.nsILoadInfo.Public,
160+
"/test_lna_content_tracker",
161+
Cr.NS_OK,
162+
H2_URL,
163+
],
164+
[
165+
false,
166+
Ci.nsILoadInfo.Private,
167+
"/test_lna_basic_tracker",
168+
Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED,
169+
H2_URL,
170+
],
171+
[
172+
false,
173+
Ci.nsILoadInfo.Private,
174+
"/test_lna_social_tracker",
175+
Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED,
176+
H2_URL,
177+
],
178+
[
179+
false,
180+
Ci.nsILoadInfo.Private,
181+
"/test_lna_content_tracker",
182+
Cr.NS_OK,
183+
H2_URL,
184+
],
102185
];
103186

104187
for (let [blocking, space, suffix, expectedStatus, url] of testCases) {
105-
info(`do_test ${url}, ${space} -> ${expectedStatus}`);
188+
info(`do_test ${url}${suffix}, ${space} -> ${expectedStatus}`);
106189

107190
Services.prefs.setBoolPref("network.lna.blocking", blocking);
108191

0 commit comments

Comments
 (0)