Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DataModel Plugin #2494

Merged
merged 75 commits into from
Nov 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
fa34c52
added data models
cristinaascari Jul 30, 2024
604738b
updated data models
cristinaascari Jul 31, 2024
1cf2e0a
updated data models
cristinaascari Jul 31, 2024
45b7f10
updated data models
cristinaascari Jul 31, 2024
a234319
updated data models
cristinaascari Aug 1, 2024
38c0c29
fix
cristinaascari Aug 1, 2024
3bc44c5
fix
cristinaascari Aug 2, 2024
29f4313
update data models
cristinaascari Aug 5, 2024
1913000
fix
cristinaascari Aug 5, 2024
90187fb
update file data model
cristinaascari Aug 5, 2024
b4462a0
update file data model
cristinaascari Aug 5, 2024
4140f2f
updates file data model
cristinaascari Aug 6, 2024
5ab5614
updates file data model
cristinaascari Aug 6, 2024
e82f98e
updates file data model
cristinaascari Aug 6, 2024
f12776d
updates
cristinaascari Aug 9, 2024
845406c
updates data models
cristinaascari Aug 9, 2024
6f91d84
fix
cristinaascari Aug 9, 2024
0a6529c
fix
cristinaascari Aug 9, 2024
210f008
fix CharFiled max_length
cristinaascari Aug 26, 2024
88376fc
fixes
cristinaascari Aug 26, 2024
858b200
fixes
cristinaascari Aug 26, 2024
7ebe465
Added BaseDataModel
cristinaascari Aug 26, 2024
3717b95
updated BaseDataModel
cristinaascari Aug 26, 2024
8e78524
updates data models
cristinaascari Aug 26, 2024
bdddb86
Merge branch 'develop' into datamodel_plugin
cristinaascari Aug 27, 2024
e6b289d
updates data models
cristinaascari Aug 27, 2024
beb3ff8
added admin data models
cristinaascari Aug 29, 2024
6261ec0
field names fixes
cristinaascari Aug 29, 2024
de6b938
fix ip data model
cristinaascari Aug 29, 2024
dca7a50
fix ip data model admin
cristinaascari Aug 29, 2024
db3f59a
fixes FileDataModel fields
cristinaascari Aug 30, 2024
b0119d6
Update external_references field
cristinaascari Aug 30, 2024
e0e64da
fix linters
cristinaascari Aug 30, 2024
a7beacb
fixes
cristinaascari Aug 30, 2024
0b934ff
updates signature field
cristinaascari Aug 30, 2024
dbbd637
updates tags field
cristinaascari Aug 30, 2024
f57abe3
fix
cristinaascari Aug 30, 2024
1018903
updates data model admin
cristinaascari Aug 30, 2024
3dab81c
fix
cristinaascari Aug 30, 2024
8c96d36
moved data_model into api_app
cristinaascari Sep 2, 2024
7c81328
moved data_model into api_app
cristinaascari Sep 2, 2024
48bfb83
Added unique_together constraint in IETFReport
cristinaascari Sep 2, 2024
c03102a
Merge branch 'develop' into datamodel_plugin
0ssigeno Sep 18, 2024
1b84446
More stuff
0ssigeno Sep 24, 2024
a1cba27
Stuff
0ssigeno Oct 7, 2024
f853d59
More fixes
0ssigeno Oct 14, 2024
c7fa248
More test and logs
0ssigeno Oct 14, 2024
0d85592
Blake
0ssigeno Oct 14, 2024
5dacc79
More
0ssigeno Oct 16, 2024
8e3a3e4
Mini rework
0ssigeno Oct 16, 2024
6914ecd
Blake
0ssigeno Oct 16, 2024
9aeebe3
Blake
0ssigeno Oct 16, 2024
f2384be
Fixes
0ssigeno Oct 16, 2024
84421b4
Merge branch 'develop' into datamodel_plugin
0ssigeno Oct 16, 2024
dba0c22
Fixes
0ssigeno Oct 16, 2024
89875f5
Fixes
0ssigeno Oct 16, 2024
4ad19ab
Technically we can have some mapping with post processing
0ssigeno Oct 16, 2024
bf17b04
bgp_ranking mapping
cristinaascari Oct 21, 2024
c2ef65f
more analyzer mappings
cristinaascari Oct 22, 2024
b175d72
fixes analyzer mappings
cristinaascari Oct 23, 2024
5cd8f3a
more mappings
cristinaascari Oct 23, 2024
fa5a40b
Tor mapping
cristinaascari Oct 23, 2024
a084c17
Fix retrieval
0ssigeno Oct 29, 2024
411a3fc
Upgrade data models
0ssigeno Nov 8, 2024
bba4baa
More
0ssigeno Nov 8, 2024
6305f44
updates data model
cristinaascari Nov 27, 2024
6cd174f
updates data model
cristinaascari Nov 27, 2024
86faaad
Merge branch 'develop' into datamodel_plugin
cristinaascari Nov 27, 2024
1970b5d
fix migrations
cristinaascari Nov 27, 2024
69f16bd
fixes
cristinaascari Nov 27, 2024
c0650d2
black
cristinaascari Nov 27, 2024
c686867
fix
cristinaascari Nov 27, 2024
12db34f
Merge branch 'develop' into datamodel_plugin
cristinaascari Nov 28, 2024
7511c3f
black
cristinaascari Nov 28, 2024
d3a17c9
Fixes
cristinaascari Nov 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 48 additions & 2 deletions api_app/analyzers_manager/classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,48 @@ class BaseAnalyzerMixin(Plugin, metaclass=ABCMeta):
ObservableTypes = ObservableTypes
TypeChoices = TypeChoices

MALICIOUS_EVALUATION = 75
SUSPICIOUS_EVALUATION = 35
FALSE_POSITIVE = -50

def threat_to_evaluation(self, threat_level):
# MAGIC NUMBERS HERE!!!
# I know, it should be 25-50-75-100. We raised it a bit because too many false positives were generated
self.report: AnalyzerReport
if threat_level >= self.MALICIOUS_EVALUATION:
evaluation = self.report.data_model_class.EVALUATIONS.MALICIOUS.value
elif threat_level >= self.SUSPICIOUS_EVALUATION:
evaluation = self.report.data_model_class.EVALUATIONS.SUSPICIOUS.value
elif threat_level <= self.FALSE_POSITIVE:
evaluation = self.report.data_model_class.EVALUATIONS.TRUSTED.value
else:
evaluation = self.report.data_model_class.EVALUATIONS.CLEAN.value
return evaluation

def _do_create_data_model(self) -> bool:
if self.report.job.observable_classification == ObservableTypes.GENERIC:
return False
return True

def _create_data_model_mtm(self):
return {}

def _update_data_model(self, data_model) -> None:
mtm = self._create_data_model_mtm()
for field_name, value in mtm.items():
field = getattr(data_model, field_name)
field.add(*value)

def create_data_model(self):
self.report: AnalyzerReport
if self._do_create_data_model():
data_model = self.report.create_data_model()
if data_model:
self._update_data_model(data_model)
data_model.save()
return data_model
return None

@classmethod
@property
def config_exception(cls):
Expand Down Expand Up @@ -108,7 +150,11 @@ def after_run_success(self, content):
Args:
content (any): The content to process after a successful run.
"""
super().after_run_success(self._validate_result(content, max_recursion=15))
result = super().after_run_success(
self._validate_result(content, max_recursion=15)
)
self.create_data_model()
return result


class ObservableAnalyzer(BaseAnalyzerMixin, metaclass=ABCMeta):
Expand Down Expand Up @@ -326,7 +372,7 @@ def __polling(self, req_key: str, chance: int, re_poll_try: int = 0):
return self.__polling(req_key, chance, re_poll_try=re_poll_try + 1)
else:
status = json_data.get("status", None)
if status and status == self._job.Status.RUNNING.value:
if status and status == self._job.STATUSES.RUNNING.value:
logger.info(
f"Poll number #{chance + 1}, "
f"status: 'running' <-- {self.__repr__()}"
Expand Down
2 changes: 1 addition & 1 deletion api_app/analyzers_manager/file_analyzers/elf_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def run(self):
)
logger.warning(warning_message)
self.report.errors.append(warning_message)
self.report.status = self.report.Status.FAILED
self.report.status = self.report.STATUSES.FAILED
self.report.save()

return results
2 changes: 1 addition & 1 deletion api_app/analyzers_manager/file_analyzers/pe_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ def run(self):
)
logger.warning(warning_message)
self.report.errors.append(warning_message)
self.report.status = self.report.Status.FAILED
self.report.status = self.report.STATUSES.FAILED
self.report.save()

return results
Expand Down
30 changes: 30 additions & 0 deletions api_app/analyzers_manager/file_analyzers/yara_scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -438,3 +438,33 @@ def update(cls):
logger.info("Finished updating yara rules")
set_permissions(settings.YARA_RULES_PATH)
return True

def _create_data_model_mtm(self):
from api_app.data_model_manager.models import Signature

signatures = []
for yara_signatures in self.report.report.values():
for yara_signature in yara_signatures:
url = yara_signature.pop("rule_url", None)
sign = Signature.objects.create(
provider=Signature.PROVIDERS.YARA.value,
signature=yara_signature,
url=url,
score=1,
)
signatures.append(sign)

return {"signatures": signatures}

def _update_data_model(self, data_model):
from api_app.data_model_manager.models import FileDataModel

super()._update_data_model(data_model)
data_model: FileDataModel
signatures = data_model.signatures.count()

if signatures:
self.MALICIOUS_EVALUATION = 20
self.SUSPICIOUS_EVALUATION = 10

data_model.evaluation = self.threat_to_evaluation(signatures)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 4.2.15 on 2024-10-14 07:24

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("analyzers_manager", "0133_analyzer_config_urldna_search"),
]

operations = [
migrations.AddField(
model_name="analyzerconfig",
name="mapping_data_model",
field=models.JSONField(
default=dict, help_text="Mapping data_model_key: analyzer_report_key. "
),
),
]
58 changes: 58 additions & 0 deletions api_app/analyzers_manager/migrations/0135_data_mapping.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Generated by Django 4.2.15 on 2024-10-14 07:24

from django.db import migrations


def migrate_urlhaus(apps, schema_editor):
AnalyzerConfig = apps.get_model("analyzers_manager", "AnalyzerConfig")
ac = AnalyzerConfig.objects.filter(name="URLhaus").first()
if not ac:
return
ac.mapping_data_model = {
"urlhaus_reference": "external_references",
"$malicious": "evaluation",
"urls.url": "related_threats",
}
ac.save()


def migrate_maxmind(apps, schema_editor):
AnalyzerConfig = apps.get_model("analyzers_manager", "AnalyzerConfig")
ac = AnalyzerConfig.objects.filter(name="MaxMindGeoIP").first()
if not ac:
return
ac.mapping_data_model = {
"country.iso_code": "country_code",
"registered_country_code.iso_code": "registered_country_code",
"autonomous_system_number": "asn",
"autonomous_system_organization": "isp",
}
ac.save()


def migrate_abuse_ipdb(apps, schema_editor):
AnalyzerConfig = apps.get_model("analyzers_manager", "AnalyzerConfig")
ac = AnalyzerConfig.objects.filter(name="AbuseIPDB").first()
if not ac:
return
ac.mapping_data_model = {
"data.countryCode": "country_code",
"permalink": "external_references",
"data.hostnames": "resolutions",
"data.isp": "isp",
"categories_found": "tags",
}
ac.save()


class Migration(migrations.Migration):

dependencies = [
("analyzers_manager", "0134_analyzerconfig_mapping_data_model"),
]

operations = [
migrations.RunPython(migrate_maxmind, migrations.RunPython.noop),
migrations.RunPython(migrate_abuse_ipdb, migrations.RunPython.noop),
migrations.RunPython(migrate_urlhaus, migrations.RunPython.noop),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# Generated by Django 4.2.16 on 2024-11-08 09:21

from django.db import migrations, models

import api_app.fields


class Migration(migrations.Migration):

dependencies = [
("analyzers_manager", "0135_data_mapping"),
]

operations = [
migrations.AlterField(
model_name="analyzerconfig",
name="mapping_data_model",
field=models.JSONField(
default=dict,
help_text="Mapping analyzer_report_key: data_model_key. Keys preceded by the symbol $ will be considered as constants.",
),
),
migrations.AlterField(
model_name="analyzerconfig",
name="not_supported_filetypes",
field=api_app.fields.ChoiceArrayField(
base_field=models.CharField(
choices=[
("application/w-script-file", "Wscript"),
("application/javascript", "Javascript1"),
("application/x-javascript", "Javascript2"),
("text/javascript", "Javascript3"),
("application/x-vbscript", "Vb Script"),
("text/x-ms-iqy", "Iqy"),
("application/vnd.android.package-archive", "Apk"),
("application/x-dex", "Dex"),
("application/onenote", "One Note"),
("application/zip", "Zip1"),
("multipart/x-zip", "Zip2"),
("application/java-archive", "Java"),
("text/rtf", "Rtf1"),
("application/rtf", "Rtf2"),
("application/x-sharedlib", "Shared Lib"),
("application/vnd.microsoft.portable-executable", "Exe"),
("application/x-elf", "Elf"),
("application/octet-stream", "Octet"),
("application/vnd.tcpdump.pcap", "Pcap"),
("application/pdf", "Pdf"),
("text/html", "Html"),
("application/x-mspublisher", "Pub"),
("application/vnd.ms-excel.addin.macroEnabled", "Excel Macro1"),
(
"application/vnd.ms-excel.sheet.macroEnabled.12",
"Excel Macro2",
),
("application/vnd.ms-excel", "Excel1"),
("application/excel", "Excel2"),
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Doc",
),
("application/xml", "Xml1"),
("text/xml", "Xml2"),
("application/encrypted", "Encrypted"),
("text/plain", "Plain"),
("text/csv", "Csv"),
(
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"Pptx",
),
("application/msword", "Word1"),
(
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"Word2",
),
("application/vnd.ms-powerpoint", "Powerpoint"),
("application/vnd.ms-office", "Office"),
("application/x-binary", "Binary"),
("application/x-macbinary", "Mac1"),
("application/mac-binary", "Mac2"),
("application/x-mach-binary", "Mac3"),
("application/x-zip-compressed", "Compress1"),
("application/x-compressed", "Compress2"),
("application/vnd.ms-outlook", "Outlook"),
("message/rfc822", "Eml"),
("application/pkcs7-signature", "Pkcs7"),
("application/x-pkcs7-signature", "Xpkcs7"),
("multipart/mixed", "Mixed"),
("text/x-shellscript", "X Shellscript"),
("application/x-chrome-extension", "Crx"),
("application/json", "Json"),
("application/x-executable", "Executable"),
("text/x-java", "Java2"),
("text/x-kotlin", "Kotlin"),
("text/x-swift", "Swift"),
("text/x-objective-c", "Objective C Code"),
("application/x-ms-shortcut", "Lnk"),
],
max_length=90,
),
blank=True,
default=list,
size=None,
),
),
migrations.AlterField(
model_name="analyzerconfig",
name="supported_filetypes",
field=api_app.fields.ChoiceArrayField(
base_field=models.CharField(
choices=[
("application/w-script-file", "Wscript"),
("application/javascript", "Javascript1"),
("application/x-javascript", "Javascript2"),
("text/javascript", "Javascript3"),
("application/x-vbscript", "Vb Script"),
("text/x-ms-iqy", "Iqy"),
("application/vnd.android.package-archive", "Apk"),
("application/x-dex", "Dex"),
("application/onenote", "One Note"),
("application/zip", "Zip1"),
("multipart/x-zip", "Zip2"),
("application/java-archive", "Java"),
("text/rtf", "Rtf1"),
("application/rtf", "Rtf2"),
("application/x-sharedlib", "Shared Lib"),
("application/vnd.microsoft.portable-executable", "Exe"),
("application/x-elf", "Elf"),
("application/octet-stream", "Octet"),
("application/vnd.tcpdump.pcap", "Pcap"),
("application/pdf", "Pdf"),
("text/html", "Html"),
("application/x-mspublisher", "Pub"),
("application/vnd.ms-excel.addin.macroEnabled", "Excel Macro1"),
(
"application/vnd.ms-excel.sheet.macroEnabled.12",
"Excel Macro2",
),
("application/vnd.ms-excel", "Excel1"),
("application/excel", "Excel2"),
(
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Doc",
),
("application/xml", "Xml1"),
("text/xml", "Xml2"),
("application/encrypted", "Encrypted"),
("text/plain", "Plain"),
("text/csv", "Csv"),
(
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"Pptx",
),
("application/msword", "Word1"),
(
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"Word2",
),
("application/vnd.ms-powerpoint", "Powerpoint"),
("application/vnd.ms-office", "Office"),
("application/x-binary", "Binary"),
("application/x-macbinary", "Mac1"),
("application/mac-binary", "Mac2"),
("application/x-mach-binary", "Mac3"),
("application/x-zip-compressed", "Compress1"),
("application/x-compressed", "Compress2"),
("application/vnd.ms-outlook", "Outlook"),
("message/rfc822", "Eml"),
("application/pkcs7-signature", "Pkcs7"),
("application/x-pkcs7-signature", "Xpkcs7"),
("multipart/mixed", "Mixed"),
("text/x-shellscript", "X Shellscript"),
("application/x-chrome-extension", "Crx"),
("application/json", "Json"),
("application/x-executable", "Executable"),
("text/x-java", "Java2"),
("text/x-kotlin", "Kotlin"),
("text/x-swift", "Swift"),
("text/x-objective-c", "Objective C Code"),
("application/x-ms-shortcut", "Lnk"),
],
max_length=90,
),
blank=True,
default=list,
size=None,
),
),
]
Loading
Loading