Skip to content

Commit b1cc2f4

Browse files
authored
Merge pull request #303 from leeN/fetch-header-sink
Fetch header sink reporting
2 parents ae1d586 + 9e9e7a4 commit b1cc2f4

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

dom/fetch/Request.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "nsIURI.h"
1111
#include "nsNetUtil.h"
1212
#include "nsPIDOMWindow.h"
13+
#include "nsTaintingUtils.h"
1314

1415
#include "mozilla/ErrorResult.h"
1516
#include "mozilla/StaticPrefs_network.h"
@@ -379,6 +380,15 @@ SafeRefPtr<Request> Request::Constructor(
379380
return nullptr;
380381
}
381382
headers = h->GetInternalHeaders();
383+
384+
// Foxhound:
385+
nsTArray<InternalHeaders::Entry> headerEntries;
386+
headers->GetEntries(headerEntries);
387+
for(InternalHeaders::Entry entry : headerEntries) {
388+
ReportTaintSink(entry.mName, "fetch.header(key)");
389+
ReportTaintSink(entry.mValue, "fetch.header(value)");
390+
}
391+
382392
} else {
383393
headers = new InternalHeaders(*requestHeaders);
384394
}

taint/test/mochitest/mochitest.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ support-files =
4141
[test_iframe_sinks.html]
4242
[test_fetch.html]
4343
[test_fetch_response.html]
44+
[test_fetch_header.html]
4445
[test_websocket_sinks.html]
4546
[test_function_ctor.html]
4647
[test_websocket.html]
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<!DOCTYPE HTML>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Test HTML Taint Sinks</title>
6+
<script src="/tests/SimpleTest/SimpleTest.js"></script>
7+
<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
8+
<script>
9+
function check_tainted(str) {
10+
SimpleTest.ok(str.taint.length > 0, "Check tainted for: " + str);
11+
}
12+
13+
let sink_names = [
14+
"fetch.header(key)",
15+
"fetch.header(value)",
16+
"fetch.header(value)"
17+
];
18+
19+
20+
let i = 0;
21+
22+
SimpleTest.waitForExplicitFinish();
23+
addEventListener("__taintreport", (report) => {
24+
25+
let flow = report.detail.str.taint[0].flow;
26+
is(flow[1].operation, sink_names[i]);
27+
28+
i += 1;
29+
if (i >= sink_names.length) {
30+
SimpleTest.finish();
31+
}
32+
}, false);
33+
34+
async function startTest() {
35+
try {
36+
let tName = String.tainted("X_TAINT_HEADER");
37+
let tValue = String.tainted("Foxhound");
38+
let hs = new Headers();
39+
hs.append(tName, tValue);
40+
let response = await fetch(`http://mochi.test:8888/tests/taint/test/mochitest/fetch_server.sjs?text`,
41+
{
42+
headers: hs,
43+
});
44+
response = await fetch(`http://mochi.test:8888/tests/taint/test/mochitest/fetch_server.sjs?text`,
45+
{
46+
headers: { x : tValue },
47+
});
48+
return response.ok;
49+
} catch(error
50+
) {
51+
SimpleTest.info(error.message);
52+
SimpleTest.is(true, false, "Error");
53+
return null;
54+
};
55+
}
56+
57+
58+
</script>
59+
</head>
60+
<body onload="startTest()">
61+
<p id="display"></p>
62+
<div id="content" style="display: none"></div>
63+
<p id="test"></p>
64+
</body>
65+
</html>

0 commit comments

Comments
 (0)