feat: project scaffold, unified Pydantic schema, scope gating
This commit is contained in:
@@ -0,0 +1,709 @@
|
||||
{
|
||||
"$defs": {
|
||||
"ExploitDBMatch": {
|
||||
"additionalProperties": false,
|
||||
"description": "An Exploit-DB candidate returned verbatim by ``searchsploit``.\n\nThese are ALWAYS unverified references. We never fabricate or infer EDB-IDs or\npaths; only what searchsploit actually returned is emitted.",
|
||||
"properties": {
|
||||
"edb_id": {
|
||||
"description": "Exploit-DB id, e.g. '50383'.",
|
||||
"title": "Edb Id",
|
||||
"type": "string"
|
||||
},
|
||||
"title": {
|
||||
"title": "Title",
|
||||
"type": "string"
|
||||
},
|
||||
"path": {
|
||||
"description": "Local path within the Exploit-DB checkout.",
|
||||
"title": "Path",
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"description": "exploit-db.com URL.",
|
||||
"title": "Url"
|
||||
},
|
||||
"query": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"description": "The searchsploit query that produced this hit.",
|
||||
"title": "Query"
|
||||
},
|
||||
"source": {
|
||||
"default": "exploit-db",
|
||||
"title": "Source",
|
||||
"type": "string"
|
||||
},
|
||||
"verified": {
|
||||
"default": false,
|
||||
"description": "Always false: candidate reference only.",
|
||||
"title": "Verified",
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"edb_id",
|
||||
"title",
|
||||
"path"
|
||||
],
|
||||
"title": "ExploitDBMatch",
|
||||
"type": "object"
|
||||
},
|
||||
"Host": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"hostname": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Hostname"
|
||||
},
|
||||
"ips": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "Ips",
|
||||
"type": "array"
|
||||
},
|
||||
"cnames": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "Cnames",
|
||||
"type": "array"
|
||||
},
|
||||
"ports": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/Port"
|
||||
},
|
||||
"title": "Ports",
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"title": "Host",
|
||||
"type": "object"
|
||||
},
|
||||
"HttpInfo": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"url": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Url"
|
||||
},
|
||||
"status": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "integer"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Status"
|
||||
},
|
||||
"title": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Title"
|
||||
},
|
||||
"webserver": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Webserver"
|
||||
},
|
||||
"technologies": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "Technologies",
|
||||
"type": "array"
|
||||
},
|
||||
"tls": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/$defs/TlsInfo"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null
|
||||
}
|
||||
},
|
||||
"title": "HttpInfo",
|
||||
"type": "object"
|
||||
},
|
||||
"NucleiFinding": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"template_id": {
|
||||
"title": "Template Id",
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Name"
|
||||
},
|
||||
"severity": {
|
||||
"$ref": "#/$defs/Severity",
|
||||
"default": "unknown"
|
||||
},
|
||||
"matched_at": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Matched At"
|
||||
},
|
||||
"host": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Host"
|
||||
},
|
||||
"reference": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "Reference",
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"template_id"
|
||||
],
|
||||
"title": "NucleiFinding",
|
||||
"type": "object"
|
||||
},
|
||||
"Port": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"number": {
|
||||
"maximum": 65535,
|
||||
"minimum": 0,
|
||||
"title": "Number",
|
||||
"type": "integer"
|
||||
},
|
||||
"protocol": {
|
||||
"default": "tcp",
|
||||
"title": "Protocol",
|
||||
"type": "string"
|
||||
},
|
||||
"state": {
|
||||
"default": "open",
|
||||
"title": "State",
|
||||
"type": "string"
|
||||
},
|
||||
"service": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/$defs/Service"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"number"
|
||||
],
|
||||
"title": "Port",
|
||||
"type": "object"
|
||||
},
|
||||
"ScopeUsed": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"in_scope_domains": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "In Scope Domains",
|
||||
"type": "array"
|
||||
},
|
||||
"in_scope_cidrs": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "In Scope Cidrs",
|
||||
"type": "array"
|
||||
},
|
||||
"out_of_scope": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "Out Of Scope",
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"title": "ScopeUsed",
|
||||
"type": "object"
|
||||
},
|
||||
"Service": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"name": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"description": "Service name, e.g. 'http'.",
|
||||
"title": "Name"
|
||||
},
|
||||
"product": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"description": "Product, e.g. 'Apache httpd'.",
|
||||
"title": "Product"
|
||||
},
|
||||
"version": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"description": "Version string, e.g. '2.4.49'.",
|
||||
"title": "Version"
|
||||
},
|
||||
"cpe": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Cpe"
|
||||
},
|
||||
"http": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/$defs/HttpInfo"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null
|
||||
},
|
||||
"exploitdb_candidates": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/ExploitDBMatch"
|
||||
},
|
||||
"title": "Exploitdb Candidates",
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"title": "Service",
|
||||
"type": "object"
|
||||
},
|
||||
"Severity": {
|
||||
"enum": [
|
||||
"info",
|
||||
"low",
|
||||
"medium",
|
||||
"high",
|
||||
"critical",
|
||||
"unknown"
|
||||
],
|
||||
"title": "Severity",
|
||||
"type": "string"
|
||||
},
|
||||
"StageResult": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"name": {
|
||||
"title": "Name",
|
||||
"type": "string"
|
||||
},
|
||||
"status": {
|
||||
"$ref": "#/$defs/StageStatus",
|
||||
"default": "skipped"
|
||||
},
|
||||
"detail": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Detail"
|
||||
},
|
||||
"started_at": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Started At"
|
||||
},
|
||||
"finished_at": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Finished At"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"title": "StageResult",
|
||||
"type": "object"
|
||||
},
|
||||
"StageStatus": {
|
||||
"description": "Per-tool stage outcome. The pipeline fails soft: a tool that crashes, times\nout, or returns nothing is recorded here and the run continues.",
|
||||
"enum": [
|
||||
"ok",
|
||||
"empty",
|
||||
"failed",
|
||||
"skipped"
|
||||
],
|
||||
"title": "StageStatus",
|
||||
"type": "string"
|
||||
},
|
||||
"TlsInfo": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"subject_cn": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Subject Cn"
|
||||
},
|
||||
"issuer": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Issuer"
|
||||
},
|
||||
"not_after": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Not After"
|
||||
}
|
||||
},
|
||||
"title": "TlsInfo",
|
||||
"type": "object"
|
||||
},
|
||||
"ToolVersion": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"name": {
|
||||
"title": "Name",
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Version"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name"
|
||||
],
|
||||
"title": "ToolVersion",
|
||||
"type": "object"
|
||||
},
|
||||
"TriageItem": {
|
||||
"additionalProperties": false,
|
||||
"description": "One prioritized finding from the LLM stage. All references must point at ids\npresent in the ReconReport \u2014 see triage.llm for the acceptance gate.",
|
||||
"properties": {
|
||||
"summary": {
|
||||
"title": "Summary",
|
||||
"type": "string"
|
||||
},
|
||||
"rationale": {
|
||||
"title": "Rationale",
|
||||
"type": "string"
|
||||
},
|
||||
"severity": {
|
||||
"$ref": "#/$defs/Severity",
|
||||
"default": "unknown"
|
||||
},
|
||||
"evidence_refs": {
|
||||
"description": "ids/keys present in the ReconReport (host:port, edb_id, template_id).",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"title": "Evidence Refs",
|
||||
"type": "array"
|
||||
},
|
||||
"suggested_next_step": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"description": "Must reference a real edb_id / nuclei template / host:port from input.",
|
||||
"title": "Suggested Next Step"
|
||||
},
|
||||
"confidence": {
|
||||
"default": 0.0,
|
||||
"maximum": 1.0,
|
||||
"minimum": 0.0,
|
||||
"title": "Confidence",
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"summary",
|
||||
"rationale"
|
||||
],
|
||||
"title": "TriageItem",
|
||||
"type": "object"
|
||||
},
|
||||
"TriageReport": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"prioritized_findings": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/TriageItem"
|
||||
},
|
||||
"title": "Prioritized Findings",
|
||||
"type": "array"
|
||||
},
|
||||
"model": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Model"
|
||||
},
|
||||
"generated_by": {
|
||||
"default": "deterministic",
|
||||
"description": "'llm' or 'deterministic'.",
|
||||
"title": "Generated By",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"title": "TriageReport",
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false,
|
||||
"description": "Top-level run artifact. Schema-valid instances are written to report.json.",
|
||||
"properties": {
|
||||
"run_id": {
|
||||
"title": "Run Id",
|
||||
"type": "string"
|
||||
},
|
||||
"target": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Target"
|
||||
},
|
||||
"started_at": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Started At"
|
||||
},
|
||||
"finished_at": {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null,
|
||||
"title": "Finished At"
|
||||
},
|
||||
"tool_versions": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/ToolVersion"
|
||||
},
|
||||
"title": "Tool Versions",
|
||||
"type": "array"
|
||||
},
|
||||
"scope": {
|
||||
"$ref": "#/$defs/ScopeUsed"
|
||||
},
|
||||
"stages": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/StageResult"
|
||||
},
|
||||
"title": "Stages",
|
||||
"type": "array"
|
||||
},
|
||||
"hosts": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/Host"
|
||||
},
|
||||
"title": "Hosts",
|
||||
"type": "array"
|
||||
},
|
||||
"nuclei_findings": {
|
||||
"items": {
|
||||
"$ref": "#/$defs/NucleiFinding"
|
||||
},
|
||||
"title": "Nuclei Findings",
|
||||
"type": "array"
|
||||
},
|
||||
"triage": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/$defs/TriageReport"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
],
|
||||
"default": null
|
||||
},
|
||||
"notice": {
|
||||
"default": "Authorized use only. Recon-and-triage scope: this report enumerates and references findings; it does not run or generate exploits.",
|
||||
"title": "Notice",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"run_id"
|
||||
],
|
||||
"title": "ReconReport",
|
||||
"type": "object"
|
||||
}
|
||||
Reference in New Issue
Block a user