Skip to content

Commit 13998c5

Browse files
committed
fix
1 parent 0ed5f06 commit 13998c5

File tree

6 files changed

+21
-11
lines changed

6 files changed

+21
-11
lines changed

uncoder-core/app/translator/core/mixins/rule.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ def parse_mitre_attack(self, tags: list[str]) -> Optional[MitreInfoContainer]:
4141
parsed_techniques.append(technique)
4242
elif tactic := self.mitre_config.get_tactic(tag):
4343
parsed_tactics.append(tactic)
44-
if parsed_techniques or parsed_tactics:
45-
return MitreInfoContainer(tactics=parsed_tactics, techniques=parsed_techniques)
44+
return MitreInfoContainer(tactics=parsed_tactics, techniques=parsed_techniques)
4645

4746

4847
class XMLRuleMixin:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ def __init__(
4646
severity: Optional[str] = None,
4747
references: Optional[list[str]] = None,
4848
tags: Optional[list[str]] = None,
49-
mitre_attack: Optional[MitreInfoContainer] = None,
5049
raw_mitre_attack: Optional[list[str]] = None,
5150
status: Optional[str] = None,
5251
false_positives: Optional[list[str]] = None,
5352
source_mapping_ids: Optional[list[str]] = None,
5453
parsed_logsources: Optional[dict] = None,
5554
timeframe: Optional[timedelta] = None,
55+
mitre_attack: MitreInfoContainer = MitreInfoContainer(),
5656
) -> None:
5757
self.id = id_ or str(uuid.uuid4())
5858
self.title = title or ""

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ def wrap_with_meta_info(self, query: str, meta_info: Optional[MetaInfoContainer]
320320
meta_info_dict = {
321321
"name: ": meta_info.title,
322322
"uuid: ": meta_info.id,
323-
"author: ": meta_info.author if meta_info.author else "not defined in query/rule",
323+
"author: ": ", ".join(meta_info.author) if meta_info.author else "not defined in query/rule",
324324
"licence: ": meta_info.license,
325325
}
326326
query_meta_info = "\n".join(

uncoder-core/app/translator/platforms/elasticsearch/renders/detection_rule.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
ElasticSearchFieldValue,
3434
ElasticSearchQueryRender,
3535
)
36+
from app.translator.tools.utils import get_rule_description_str
3637

3738
_AUTOGENERATED_TEMPLATE = "Autogenerated Elastic Rule"
3839

@@ -94,10 +95,14 @@ def finalize_query(
9495
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
9596
rule = copy.deepcopy(ELASTICSEARCH_DETECTION_RULE)
9697
index = source_mapping.log_source_signature.default_source.get("index") if source_mapping else None
98+
description_str = get_rule_description_str(
99+
description=meta_info.description or rule["description"] or _AUTOGENERATED_TEMPLATE,
100+
license_=meta_info.license,
101+
)
97102
rule.update(
98103
{
99104
"query": query,
100-
"description": meta_info.description or rule["description"] or _AUTOGENERATED_TEMPLATE,
105+
"description": description_str,
101106
"name": meta_info.title or _AUTOGENERATED_TEMPLATE,
102107
"rule_id": meta_info.id,
103108
"author": meta_info.author,

uncoder-core/app/translator/platforms/microsoft/renders/microsoft_sentinel_rule.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from app.translator.core.custom_types.meta_info import SeverityType
2525
from app.translator.core.mapping import SourceMapping
2626
from app.translator.core.models.platform_details import PlatformDetails
27-
from app.translator.core.models.query_container import MetaInfoContainer
27+
from app.translator.core.models.query_container import MetaInfoContainer, MitreInfoContainer
2828
from app.translator.managers import render_manager
2929
from app.translator.platforms.microsoft.const import DEFAULT_MICROSOFT_SENTINEL_RULE, microsoft_sentinel_rule_details
3030
from app.translator.platforms.microsoft.mapping import MicrosoftSentinelMappings, microsoft_sentinel_rule_mappings
@@ -54,14 +54,14 @@ class MicrosoftSentinelRuleRender(MicrosoftSentinelQueryRender):
5454
or_token = "or"
5555
field_value_render = MicrosoftSentinelRuleFieldValueRender(or_token=or_token)
5656

57-
def __create_mitre_threat(self, meta_info: MetaInfoContainer) -> tuple[list, list]:
57+
def __create_mitre_threat(self, mitre_attack: MitreInfoContainer) -> tuple[list, list]:
5858
tactics = set()
5959
techniques = []
6060

61-
for tactic in meta_info.mitre_attack.tactics:
61+
for tactic in mitre_attack.tactics:
6262
tactics.add(tactic.name)
6363

64-
for technique in meta_info.mitre_attack.techniques:
64+
for technique in mitre_attack.techniques:
6565
if technique.tactic:
6666
for tactic in technique.tactic:
6767
tactics.add(tactic)
@@ -91,7 +91,7 @@ def finalize_query(
9191
license_=meta_info.license,
9292
)
9393
rule["severity"] = _SEVERITIES_MAP.get(meta_info.severity, SeverityType.medium)
94-
mitre_tactics, mitre_techniques = self.__create_mitre_threat(meta_info=meta_info)
94+
mitre_tactics, mitre_techniques = self.__create_mitre_threat(mitre_attack=meta_info.mitre_attack)
9595
rule["tactics"] = mitre_tactics
9696
rule["techniques"] = mitre_techniques
9797
json_rule = json.dumps(rule, indent=4, sort_keys=False)

uncoder-core/app/translator/platforms/sigma/renders/sigma.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from app.translator.platforms.sigma.models.group import Group
3838
from app.translator.platforms.sigma.models.operator import AND, NOT, OR
3939
from app.translator.platforms.sigma.str_value_manager import sigma_str_value_manager
40+
from app.translator.tools.utils import get_rule_description_str
4041

4142
_AUTOGENERATED_TEMPLATE = "Autogenerated Sigma Rule"
4243

@@ -288,10 +289,15 @@ def generate_from_tokenized_query_container(self, query_container: TokenizedQuer
288289
rendered_functions = self.platform_functions.render(query_container.functions.functions, source_mapping)
289290
not_supported_functions = query_container.functions.not_supported + rendered_functions.not_supported
290291

292+
description_str = get_rule_description_str(
293+
description=meta_info.description or _AUTOGENERATED_TEMPLATE,
294+
license_=meta_info.license
295+
)
296+
291297
rule = {
292298
"title": meta_info.title or _AUTOGENERATED_TEMPLATE,
293299
"id": meta_info.id,
294-
"description": meta_info.description or _AUTOGENERATED_TEMPLATE,
300+
"description": description_str,
295301
"status": "experimental",
296302
"author": meta_info.author,
297303
"references": meta_info.references,

0 commit comments

Comments
 (0)