-
Notifications
You must be signed in to change notification settings - Fork 30.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
module: allowed module location list #34379
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -84,13 +84,15 @@ const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const manifest = getOptionValue('--experimental-policy') ? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
require('internal/process/policy').manifest : | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const allowedModuleLocations = getOptionValue('--allowed-module-location'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should cache builtins to avoid mutations from affecting this (comment 1 of n)
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { compileFunction } = internalBinding('contextify'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Whether any user-provided CJS modules had been loaded (executed). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Used for internal assertions. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let hasLoadedAnyUserCJSModule = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERR_MODULE_BLOCKED, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERR_INVALID_ARG_VALUE, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERR_INVALID_OPT_VALUE, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERR_INVALID_PACKAGE_CONFIG, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -937,6 +939,28 @@ Module._load = function(request, parent, isMain) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const mod = loadNativeModule(filename, request); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (mod && mod.canBeRequiredByUsers) return mod.exports; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Only return the file location if it is in an allowed location | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// or the allowed locations are not set | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let locationAllowed = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (allowedModuleLocations && allowedModuleLocations.length > 0) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
locationAllowed = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
debug('Allowed module locations count: %d', allowedModuleLocations.length); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (const allowedLocation of allowedModuleLocations) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const relative = path.relative(allowedLocation, filename); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
debug('Relative path from allowed location "%s" to loaded "%s": %s', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
allowedLocation, filename, relative); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (relative === '' || | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(!relative.startsWith('..') && !path.isAbsolute(relative))) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
debug('Module will be allowed'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
locationAllowed = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+945
to
+959
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should cache builtins to avoid mutations from affecting this (comment 2 of n)
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!locationAllowed) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new ERR_MODULE_BLOCKED(request); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Don't call updateChildren(), Module constructor already does. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const module = new Module(filename, parent); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
module.exports = {} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"main": "index.js" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
'use strict'; | ||
// Flags: --expose-internals | ||
require('../common'); | ||
const { getOptionValue } = require('internal/options'); | ||
const assert = require('assert'); | ||
const path = require('path'); | ||
const cp = require('child_process'); | ||
|
||
if (getOptionValue('--allowed-module-location').length === 0) { | ||
const args = [ | ||
'--expose-internals', | ||
'--allowed-module-location', __dirname, | ||
'--allowed-module-location', path.join(__dirname, '..', 'common'), | ||
__filename | ||
]; | ||
const result = cp.spawnSync(process.argv0, | ||
args, | ||
{ stdio: 'inherit', shell: false }); | ||
assert.strictEqual(result.status, 0); | ||
process.exit(0); | ||
} | ||
|
||
const requireModule = path.join('..', 'fixtures', 'allowed-modules'); | ||
assert.throws( | ||
() => { require(requireModule); }, | ||
{ | ||
code: 'ERR_MODULE_BLOCKED', | ||
name: 'Error', | ||
message: `Loading of module ${requireModule} was blocked: ` + | ||
'module path is outside allowed locations' | ||
}); | ||
|
||
const requireFile = path.join(requireModule, 'index.js'); | ||
assert.throws( | ||
() => { require(requireFile); }, | ||
{ | ||
code: 'ERR_MODULE_BLOCKED', | ||
name: 'Error', | ||
message: `Loading of module ${requireFile} was blocked: ` + | ||
'module path is outside allowed locations' | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.