Skip to content

internal/process/per_thread.js is incompatible with Hardened JS shim #43496

@michaelfig

Description

@michaelfig

Version

16.15.1

Platform

Darwin snow.local 21.5.0 Darwin Kernel Version 21.5.0: Tue Apr 26 21:08:37 PDT 2022; root:xnu-8020.121.3~4/RELEASE_ARM64_T6000 arm64

Subsystem

internal/process

What steps will reproduce the bug?

Unfortunately, I currently need to install third party deps to reproduce:

mkdir repro
cd repro
yarn init --yes
yarn add zx endo-exec
cd node_modules/endo-exec
node endo-exec.cjs ./scripts/zx-head.js /etc/passwd

How often does it reproduce? Is there a required condition?

It reproduces every time.

What is the expected behavior?

Hello, world (from ./scripts/zx-head.js)!
$ head -5 /etc/passwd
##
# User Database
# 
# Note that this file is consulted directly only when the system is running
# in single-user mode.  At other times this information is provided by
$

What do you see instead?

(TypeError#1)
TypeError#1: Cannot assign to read only property 'Symbol(Symbol.iterator)' of object '[object Set]'
  at Object.buildAllowedFlags (node:internal/process/per_thread:375:53)
  at process.get [as allowedNodeEnvironmentFlags] (node:internal/bootstrap/node:279:34)
  at get (<anonymous>)
  at getOwn (node:internal/bootstrap/loaders:182:5)
  at NativeModule.syncExports (node:internal/bootstrap/loaders:294:31)
  at ModuleWrap.<anonymous> (node:internal/bootstrap/loaders:274:22)
  at NativeModule.getESMFacade (node:internal/bootstrap/loaders:279:17)
  at NativeModule.compileForPublicLoader (node:internal/bootstrap/loaders:259:10)
  at loadNativeModule (node:internal/modules/cjs/helpers:49:9)
  at ESMLoader.builtinStrategy (node:internal/modules/esm/translators:258:18)
  at ESMLoader.moduleProvider (node:internal/modules/esm/loader:337:14)

Additional information

Here is a a fix that makes Node.js compatible with the prototype freezing done by the Endo SES shim:

diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js
index 709bcb7b13..6ddc88a555 100644
--- a/lib/internal/process/per_thread.js
+++ b/lib/internal/process/per_thread.js
@@ -15,6 +15,7 @@ const {
   Float64Array,
   NumberMAX_SAFE_INTEGER,
   ObjectFreeze,
+  ObjectDefineProperty,
   ReflectApply,
   RegExpPrototypeTest,
   SafeArrayIterator,
@@ -371,9 +372,11 @@ function buildAllowedFlags() {
       return SetPrototypeValues(this[kInternal].set);
     }
   }
-  NodeEnvironmentFlagsSet.prototype.keys =
-  NodeEnvironmentFlagsSet.prototype[SymbolIterator] =
-    NodeEnvironmentFlagsSet.prototype.values;
+
+  const flagSetValues = NodeEnvironmentFlagsSet.prototype.values;
+  // NodeEnvironmentFlagsSet.prototype[SymbolIterator] = flagSetValues;
+  ObjectDefineProperty(NodeEnvironmentFlagsSet.prototype, SymbolIterator, { value: flagSetValues });
+  ObjectDefineProperty(NodeEnvironmentFlagsSet.prototype, 'keys', { value: flagSetValues });
 
   ObjectFreeze(NodeEnvironmentFlagsSet.prototype.constructor);
   ObjectFreeze(NodeEnvironmentFlagsSet.prototype);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions