3939#include " node_revert.h"
4040#include " node_v8_platform-inl.h"
4141#include " node_version.h"
42+ #include " policy/policy.h"
4243
4344#if HAVE_OPENSSL
4445#include " allocated_buffer-inl.h" // Inlined functions needed by node_crypto.h
@@ -294,6 +295,18 @@ void Environment::InitializeDiagnostics() {
294295#endif
295296}
296297
298+ bool Environment::BootstrapPrivilegedAccessContext () {
299+ Local<Function> run_in_privileged_scope;
300+ MaybeLocal<Function> maybe_run_in_privileged_scope =
301+ Function::New (
302+ context (),
303+ policy::PrivilegedAccessContext::Run);
304+ if (!maybe_run_in_privileged_scope.ToLocal (&run_in_privileged_scope))
305+ return false ;
306+ set_run_in_privileged_scope (run_in_privileged_scope);
307+ return true ;
308+ }
309+
297310MaybeLocal<Value> Environment::BootstrapInternalLoaders () {
298311 EscapableHandleScope scope (isolate_);
299312
@@ -302,7 +315,8 @@ MaybeLocal<Value> Environment::BootstrapInternalLoaders() {
302315 process_string (),
303316 FIXED_ONE_BYTE_STRING (isolate_, " getLinkedBinding" ),
304317 FIXED_ONE_BYTE_STRING (isolate_, " getInternalBinding" ),
305- primordials_string ()};
318+ primordials_string (),
319+ run_in_privileged_scope_string ()};
306320 std::vector<Local<Value>> loaders_args = {
307321 process_object (),
308322 NewFunctionTemplate (binding::GetLinkedBinding)
@@ -311,7 +325,8 @@ MaybeLocal<Value> Environment::BootstrapInternalLoaders() {
311325 NewFunctionTemplate (binding::GetInternalBinding)
312326 ->GetFunction (context ())
313327 .ToLocalChecked (),
314- primordials ()};
328+ primordials (),
329+ run_in_privileged_scope ()};
315330
316331 // Bootstrap internal loaders
317332 Local<Value> loader_exports;
@@ -348,12 +363,14 @@ MaybeLocal<Value> Environment::BootstrapNode() {
348363 process_string (),
349364 require_string (),
350365 internal_binding_string (),
351- primordials_string ()};
366+ primordials_string (),
367+ run_in_privileged_scope_string ()};
352368 std::vector<Local<Value>> node_args = {
353369 process_object (),
354370 native_module_require (),
355371 internal_binding_loader (),
356- primordials ()};
372+ primordials (),
373+ run_in_privileged_scope ()};
357374
358375 MaybeLocal<Value> result = ExecuteBootstrapper (
359376 this , " internal/bootstrap/node" , &node_params, &node_args);
@@ -399,6 +416,10 @@ MaybeLocal<Value> Environment::RunBootstrapping() {
399416
400417 CHECK (!has_run_bootstrapping_code ());
401418
419+ if (!BootstrapPrivilegedAccessContext ()) {
420+ return MaybeLocal<Value>();
421+ }
422+
402423 if (BootstrapInternalLoaders ().IsEmpty ()) {
403424 return MaybeLocal<Value>();
404425 }
@@ -436,7 +457,8 @@ MaybeLocal<Value> StartExecution(Environment* env, const char* main_script_id) {
436457 env->require_string (),
437458 env->internal_binding_string (),
438459 env->primordials_string (),
439- FIXED_ONE_BYTE_STRING (env->isolate (), " markBootstrapComplete" )};
460+ FIXED_ONE_BYTE_STRING (env->isolate (), " markBootstrapComplete" ),
461+ env->run_in_privileged_scope_string ()};
440462
441463 std::vector<Local<Value>> arguments = {
442464 env->process_object (),
@@ -445,7 +467,8 @@ MaybeLocal<Value> StartExecution(Environment* env, const char* main_script_id) {
445467 env->primordials (),
446468 env->NewFunctionTemplate (MarkBootstrapComplete)
447469 ->GetFunction (env->context ())
448- .ToLocalChecked ()};
470+ .ToLocalChecked (),
471+ env->run_in_privileged_scope ()};
449472
450473 return scope.EscapeMaybe (
451474 ExecuteBootstrapper (env, main_script_id, ¶meters, &arguments));
0 commit comments