mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #7245] feat(android): project expected JNI/JNA symbol names and structural attack-surface facts #7743
Open
opened 2026-11-03 13:40:05 +00:00 by bsakaguchi
·
0 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#7743
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?
📋 Pull Request Information
Original PR: https://github.com/morluto/rea/pull/7245
Author: @0xLLVEL
Created: 10/26/2026
Status: 🔄 Open
Base:
main← Head:feat/android-component-inventory📝 Commits (10+)
43d6742feat(android)!: return structured manifest component inventory52e4b6afeat(android): project expected JNI/JNA symbol namesc4cd9f2feat(android): project structural attack-surface facts1bb18dadocs(android): packed and split APK analysis playbook1ed6956feat(android): tolerate missing DEX prototypes in JNI projection23aeee5Merge remote-tracking branch 'upstream/main' into feat/android-component-inventory9db2aceMerge remote-tracking branch 'upstream/main' into feat/android-component-inventory1b7170cMerge remote-tracking branch 'upstream/main' into feat/android-component-inventory9ac0b79style: restore upstream import layout outside the android scopeef948eefix(android): keep unresolved guards unknown and reuse the DEX descriptor contract📊 Changes
43 files changed (+3117 additions, -48 deletions)
View changed files
📝
.agents/skills/reverse-engineer-anything/references/android-applications.md(+18 -0)📝
docs/android-analysis.md(+83 -5)➕
docs/android-packed-analysis.md(+68 -0)📝
src/android/AndroidManifestComponents.ts(+39 -4)📝
src/android/JadxAnalysis.ts(+13 -6)📝
src/android/JadxProtocol.ts(+1 -0)📝
src/android/JadxSession.ts(+3 -4)➕
src/application/android/AndroidAttackSurfaceService.test.ts(+320 -0)➕
src/application/android/AndroidAttackSurfaceService.ts(+105 -0)➕
src/application/android/AndroidJniNamesService.test.ts(+159 -0)➕
src/application/android/AndroidJniNamesService.ts(+100 -0)➕
src/application/android/AndroidProjectionSource.ts(+250 -0)📝
src/cli/applicationCommands.ts(+35 -1)📝
src/cliCommandNames.ts(+2 -0)📝
src/contracts/applicationToolContracts.ts(+54 -0)➕
src/contracts/sourceEvidenceAdvertisement.ts(+62 -0)📝
src/contracts/toolContractTypes.ts(+9 -0)📝
src/contracts/toolEffects.ts(+2 -0)📝
src/contracts/toolSchemaMetadata.ts(+4 -1)📝
src/domain/analysisView/androidPackageView.ts(+15 -2)...and 23 more files
📄 Description
Summary
Closes #7244.
Adds two projection operations over caller-selected Android declarations —
project_android_jni_namesandproject_android_attack_surface— plus a scoped packed/split APK playbook (static pack detection and split acquisition only), so an agent gets expected JNI/JNA symbol names and a ranked exposure view of manifest components in one call each instead of re-deriving them from raw manifest/DEX text every session.Problem and expected behavior
For a selected class/method, no REA operation returns the symbol names native code would resolve (
Java_pkg_Class_method, wide/short overloads, DEX shorty), so agents either re-derive the strings per call or discover mismatches only at symbol-resolution time. Likewise, the manifest component inventory comes back as declarations with nothing ranking which exported components are reachable without a permission guard, nor an intent-action index / foreground-service-type / provider-authority summary for triage.Expected behavior: two MCP/CLI operations over caller-selected facts (no APK re-read) that return deterministic, Evidence-retained projections with explicit limitations — "string projection, not a runtime check" and "static declarations, not exploitability" — and that propagate component coverage (
complete/partial/unknown) instead of claiming absence.Change and scope
src/domain/android/androidJniNames.ts(JNI/JNA name projection over UTF-16 code units, the JNA default-mapping name, overload groups from distinct selected descriptors, the canonicaldexDescriptorSchema, an omitted descriptor normalized once tonull, per-field limits and a projected-symbol budget that also counts each retained descriptor) andsrc/domain/android/androidAttackSurface.ts(unguarded/guarded/guard-unknown/export-unknown findings that each carrypermission_source,permission_overridesandpath_permissions, intent-action index, coverage propagation, component/action/aggregate-input/projected-output budgets, and a refusal of permission values without their established source).src/domain/android/androidAnalysis.tsexports the sharedandroidManifestComponentSchemaso both projections and the landed component-inventory contract consume one schema.bridge/android/ReaJadxBridge.javaemits each method's frozen raw name asdex_name;src/android/JadxProtocol.ts,src/android/JadxAnalysis.tsandandroidResultSchemas.inspect_android_classexpose it asdex_method_nametogether withdex_class_name(the raw binary class name), so callers can feed real DEX identities instead of decompiler aliases.src/android/AndroidManifestComponents.tsprojectspermission_overrides(none/read/write/read-write) andpath_permissions(none/present) per component, defaulted tounknownwhen re-parsing older Evidence, and records a limitation when either is present.AndroidJniNamesServiceandAndroidAttackSurfaceServicecreate Evidence (derivedconfidence,analyst-inferenceauthority, explicit limitations). Both accept an optionalsource_evidence— theinspect_android_packageorinspect_android_classresult the facts came from — authenticated byAndroidProjectionSourcebefore projection: the record's own identity is re-derived withsafeParseEvidence, every selected component, class and method must appear in it,component_coverage: "complete"requires that inventory to report complete coverage and to be passed in full,package_namemust match, and the JNIclass_namemust be the rawdex_class_name. The result copies its artifact subject, links itsevidence_idand recordssource_evidence_id.applicationToolContracts,toolEffects,toolFamilies,toolOutputSchemaGroups,cliCommandNames,applicationCommands, andserver/registerApplicationTools/*.docs/android-analysis.mdand the source agent skill (.agents/skills/reverse-engineer-anything/references/android-applications.md, from whichskills/is generated) teach both projections and theirsource_evidencehandoffs;docs/android-packed-analysis.mdstays within static pack detection, split acquisition and the out-of-scope boundary (CONTRIBUTING.mdexcludes packing-defeat recovery, documentation included), linking the general Frida guide instead of a dump recipe.upstream/mainmerges in favor of the landed inventory parser;src/contracts/toolFamilies.tsdrops a dead re-export flagged by knip; astyle:commit restores upstream import layout in 26 unrelated files that merge-time lint-staged had reformatted, so this diff stays scoped.inspect_android_package's summary view.Follow the contribution scope.
Contract and boundary impact
src/domain/androidowns the projection semantics; earliest changed stage is validated caller-selected declarations (strict zod schemas) in the application services. Superseded path removed: the branch-local duplicate manifest parser, replaced by the landed inventory parser behind the shared exported schema.project_android_jni_names,project_android_attack_surface) registered in the tool catalog;metadata:checkgreen. Each input schema carries only the facts its projection consumes plus the optionalsource_evidencelink:project_android_attack_surfacetakespackage_name,components,component_coverageandsource_evidence, with no unusedtarget_sdk/permissions, and it is bounded to 1000 components, 128 actions or categories per component, about 1 MiB of selected text and about 4 MiB of projected findings. Additive fields on the landed Android result contract:inspect_android_classcarriesdex_class_nameand per-methoddex_method_name, and every projected manifest component carriespermission_overridesandpath_permissions.derivedconfidence,analyst-inferenceauthority,rawResult: null, limitations stating the results do not read an APK or establish exploitability; component coverage preserved ascomplete/partial/unknown; the attack-surfaceparametersretain the selectedcomponentsso fields and components the result omits stay readable, and unresolved guard facts stay unknown rather than absent, including guard presence that predates the projection, which is reported as unknown rather than as a declared guard. Withsource_evidence, the record's own identity is re-derived before any fact is read from it, every selected component, class and method is authenticated against it, and the new Evidence copies its subject (path, SHA-256, format) and links its id, so identical declarations from different APKs stay distinguishable; without it the Evidence states that no source was linked and keepsevidence_linksempty. A selection may be narrowed from the source, never extended, and a linkedcompleteclaim requires the source inventory to be complete and to be passed in full.docs/public/product-catalog.json), package, or installation impact: catalog is CI-generated and validated;metadata:checkpasses locally; no package/dependency changes in this diff.Expected effects (check known effects; use documentation-only on its own).
Evidence and regression coverage
androidJniNames.test.ts(short/long/JNA names, distinct-descriptor overload groups, UTF-16 supplementary characters, omitted versusnulldescriptor, method and byte budgets),androidAttackSurface.test.ts(unguarded/guarded/guard-unknown/export-unknown split, provider overrides including a provider with a base permission and an override, path-protected providers, contradictory permission provenance, action index, coverage propagation, owned note constants, and the component/text and projected-output budget rejections),AndroidJniNamesService.test.tsandAndroidAttackSurfaceService.test.ts(Evidence shape, retained selection, the source-Evidence subject and link, and refusals of facts the linked record does not report),tests/boundary/android/JadxAnalysis.test.ts(rawdex_class_name/dex_method_namebeside aliases),tests/boundary/android/androidManifestComponents.test.ts(per-provider override and path-permission projection), and the real-bridge conformance regression assertsdex_name. New public coverage:tests/boundary/mcp/androidStructuralProjectionsMcp.test.ts(advertised tools, both successes, rejected input,get_evidence_bundlereadback) andtests/boundary/cli/androidStructuralProjectionsCli.test.ts(compiled-CLI successes and rejection).check:pr) and a real JADX/JDK end-to-end run were not executed locally; representative tool output is not attached.For evidence-bearing changes:
Representative output, compiled CLI (abridged to
normalized_result):Validation performed
npm run typecheck— green on the final tree, before and after each commit.npx vitest run src/domain/android src/application/android tests/boundary/android— 10 files, 230 tests passed (4 files skipped on this host), including the raw-identity, override, path-guard, provenance-link, source-identity and budget regressions.npm run test:focused -- tests/boundary/mcp/androidStructuralProjectionsMcp.test.ts tests/boundary/cli/androidStructuralProjectionsCli.test.ts— 4 passed against freshly rebuilt artifacts, so both operations are exercised through the public MCP and compiled-CLI boundaries.npx vitest run tests/boundary/mcp/compactInputSchemaMcp.test.ts— 14 tests passed, so the two input schemas (including the optionalsource_evidence) still fit the advertised compact profile and its per-tool budget.npx vitest run src/contracts/toolEffects.test.ts tests/conformance/contracts/mcpToolFamilies.test.ts tests/acceptance/tools/mobileGraphExamples.test.ts tests/conformance/readmeConsistency.test.ts— 34 tests passed.compile,artifacts:skills) before executing, andnpm run docs:checkis green.npx vitest run src/domain/analysisView— 53 files, 1229 tests passed after the component and class result schemas gained fields.node scripts/ci/static-check-report.mjs lint— exit 0 (warnings only), run with--ignore-pattern ".worktrees/**";npm run verify:module-boundaries(3144 files),npm run knip,npm run verify:architecture-guardsandnpm run docs:checkall green, andoxfmt --checkis clean on the changed files.npm run check:fastcannot run in this checkout because a stale scratch worktree (.worktrees/pr-3026-merge, left from a closed PR) carries a.oxlintrc.jsonthat repo-wide oxlint rejects (reportUnusedDisableDirectivesoutside the root config). The equivalent checks were run manually as listed above; the push usedHUSKY=0for that environmental reason only.tests/boundary/cli/jsonInputStatus.test.tsfails three format variants because the asserted temp path is JSON-escaped in stdout (the two rows added for these commands pass);tests/boundary/mcp/androidLateCompletionMcp.test.tsand threetests/boundary/process/androidAnalysisMcp.test.tsrows fail because the JADX provider fixture is unavailable on this host. The late-completion failure reproduces atef948eed6without the raw-identity changes, so it is environmental, not a regression.real-android-metadataconformance regression (real JADX + APK), which cannot run in this environment; no real-provider run was performed here.npm cifor the zod upgrade,npm run check, focused batches) are unchanged and still green on this tree.Compatibility, safety, and release
feat(android)!contract change was absorbed into the landed component-inventory contract during reconciliation;inspect_android_packageoutput matches main, and the two new operations are additive.Author readiness
Human owner: @0xLLVEL
Before merge
type(scope): outcome.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.