Skip to content

findings

ReproductionStep

Bases: BaseModel

This class holds a reproduction step for vulnerabilities

This class holds a reproduction step for vulnerabilities, it can contain the tool used, action taken, confidence level and arguments passed to the tool.

Examples:

>>> import core
>>> rs = core.ReproductionStep(
...     tool="nmap",
...     action="scan",
...     confidence=5,
...     arguments=["-sV", "-script=vuln"],
... )
>>> print(rs.tool)
nmap
>>> print(rs.confidence)
5
>>> print(rs.arguments)
['-sV', '-script=vuln']

Attributes:

Name Type Description
* title (str

Title of the reproduction step

* description (str

Description of the reproduction step

* tool (str

Tool used in the reproduction step

* action (str

Action taken in the reproduction step

* confidence (int

Confidence level of the reproduction step (0-10)

* arguments (array

Array of arguments passed to the tool

* vulnOutput (str

Output from the vulnerability scan

* fixOutput (str

Output from the fix attempt

Source code in wintermute/findings.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
class ReproductionStep(BaseModel):
    """This class holds a reproduction step for vulnerabilities

    This class holds a reproduction step for vulnerabilities, it can contain
    the tool used, action taken, confidence level and arguments passed to the tool.

    Examples:
        >>> import core
        >>> rs = core.ReproductionStep(
        ...     tool="nmap",
        ...     action="scan",
        ...     confidence=5,
        ...     arguments=["-sV", "-script=vuln"],
        ... )
        >>> print(rs.tool)
        nmap
        >>> print(rs.confidence)
        5
        >>> print(rs.arguments)
        ['-sV', '-script=vuln']

    Attributes:
        * title (str): Title of the reproduction step
        * description (str): Description of the reproduction step
        * tool (str): Tool used in the reproduction step
        * action (str): Action taken in the reproduction step
        * confidence (int): Confidence level of the reproduction step (0-10)
        * arguments (array): Array of arguments passed to the tool
        * vulnOutput (str): Output from the vulnerability scan
        * fixOutput (str): Output from the fix attempt
    """

    def __init__(
        self,
        title: str = "",
        description: str = "",
        tool: str | None = None,
        action: str | None = None,
        confidence: int = 0,
        arguments: Sequence[str] | None = None,
        vulnOutput: str | None = None,
        fixOutput: str | None = None,
    ) -> None:
        self.title = title
        self.description = description
        self.tool = tool
        self.action = action
        self.confidence = confidence
        self.arguments = list(arguments) if arguments is not None else []
        self.vulnOutput = vulnOutput
        self.fixOutput = fixOutput

Risk

Bases: BaseModel

This class defines and holds the Risks, it inherits from the Vulns

This class defines the risk for the vulnerability is assigned to, is designed to be used by a vulnerability itself

Examples:

>>> import core
>>> r = core.Risk(likelihood="High", impact="High", severity="Critical")
>>> print(r.severity)
Critical
>>> print(r.likelihood)
High
>>> print(r.impact)
High

Attributes:

Name Type Description
* likelihood (str

Likelihood of the vulnerability

* impact (str

Impact of the vulnerability

* severity (str

Severity of the vulnerability

Source code in wintermute/findings.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
class Risk(BaseModel):
    """This class defines and holds the Risks, it inherits from the Vulns

    This class defines the risk for the vulnerability is assigned to, is designed to
    be used by a vulnerability itself

    Examples:
        >>> import core
        >>> r = core.Risk(likelihood="High", impact="High", severity="Critical")
        >>> print(r.severity)
        Critical
        >>> print(r.likelihood)
        High
        >>> print(r.impact)
        High

    Attributes:
        * likelihood (str): Likelihood of the vulnerability
        * impact (str): Impact of the vulnerability
        * severity (str): Severity of the vulnerability
    """

    def __init__(
        self, likelihood: str = "Low", impact: str = "Low", severity: str = "Low"
    ) -> None:
        self.likelihood = likelihood
        self.impact = impact
        self.severity = severity

Vulnerability

Bases: BaseModel

This class holds a vulnerability found

This class holds a vulnerability found during the operation, it can contain reproduction steps and a risk object.

Source code in wintermute/findings.py
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
class Vulnerability(BaseModel):
    """This class holds a vulnerability found

    This class holds a vulnerability found during the operation, it can contain
    reproduction steps and a risk object.
    """

    vuln_id: str
    code: str
    discovered_at: datetime
    verified_at: datetime | None

    __schema__ = {
        "risk": Risk,
        "reproduction_steps": ReproductionStep,
    }

    def __init__(
        self,
        title: str = "",
        description: str = "",
        threat: str = "",
        cvss: int = 0,
        mitigation: bool = True,
        fix: bool = True,
        fix_desc: str = "",
        mitigation_desc: str = "",
        risk: Dict[Any, Any] | Risk = {},
        verified: bool = False,
        reproduction_steps: list[ReproductionStep] | None = None,
        *,
        vuln_id: str | None = None,
        code: str = "",
        discovered_at: datetime | None = None,
        verified_at: datetime | None = None,
    ) -> None:
        self.vuln_id = vuln_id or str(uuid.uuid4())
        self.code = code
        self.discovered_at = discovered_at or datetime.now(timezone.utc)
        self.verified_at = verified_at
        self.title = title
        self.description = description
        self.threat = threat
        self.cvss = cvss
        self.mitigation = mitigation  # Boolean
        self.fix = fix  # Boolean
        self.mitigation_desc = mitigation_desc
        self.fix_desc = fix_desc
        self.verified = verified  # If exploited or high confidence this will be true
        if self.verified and self.verified_at is None:
            self.verified_at = datetime.now(timezone.utc)
        self.reproduction_steps = reproduction_steps or []

        if isinstance(risk, Risk):
            self.risk = risk
        elif isinstance(risk, dict):
            self.risk = Risk.from_dict(risk)
        else:
            self.risk = Risk()

    def setRisk(
        self, likelihood: str = "Low", impact: str = "Low", severity: str = "Low"
    ) -> None:
        self.risk = Risk(likelihood=likelihood, impact=impact, severity=severity)