mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #3338] [Bug] Process capture silently drops the accepted __proto__ environment override #1209
Open
opened 2026-10-15 18:32:01 +00:00 by bsakaguchi
·
4 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#1209
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @coygeek on GitHub (Oct 14, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/3338
Before submitting
Area
Process capture or runtime observation
Observed behavior
capture-processaccepts an explicit environment entry named__proto__, but silently drops it before launching the selected command. The captured scenario also omits that caller-selected entry. The CLI succeeds, and the ordinaryNORMAL_CAPTURE_KEYcontrol reaches the child correctly. Launching the same child directly with this environment name works. The failure concerns preservation of a literal environment variable.Parsing the same scenario at the scenario-schema boundary also succeeds while returning an environment with no own
__proto__key. The CLI failure reproduced on both tested Node.js versions. Other tested object-like names and the ordinary control were preserved.Reproduction
xcrun.The capture was executed with an isolated home and compiler module cache. These settings do not change the supplied scenario environment.
Expected behavior
An accepted explicit environment override should reach the selected command and remain in the recorded scenario commitment.
docs/process-capture.md:9says the host environment is inherited before scenario overrides apply.src/domain/process/processScenario.ts:35defines accepted environment names, andsrc/domain/process/processScenario.ts:152accepts this environment entry.AGENTS.md:13requires preservation of caller-selected inputs and metadata.__proto__is a nonempty environment name without=or NUL and is not the reserved process run identifier. The child should printselected=true:selected-value, followed bycontrol=control-value, and the recorded environment should contain both entries.Impact and scope
Impact level P2, supported. Captures using this accepted environment key run with a different input from the one requested, and their Evidence omits the lost explicit override. The demonstrated scope is this particular key; other tested object-like names and the ordinary control were preserved.
A verified runtime workaround is available. Use
/usr/bin/envas the scenario executable, put__proto__=selected-valueandnodebefore the existing arguments, and leave the ordinary control override inenvironment. That capture printedselected=true:selected-valueandcontrol=control-value. This preserves the target's runtime input but changes how the environment choice appears in the scenario, so it does not remove the need to preserve accepted scenario overrides.REA version
6.4.0 (main at
8dde6370d0)Runtime and platform
Node.js v26.10.0 and v24.21.0, macOS 27.0.1 arm64. The CLI failure reproduced on both Node.js versions.
Target and artifact context
A synthetic process-capture JSON scenario launches
node -eto print a selected literal environment variable and an ordinary control. The affected artifact is the captured scenario environment incapture.manifest.scenario.environment.Interface
CLI
Earliest failure stage
Request parsing or validation
Relevant output or evidence
The CLI succeeds, but the captured output and recorded scenario environment are:
The direct child-process control prints
true selected-value. The schema-boundary check also succeeds while returning an environment with no own__proto__key. These are reproduced observations; the source references below explain the boundary at which the entry is lost.Typed outcome or recovery expected
Run the supplied scenario and confirm both environment entries reach the child and appear in the recorded scenario. Require
selected=true:selected-valueandcontrol=control-value; the ordinary control must continue to pass. Compare the direct child-process control, which already delivers the selected value. Keep the existing rejection of empty names, names containing=or NUL, and the reserved process run identifier. Preserve the literal environment entry without treating it as an object-prototype operation.Analysis or suspected cause
Source-derived reasoning:
src/application/process/ProcessCli.ts:59parses the scenario before capture. The record parser atsrc/domain/process/processScenario.ts:152accepts this input while omitting the entry, so the launch and scenario commitment receive the reduced environment. The accepted-name contract is defined atsrc/domain/process/processScenario.ts:35. The executed capture, its recorded environment, and the direct child-process control establish the failure; this reasoning does not claim a broader prototype-mutation vulnerability.Additional context
@dayvison2b commented on GitHub (Oct 15, 2026):
I'll take this issue. I'll work on a focused fix with regression coverage and open a separate draft PR linked to #3338.
@skyvanguard commented on GitHub (Oct 15, 2026):
I looked into this. Two layers drop
__proto__, and only the first is in REA's own code.1. Scenario parsing (observed). zod 4.4.3
z.recordskips the own key"__proto__"without validating or reporting it ($ZodRecordinzod/v4/core/schemas.js:if (key === "__proto__") continue;).processScenarioSchema.environmentis such a record, which explains the schema-boundary result in the report.2. PTY launch (observed in the dependency's code). With the schema fixed,
@lydell/node-pty1.1.0 still copiesopt.envwith itsutils.assign, which doestarget[key] = source[key](unixTerminal.js:47). Assigning__proto__on a plain object calls the prototype setter, so the copy loses it before_parseEnvbuilds the child environment. Running the installedassigndirectly:Upstream
node-pty1.1.0 has the sameassign. Preserving the entry in the schema alone would therefore make the recorded scenario claim an override the child never received.Proposed fix: fail closed (draft #3834). Validate an own
__proto__member instead of letting zod skip it, and reserve the name alongsideREA_PROCESS_RUN_IDwith a diagnostic that points to your/usr/bin/env __proto__=VALUEworkaround. The advertisedpropertyNamespattern excludes it too, so the catalog matches enforcement in the CLI and over MCP. If node-pty stops copying the environment by assignment, accepting the name again only requires removing the reservation, because the record helper already keeps an accepted__proto__as a data property.Related but not changed:
nativeCallObservationInputSchema.environmentuses the samez.recordshape and would drop__proto__the same way. Its launch path differs and I could not verify it.Limitation: I worked on Windows, where native process capture is unavailable, so I did not run the end-to-end capture (
selected=…). The node-pty finding comes from its source and from executing itsassigndirectly.@nikolay-dementiev commented on GitHub (Oct 15, 2026):
The PTY layer is in node-pty itself:
spawncopies the environment withassign, whosetarget[key] = source[key]turns an own__proto__key into a prototype assignment, so the child never receives it. The officialnode-pty1.1.0 and@lydell/node-pty1.1.0 behave the same (false:[object Object]from the child, whilechild_processgivestrue:selected-value). Reported upstream as microsoft/node-pty#993. Once a release with that fix reaches@lydell/node-pty,capture-processcan keep the caller-selected entry end to end; until then the explicit rejection in #3834 avoids the silent drop.@coygeek commented on GitHub (Oct 24, 2026):
At
d87e73f, the silent-drop behavior has been mitigated, but the original delivery requirement is still unsupported. The owning schema now detects an own__proto__member before record parsing and rejects it with the PTY diagnostic. The regression assertions require rejection for both string and numeric values; they do not establish that a literal override reaches the child or remains in the recorded scenario.The current guide documents this restriction and the
/usr/bin/envworkaround. The dependency is still pinned to@lydell/node-pty1.1.0. The discussion contains earlier dependency observations; I have not rerun them or process capture on this revision.The remaining choice is whether explicit refusal is the accepted final contract or only an interim mitigation. For the original requested outcome, closure needs a verified preservation path through parsing, PTY launch, and recording, followed by the original scenario printing
selected=true:selected-valueandcontrol=control-value, with both own entries present in the captured scenario. CLI and MCP admission should agree, while invalid names andREA_PROCESS_RUN_IDremain rejected. If maintainers instead accept permanent refusal, that decision should explicitly narrow the issue's acceptance criteria; the current rejection tests support that narrower outcome.