mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #5741] [Bug] inspect-plist aborts a JSON-decodable NUL string when a large integer triggers XML probing #3487
Closed
opened 2026-10-31 00:41:03 +00:00 by bsakaguchi
·
5 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#3487
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 21, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5741
Before submitting
Area
Native analysis or decompilation
Observed behavior
inspect-plistexits 1 withexecution_failureand no normalized result for a valid binary plist containing both a string containing U+0061, U+0000, U+0062 and the integer9007199254740993. Removing the integer or replacing the NUL string with printable text makes inspection succeed. System plutil successfully converts the complete failing input to JSON; its supplemental XML conversion alone fails.Reproduction
Run from a built source checkout on macOS with Python 3 and jq available. The fixtures are synthetic and REA uses isolated state.
The independent verifier executed these fixtures at the baseline below. I replayed this script once against a fresh
npm run build:cachedbuild of fetched main: the combined fixture fails, both reduced controls succeed, and the truncated control fails withinvalid_request. Python's integer-awarejson.loadsof plutil's output andplistlib.loadsof the binary were also asserted equal to the exact source dictionary.Expected behavior
Return normalized JSON with
format: "binary"and preserve the NUL-bearing string. Retain the large integer exactly when its type can be established; otherwise expose an explicit precision limitation while preserving the available facts. An unavailable supplemental XML representation should not discard successful JSON decoding.The selected-local-plist contract promises normalized JSON. The JSON parser and its missing-element-types test already support a result with a precision limitation when number-type metadata is unavailable. Malformed selected inputs must still fail with
invalid_request.Impact and scope
P2: this bounded valid-input combination prevents inspection from returning any normalized facts. It reproduces at the verified baseline and current main. System plutil JSON text and Python plistlib provide demonstrated external-inspection workarounds that preserve both values, although they do not produce REA Evidence. Frequency in real artifacts is unknown. MCP, other platforms, and other value combinations were not exercised. No data mutation or security-boundary crossing was observed.
REA version
rea-agents6.7.0, verified source baseline9d8e7803326a382cbbb3ffdb900f5e93e5442d68. Rechecked with a successful freshnpm run build:cachedand public CLI execution on fetched maind0067ba34a39ea47dd7e11bb2e6169bc0938cc3f(also 6.7.0): still reproduces. The lockfile is unchanged between these revisions.Runtime and platform
Node.js v26.12.0; macOS 27.0.1; arm64; system plutil and Python 3 plistlib. No Hopper/Ghidra/IDA involvement.
Target and artifact context
Self-authored binary property-list dictionaries with a NUL string and/or a large integer. The malformed control removes the last ten bytes of a genuine binary fixture. No app bundle or live service is required.
Interface
CLI
Earliest failure stage
Native analysis or reconstruction
Relevant output or evidence
Current-main CLI and native utility outcomes, reduced to relevant fields:
The failing CLI's diagnostics identify
tool: "plutil",reason: "nonzero-exit", andexit_code: 1; captured stderr ends with the XML-conversion diagnostic above. Its message recommendsrea doctorand says repeating the unchanged request is not expected to succeed. The printable control includes the expected exact-integer limitation. Python reads the original string as U+0061, U+0000, U+0062 and the integer as exactly9007199254740993.Evidence provenance: observed public CLI and independent native utility checks, independently verified at the baseline and replayed on main. Ordinary JavaScript JSON parsing is not evidence of exact unsafe-integer preservation; the exact textual digits and Python decoder establish that here.
Typed outcome or recovery expected
The combined fixture should exit 0 and retain
noteas U+0061, U+0000, U+0062.bigmust preserve the exact decimal integer or carry an explicit precision limitation if its integer/real type cannot be established. Dropping the string or number, replacing NUL, or silently rounding does not restore the contract. Preserve both successful controls and the truncated input'sinvalid_request. These are proposed restoration checks; no fix was implemented or tested.Analysis or suspected cause
Source-derived reasoning: NativeMacOSProvider.ts captures JSON successfully, detects an unsafe integral literal, and requests XML element-type metadata with
acceptNonZero: false. The XML command failure returns beforeparsePlistJsoncan use the already decoded JSON and report missing type information. Current main retains this branch. The failure occurs in REA's handling of the supplemental native command, before the bundled XML decoder runs.Additional context
Related #5701, #5702, #5703, #5705, and #5737 concern XML fallback after JSON conversion fails. Here JSON conversion succeeds and the optional number-type probe fails before parsing. Preserving successful JSON decoding when that metadata is unavailable can restore this case while those sibling defects remain. Open #4047/#4054 concern real CDATA decoding and do not cover this command-failure branch. Merged #846/#860 establish exact-number and number-type handling, but do not handle this XML-refusal trigger.
Prepared with AI assistance and independent verification. NOT_ENOUGH_INFO: no last known good version or regression range was established. No successful restoration is claimed.
@XinwangTao commented on GitHub (Oct 21, 2026):
Good repro — the combination of a NUL string and a large integer is exactly the case that exposes a probe-order bug: XML 1.0 forbids U+0000, so once the large integer (9007199254740993 > U+0020 printable probing window) pushes the path toward XML conversion, the NUL byte makes serialization abort, and the tool exits 1 instead of falling back to the JSON path that plutil itself handles fine. The error only shows up when both conditions are present, which is why the individual fixtures (nul-small, printable-big) both pass.
Suggestion: when XML probing/serialization fails on an input that the JSON decoder accepts (plutil already proves it), degrade to the JSON path and report a warning instead of execution_failure. A regression fixture combining a\x00b with 9007199254740993 would lock this in.
@coygeek commented on GitHub (Oct 21, 2026):
Additional independently verified triggers share this issue's root cause: successful JSON conversion is discarded when the supplemental XML number-typing probe is unusable. Here
plutil -convert xml1exits 0, but emits literal control characters/noncharacters that REA's strict XML parser rejects. The independent verifier reproduced all variants below; I separately reran the U+0001 string plus large integer. Tested withrea-agents6.7.0 at9d8e7803326a382cbbb3ffdb900f5e93e5442d68on macOS, Node.js v26.12.0. Fetched main isd0067ba34a39ea47dd7e11bb2e6169bc0938cc3f, with changes in the provider file: verified at baseline; main not re-run for these additional triggers.9007199254740993.9007199254740992.0also triggers the XML type probe and fails.Minimal reproduction from the built source checkout:
Observed: both plutil conversions exit 0. Python's integer-aware JSON decoder confirms the exact source dictionary in the JSON output; the XML contains literal U+0001. REA exits 1 with
unreadable_output, reasonXML is not well-formed: 8:11: disallowed character., and nonormalized_result.Expected restoration: keep the successful JSON result and original string/key, with an explicit precision limitation when number-type metadata cannot be used. The existing parser fallback can retain available facts but does not establish exact unsafe-integer preservation. Recovery must handle unusable XML output even when the conversion command succeeds; tolerating only nonzero XML exits leaves these triggers failing. This is a proposed restoration check, not a tested fix.
@kaoru0822-kitauji commented on GitHub (Oct 21, 2026):
Rechecked on current main
a5f982de8with a freshnpm run build:cached(macOS arm64, Node 26.5.0, built CLI). This no longer reproduces.d672cc239(fix(apple): preserve binary plist scalar source facts) decodes binary plists from their own bytes before anyplutilconversion, so the XML number-typing probe no longer runs for these inputs.inspect-plistresults withplistlib-generated binary fixtures (all except the truncated control exit 0 withformat: "binary"):nul-big(issue fixture)noteis U+0061 U+0000 U+0062;bigis{"$plist_type":"integer","decimal":"9007199254740993"}nul-smallnotekeptprintable-bigbigexactskept;bigexactskept;bigexactk\u0001kept;bigexact9007199254740992.0(coygeek)ris9007199254740992;skepttruncatedcontrolinvalid_request(unchanged)Not covered: non-binary inputs still go through
plutil, but none of the reported triggers are non-binary. Closing is the maintainers' call; I'm unassigning myself since no change is needed.@XinwangTao commented on GitHub (Oct 21, 2026):
The verification table is reassuring — all binary fixtures (nul-big, the U+0001/U+FFFF variants, the 9007199254740992.0 real) now exit 0 with the NUL string and exact integer preserved, while the truncated control still correctly fails with invalid_request. That keeps malformed-input handling intact.
One small suggestion: since the combined NUL-string + large-integer fixture is what originally exposed this probe-order bug, it would be worth pinning it as a permanent regression test (the reduced controls alone wouldn't have caught it). That would also guard the binary path against future refactors of the XML number-type probe.
@XinwangTao commented on GitHub (Oct 21, 2026):
Agree with the fix direction — decoding binary plists from their own bytes sidesteps the XML probe entirely for these inputs, and the recheck table covers all reported variants cleanly. One gap worth pinning down: non-binary inputs still route through plutil, so a NUL/control char combined with an unsafe integer could still hit the same "successful JSON discarded by unusable XML probe" abort there. A regression fixture that forces the XML type-probe path on a non-binary input (control char + 9007199254740993) would lock in the fallback behavior — keep the JSON facts and surface a precision limitation instead of execution_failure.