macOS: Desktop hardened Node cannot load bundled unsigned skia.node
What version of the Codex App are you using (From “About Codex” dialog)?
ChatGPT/Codex desktop app 26.721.81911 (build 5973), bundled codex-cli 0.146.0-alpha.3.1
What subscription do you have?
ChatGPT paid plan
What platform is your computer?
Darwin 22.6.0 x86_64 i386 — macOS 13.7.8 (22H730), Intel
What issue are you seeing?
The Codex desktop app's hardened Node executable cannot load the skia.node
native addon shipped in the primary runtime's @oai/artifact-tool dependency.
The app bundle itself passes deep and strict code-signature verification.
However, importing @oai/artifact-tool with the app'sContents/Resources/cua_node/bin/node fails with:
ERR_DLOPEN_FAILED
mapped file has no cdhash, completely unsigned?
Code has to be at least ad-hoc signed.
The same package imports successfully when executed with the Node binary in the
primary runtime.
Observed versions:
- Primary runtime bundle:
26.727.11326 - Manifest artifact-tool version:
2.8.31 - Installed
@oai/artifact-toolpackage version:2.8.33 skia-canvas:3.0.8- Both Node executables:
v24.14.0
The runtime's skia.node is byte-for-byte identical to the officialskia-canvas v3.0.8 darwin-x64.gz release asset after decompression:
darwin-x64.gz SHA-256:
3301d9241b661f30dcaf73c413b91549d020d7c2faff4b13905007b93ff66736
skia.node SHA-256:
8178acf1a69814779d124675502c0ae08868eb190dcc28ea735d0294f8c45d38
Both the upstream file and the runtime copy report:
code object is not signed at all
The app's cua_node has Hardened Runtime enabled and does not have thecom.apple.security.cs.disable-library-validation entitlement. The runtime
Node does have that entitlement, which is consistent with the success/failure
boundary.
What steps can reproduce the bug?
No config changes or re-signing are required.
APP=/Applications/ChatGPT.app
RUNTIME="$HOME/.cache/codex-runtimes/codex-primary-runtime"
NODE_MODULES="$RUNTIME/dependencies/node/node_modules"
SKIA="$NODE_MODULES/@oai/artifact-tool/node_modules/skia-canvas/lib/skia.node"
codesign --verify --deep --strict --verbose=2 "$APP"
codesign --verify --strict --verbose=4 "$SKIA"
NODE_PATH="$NODE_MODULES" \
"$APP/Contents/Resources/cua_node/bin/node" \
-e 'const artifact = require("@oai/artifact-tool"); console.log(Object.keys(artifact).length)'
NODE_PATH="$NODE_MODULES" \
"$RUNTIME/dependencies/node/bin/node" \
-e 'const artifact = require("@oai/artifact-tool"); console.log(Object.keys(artifact).length)'
Actual results:
- The app signature is valid.
skia.nodeis unsigned.- The Desktop
cua_nodecommand exits withERR_DLOPEN_FAILED. - The runtime Node command succeeds and prints
1171.
What is the expected behavior?
The supported Desktop workspace-dependency/artifact path should import the
bundled @oai/artifact-tool and load its native dependencies without requiring
users to modify or locally re-sign managed runtime files.
If cua_node is not intended to host these native dependencies, Desktop should
consistently route artifact execution through the primary runtime Node and
expose the required workspace-dependency loader to fresh sessions.
Additional information
This is related to, but narrower than, #34853, #34270, and #34091. Those issues
primarily track the missing load_workspace_dependencies tool. This report
captures the underlying macOS native-module boundary that prevents the Desktop
Hardened Node from serving as a fallback when that loader is absent.
There is also a packaging metadata mismatch: runtime.json reports
artifact-tool 2.8.31, while the installed package identifies itself as2.8.33. That mismatch does not appear to cause the signature failure, but may
be useful when auditing the runtime bundle.
No app, runtime, native module, entitlement, or signature was modified while
reproducing this issue.
2 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Closing as a duplicate of #35055. I added the newer Desktop/runtime, x86_64, upstream-hash, and runtime-Node comparison evidence to that issue.