Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit dd93dd7

Browse files
committed
fix: limit SW registration to content root
Introduces hardening proposed in: ipfs/kubo#4025 (comment) License: MIT Signed-off-by: Marcin Rataj <[email protected]>
1 parent 3516bb8 commit dd93dd7

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

src/http/gateway/resources/gateway.js

+5
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ module.exports = {
7676
// add trailing slash for directories with implicit index.html
7777
return h.redirect(`${path}/`).permanent(true)
7878
}
79+
if (request.headers['service-worker'] === 'script') {
80+
// Disallow Service Worker registration on /ipfs scope
81+
// https://github.com/ipfs/go-ipfs/issues/4025
82+
if (path.match(/^\/ip[nf]s\/[^/]+$/)) throw Boom.badRequest('navigator.serviceWorker: registration is not allowed for this scope')
83+
}
7984

8085
// Support If-None-Match & Etag (Conditional Requests from RFC7232)
8186
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag

test/gateway/index.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ describe('HTTP Gateway', function () {
105105
expect(res.headers.suborigin).to.equal(undefined)
106106
})
107107

108-
it('400 for request with invalid argument', async () => {
108+
it('returns 400 for request with invalid argument', async () => {
109109
const res = await gateway.inject({
110110
method: 'GET',
111111
url: '/ipfs/invalid'
@@ -118,6 +118,18 @@ describe('HTTP Gateway', function () {
118118
expect(res.headers.suborigin).to.equal(undefined)
119119
})
120120

121+
it('returns 400 for service worker registration outside of an IPFS content root', async () => {
122+
const res = await gateway.inject({
123+
method: 'GET',
124+
url: '/ipfs/QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o?filename=sw.js',
125+
headers: { 'Service-Worker': 'script' }
126+
})
127+
128+
// Expect 400 Bad Request
129+
// https://github.com/ipfs/go-ipfs/issues/4025#issuecomment-342250616
130+
expect(res.statusCode).to.equal(400)
131+
})
132+
121133
it('valid CIDv0', async () => {
122134
const res = await gateway.inject({
123135
method: 'GET',

0 commit comments

Comments
 (0)