mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8374] [Bug] Ghidra searches drop provider facts from string and procedure inventory rows #6575
Open
opened 2026-11-01 21:12:22 +00:00 by bsakaguchi
·
1 comment
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#6575
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 @morluto on GitHub (Oct 31, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/8374
Before submitting
Area
Native analysis or decompilation
Observed behavior
Ghidra inventory search drops provider facts that are present on the corresponding list rows.
search_stringsloses encoding, termination and byte length;search_proceduresloses the procedure external/thunk classification.trace_featureuses these searches and therefore also omits the facts. Addresses and text are preserved; this report concerns the missing qualifications.Reproduction
On macOS arm64, compile this self-owned fixture without executing it:
Run
clang -O0 -g -arch arm64 simple.c -o simple, open it through REA MCP with Ghidra 12.1.4, then calllist_strings({detail:"complete"}),search_strings({pattern:"rea_encoding_marker", mode:"literal", case_sensitive:false, detail:"complete"}), andtrace_feature({query:"rea_encoding_marker"}). On this build, the same address/value appeared as follows:A separate real Ghidra control on current main used a synthetic Mach-O function
_Kelvin_markerat0x1000002ec:list_proceduresincludedprocedure: {external:false, thunk:false, thunk_target:null};search_procedures({pattern:"Kelvin",mode:"literal",case_sensitive:false,detail:"complete"})and the procedure match intrace_feature({query:"Kelvin",case_sensitive:false})retained its symbol metadata but omittedprocedure. This proves the loss for one ordinary function; external and thunk entries were not separately exercised.A separate selected Ghidra project defined the same Unicode text at two addresses, once as UTF-8 and once as UTF-16.
list_stringsexposed the distinct types and byte lengths;search_stringsandtrace_featurereturned both rows without that information. On that project, CLIrea search ... Σ --provider ghidra --jsonandrea trace ... Σ --provider ghidra --jsonalso omitted it. The original target and all source-project files were unchanged by REA. Both MCP sessions closed normally; successful MCP calls used the full TypeScript SDK-validated schemas.Expected behavior
Preserve the provider's string qualifications and procedure classification when selecting the same inventory rows, including in the composed trace and CLI/MCP results. An encoding is the selected Ghidra data interpretation, not independent proof of the original source encoding. Preserve unknown or absent facts when the provider did not supply them. This follows REA's requirement to preserve source evidence and uncertainty across boundaries.
Impact and scope
An agent cannot distinguish UTF-8 from UTF-16 matches using search or trace output, despite that information being present in the same provider inventory. Procedure search likewise omits the inventory classification in the tested case.
list_stringssupplies a same-session workaround, with address and value used to correlate rows. Reproduced on the ASCII fixture and the selected Unicode project on one Ghidra/macOS host. The corresponding Kuna 1.986 control retained its UTF-8 encoding metadata through inventory, search and trace. Other providers, targets and hosts are unverified.REA version
Current main
d54a4661da20382ad8456564a08569fdd24131c5.Runtime and platform
Node 24.22.1; macOS 26.3 arm64; Ghidra 12.1.4 / JDK 21; Kuna 1.986 control; TypeScript MCP SDK 2.3.1.
Target and artifact context
Synthetic unexecuted arm64 Mach-O; simple fixture SHA-256
b68170876fd69e97cf00d2a06250ac3a213c4110a2ddc55fd730e288afdb7314. The selected-project control is a separate synthetic fixture with explicit analyst-defined data types.Interface
MCP and CLI
Earliest failure stage
Native analysis or reconstruction
Relevant output or evidence
The smallest same-session MCP output is above. The CLI control used a separate source project with UTF-8 and UTF-16 definitions and returned the two matching rows without
stringmetadata. A successful trace need not imply complete reference discovery; that question is separate.Analysis or suspected cause
Source-derived: the Ghidra bridge's search loop passes
nullas the facts name, soresultItemomits its facts. The same bridge search loop handles both strings and procedures. The Ghidra search output parser also selects the unqualified addressed-row schema forsearch_strings. The shared trace already carries fields that reach it; fixing only its projection would not recover facts discarded upstream.Additional context
Related closed #5503 concerned Hopper qualifications lost between search and trace; here the earliest observed loss is Ghidra inventory to search. Related #8218 covers finding text not represented correctly in the inventory.
cc @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
@morluto commented on GitHub (Oct 31, 2026):
A disposable, uncommitted prototype tests the producing boundary on main
d54a4661: the Ghidra search bridge includes the samestringorprocedurefacts as its inventory row, and the Ghidra search output parser accepts the matching inventory row contract. It adds no new provider operation or fallback. This is exploratory evidence, not a proposed ready-to-merge patch.list_stringsin both. On the separate procedure fixture, it likewise retained the list classification in search and trace. The selected source project and target were unchanged.putsexercised real external and thunk rows. In the prototype,/usr/lib/libSystem.B.dylib::_putsretained{external:true,thunk:false,thunk_target:null}and_putsretained{external:false,thunk:true,thunk_target:"EXTERNAL:0x1"}through both search and trace. Its SHA-256 remaineddc6226fe389901d641ba5a2fcd1ff6b9298cf2708095b02b4c27ec4e56d3fa40.native-inventorypages, Evidence export, close, and import into the target-free session. A real Kuna string-search control also passed those paths. These are fixture/host controls, not coverage of all providers, formats or clients.A production change should add that observable cross-workflow regression, cover malformed/missing producer facts and cancellation, validate both output profiles and offline paging, and assess any client impact from the additional row fields. Other platforms and Ghidra releases remain unverified; no full local or CI gate was run for the prototype.
Real-verifier regression experiment: I added a temporary check to the existing public-MCP Ghidra boundary lane that compares the exact inventory row against its corresponding search row and
trace_featurematch for a defined string, selected function, external function and, when present, a thunk. A direct run of that same check against main fails at the string comparison; against the prototype it passes all four, including the real thunk. Both sessions closed, and the source-built target hash was unchanged.The normal host-native verifier initially hit existing #8172 before the boundary lane. After changing both comparisons in the disposable verifier to use the already-retained Evidence references (the separate fix is tracked in PR #8258), it reached this check and exposed another existing assertion that expected a long string search to omit metadata. Updating that assertion to compare the original inventory row allowed the complete
node scripts/verify-real-ghidra.mjsrun to finish withok:true,cleanup:complete, debug/stripped/type-layout/jump-table fixtures, 441 successful and 52 rejected boundary calls, and a verified empty descendant list. This was a built runtime in the combined temporary worktree, with Ghidra 12.1.4, explicit JDK 21 and Node 24.22.1 on macOS arm64; it is not a clean-main or hosted CI pass. The uncommitted regression and verifier changes are not an integrated fix.The long-string assertion is an additional reason existing real-provider verification missed the problem: it explicitly required the incomplete
{address,value}search projection. Comparing the search and trace with the list row catches the loss at the public workflow boundary without turning a provider inventory into a claim of exhaustive discovery.Regex and interrupted paging control: with the same uncommitted prototype and real Ghidra,
mode:"regex"search preserved inventory facts for three selected-project string rows and two external/thunk procedure rows. With each MCP schema profile, I requested a one-rownative-inventorypage, exported Evidence, closed the binary, imported the bundle into the target-free session, then continued fromnext_offset; all rows and explicitly selected facts matched the original inventory. Invalid[regexes returnedinvalid_request, after which the same session successfully searched and paged. The selected source project and both target digests remained unchanged. The complete trace checks were literal searches, becausetrace_featuredoes not offer regex mode. This is a bounded fixture control, not a cancellation, multi-host or full-provider conformance result.Malformed producer controls: in the disposable MCP boundary harness, valid address/value rows missing the now-required Ghidra string or procedure facts, and a string fact with a negative byte length, returned
unreadable_outputwithout an Evidence ID. The two affected focused MCP test files passed 11 tests after adding those controlled cases. This uses an injected bridge response; it is not a real Ghidra corruption or cancellation test.