Skip to content

Commit 0ed5f06

Browse files
committed
fix
1 parent 5f57375 commit 0ed5f06

File tree

3 files changed

+35
-36
lines changed

3 files changed

+35
-36
lines changed

uncoder-core/app/translator/core/mitre.py

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,15 @@
22
import os
33
import ssl
44
import urllib.request
5-
from dataclasses import dataclass
65
from json import JSONDecodeError
7-
from typing import Optional, Union
6+
from typing import Optional
87
from urllib.error import HTTPError
98

9+
from app.translator.core.models.query_container import MitreInfoContainer, MitreTacticContainer, MitreTechniqueContainer
1010
from app.translator.tools.singleton_meta import SingletonMeta
1111
from const import ROOT_PROJECT_PATH
1212

1313

14-
@dataclass
15-
class MitreTechniqueContainer:
16-
technique_id: str
17-
name: str
18-
url: str
19-
tactic: list[str]
20-
21-
22-
@dataclass
23-
class MitreTacticContainer:
24-
external_id: str
25-
url: str
26-
name: str
27-
28-
29-
@dataclass
30-
class MitreInfoContainer:
31-
tactics: Union[list[MitreTacticContainer], list]
32-
techniques: Union[list[MitreTechniqueContainer], list]
33-
34-
3514
class MitreConfig(metaclass=SingletonMeta):
3615
config_url: str = "https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json"
3716
mitre_source_types: tuple = ("mitre-attack",)
@@ -157,16 +136,13 @@ def get_technique(self, technique_id: str) -> Optional[MitreTechniqueContainer]:
157136

158137
def get_mitre_info(
159138
self, tactics: Optional[list[str]] = None, techniques: Optional[list[str]] = None
160-
) -> Optional[MitreInfoContainer]:
139+
) -> MitreInfoContainer:
161140
tactics_list = []
162141
techniques_list = []
163-
if tactics:
164-
for tactic in tactics:
165-
if tactic_found := self.get_tactic(tactic=tactic.lower()):
166-
tactics_list.append(tactic_found)
167-
if techniques:
168-
for technique in techniques:
169-
if technique_found := self.get_technique(technique_id=technique.lower()):
170-
techniques_list.append(technique_found)
171-
if tactics_list or techniques_list:
172-
return MitreInfoContainer(tactics=tactics_list, techniques=techniques_list)
142+
for tactic in tactics or []:
143+
if tactic_found := self.get_tactic(tactic=tactic.lower()):
144+
tactics_list.append(tactic_found)
145+
for technique in techniques or []:
146+
if technique_found := self.get_technique(technique_id=technique.lower()):
147+
techniques_list.append(technique_found)
148+
return MitreInfoContainer(tactics=tactics_list, techniques=techniques_list)

uncoder-core/app/translator/core/models/query_container.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,31 @@
66
from app.translator.core.const import QUERY_TOKEN_TYPE
77
from app.translator.core.custom_types.meta_info import SeverityType
88
from app.translator.core.mapping import DEFAULT_MAPPING_NAME
9-
from app.translator.core.mitre import MitreInfoContainer
109
from app.translator.core.models.functions.base import ParsedFunctions
1110
from app.translator.core.models.query_tokens.field import Field
1211

1312

13+
@dataclass
14+
class MitreTechniqueContainer:
15+
technique_id: str
16+
name: str
17+
url: str
18+
tactic: list[str]
19+
20+
21+
@dataclass
22+
class MitreTacticContainer:
23+
external_id: str
24+
url: str
25+
name: str
26+
27+
28+
@dataclass
29+
class MitreInfoContainer:
30+
tactics: list[MitreTacticContainer] = field(default_factory=list)
31+
techniques: list[MitreTechniqueContainer] = field(default_factory=list)
32+
33+
1434
class MetaInfoContainer:
1535
def __init__(
1636
self,

uncoder-core/app/translator/tools/utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ def parse_rule_description_str(description: str) -> dict:
8585
pattern = r"___name___:\s*(?P<value>.+)\."
8686
for key, name in keys_map.items():
8787
if search := re.search(pattern.replace("___name___", name), description):
88-
parsed[key] = search.group("value")
88+
if key == "author":
89+
parsed[key] = search.group("value").split(",")
90+
else:
91+
parsed[key] = search.group("value")
8992
description = description[: search.start()]
9093

9194
parsed["description"] = description.strip()

0 commit comments

Comments
 (0)