rea-agents 5.0.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +32 -16
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { posix } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import * as t from "@babel/types";
|
|
5
|
-
import { semanticStaticPropertyName } from "./javascriptAstValues.js";
|
|
5
|
+
import { readExactJavaScriptLiteral, semanticStaticPropertyName, } from "./javascriptAstValues.js";
|
|
6
6
|
import { compareCodePoints } from "../canonicalOrdering.js";
|
|
7
7
|
export { propertyName, semanticStaticPropertyName, } from "./javascriptAstValues.js";
|
|
8
8
|
/** Explicit result for source text that Babel cannot parse. */
|
|
@@ -118,10 +118,8 @@ export const staticPathResolutionContext = (node) => isFilesystemPathExpression(
|
|
|
118
118
|
const staticPathAt = (node) => {
|
|
119
119
|
if (t.isStringLiteral(node))
|
|
120
120
|
return node.value;
|
|
121
|
-
if (t.isTemplateLiteral(node) && node.expressions.length === 0)
|
|
122
|
-
|
|
123
|
-
return value;
|
|
124
|
-
}
|
|
121
|
+
if (t.isTemplateLiteral(node) && node.expressions.length === 0)
|
|
122
|
+
return stringValue(node);
|
|
125
123
|
if (t.isBinaryExpression(node, { operator: "+" })) {
|
|
126
124
|
const left = staticPathAt(node.left);
|
|
127
125
|
const right = staticPathAt(node.right);
|
|
@@ -347,23 +345,34 @@ const BROWSING_CONTEXT_KEYWORDS = new Set([
|
|
|
347
345
|
* methods' case; extension methods such as WebDAV `PROPFIND` are
|
|
348
346
|
* conventionally uppercase tokens.
|
|
349
347
|
*/
|
|
350
|
-
const xhrOpenUrl = (name, methodNode, urlNode) => {
|
|
348
|
+
const xhrOpenUrl = (name, methodNode, urlNode, receiverFact) => {
|
|
351
349
|
const url = stringValue(urlNode);
|
|
352
350
|
if (url === undefined)
|
|
353
351
|
return undefined;
|
|
352
|
+
// A lexical fact is stronger than the receiver's spelling. In particular,
|
|
353
|
+
// browser Window and Document globals overload `open` with URL/content APIs.
|
|
354
|
+
if (receiverFact === "window")
|
|
355
|
+
return undefined;
|
|
354
356
|
const method = stringValue(methodNode);
|
|
355
357
|
// IndexedDB and Cache Storage `open` take a name and a version, so a
|
|
356
358
|
// receiver spelled as storage needs a standard HTTP method literal.
|
|
357
|
-
const storage =
|
|
359
|
+
const storage = receiverFact === "local-indexed-db" ||
|
|
360
|
+
receiverFact === "local-cache-storage" ||
|
|
361
|
+
receiverFact === "indexed-db" ||
|
|
362
|
+
receiverFact === "cache-storage" ||
|
|
363
|
+
storageKind(name) !== undefined;
|
|
358
364
|
if (method === undefined)
|
|
359
365
|
return storage ||
|
|
360
|
-
WINDOW_OPEN_CALL.test(name) ||
|
|
366
|
+
(receiverFact === undefined && WINDOW_OPEN_CALL.test(name)) ||
|
|
361
367
|
FS_OPEN_FLAGS.has(url) ||
|
|
362
368
|
BROWSING_CONTEXT_KEYWORDS.has(url.toLowerCase())
|
|
363
369
|
? undefined
|
|
364
370
|
: url;
|
|
365
371
|
return XHR_METHODS.has(method.toUpperCase()) ||
|
|
366
|
-
(!storage
|
|
372
|
+
((!storage ||
|
|
373
|
+
receiverFact === "local-indexed-db" ||
|
|
374
|
+
receiverFact === "local-cache-storage") &&
|
|
375
|
+
/^[A-Z][A-Z-]*$/u.test(method))
|
|
367
376
|
? url
|
|
368
377
|
: undefined;
|
|
369
378
|
};
|
|
@@ -396,11 +405,13 @@ const isKeyedCollectionReceiver = (callee) => {
|
|
|
396
405
|
return property === "headers" || property === "searchParams";
|
|
397
406
|
};
|
|
398
407
|
/** Select the literal URL argument for recognized network callees. */
|
|
399
|
-
export const endpointArgument = (name, args, callee) => {
|
|
408
|
+
export const endpointArgument = (name, args, callee, receiverFact) => {
|
|
409
|
+
if (receiverFact === "window")
|
|
410
|
+
return undefined;
|
|
400
411
|
if (name === "fetch" || name.endsWith(".fetch") || name === "WebSocket")
|
|
401
412
|
return stringValue(args[0]);
|
|
402
413
|
if (name.endsWith(".open"))
|
|
403
|
-
return xhrOpenUrl(name, args[0], args[1]);
|
|
414
|
+
return xhrOpenUrl(name, args[0], args[1], receiverFact);
|
|
404
415
|
const method = ["get", "post", "put", "patch", "delete", "request"].find((candidate) => name === candidate || name.endsWith(`.${candidate}`));
|
|
405
416
|
if (method !== undefined) {
|
|
406
417
|
const value = stringValue(args[0]);
|
|
@@ -462,11 +473,12 @@ const memberPropertyName = (node) => node.computed &&
|
|
|
462
473
|
* literal without substitutions denotes the same exact string.
|
|
463
474
|
*/
|
|
464
475
|
export const stringValue = (node) => {
|
|
465
|
-
if (
|
|
466
|
-
return
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
476
|
+
if (node === null || node === undefined)
|
|
477
|
+
return undefined;
|
|
478
|
+
const literal = readExactJavaScriptLiteral(node);
|
|
479
|
+
return literal.found && typeof literal.value === "string"
|
|
480
|
+
? literal.value
|
|
481
|
+
: undefined;
|
|
470
482
|
};
|
|
471
483
|
/** Return a string or numeric argument literal. */
|
|
472
484
|
export const argumentValue = (node) => t.isNumericLiteral(node) ? String(node.value) : stringValue(node);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { JavaScriptModuleRangeIndex } from "./javascriptStaticAnalysisFindings.js";
|
|
1
2
|
/** Create isolated mutable state for one source analysis. */
|
|
2
|
-
export const createJavaScriptAnalysisAccumulator = () => ({
|
|
3
|
+
export const createJavaScriptAnalysisAccumulator = (sourceLength) => ({
|
|
3
4
|
references: [],
|
|
4
5
|
endpoints: [],
|
|
5
6
|
storage: [],
|
|
@@ -12,7 +13,7 @@ export const createJavaScriptAnalysisAccumulator = () => ({
|
|
|
12
13
|
senderValidations: [],
|
|
13
14
|
utilityProcesses: [],
|
|
14
15
|
nativeAddonBindings: [],
|
|
15
|
-
|
|
16
|
+
moduleRangeIndex: new JavaScriptModuleRangeIndex(sourceLength),
|
|
16
17
|
seen: new Set(),
|
|
17
18
|
visitedNodes: 0,
|
|
18
19
|
unknownFindings: 0,
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** Encode ordinary JSON as bounded string parts without a document-sized allocation. */
|
|
2
|
+
export function* jsonParts(value, pretty = false) {
|
|
3
|
+
yield* encodeValue(value, pretty, 0, new Set(), false);
|
|
4
|
+
}
|
|
5
|
+
/** Encode validated JSON with canonical key ordering without allocating the whole document. */
|
|
6
|
+
export function* canonicalJsonParts(value) {
|
|
7
|
+
yield* encodeValue(value, false, 0, new Set(), true);
|
|
8
|
+
}
|
|
9
|
+
/** Buffer JSON parts while preserving complete UTF-16 surrogate pairs. */
|
|
10
|
+
export function* bufferedJsonParts(parts) {
|
|
11
|
+
let buffer = "";
|
|
12
|
+
for (const part of parts) {
|
|
13
|
+
if (buffer.length + part.length > 64 * 1024 && buffer !== "") {
|
|
14
|
+
yield buffer;
|
|
15
|
+
buffer = "";
|
|
16
|
+
}
|
|
17
|
+
buffer += part;
|
|
18
|
+
}
|
|
19
|
+
if (buffer !== "")
|
|
20
|
+
yield buffer;
|
|
21
|
+
}
|
|
22
|
+
function* encodeString(value) {
|
|
23
|
+
if (value.length <= 8192) {
|
|
24
|
+
yield JSON.stringify(value);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
yield '"';
|
|
28
|
+
for (let start = 0; start < value.length;) {
|
|
29
|
+
let end = Math.min(start + 8192, value.length);
|
|
30
|
+
const last = value.charCodeAt(end - 1);
|
|
31
|
+
const next = value.charCodeAt(end);
|
|
32
|
+
// Keep a surrogate pair in the same JSON.stringify and UTF-8 write.
|
|
33
|
+
if (end < value.length &&
|
|
34
|
+
last >= 0xd800 &&
|
|
35
|
+
last <= 0xdbff &&
|
|
36
|
+
next >= 0xdc00 &&
|
|
37
|
+
next <= 0xdfff)
|
|
38
|
+
end -= 1;
|
|
39
|
+
yield JSON.stringify(value.slice(start, end)).slice(1, -1);
|
|
40
|
+
start = end;
|
|
41
|
+
}
|
|
42
|
+
yield '"';
|
|
43
|
+
}
|
|
44
|
+
function* encodeValue(value, pretty, depth, ancestors, canonical) {
|
|
45
|
+
if (typeof value === "string") {
|
|
46
|
+
yield* encodeString(value);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (value === null || typeof value === "boolean") {
|
|
50
|
+
yield value === null ? "null" : String(value);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
54
|
+
yield String(value);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (typeof value !== "object" || value === null)
|
|
58
|
+
throw new TypeError("JSON output requires ordinary JSON values");
|
|
59
|
+
if (ancestors.has(value))
|
|
60
|
+
throw new TypeError("JSON output contains a circular reference");
|
|
61
|
+
if (!Array.isArray(value) &&
|
|
62
|
+
Object.prototype.toString.call(value) !== "[object Object]")
|
|
63
|
+
throw new TypeError("JSON output requires ordinary JSON objects");
|
|
64
|
+
ancestors.add(value);
|
|
65
|
+
try {
|
|
66
|
+
const array = Array.isArray(value);
|
|
67
|
+
const keys = array ? undefined : Object.keys(value);
|
|
68
|
+
if (canonical)
|
|
69
|
+
keys?.sort();
|
|
70
|
+
const count = array ? value.length : (keys?.length ?? 0);
|
|
71
|
+
let written = 0;
|
|
72
|
+
yield array ? "[" : "{";
|
|
73
|
+
for (let index = 0; index < count; index += 1) {
|
|
74
|
+
let item;
|
|
75
|
+
let key;
|
|
76
|
+
if (array) {
|
|
77
|
+
item = value[index];
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
key = keys?.[index];
|
|
81
|
+
if (key === undefined)
|
|
82
|
+
throw new TypeError("JSON object changed during serialization");
|
|
83
|
+
item = Reflect.get(value, key);
|
|
84
|
+
// Incur's filter can select inherited methods. Match native JSON's
|
|
85
|
+
// omission without eagerly reading the rest of a bounded result.
|
|
86
|
+
if (item === undefined ||
|
|
87
|
+
typeof item === "function" ||
|
|
88
|
+
typeof item === "symbol")
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (written > 0)
|
|
92
|
+
yield ",";
|
|
93
|
+
if (pretty)
|
|
94
|
+
yield `\n${" ".repeat(depth + 1)}`;
|
|
95
|
+
if (key !== undefined) {
|
|
96
|
+
yield* encodeString(key);
|
|
97
|
+
yield pretty ? ": " : ":";
|
|
98
|
+
}
|
|
99
|
+
yield* encodeValue(item, pretty, depth + 1, ancestors, canonical);
|
|
100
|
+
written += 1;
|
|
101
|
+
}
|
|
102
|
+
if (pretty && written > 0)
|
|
103
|
+
yield `\n${" ".repeat(depth)}`;
|
|
104
|
+
yield array ? "]" : "}";
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
ancestors.delete(value);
|
|
108
|
+
}
|
|
109
|
+
}
|
package/dist/domain/jsonValue.js
CHANGED
|
@@ -1,5 +1,93 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { isImmutableJsonSnapshot } from "./immutableJson.js";
|
|
3
|
+
/** Maximum JSON nesting accepted before recursive result cloning. */
|
|
4
|
+
export const MAX_JSON_DEPTH = 1000;
|
|
5
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
const recordShape = z.record(z.string(), z.unknown());
|
|
7
|
+
const immutableValidation = new WeakMap();
|
|
8
|
+
/** Validate JSON meaning and nesting without cloning a trusted immutable value. */
|
|
9
|
+
export const jsonValueValidationIssue = (root) => {
|
|
10
|
+
const steps = jsonValueValidationSteps(root);
|
|
11
|
+
for (;;) {
|
|
12
|
+
const step = steps.next();
|
|
13
|
+
if (step.done)
|
|
14
|
+
return step.value;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
/** Validate JSON in bounded steps; cache only authenticated immutable roots. */
|
|
18
|
+
export function* jsonValueValidationSteps(root) {
|
|
19
|
+
const immutable = typeof root === "object" && root !== null && isImmutableJsonSnapshot(root)
|
|
20
|
+
? root
|
|
21
|
+
: undefined;
|
|
22
|
+
if (immutable !== undefined && immutableValidation.has(immutable))
|
|
23
|
+
return immutableValidation.get(immutable);
|
|
24
|
+
const finish = (issue) => {
|
|
25
|
+
if (immutable !== undefined)
|
|
26
|
+
immutableValidation.set(immutable, issue);
|
|
27
|
+
return issue;
|
|
28
|
+
};
|
|
29
|
+
const pending = [
|
|
30
|
+
{ value: root, depth: 0 },
|
|
31
|
+
];
|
|
32
|
+
let examined = 0;
|
|
33
|
+
while (pending.length > 0) {
|
|
34
|
+
if (examined++ === 4096) {
|
|
35
|
+
examined = 0;
|
|
36
|
+
yield;
|
|
37
|
+
}
|
|
38
|
+
const item = pending.pop();
|
|
39
|
+
if (item === undefined)
|
|
40
|
+
break;
|
|
41
|
+
if (item.depth > MAX_JSON_DEPTH)
|
|
42
|
+
return finish(`JSON value exceeds maximum nesting depth of ${MAX_JSON_DEPTH}`);
|
|
43
|
+
const value = item.value;
|
|
44
|
+
if (value === null ||
|
|
45
|
+
typeof value === "string" ||
|
|
46
|
+
typeof value === "boolean")
|
|
47
|
+
continue;
|
|
48
|
+
if (typeof value === "number") {
|
|
49
|
+
if (!Number.isFinite(value))
|
|
50
|
+
return finish("JSON numbers must be finite");
|
|
51
|
+
}
|
|
52
|
+
else if (Array.isArray(value)) {
|
|
53
|
+
for (const child of value)
|
|
54
|
+
pending.push({ value: child, depth: item.depth + 1 });
|
|
55
|
+
}
|
|
56
|
+
else if (isRecord(value) && recordShape.safeParse(value).success) {
|
|
57
|
+
// Inspect every own member, including keys Zod's record parser skips.
|
|
58
|
+
for (const child of Object.values(value))
|
|
59
|
+
pending.push({ value: child, depth: item.depth + 1 });
|
|
60
|
+
}
|
|
61
|
+
else
|
|
62
|
+
return finish("Invalid JSON value");
|
|
63
|
+
}
|
|
64
|
+
return finish(undefined);
|
|
65
|
+
}
|
|
66
|
+
const preserveJsonValue = (value) => {
|
|
67
|
+
if (Array.isArray(value))
|
|
68
|
+
return value.map(preserveJsonValue);
|
|
69
|
+
if (value !== null && typeof value === "object")
|
|
70
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [
|
|
71
|
+
key,
|
|
72
|
+
preserveJsonValue(child),
|
|
73
|
+
]));
|
|
74
|
+
return value;
|
|
75
|
+
};
|
|
76
|
+
const validatedJsonValue = z.custom((value) => jsonValueValidationIssue(value) === undefined, {
|
|
77
|
+
error: (issue) => jsonValueValidationIssue(issue.input) ?? "Invalid JSON value",
|
|
78
|
+
});
|
|
79
|
+
// Keep both stages nonrecursive in public and Standard Schema projections.
|
|
80
|
+
validatedJsonValue._zod.toJSONSchema = () => ({});
|
|
81
|
+
/** Parse bounded JSON and retain all own data members without prototype setters. */
|
|
82
|
+
export const jsonValueSchema = z
|
|
83
|
+
.unknown()
|
|
84
|
+
.nonoptional()
|
|
85
|
+
.pipe(validatedJsonValue)
|
|
86
|
+
.transform(preserveJsonValue);
|
|
87
|
+
jsonValueSchema._zod.toJSONSchema = () => ({});
|
|
88
|
+
const objectValidation = z.custom(isRecord, "Expected JSON object");
|
|
89
|
+
const objectProjection = () => ({ type: "object", additionalProperties: {} });
|
|
90
|
+
objectValidation._zod.toJSONSchema = objectProjection;
|
|
4
91
|
/** JSON object boundary for caller-visible parameter maps. */
|
|
5
|
-
export const jsonObjectSchema =
|
|
92
|
+
export const jsonObjectSchema = jsonValueSchema.pipe(objectValidation);
|
|
93
|
+
jsonObjectSchema._zod.toJSONSchema = objectProjection;
|
package/dist/domain/localPath.js
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { isAbsolute, relative, sep } from "node:path";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/** Preserve selected filesystem names while rejecting OS-invalid NUL bytes. */
|
|
4
|
+
export const localPathStringSchema = z
|
|
5
|
+
.string()
|
|
6
|
+
.min(1)
|
|
7
|
+
.regex(/^[^\0]*$/u, "Local filesystem paths cannot contain NUL");
|
|
8
|
+
/** True when the value is an absolute filesystem path on the host platform. */
|
|
9
|
+
export const isAbsoluteLocalPath = (value) => isAbsolute(value);
|
|
2
10
|
/** Test lexical containment on the host platform; callers must resolve symlinks first. */
|
|
3
11
|
export const isPathWithinRoot = (root, path) => {
|
|
4
12
|
const value = relative(root, path);
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { evidenceSchema
|
|
4
|
+
import { evidenceSchema } from "../evidence.js";
|
|
5
5
|
import { createJavaScriptApplicationGraph, javascriptApplicationGraphSchema, } from "../javascript/javascriptApplicationGraph.js";
|
|
6
6
|
import { managedArtifactInspectionSchema, managedMemberInspectionSchema, managedNativeBoundaryInspectionSchema, } from "./managedArtifact.js";
|
|
7
7
|
import { assessManagedGraphOmissions, managedGraphEvidenceCoverage, managedGraphResultCoverage, } from "./managedApplicationGraphCoverage.js";
|
|
8
8
|
import { addArtifactNode, addArtifactIdentityNodes, addBoundaryNodes, addMemberNodes, } from "./managedApplicationGraphNodes.js";
|
|
9
9
|
import { digestSchema } from "../digests.js";
|
|
10
10
|
import { prefixedDigestSchema } from "../digests.js";
|
|
11
|
+
import { parseManagedInspectionEvidence } from "./managedInspectionEvidence.js";
|
|
11
12
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
12
13
|
const textSchema = z.string().min(1);
|
|
13
14
|
/** Authenticated managed Evidence records projected into the application graph. */
|
|
@@ -121,20 +122,14 @@ export const projectManagedApplicationGraph = (input) => {
|
|
|
121
122
|
const parseManagedInputs = (input) => ({
|
|
122
123
|
artifact: input.managed_artifact === undefined
|
|
123
124
|
? null
|
|
124
|
-
:
|
|
125
|
+
: parseManagedInspectionEvidence(input.managed_artifact, "inspect_managed_artifact", managedArtifactInspectionSchema),
|
|
125
126
|
members: input.managed_members === undefined
|
|
126
127
|
? null
|
|
127
|
-
:
|
|
128
|
+
: parseManagedInspectionEvidence(input.managed_members, "inspect_managed_members", managedMemberInspectionSchema),
|
|
128
129
|
boundaries: input.managed_native_boundaries === undefined
|
|
129
130
|
? null
|
|
130
|
-
:
|
|
131
|
+
: parseManagedInspectionEvidence(input.managed_native_boundaries, "inspect_managed_native_boundaries", managedNativeBoundaryInspectionSchema),
|
|
131
132
|
});
|
|
132
|
-
const parseManagedEvidence = (rawEvidence, operation, schema) => {
|
|
133
|
-
const evidence = parseEvidence(rawEvidence);
|
|
134
|
-
if (evidence.operation !== operation)
|
|
135
|
-
throw new TypeError(`Evidence operation is not ${operation}`);
|
|
136
|
-
return { evidence, result: schema.parse(evidence.normalized_result) };
|
|
137
|
-
};
|
|
138
133
|
const chooseArtifact = (parsed) => {
|
|
139
134
|
const result = parsed.artifact?.result ??
|
|
140
135
|
parsed.members?.result ??
|
|
@@ -164,6 +159,11 @@ const projectionLimitations = (parsed, omissions) => [
|
|
|
164
159
|
"Managed member Evidence was not supplied; type, method, and field nodes are absent.",
|
|
165
160
|
]
|
|
166
161
|
: []),
|
|
162
|
+
...(parsed.artifact === null
|
|
163
|
+
? [
|
|
164
|
+
"Managed artifact Evidence was not supplied; assembly identity observations are absent.",
|
|
165
|
+
]
|
|
166
|
+
: []),
|
|
167
167
|
...(parsed.boundaries === null
|
|
168
168
|
? [
|
|
169
169
|
"Managed native-boundary Evidence was not supplied; P/Invoke and native-implementation nodes are absent.",
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { parseEvidence } from "../evidence.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse managed inspection Evidence and bind its artifact to any available subject.
|
|
4
|
+
* A null subject remains valid and means there is no digest to cross-check.
|
|
5
|
+
*/
|
|
6
|
+
export const parseManagedInspectionEvidence = (rawEvidence, operation, schema) => {
|
|
7
|
+
const evidence = parseEvidence(rawEvidence);
|
|
8
|
+
if (evidence.operation !== operation)
|
|
9
|
+
throw new TypeError(`Evidence operation is not ${operation}`);
|
|
10
|
+
const result = schema.parse(evidence.normalized_result);
|
|
11
|
+
const artifactSha256 = result.artifact.sha256;
|
|
12
|
+
const subjectSha256 = evidence.subject?.digest.sha256;
|
|
13
|
+
if (subjectSha256 !== undefined && artifactSha256 !== subjectSha256)
|
|
14
|
+
throw new TypeError(`Managed Evidence ${operation} (${evidence.evidence_id}) subject SHA-256 ${subjectSha256} does not match normalized artifact SHA-256 ${artifactSha256}`);
|
|
15
|
+
return { evidence, result };
|
|
16
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import { parseEvidence } from "../evidence.js";
|
|
4
3
|
import { managedMemberInspectionSchema, } from "./managedArtifact.js";
|
|
4
|
+
import { parseManagedInspectionEvidence } from "./managedInspectionEvidence.js";
|
|
5
5
|
export const sha256 = (value) => {
|
|
6
6
|
const serialized = canonicalize(value);
|
|
7
7
|
if (serialized === undefined)
|
|
@@ -10,9 +10,7 @@ export const sha256 = (value) => {
|
|
|
10
10
|
};
|
|
11
11
|
const keyMethod = (item) => ({
|
|
12
12
|
item,
|
|
13
|
-
exactKey: item.
|
|
14
|
-
item.body.status === "present" &&
|
|
15
|
-
item.body.normalized_il_sha256 !== null
|
|
13
|
+
exactKey: item.body.status === "present" && item.body.normalized_il_sha256 !== null
|
|
16
14
|
? stableKey([
|
|
17
15
|
"method-exact",
|
|
18
16
|
item.signature.raw_sha256,
|
|
@@ -173,11 +171,9 @@ export const keyMembers = (left, right) => ({
|
|
|
173
171
|
fieldMatches: matchFields(left.result.fields.map(keyField), right.result.fields.map(keyField)),
|
|
174
172
|
});
|
|
175
173
|
export const parseManagedMemberEvidence = (evidence) => {
|
|
176
|
-
const parsed =
|
|
177
|
-
if (parsed.operation !== "inspect_managed_members")
|
|
178
|
-
throw new TypeError("Evidence operation is not inspect_managed_members");
|
|
174
|
+
const parsed = parseManagedInspectionEvidence(evidence, "inspect_managed_members", managedMemberInspectionSchema);
|
|
179
175
|
return {
|
|
180
|
-
evidenceId: parsed.evidence_id,
|
|
181
|
-
result:
|
|
176
|
+
evidenceId: parsed.evidence.evidence_id,
|
|
177
|
+
result: parsed.result,
|
|
182
178
|
};
|
|
183
179
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import { parseEvidence } from "../evidence.js";
|
|
4
3
|
import { managedNativeBoundaryInspectionSchema, } from "./managedArtifact.js";
|
|
4
|
+
import { parseManagedInspectionEvidence } from "./managedInspectionEvidence.js";
|
|
5
5
|
import { managedNativeVerificationResultSchema, } from "./managedNativeVerificationSchemas.js";
|
|
6
6
|
import { buildVerificationResult, collectNativeSymbols, verifyPinvoke, } from "./managedNativeVerificationMatch.js";
|
|
7
7
|
export { managedNativeVerificationInputSchema, } from "./managedNativeVerificationSchemas.js";
|
|
@@ -12,16 +12,10 @@ const sha256 = (value) => {
|
|
|
12
12
|
throw new TypeError("Managed/native verification canonicalization failed");
|
|
13
13
|
return createHash("sha256").update(serialized).digest("hex");
|
|
14
14
|
};
|
|
15
|
-
const
|
|
16
|
-
const managedEvidence = parseEvidence(input.managed_boundaries);
|
|
17
|
-
if (managedEvidence.operation !== "inspect_managed_native_boundaries")
|
|
18
|
-
throw new TypeError("Evidence operation is not inspect_managed_native_boundaries");
|
|
19
|
-
return managedNativeBoundaryInspectionSchema.parse(managedEvidence.normalized_result);
|
|
20
|
-
};
|
|
15
|
+
const parseManagedBoundary = (input) => parseManagedInspectionEvidence(input.managed_boundaries, "inspect_managed_native_boundaries", managedNativeBoundaryInspectionSchema);
|
|
21
16
|
/** Verify managed P/Invoke declarations against authenticated native Evidence. */
|
|
22
17
|
export const verifyManagedNativeBoundaries = (input) => {
|
|
23
|
-
const managed =
|
|
24
|
-
const managedEvidence = parseEvidence(input.managed_boundaries);
|
|
18
|
+
const { evidence: managedEvidence, result: managed } = parseManagedBoundary(input);
|
|
25
19
|
const native = collectNativeSymbols(input.native_observations);
|
|
26
20
|
const verifiedPinvokes = managed.pinvoke_imports.map((item) => verifyPinvoke({
|
|
27
21
|
item,
|