Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Findings Ledger CI / build-test (push) Has been cancelled
Findings Ledger CI / migration-validation (push) Has been cancelled
Findings Ledger CI / generate-manifest (push) Has been cancelled
mock-dev-release / package-mock-release (push) Has been cancelled
- Added ConsoleExportClient for managing export requests and responses. - Introduced ConsoleExportRequest and ConsoleExportResponse models. - Implemented methods for creating and retrieving exports with appropriate headers. feat(crypto): Add Software SM2/SM3 Cryptography Provider - Implemented SmSoftCryptoProvider for software-only SM2/SM3 cryptography. - Added support for signing and verification using SM2 algorithm. - Included hashing functionality with SM3 algorithm. - Configured options for loading keys from files and environment gate checks. test(crypto): Add unit tests for SmSoftCryptoProvider - Created comprehensive tests for signing, verifying, and hashing functionalities. - Ensured correct behavior for key management and error handling. feat(api): Enhance Console Export Models - Expanded ConsoleExport models to include detailed status and event types. - Added support for various export formats and notification options. test(time): Implement TimeAnchorPolicyService tests - Developed tests for TimeAnchorPolicyService to validate time anchors. - Covered scenarios for anchor validation, drift calculation, and policy enforcement.
1274 lines
34 KiB
JSON
1274 lines
34 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://stella-ops.org/schemas/java-entrypoint-resolver.schema.json",
|
|
"title": "StellaOps Java Entrypoint Resolver Schema",
|
|
"description": "Schema for Java-specific entrypoint resolution, bytecode analysis, reflection handling, and framework patterns. Unblocks Java Analyzer tasks 21-005 through 21-011 (7 tasks).",
|
|
"type": "object",
|
|
"definitions": {
|
|
"JavaEntrypointConfig": {
|
|
"type": "object",
|
|
"description": "Java-specific entrypoint resolution configuration",
|
|
"required": ["config_id", "java_version_range"],
|
|
"properties": {
|
|
"config_id": {
|
|
"type": "string"
|
|
},
|
|
"java_version_range": {
|
|
"type": "string",
|
|
"description": "Supported Java version range (e.g., >=8, 11-17, 21+)"
|
|
},
|
|
"version": {
|
|
"type": "string"
|
|
},
|
|
"bytecode_analysis": {
|
|
"$ref": "#/definitions/BytecodeAnalysisConfig"
|
|
},
|
|
"reflection_handling": {
|
|
"$ref": "#/definitions/ReflectionHandlingConfig"
|
|
},
|
|
"framework_resolvers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/FrameworkResolver"
|
|
}
|
|
},
|
|
"annotation_processors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/AnnotationProcessor"
|
|
}
|
|
},
|
|
"class_hierarchy_rules": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/ClassHierarchyRule"
|
|
}
|
|
},
|
|
"interface_implementation_rules": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/InterfaceImplementationRule"
|
|
}
|
|
},
|
|
"lambda_resolution": {
|
|
"$ref": "#/definitions/LambdaResolutionConfig"
|
|
},
|
|
"method_reference_resolution": {
|
|
"$ref": "#/definitions/MethodReferenceConfig"
|
|
},
|
|
"build_tool_integration": {
|
|
"$ref": "#/definitions/BuildToolIntegration"
|
|
}
|
|
}
|
|
},
|
|
"BytecodeAnalysisConfig": {
|
|
"type": "object",
|
|
"description": "Configuration for bytecode-level analysis",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"class_file_version_min": {
|
|
"type": "integer",
|
|
"description": "Minimum class file version (52 = Java 8)",
|
|
"default": 52
|
|
},
|
|
"class_file_version_max": {
|
|
"type": "integer",
|
|
"description": "Maximum class file version (65 = Java 21)",
|
|
"default": 65
|
|
},
|
|
"analyze_invoke_dynamic": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Analyze invokedynamic for lambdas and method refs"
|
|
},
|
|
"analyze_method_handles": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"analyze_constant_pool": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"stack_frame_analysis": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"description": "Perform stack frame analysis for data flow"
|
|
},
|
|
"instruction_patterns": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/InstructionPattern"
|
|
}
|
|
},
|
|
"max_method_size": {
|
|
"type": "integer",
|
|
"default": 65535,
|
|
"description": "Max bytecode bytes per method to analyze"
|
|
}
|
|
}
|
|
},
|
|
"InstructionPattern": {
|
|
"type": "object",
|
|
"description": "Bytecode instruction pattern for entry detection",
|
|
"required": ["pattern_id", "opcodes"],
|
|
"properties": {
|
|
"pattern_id": {
|
|
"type": "string"
|
|
},
|
|
"opcodes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["INVOKEVIRTUAL", "INVOKEINTERFACE", "INVOKESPECIAL", "INVOKESTATIC", "INVOKEDYNAMIC", "GETSTATIC", "PUTSTATIC", "GETFIELD", "PUTFIELD", "NEW", "ANEWARRAY", "CHECKCAST", "INSTANCEOF", "LDC", "LDC_W", "LDC2_W"]
|
|
}
|
|
},
|
|
"operand_pattern": {
|
|
"type": "string",
|
|
"description": "Regex pattern for operand (class/method reference)"
|
|
},
|
|
"entry_type": {
|
|
"type": "string",
|
|
"enum": ["main_method", "servlet_init", "servlet_service", "ejb_lifecycle", "jni_entry", "test_entry", "annotation_driven"]
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
"ReflectionHandlingConfig": {
|
|
"type": "object",
|
|
"description": "Configuration for handling reflection-based invocations",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"confidence_penalty": {
|
|
"type": "number",
|
|
"default": 0.3,
|
|
"description": "Confidence reduction for reflection-based paths"
|
|
},
|
|
"track_class_forname": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"track_method_invoke": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"track_constructor_newinstance": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"track_proxy_creation": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"string_constant_resolution": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Resolve string constants passed to Class.forName"
|
|
},
|
|
"known_reflection_patterns": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/ReflectionPattern"
|
|
}
|
|
},
|
|
"reflection_config_files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "GraalVM/Quarkus reflection config file paths"
|
|
}
|
|
}
|
|
},
|
|
"ReflectionPattern": {
|
|
"type": "object",
|
|
"description": "Known reflection usage pattern",
|
|
"required": ["pattern_id", "class_pattern", "method_pattern"],
|
|
"properties": {
|
|
"pattern_id": {
|
|
"type": "string"
|
|
},
|
|
"class_pattern": {
|
|
"type": "string",
|
|
"description": "Regex for target class"
|
|
},
|
|
"method_pattern": {
|
|
"type": "string",
|
|
"description": "Regex for target method"
|
|
},
|
|
"resolution_strategy": {
|
|
"type": "string",
|
|
"enum": ["string_constant", "config_file", "annotation_hint", "heuristic"]
|
|
},
|
|
"entry_type_hint": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"FrameworkResolver": {
|
|
"type": "object",
|
|
"description": "Framework-specific entrypoint resolver",
|
|
"required": ["framework_id", "name", "detection_strategy"],
|
|
"properties": {
|
|
"framework_id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"version_range": {
|
|
"type": "string"
|
|
},
|
|
"detection_strategy": {
|
|
"$ref": "#/definitions/FrameworkDetection"
|
|
},
|
|
"entrypoint_rules": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/FrameworkEntrypointRule"
|
|
}
|
|
},
|
|
"lifecycle_callbacks": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/LifecycleCallback"
|
|
}
|
|
},
|
|
"dependency_injection": {
|
|
"$ref": "#/definitions/DependencyInjectionConfig"
|
|
},
|
|
"aop_support": {
|
|
"$ref": "#/definitions/AopConfig"
|
|
}
|
|
}
|
|
},
|
|
"FrameworkDetection": {
|
|
"type": "object",
|
|
"description": "How to detect framework presence",
|
|
"properties": {
|
|
"marker_classes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Classes that indicate framework presence"
|
|
},
|
|
"marker_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"pom_dependencies": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Maven coordinates (groupId:artifactId)"
|
|
},
|
|
"gradle_dependencies": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"config_files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Config files indicating framework (e.g., application.properties)"
|
|
}
|
|
}
|
|
},
|
|
"FrameworkEntrypointRule": {
|
|
"type": "object",
|
|
"description": "Rule for detecting framework-specific entrypoints",
|
|
"required": ["rule_id", "type"],
|
|
"properties": {
|
|
"rule_id": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["annotation", "interface", "superclass", "method_name", "xml_config", "properties_config"]
|
|
},
|
|
"annotation_fqcn": {
|
|
"type": "string",
|
|
"description": "Fully qualified annotation class name"
|
|
},
|
|
"annotation_attributes": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "Required annotation attributes"
|
|
},
|
|
"interface_fqcn": {
|
|
"type": "string"
|
|
},
|
|
"superclass_fqcn": {
|
|
"type": "string"
|
|
},
|
|
"method_signature_pattern": {
|
|
"type": "string"
|
|
},
|
|
"xml_xpath": {
|
|
"type": "string",
|
|
"description": "XPath for XML-configured entries"
|
|
},
|
|
"entry_type": {
|
|
"type": "string",
|
|
"enum": ["http_endpoint", "grpc_method", "message_consumer", "scheduled_job", "event_handler", "ejb_method", "servlet_method", "jax_rs_resource", "graphql_resolver", "websocket_handler"]
|
|
},
|
|
"metadata_extraction": {
|
|
"$ref": "#/definitions/JavaMetadataExtraction"
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
"JavaMetadataExtraction": {
|
|
"type": "object",
|
|
"description": "Rules for extracting metadata from Java entrypoints",
|
|
"properties": {
|
|
"http_method_from": {
|
|
"type": "string",
|
|
"description": "Expression to extract HTTP method"
|
|
},
|
|
"path_from": {
|
|
"type": "string",
|
|
"description": "Expression to extract path"
|
|
},
|
|
"consumes_from": {
|
|
"type": "string"
|
|
},
|
|
"produces_from": {
|
|
"type": "string"
|
|
},
|
|
"security_annotation": {
|
|
"type": "string"
|
|
},
|
|
"role_annotation": {
|
|
"type": "string"
|
|
},
|
|
"transaction_annotation": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"LifecycleCallback": {
|
|
"type": "object",
|
|
"description": "Framework lifecycle callback as potential entrypoint",
|
|
"required": ["callback_id", "type"],
|
|
"properties": {
|
|
"callback_id": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"enum": ["post_construct", "pre_destroy", "init", "destroy", "startup", "shutdown", "context_initialized", "context_destroyed"]
|
|
},
|
|
"annotation_fqcn": {
|
|
"type": "string"
|
|
},
|
|
"interface_method": {
|
|
"type": "string"
|
|
},
|
|
"execution_phase": {
|
|
"type": "string",
|
|
"enum": ["startup", "runtime", "shutdown"]
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
"DependencyInjectionConfig": {
|
|
"type": "object",
|
|
"description": "Dependency injection analysis configuration",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"inject_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"default": ["javax.inject.Inject", "jakarta.inject.Inject", "org.springframework.beans.factory.annotation.Autowired", "com.google.inject.Inject"]
|
|
},
|
|
"qualifier_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"scope_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"track_bean_creation": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
}
|
|
},
|
|
"AopConfig": {
|
|
"type": "object",
|
|
"description": "Aspect-Oriented Programming support",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"aspect_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"default": ["org.aspectj.lang.annotation.Aspect"]
|
|
},
|
|
"pointcut_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"default": ["org.aspectj.lang.annotation.Before", "org.aspectj.lang.annotation.After", "org.aspectj.lang.annotation.Around"]
|
|
},
|
|
"track_interceptors": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
}
|
|
},
|
|
"AnnotationProcessor": {
|
|
"type": "object",
|
|
"description": "Annotation-based entrypoint processor",
|
|
"required": ["processor_id", "annotation_fqcn"],
|
|
"properties": {
|
|
"processor_id": {
|
|
"type": "string"
|
|
},
|
|
"annotation_fqcn": {
|
|
"type": "string",
|
|
"description": "Fully qualified class name of annotation"
|
|
},
|
|
"target_types": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["TYPE", "METHOD", "FIELD", "PARAMETER", "CONSTRUCTOR", "LOCAL_VARIABLE", "ANNOTATION_TYPE", "PACKAGE", "TYPE_PARAMETER", "TYPE_USE"]
|
|
}
|
|
},
|
|
"required_attributes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"entry_type": {
|
|
"type": "string"
|
|
},
|
|
"metadata_mapping": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "Maps annotation attributes to metadata fields"
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
"ClassHierarchyRule": {
|
|
"type": "object",
|
|
"description": "Rule based on class hierarchy (extends)",
|
|
"required": ["rule_id", "superclass_fqcn"],
|
|
"properties": {
|
|
"rule_id": {
|
|
"type": "string"
|
|
},
|
|
"superclass_fqcn": {
|
|
"type": "string"
|
|
},
|
|
"entry_methods": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Method signatures that are entrypoints"
|
|
},
|
|
"entry_type": {
|
|
"type": "string"
|
|
},
|
|
"include_indirect": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Include indirect subclasses"
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
"InterfaceImplementationRule": {
|
|
"type": "object",
|
|
"description": "Rule based on interface implementation",
|
|
"required": ["rule_id", "interface_fqcn"],
|
|
"properties": {
|
|
"rule_id": {
|
|
"type": "string"
|
|
},
|
|
"interface_fqcn": {
|
|
"type": "string"
|
|
},
|
|
"entry_methods": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"entry_type": {
|
|
"type": "string"
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
}
|
|
}
|
|
},
|
|
"LambdaResolutionConfig": {
|
|
"type": "object",
|
|
"description": "Configuration for resolving lambda expressions",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"track_functional_interfaces": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"known_functional_interfaces": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"default": [
|
|
"java.lang.Runnable",
|
|
"java.util.concurrent.Callable",
|
|
"java.util.function.Consumer",
|
|
"java.util.function.Supplier",
|
|
"java.util.function.Function",
|
|
"java.util.function.Predicate",
|
|
"java.util.function.BiConsumer",
|
|
"java.util.function.BiFunction"
|
|
]
|
|
},
|
|
"track_lambda_capture": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Track captured variables in lambdas"
|
|
},
|
|
"confidence_for_lambda": {
|
|
"type": "number",
|
|
"default": 0.8
|
|
}
|
|
}
|
|
},
|
|
"MethodReferenceConfig": {
|
|
"type": "object",
|
|
"description": "Configuration for resolving method references",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"reference_types": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["STATIC", "BOUND", "UNBOUND", "CONSTRUCTOR"]
|
|
},
|
|
"default": ["STATIC", "BOUND", "UNBOUND", "CONSTRUCTOR"]
|
|
},
|
|
"confidence_for_reference": {
|
|
"type": "number",
|
|
"default": 0.9
|
|
}
|
|
}
|
|
},
|
|
"BuildToolIntegration": {
|
|
"type": "object",
|
|
"description": "Build tool integration for classpath resolution",
|
|
"properties": {
|
|
"maven": {
|
|
"$ref": "#/definitions/MavenConfig"
|
|
},
|
|
"gradle": {
|
|
"$ref": "#/definitions/GradleConfig"
|
|
},
|
|
"ant": {
|
|
"$ref": "#/definitions/AntConfig"
|
|
}
|
|
}
|
|
},
|
|
"MavenConfig": {
|
|
"type": "object",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"resolve_dependencies": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"include_test_scope": {
|
|
"type": "boolean",
|
|
"default": false
|
|
},
|
|
"profiles_to_activate": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"settings_xml_path": {
|
|
"type": "string"
|
|
},
|
|
"local_repo_path": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"GradleConfig": {
|
|
"type": "object",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"resolve_dependencies": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"configurations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"default": ["compileClasspath", "runtimeClasspath"]
|
|
},
|
|
"init_script_path": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"AntConfig": {
|
|
"type": "object",
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": false
|
|
},
|
|
"build_file_path": {
|
|
"type": "string",
|
|
"default": "build.xml"
|
|
},
|
|
"target": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"ResolvedEntrypoint": {
|
|
"type": "object",
|
|
"description": "Resolved Java entrypoint",
|
|
"required": ["entry_id", "class_fqcn", "method_signature", "entry_type"],
|
|
"properties": {
|
|
"entry_id": {
|
|
"type": "string"
|
|
},
|
|
"class_fqcn": {
|
|
"type": "string",
|
|
"description": "Fully qualified class name"
|
|
},
|
|
"method_signature": {
|
|
"type": "string",
|
|
"description": "JVM method signature"
|
|
},
|
|
"method_name": {
|
|
"type": "string"
|
|
},
|
|
"method_descriptor": {
|
|
"type": "string",
|
|
"description": "JVM method descriptor (e.g., (Ljava/lang/String;)V)"
|
|
},
|
|
"entry_type": {
|
|
"type": "string",
|
|
"enum": ["http_endpoint", "grpc_method", "message_consumer", "scheduled_job", "event_handler", "ejb_method", "servlet_method", "jax_rs_resource", "graphql_resolver", "websocket_handler", "main_method", "junit_test", "testng_test", "cli_command"]
|
|
},
|
|
"source_location": {
|
|
"$ref": "#/definitions/JavaSourceLocation"
|
|
},
|
|
"bytecode_location": {
|
|
"$ref": "#/definitions/BytecodeLocation"
|
|
},
|
|
"confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
},
|
|
"resolution_path": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Chain of rules that resolved this entrypoint"
|
|
},
|
|
"framework": {
|
|
"type": "string"
|
|
},
|
|
"http_metadata": {
|
|
"$ref": "#/definitions/JavaHttpMetadata"
|
|
},
|
|
"parameters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/JavaParameter"
|
|
}
|
|
},
|
|
"return_type": {
|
|
"type": "string"
|
|
},
|
|
"throws_types": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/JavaAnnotation"
|
|
}
|
|
},
|
|
"modifiers": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["PUBLIC", "PRIVATE", "PROTECTED", "STATIC", "FINAL", "SYNCHRONIZED", "NATIVE", "ABSTRACT", "STRICTFP"]
|
|
}
|
|
},
|
|
"symbol_id": {
|
|
"type": "string",
|
|
"pattern": "^sym:java:[A-Za-z0-9_-]+$",
|
|
"description": "RichGraph SymbolID"
|
|
},
|
|
"taint_sources": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/TaintSource"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"JavaSourceLocation": {
|
|
"type": "object",
|
|
"description": "Source code location",
|
|
"properties": {
|
|
"file_path": {
|
|
"type": "string"
|
|
},
|
|
"line_start": {
|
|
"type": "integer"
|
|
},
|
|
"line_end": {
|
|
"type": "integer"
|
|
},
|
|
"column_start": {
|
|
"type": "integer"
|
|
},
|
|
"column_end": {
|
|
"type": "integer"
|
|
},
|
|
"source_root": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"BytecodeLocation": {
|
|
"type": "object",
|
|
"description": "Bytecode location",
|
|
"properties": {
|
|
"jar_path": {
|
|
"type": "string"
|
|
},
|
|
"class_file_path": {
|
|
"type": "string"
|
|
},
|
|
"method_index": {
|
|
"type": "integer"
|
|
},
|
|
"bytecode_offset": {
|
|
"type": "integer"
|
|
},
|
|
"class_file_version": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"JavaHttpMetadata": {
|
|
"type": "object",
|
|
"description": "HTTP endpoint metadata for Java",
|
|
"properties": {
|
|
"method": {
|
|
"type": "string",
|
|
"enum": ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS", "TRACE"]
|
|
},
|
|
"path": {
|
|
"type": "string"
|
|
},
|
|
"path_variables": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"request_params": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"headers": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"consumes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"produces": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"security_constraints": {
|
|
"$ref": "#/definitions/SecurityConstraints"
|
|
}
|
|
}
|
|
},
|
|
"SecurityConstraints": {
|
|
"type": "object",
|
|
"properties": {
|
|
"authentication_required": {
|
|
"type": "boolean"
|
|
},
|
|
"roles_allowed": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"security_annotation": {
|
|
"type": "string"
|
|
},
|
|
"csrf_protection": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
},
|
|
"JavaParameter": {
|
|
"type": "object",
|
|
"description": "Method parameter",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"type_fqcn": {
|
|
"type": "string"
|
|
},
|
|
"type_descriptor": {
|
|
"type": "string"
|
|
},
|
|
"generic_type": {
|
|
"type": "string"
|
|
},
|
|
"index": {
|
|
"type": "integer"
|
|
},
|
|
"source": {
|
|
"type": "string",
|
|
"enum": ["path", "query", "header", "body", "form", "cookie", "matrix", "bean"]
|
|
},
|
|
"required": {
|
|
"type": "boolean"
|
|
},
|
|
"default_value": {
|
|
"type": "string"
|
|
},
|
|
"validation_annotations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"is_taint_source": {
|
|
"type": "boolean",
|
|
"description": "Whether this parameter is a potential taint source"
|
|
}
|
|
}
|
|
},
|
|
"JavaAnnotation": {
|
|
"type": "object",
|
|
"description": "Annotation on entrypoint",
|
|
"properties": {
|
|
"fqcn": {
|
|
"type": "string"
|
|
},
|
|
"attributes": {
|
|
"type": "object",
|
|
"additionalProperties": true
|
|
},
|
|
"retention": {
|
|
"type": "string",
|
|
"enum": ["SOURCE", "CLASS", "RUNTIME"]
|
|
}
|
|
}
|
|
},
|
|
"TaintSource": {
|
|
"type": "object",
|
|
"description": "Taint source information",
|
|
"properties": {
|
|
"parameter_index": {
|
|
"type": "integer"
|
|
},
|
|
"parameter_name": {
|
|
"type": "string"
|
|
},
|
|
"taint_type": {
|
|
"type": "string",
|
|
"enum": ["user_input", "file_input", "network_input", "database_input", "environment"]
|
|
},
|
|
"sanitization_required": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"JavaEntrypointReport": {
|
|
"type": "object",
|
|
"description": "Java entrypoint resolution report",
|
|
"required": ["report_id", "scan_id", "entrypoints"],
|
|
"properties": {
|
|
"report_id": {
|
|
"type": "string",
|
|
"format": "uuid"
|
|
},
|
|
"scan_id": {
|
|
"type": "string"
|
|
},
|
|
"generated_at": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"config_used": {
|
|
"type": "string"
|
|
},
|
|
"java_version_detected": {
|
|
"type": "string"
|
|
},
|
|
"entrypoints": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/ResolvedEntrypoint"
|
|
}
|
|
},
|
|
"frameworks_detected": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/DetectedFramework"
|
|
}
|
|
},
|
|
"statistics": {
|
|
"$ref": "#/definitions/JavaEntrypointStatistics"
|
|
},
|
|
"build_info": {
|
|
"$ref": "#/definitions/BuildInfo"
|
|
},
|
|
"analysis_warnings": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"analysis_duration_ms": {
|
|
"type": "integer"
|
|
},
|
|
"digest": {
|
|
"type": "string",
|
|
"pattern": "^sha256:[a-f0-9]{64}$"
|
|
}
|
|
}
|
|
},
|
|
"DetectedFramework": {
|
|
"type": "object",
|
|
"properties": {
|
|
"framework_id": {
|
|
"type": "string"
|
|
},
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"version": {
|
|
"type": "string"
|
|
},
|
|
"detection_confidence": {
|
|
"type": "number",
|
|
"minimum": 0,
|
|
"maximum": 1
|
|
},
|
|
"detection_evidence": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"JavaEntrypointStatistics": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total_entrypoints": {
|
|
"type": "integer"
|
|
},
|
|
"by_type": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"by_framework": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"by_confidence": {
|
|
"type": "object",
|
|
"properties": {
|
|
"high": {
|
|
"type": "integer"
|
|
},
|
|
"medium": {
|
|
"type": "integer"
|
|
},
|
|
"low": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"classes_analyzed": {
|
|
"type": "integer"
|
|
},
|
|
"methods_analyzed": {
|
|
"type": "integer"
|
|
},
|
|
"reflection_usages": {
|
|
"type": "integer"
|
|
},
|
|
"lambda_expressions": {
|
|
"type": "integer"
|
|
},
|
|
"taint_sources_identified": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
},
|
|
"BuildInfo": {
|
|
"type": "object",
|
|
"properties": {
|
|
"build_tool": {
|
|
"type": "string",
|
|
"enum": ["maven", "gradle", "ant", "unknown"]
|
|
},
|
|
"java_source_version": {
|
|
"type": "string"
|
|
},
|
|
"java_target_version": {
|
|
"type": "string"
|
|
},
|
|
"modules_detected": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"dependencies_count": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"properties": {
|
|
"configs": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/JavaEntrypointConfig"
|
|
}
|
|
},
|
|
"reports": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/definitions/JavaEntrypointReport"
|
|
}
|
|
}
|
|
},
|
|
"examples": [
|
|
{
|
|
"configs": [
|
|
{
|
|
"config_id": "java-spring-resolver",
|
|
"java_version_range": ">=11",
|
|
"version": "1.0.0",
|
|
"bytecode_analysis": {
|
|
"enabled": true,
|
|
"class_file_version_min": 55,
|
|
"class_file_version_max": 65,
|
|
"analyze_invoke_dynamic": true,
|
|
"analyze_method_handles": true,
|
|
"analyze_constant_pool": true,
|
|
"stack_frame_analysis": false,
|
|
"max_method_size": 65535
|
|
},
|
|
"reflection_handling": {
|
|
"enabled": true,
|
|
"confidence_penalty": 0.3,
|
|
"track_class_forname": true,
|
|
"track_method_invoke": true,
|
|
"track_constructor_newinstance": true,
|
|
"track_proxy_creation": true,
|
|
"string_constant_resolution": true
|
|
},
|
|
"framework_resolvers": [
|
|
{
|
|
"framework_id": "spring-boot",
|
|
"name": "Spring Boot",
|
|
"version_range": ">=2.0.0",
|
|
"detection_strategy": {
|
|
"marker_classes": ["org.springframework.boot.SpringApplication"],
|
|
"marker_annotations": ["org.springframework.boot.autoconfigure.SpringBootApplication"],
|
|
"pom_dependencies": ["org.springframework.boot:spring-boot-starter"]
|
|
},
|
|
"entrypoint_rules": [
|
|
{
|
|
"rule_id": "spring-get-mapping",
|
|
"type": "annotation",
|
|
"annotation_fqcn": "org.springframework.web.bind.annotation.GetMapping",
|
|
"entry_type": "http_endpoint",
|
|
"metadata_extraction": {
|
|
"http_method_from": "GET",
|
|
"path_from": "value || path"
|
|
},
|
|
"confidence": 0.98
|
|
},
|
|
{
|
|
"rule_id": "spring-post-mapping",
|
|
"type": "annotation",
|
|
"annotation_fqcn": "org.springframework.web.bind.annotation.PostMapping",
|
|
"entry_type": "http_endpoint",
|
|
"metadata_extraction": {
|
|
"http_method_from": "POST",
|
|
"path_from": "value || path"
|
|
},
|
|
"confidence": 0.98
|
|
},
|
|
{
|
|
"rule_id": "spring-scheduled",
|
|
"type": "annotation",
|
|
"annotation_fqcn": "org.springframework.scheduling.annotation.Scheduled",
|
|
"entry_type": "scheduled_job",
|
|
"confidence": 0.95
|
|
}
|
|
],
|
|
"lifecycle_callbacks": [
|
|
{
|
|
"callback_id": "spring-post-construct",
|
|
"type": "post_construct",
|
|
"annotation_fqcn": "javax.annotation.PostConstruct",
|
|
"execution_phase": "startup",
|
|
"confidence": 0.85
|
|
}
|
|
],
|
|
"dependency_injection": {
|
|
"enabled": true,
|
|
"inject_annotations": ["org.springframework.beans.factory.annotation.Autowired", "javax.inject.Inject"],
|
|
"track_bean_creation": true
|
|
},
|
|
"aop_support": {
|
|
"enabled": true,
|
|
"track_interceptors": true
|
|
}
|
|
}
|
|
],
|
|
"lambda_resolution": {
|
|
"enabled": true,
|
|
"track_functional_interfaces": true,
|
|
"track_lambda_capture": true,
|
|
"confidence_for_lambda": 0.8
|
|
},
|
|
"method_reference_resolution": {
|
|
"enabled": true,
|
|
"reference_types": ["STATIC", "BOUND", "UNBOUND", "CONSTRUCTOR"],
|
|
"confidence_for_reference": 0.9
|
|
},
|
|
"build_tool_integration": {
|
|
"maven": {
|
|
"enabled": true,
|
|
"resolve_dependencies": true,
|
|
"include_test_scope": false
|
|
},
|
|
"gradle": {
|
|
"enabled": true,
|
|
"resolve_dependencies": true,
|
|
"configurations": ["compileClasspath", "runtimeClasspath"]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|