diff --git a/vulnerabilities/migrations/0141_advisorymitigations.py b/vulnerabilities/migrations/0141_advisorymitigations.py new file mode 100644 index 000000000..227380b98 --- /dev/null +++ b/vulnerabilities/migrations/0141_advisorymitigations.py @@ -0,0 +1,94 @@ +# Generated by Django 5.2.11 on 2026-07-22 18:14 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("vulnerabilities", "0140_alter_advisorytodo_issue_type_and_more"), + ] + + operations = [ + migrations.CreateModel( + name="AdvisoryMitigations", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + ( + "base_purl", + models.CharField( + help_text="Version less PURL related to mitigation.", max_length=500 + ), + ), + ("upgrade_to_versions_note", models.TextField(blank=True)), + ("downgrade_to_versions_note", models.TextField(blank=True)), + ("patches_note", models.TextField(blank=True)), + ( + "config_change", + models.TextField( + blank=True, help_text="Configuration change to mitigate the advisory." + ), + ), + ("config_change_note", models.TextField(blank=True)), + ( + "filter_ports_ips", + models.TextField( + blank=True, help_text="Filter Ports and IPs to mitigate the advisory." + ), + ), + ("filter_ports_ips_note", models.TextField(blank=True)), + ("replace_package_note", models.TextField(blank=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "advisory", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="mitigations", + to="vulnerabilities.advisoryv2", + ), + ), + ( + "downgrade_to_versions", + models.ManyToManyField( + blank=True, + help_text="Packages that mitigates the advisory by downgrading.", + related_name="downgrade_mitigations", + to="vulnerabilities.packagev2", + ), + ), + ( + "patches", + models.ManyToManyField( + help_text="Patches to mitigate the advisory.", + related_name="patch_mitigations", + to="vulnerabilities.packagecommitpatch", + ), + ), + ( + "replace_with_packages", + models.ManyToManyField( + blank=True, + help_text="Packages that can replace the vulnerable package.", + related_name="replacement_mitigations", + to="vulnerabilities.packagev2", + ), + ), + ( + "upgrade_to_versions", + models.ManyToManyField( + blank=True, + help_text="Packages that mitigates the advisory by upgrading.", + related_name="upgrade_mitigations", + to="vulnerabilities.packagev2", + ), + ), + ], + ), + ] diff --git a/vulnerabilities/models.py b/vulnerabilities/models.py index 0787cdd45..826d35a54 100644 --- a/vulnerabilities/models.py +++ b/vulnerabilities/models.py @@ -3470,6 +3470,67 @@ class Meta: ] +class AdvisoryMitigations(models.Model): + + advisory = models.ForeignKey( + AdvisoryV2, + related_name="mitigations", + on_delete=models.CASCADE, + ) + + base_purl = models.CharField( + max_length=500, + blank=False, + help_text="Version less PURL related to mitigation.", + ) + + upgrade_to_versions = models.ManyToManyField( + "PackageV2", + blank=True, + related_name="upgrade_mitigations", + help_text="Packages that mitigates the advisory by upgrading.", + ) + upgrade_to_versions_note = models.TextField(blank=True) + + downgrade_to_versions = models.ManyToManyField( + "PackageV2", + blank=True, + related_name="downgrade_mitigations", + help_text="Packages that mitigates the advisory by downgrading.", + ) + downgrade_to_versions_note = models.TextField(blank=True) + + patches = models.ManyToManyField( + "PackageCommitPatch", + related_name="patch_mitigations", + help_text="Patches to mitigate the advisory.", + ) + patches_note = models.TextField(blank=True) + + config_change = models.TextField( + blank=True, + help_text="Configuration change to mitigate the advisory.", + ) + config_change_note = models.TextField(blank=True) + + filter_ports_ips = models.TextField( + blank=True, + help_text="Filter Ports and IPs to mitigate the advisory.", + ) + filter_ports_ips_note = models.TextField(blank=True) + + replace_with_packages = models.ManyToManyField( + "PackageV2", + blank=True, + related_name="replacement_mitigations", + help_text="Packages that can replace the vulnerable package.", + ) + replace_package_note = models.TextField(blank=True) + + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class ToDoRelatedAdvisory(models.Model): todo = models.ForeignKey( AdvisoryToDo, diff --git a/vulnerabilities/templates/advisory_todos.html b/vulnerabilities/templates/advisory_todos.html index f3eca864a..d77a5af77 100644 --- a/vulnerabilities/templates/advisory_todos.html +++ b/vulnerabilities/templates/advisory_todos.html @@ -129,6 +129,8 @@
{{ avid }}
+| Mitigation Type | +Mitigation Data | +Mitigation Note | +
|---|