mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #6161] [Bug] A truncated ELF is analyzed as a complete program: Evidence reports fewer procedures with no truncation notice #3765
Closed
opened 2026-10-31 00:43:48 +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#3765
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 @Nitin13-git on GitHub (Oct 21, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/6161
Before submitting
Area
Evidence, artifacts, or reconstruction
Observed behavior
analyzeaccepts an ELF cut short anywhere after its 64-byte header and returns successful Evidence for what Ghidra loaded, with the same generic limitation notes as the complete file and no mention that the file is shorter than its headers declare. Only a cut inside the 64-byte header is rejected (truncated ELF header,src/domain/elfFixedHeader.ts); a cut at exactly 64 bytes fails later as a genericexecution_failure("Runrea doctorand review the reported details...").Reproduction
Executed on macOS arm64, Node 24.18.0, source
3dbe314ad, Ghidra 12.1.4 (GHIDRA_INSTALL_DIRandJAVA_HOMEset). The ELF is/usr/bin/truefrom Ubuntu 22.04 (26,936 bytes,e_phoff=64,e_phnum=13,e_shoff=25016,e_shnum=30,e_shentsize=64), copied out of a container.execution_failureprocedure_count0procedure_count24,segment_count2procedure_count27,segment_count2For N=8000 the section header table (bytes 25,016 to 26,936) is beyond the end of the file. The Evidence for N=8000 and for the whole file each lists the same 9 limitation entries, and
normalized_result(document,image_base,segments,segment_count,procedure_count,string_count) has no truncation field. For comparison, a Mach-O cut inside its load commands is refused (truncated Mach-O load commands: the header declares ... bytes ...; the file has ...).Expected behavior
Evidence for a file shorter than its program or section headers declare says so (a limitation or unknown naming the declared and actual sizes), or the file is refused as
target_unavailableas truncated Mach-O load commands already are. I do not know which the maintainers prefer: a hard refusal could reject deliberately malformed samples that reverse engineers want to analyze, so a recorded limitation may be the better fit. Either way, a cut at 64 bytes should not report an environment failure.Impact and scope
Observed on one ELF on one host. Real-world frequency, other ELF architectures, PE and fat Mach-O files, and non-Ghidra providers: NOT_ENOUGH_INFO. Effect: an incomplete download or copy produces plausible but incomplete Evidence that looks like a smaller program.
REA version
Source
3dbe314ad(package 6.7.0)Runtime and platform
macOS arm64 (26.6.2), Node 24.18.0
Target and artifact context
One ELF x86-64 from a stock Ubuntu 22.04 image, truncated with
head -c; no user binary.Interface
CLI
Earliest failure stage
Setup or provider admission
Relevant output or evidence
Commands and results are in the table above. I also ran 25 header corruptions of an ELF and a PE: bad class, byte order, machine, PE signature, PE header offset, and truncated PE headers are refused with specific
target_unavailablemessages; zero or oversized program-header and section counts and a section table beyond the file are loaded by Ghidra with changed counts, which I do not consider a defect.Analysis or suspected cause
Source-derived, not verified by a fix:
parseElfinsrc/domain/binaryTarget.tsuses only the fixed header (readElfFixedHeader,src/domain/elfFixedHeader.ts); it does not comparee_phoff/e_shoffand their entry counts and sizes against the file size. Related: #6154 (corrupt Mach-O load commands, same genericexecution_failureoutcome) and #1189 (truncated Mach-O header, closed).@XinwangTao commented on GitHub (Oct 22, 2026):
确认,这是静默不完整分析,比显式报错更危险——调用方会以为 135 个 procedure 就是全貌。除了 #6165 里"program header table 越界即拒绝"之外,建议对中间态(头能解析但文件长度小于头声明的各 section/symbol 范围)统一输出显式的不完整/截断标记,而不是静默降低 procedure_count 后照常返回成功 Evidence。另外 head -c 26935(差 1 字节)与完整文件输出同样的 135 procedures/32 segments 这一点很可疑,建议在 #6165 的验收里加一条:任意 N 截断要么非成功退出、要么结果带截断警告,杜绝"差一个字节结果完全相同"的假阳性。
@Yoh5 commented on GitHub (Oct 22, 2026):
Source-only observation — I have not reproduced the table above on my own machine yet, so nothing here is a runtime result.
Reading
src/domain/elfFixedHeader.ts: the validator checkse_ehsizeagainst the containing file size, but it never reads the two extents the same fixed header also declares —e_phoff/e_phnum/e_phentsizeande_shoff/e_shnum/e_shentsize.For the N=8000 row, the header declares a section table spanning 25,016–26,936 while the file stops at 8,000. That discrepancy is computable from the first 64 bytes, before any loader runs, which would explain why a cut inside the 64-byte header is caught and every longer cut is not.
A question on the intended contract, because it decides the shape of a fix rather than its size: should a declared extent beyond EOF reject the file, or should the file be admitted with a named truncation note carried into the Evidence?
The title ("no truncation notice") reads like the second. A rejection would also break legitimate inputs — an ELF carved out of a container, a relocatable object, an embedded image — and the second reading is consistent with #6154, #6123 and #6120, where the complaint is that a degraded input is mislabelled, not that it is accepted.
Glad to take this on if the annotate direction is the right one.
@XinwangTao commented on GitHub (Oct 23, 2026):
Agree with the annotate direction: accepting the file with an explicit truncation notice is the better contract, both for the carved-out/embedded ELF cases you list and because a hard refusal would reject deliberately malformed samples that reverse engineers want to load. To keep it consistent with #6165: keep the reject there scoped to program-header-table overflow (the case that genuinely breaks parsing), and carry a named truncation note into Evidence for section/symbol extents that merely run past EOF. It would also be worth pinning #6165's acceptance criterion to "any N-byte cut either exits non-zero or returns Evidence with a truncation notice", so the 26935-vs-26936 identical-result case cannot silently come back.
@morluto commented on GitHub (Oct 23, 2026):
Resolved on main in 651afa445. Before provider selection, the shared target resolver validates complete ELF program/section tables and file-backed payload extents using one exact declaration owner. Executed ELF32/64 LE/BE controls refuse truncation and retain valid absent-table/NOBITS/zero-sized declarations. Validation:
tests/boundary/filesystem/elfDeclaredRanges.test.ts— refuses declared table and payload truncation before provider admission; recorded execution ateac392d08. The exact ELF declared-range file passed; enclosing group exited1 on unrelated MIPS expectations later repaired. No Ghidra engine run; hard refusal occurs before provider launch, so this does not claim loader completeness.