46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from abc import ABC, abstractmethod
|
|
from dataclasses import dataclass, field
|
|
from pathlib import Path
|
|
from typing import Callable
|
|
|
|
from redflare.core.models import ModuleResult, Target
|
|
from redflare.core.surface_graph import AttackSurfaceGraph
|
|
|
|
|
|
@dataclass
|
|
class ModuleContext:
|
|
run_id: str
|
|
artifact_dir: Path
|
|
timeout: float = 8.0
|
|
rate: float = 2.0
|
|
wordlist: str | None = None
|
|
max_paths: int = 100
|
|
max_crawl_pages: int = 30
|
|
max_crawl_depth: int = 2
|
|
max_scripts: int = 20
|
|
max_schema_documents: int = 8
|
|
max_exposure_endpoints: int = 75
|
|
max_exposure_findings: int = 100
|
|
max_exposure_body_bytes: int = 2_000_000
|
|
max_cve_products: int = 12
|
|
max_cves_per_product: int = 100
|
|
graphql_introspection: bool = False
|
|
allow_public: bool = False
|
|
surface_graph: AttackSurfaceGraph = field(default_factory=AttackSurfaceGraph)
|
|
reporter: Callable[[str, str, str, str], None] | None = None
|
|
|
|
def emit(self, target: str, module: str, kind: str, message: str) -> None:
|
|
if self.reporter:
|
|
self.reporter(target, module, kind, message)
|
|
|
|
|
|
class Module(ABC):
|
|
name: str
|
|
description: str
|
|
|
|
@abstractmethod
|
|
def run(self, target: Target, context: ModuleContext) -> ModuleResult:
|
|
raise NotImplementedError
|