Skip to content

Commit 759094d

Browse files
committed
WIP TpyedField updates for TTP, ExploitTarget, and others
1 parent f182fa1 commit 759094d

14 files changed

Lines changed: 352 additions & 871 deletions

File tree

stix/exploit_target/__init__.py

Lines changed: 10 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from .vulnerability import Vulnerability, _Vulnerabilities # noqa
1717
from .weakness import Weakness, _Weaknesses # noqa
1818
from .configuration import Configuration, _Configurations # noqa
19-
19+
from stix.common import InformationSource
2020

2121
class ExploitTarget(stix.BaseCoreComponent):
2222
"""Implementation of STIX Exploit Target.
@@ -41,6 +41,14 @@ class ExploitTarget(stix.BaseCoreComponent):
4141
_ALL_VERSIONS = ("1.0", "1.0.1", "1.1", "1.1.1", "1.2")
4242
_ID_PREFIX = 'et'
4343

44+
potential_coas = fields.TypedField("Potential_COAs", type_="stix.exploit_target.PotentialCOAs")
45+
related_exploit_targets = fields.TypedField("Related_Exploit_Targets", type_="stix.exploit_target.RelatedExploitTargets")
46+
vulnerabilities = fields.TypedField("Vulnerability", Vulnerability, multiple=True, key_name="vulnerabilities")
47+
weaknesses = fields.TypedField("Weakness", Weakness, multiple=True, key_name="weaknesses")
48+
configuration = fields.TypedField("Configuration", Configuration, multiple=True)
49+
related_packages = fields.TypedField("Related_Packages", RelatedPackageRefs)
50+
information_source = fields.TypedField("Information_Source", InformationSource)
51+
4452
def __init__(self, id_=None, idref=None, timestamp=None, title=None,
4553
description=None, short_description=None):
4654

@@ -55,32 +63,7 @@ def __init__(self, id_=None, idref=None, timestamp=None, title=None,
5563

5664
self.potential_coas = PotentialCOAs()
5765
self.related_exploit_targets = RelatedExploitTargets()
58-
self.vulnerabilities = None
59-
self.weaknesses = None
60-
self.configuration = None
6166
self.related_packages = RelatedPackageRefs()
62-
63-
@property
64-
def vulnerabilities(self):
65-
"""A collection of :class:`.Vulnerability` objects. This behaves like
66-
a ``MutableSequence`` type.
67-
68-
Default Value: ``None``
69-
70-
Returns:
71-
A list of :class:`.Vulnerability`
72-
73-
Raises:
74-
ValueError: If set to a value that is not ``None`` and not an
75-
instance of :class:`.Vulnerability`
76-
77-
"""
78-
79-
return self._vulnerabilities
80-
81-
@vulnerabilities.setter
82-
def vulnerabilities(self, value):
83-
self._vulnerabilities = _Vulnerabilities(value)
8467

8568
def add_vulnerability(self, value):
8669
"""Adds a vulnerability to the :attr:`vulnerabilities` list property.
@@ -95,29 +78,7 @@ def add_vulnerability(self, value):
9578
ValueError: if the `value` param is of type :class:`.Vulnerability`
9679
9780
"""
98-
self.vulnerabilities.append(value)
99-
100-
@property
101-
def weaknesses(self):
102-
"""A collection of :class:`.Weakness` objects. This behaves like
103-
a ``MutableSequence`` type.
104-
105-
Default Value: ``None``
106-
107-
Returns:
108-
A list of :class:`.Weakness` objects.
109-
110-
Raises:
111-
ValueError: If set to a value that is not ``None`` and not an
112-
instance of :class:`.Weakness`
113-
114-
"""
115-
return self._weaknesses
116-
117-
@weaknesses.setter
118-
def weaknesses(self, value):
119-
self._weaknesses = _Weaknesses(value)
120-
81+
self.vul
12182
def add_weakness(self, value):
12283
"""Adds a weakness to the :attr:`weaknesses` list property.
12384
@@ -131,28 +92,6 @@ def add_weakness(self, value):
13192
13293
"""
13394
self.weaknesses.append(value)
134-
135-
@property
136-
def configuration(self):
137-
"""A list of :class:`.Configuration` objects. This behaves like
138-
a ``MutableSequence`` type.
139-
140-
Default Value: ``None``
141-
142-
Returns:
143-
A list of :class:`.Configuration` objects.
144-
145-
Raises:
146-
ValueError: If set to a value that is not ``None`` and not an
147-
instance of :class:`.Configuration`.
148-
149-
"""
150-
151-
return self._configuration
152-
153-
@configuration.setter
154-
def configuration(self, value):
155-
self._configuration = _Configurations(value)
15695

15796
def add_configuration(self, value):
15897
"""Adds a configuration to the :attr:`configurations` list property.
@@ -168,71 +107,7 @@ def add_configuration(self, value):
168107
169108
"""
170109
self.configuration.append(value)
171-
"""
172-
def to_obj(self, return_obj=None, ns_info=None):
173-
if not return_obj:
174-
return_obj = self._binding_class()
175-
176-
super(ExploitTarget, self).to_obj(return_obj=return_obj, ns_info=ns_info)
177-
178-
if self.potential_coas:
179-
return_obj.Potential_COAs = self.potential_coas.to_obj(ns_info=ns_info)
180-
if self.related_exploit_targets:
181-
return_obj.Related_Exploit_Targets = self.related_exploit_targets.to_obj(ns_info=ns_info)
182-
if self.vulnerabilities:
183-
return_obj.Vulnerability = self.vulnerabilities.to_obj(ns_info=ns_info)
184-
if self.weaknesses:
185-
return_obj.Weakness = self.weaknesses.to_obj(ns_info=ns_info)
186-
if self.configuration:
187-
return_obj.Configuration = self.configuration.to_obj(ns_info=ns_info)
188-
if self.related_packages:
189-
return_obj.Related_Packages = self.related_packages.to_obj(ns_info=ns_info)
190-
191-
return return_obj
192-
193-
@classmethod
194-
def from_obj(cls, obj, return_obj=None):
195-
if not obj:
196-
return None
197-
198-
if not return_obj:
199-
return_obj = cls()
200-
201-
super(ExploitTarget, cls).from_obj(obj, return_obj=return_obj)
202-
203-
if isinstance(obj, cls._binding_class):
204-
return_obj.potential_coas = PotentialCOAs.from_obj(obj.Potential_COAs)
205-
return_obj.related_exploit_targets = RelatedExploitTargets.from_obj(obj.Related_Exploit_Targets)
206-
return_obj.vulnerabilities = _Vulnerabilities.from_obj(obj.Vulnerability)
207-
return_obj.weaknesses = _Weaknesses.from_obj(obj.Weakness)
208-
return_obj.configuration = _Configurations.from_obj(obj.Configuration)
209-
return_obj.related_packages = RelatedPackageRefs.from_obj(obj.Related_Packages)
210-
211-
return return_obj
212-
213-
def to_dict(self):
214-
return super(ExploitTarget, self).to_dict()
215-
216-
@classmethod
217-
def from_dict(cls, dict_repr, return_obj=None):
218-
if not dict_repr:
219-
return None
220-
221-
if not return_obj:
222-
return_obj = cls()
223-
224-
super(ExploitTarget, cls).from_dict(dict_repr, return_obj=return_obj)
225110

226-
get = dict_repr.get
227-
return_obj.potential_coas = PotentialCOAs.from_dict(get('potential_coas'))
228-
return_obj.related_exploit_targets = RelatedExploitTargets.from_dict(get('related_exploit_targets'))
229-
return_obj.vulnerabilities = _Vulnerabilities.from_dict(get('vulnerabilities'))
230-
return_obj.weaknesses = _Weaknesses.from_dict(get('weaknesses'))
231-
return_obj.configuration = _Configurations.from_dict(get('configuration'))
232-
return_obj.related_packages = RelatedPackageRefs.from_dict(get('related_packages'))
233-
234-
return return_obj
235-
"""
236111

237112
class PotentialCOAs(GenericRelationshipList):
238113
"""

stix/exploit_target/configuration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def description(self):
4242
Returns:
4343
An instance of :class:`.StructuredText`
4444
"""
45-
return next(iter(self.descriptions), None)
45+
return next(iter(self.descriptions or []), None)
4646

4747
@description.setter
4848
def description(self, value):
@@ -69,7 +69,7 @@ def short_description(self):
6969
Returns:
7070
An instance of :class:`.StructuredText`
7171
"""
72-
return next(iter(self.short_descriptions), None)
72+
return next(iter(self.short_descriptions or []), None)
7373

7474
@short_description.setter
7575
def short_description(self, value):

stix/exploit_target/vulnerability.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ class Vulnerability(entities.Entity):
2727

2828
is_known = fields.BooleanField("is_known")
2929
is_publicly_ackowledged = fields.BooleanField("is_publicly_acknowledged")
30-
title = fields.TypedField("title")
30+
title = fields.TypedField("Title")
3131
descriptions = fields.TypedField("Description", type_="stix.common.StructuredTextList")
3232
short_descriptions = fields.TypedField("Short_Description", type_="stix.common.StructuredTextList")
3333
cve_id = fields.TypedField("CVE_ID")
3434
osvdb_id = fields.TypedField("OSVDB_ID")
35-
source = fields.TypedField("source")
35+
source = fields.TypedField("Source")
3636
cvss_score = fields.TypedField("CVSS_Score", "stix.exploit_target.vulnerability.CVSSVector")
3737
discovered_datetime = fields.TypedField("Discovered_DateTime", DateTimeWithPrecision)
3838
published_datetime = fields.TypedField("Published_DateTime", DateTimeWithPrecision)
@@ -59,7 +59,7 @@ def description(self):
5959
Returns:
6060
An instance of :class:`.StructuredText`
6161
"""
62-
return next(iter(self.descriptions), None)
62+
return next(iter(self.descriptions or []), None)
6363

6464
@description.setter
6565
def description(self, value):
@@ -86,7 +86,7 @@ def short_description(self):
8686
Returns:
8787
An instance of :class:`.StructuredText`
8888
"""
89-
return next(iter(self.short_descriptions), None)
89+
return next(iter(self.short_descriptions or []), None)
9090

9191
@short_description.setter
9292
def short_description(self, value):

stix/exploit_target/weakness.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def description(self):
3939
Returns:
4040
An instance of :class:`.StructuredText`
4141
"""
42-
return next(iter(self.descriptions), None)
42+
return next(iter(self.descriptions or []), None)
4343

4444
@description.setter
4545
def description(self, value):

stix/indicator/sightings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def description(self):
4949
An instance of :class:`.StructuredText`
5050
5151
"""
52-
return next(iter(self.descriptions), None)
52+
return next(iter(self.descriptions or []), None)
5353

5454
@description.setter
5555
def description(self, value):

stix/report/header.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def description(self):
6767
:class:`.StructuredText`
6868
6969
"""
70-
return next(iter(self.descriptions), None)
70+
return next(iter(self.descriptions or []), None)
7171

7272
@description.setter
7373
def description(self, value):
@@ -96,7 +96,7 @@ def short_description(self):
9696
An instance of :class:`.StructuredText`
9797
9898
"""
99-
return next(iter(self.short_descriptions), None)
99+
return next(iter(self.short_descriptions or []), None)
100100

101101
@short_description.setter
102102
def short_description(self, value):

stix/threat_actor/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class AssociatedCampaigns(GenericRelationshipList):
3838
_binding = threat_actor_binding
3939
_binding_class = threat_actor_binding.AssociatedCampaignsType
4040

41-
associated_campaign = fields.TypedField("Associated_Campaigns", RelatedCampaign, multiple=True, key_name="campaigns")
41+
associated_campaign = fields.TypedField("Associated_Campaign", RelatedCampaign, multiple=True, key_name="campaigns")
4242

4343

4444
class ThreatActor(stix.BaseCoreComponent):

stix/ttp/__init__.py

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class TTP(stix.BaseCoreComponent):
4949
resources = fields.TypedField("Resources", Resource)
5050
victim_targeting = fields.TypedField("Victim_Targeting", VictimTargeting)
5151
exploit_targets = fields.TypedField("Exploit_Targets", ExploitTargets)
52-
related_packages = fields.TypedField("Related_Pacakges", RelatedPackageRefs)
52+
related_packages = fields.TypedField("Related_Packages", RelatedPackageRefs)
5353
kill_chain_phases = fields.TypedField("Kill_Chain_Phases", KillChainPhasesReference)
5454

5555
def __init__(self, id_=None, idref=None, timestamp=None, title=None,
@@ -64,13 +64,7 @@ def __init__(self, id_=None, idref=None, timestamp=None, title=None,
6464
short_description=short_description
6565
)
6666

67-
self.behavior = None
68-
self.related_ttps = None
69-
self.intended_effects = None
70-
self.resources = None
71-
self.victim_targeting = None
72-
self.related_packages = None
73-
self.kill_chain_phases = None
67+
self.related_packages = RelatedPackageRefs()
7468

7569

7670
def add_related_ttp(self, value):
@@ -134,18 +128,6 @@ def add_kill_chain_phase(self, value):
134128
"""
135129
self.kill_chain_phases.append(value)
136130

137-
@property
138-
def related_packages(self):
139-
"""**DEPRECATED**: A collection of :class:`.RelatedPackageRef`
140-
objects. This behaves like a ``MutableSequence``.
141-
142-
"""
143-
return self._related_packages
144-
145-
@related_packages.setter
146-
def related_packages(self, value):
147-
self._related_packages = RelatedPackageRefs(value)
148-
149131
def add_related_package(self, value):
150132
"""Adds a :class:`.RelatedPackageRef` object to the
151133
:attr:`related_packages` collection.

0 commit comments

Comments
 (0)