Skip to content

Commit 84a35db

Browse files
TG1999ziadhanykeshav-space
authored
Add support for reference_type (#1518)
* Revert "Revert "Add support for reference_type (#1502)" (#1517)" This reverts commit 6727786. Signed-off-by: ziadhany <[email protected]> * Fix cargo test Signed-off-by: ziadhany <[email protected]> * Fix test by adding reference_type to ordering list Signed-off-by: ziadhany <[email protected]> * Regen apache_kafka test fixture Signed-off-by: Keshav Priyadarshi <[email protected]> --------- Signed-off-by: ziadhany <[email protected]> Signed-off-by: Keshav Priyadarshi <[email protected]> Co-authored-by: ziadhany <[email protected]> Co-authored-by: Keshav Priyadarshi <[email protected]>
1 parent 574d06e commit 84a35db

File tree

98 files changed

+5707
-1458
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+5707
-1458
lines changed

vulnerabilities/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class VulnerabilityReferenceSerializer(serializers.ModelSerializer):
4747

4848
class Meta:
4949
model = VulnerabilityReference
50-
fields = ["reference_url", "reference_id", "scores", "url"]
50+
fields = ["reference_url", "reference_id", "reference_type", "scores", "url"]
5151

5252

5353
class BaseResourceSerializer(serializers.HyperlinkedModelSerializer):

vulnerabilities/importer.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def from_dict(cls, severity: dict):
7676
@dataclasses.dataclass(order=True)
7777
class Reference:
7878
reference_id: str = ""
79+
reference_type: str = ""
7980
url: str = ""
8081
severities: List[VulnerabilitySeverity] = dataclasses.field(default_factory=list)
8182

@@ -85,11 +86,17 @@ def __post_init__(self):
8586

8687
def normalized(self):
8788
severities = sorted(self.severities)
88-
return Reference(reference_id=self.reference_id, url=self.url, severities=severities)
89+
return Reference(
90+
reference_id=self.reference_id,
91+
url=self.url,
92+
severities=severities,
93+
reference_type=self.reference_type,
94+
)
8995

9096
def to_dict(self):
9197
return {
9298
"reference_id": self.reference_id,
99+
"reference_type": self.reference_type,
93100
"url": self.url,
94101
"severities": [severity.to_dict() for severity in self.severities],
95102
}
@@ -98,6 +105,7 @@ def to_dict(self):
98105
def from_dict(cls, ref: dict):
99106
return cls(
100107
reference_id=ref["reference_id"],
108+
reference_type=ref["reference_type"],
101109
url=ref["url"],
102110
severities=[
103111
VulnerabilitySeverity.from_dict(severity) for severity in ref["severities"]

vulnerabilities/importers/fireeye.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ def get_references(references):
8989
"""
9090
Return a list of Reference from a list of URL reference in md format
9191
>>> get_references(["- http://1-4a.com/cgi-bin/alienform/af.cgi"])
92-
[Reference(reference_id='', url='http://1-4a.com/cgi-bin/alienform/af.cgi', severities=[])]
92+
[Reference(reference_id='', reference_type='', url='http://1-4a.com/cgi-bin/alienform/af.cgi', severities=[])]
9393
>>> get_references(["- [Mitre CVE-2021-42712](https://www.cve.org/CVERecord?id=CVE-2021-42712)"])
94-
[Reference(reference_id='', url='https://www.cve.org/CVERecord?id=CVE-2021-42712', severities=[])]
94+
[Reference(reference_id='', reference_type='', url='https://www.cve.org/CVERecord?id=CVE-2021-42712', severities=[])]
9595
"""
9696
urls = []
9797
for ref in references:

vulnerabilities/improve_runner.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,14 @@ def process_inferences(
9898

9999
reference = VulnerabilityReference.objects.get_or_none(
100100
reference_id=ref.reference_id,
101+
reference_type=ref.reference_type,
101102
url=ref.url,
102103
)
103104

104105
if not reference:
105106
reference = create_valid_vulnerability_reference(
106107
reference_id=ref.reference_id,
108+
reference_type=ref.reference_type,
107109
url=ref.url,
108110
)
109111
if not reference:
@@ -167,14 +169,15 @@ def process_inferences(
167169
return inferences_processed_count
168170

169171

170-
def create_valid_vulnerability_reference(url, reference_id=None):
172+
def create_valid_vulnerability_reference(url, reference_type="", reference_id=None):
171173
"""
172174
Create and return a new validated VulnerabilityReference from a
173175
``url`` and ``reference_id``.
174176
Return None and log a warning if this is not a valid reference.
175177
"""
176178
reference = VulnerabilityReference(
177179
reference_id=reference_id,
180+
reference_type=reference_type,
178181
url=url,
179182
)
180183

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Generated by Django 4.1.13 on 2024-08-01 22:03
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0057_kev"),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name="vulnerabilityreference",
15+
options={"ordering": ["reference_id", "url", "reference_type"]},
16+
),
17+
migrations.AddField(
18+
model_name="vulnerabilityreference",
19+
name="reference_type",
20+
field=models.CharField(
21+
blank=True,
22+
choices=[
23+
("advisory", "Advisory"),
24+
("exploit", "Exploit"),
25+
("mailing_list", "Mailing List"),
26+
("bug", "Bug"),
27+
("other", "Other"),
28+
],
29+
max_length=20,
30+
),
31+
),
32+
]

vulnerabilities/models.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,22 @@ class VulnerabilityReference(models.Model):
359359
unique=True,
360360
)
361361

362+
ADVISORY = "advisory"
363+
EXPLOIT = "exploit"
364+
MAILING_LIST = "mailing_list"
365+
BUG = "bug"
366+
OTHER = "other"
367+
368+
REFERENCE_TYPES = [
369+
(ADVISORY, "Advisory"),
370+
(EXPLOIT, "Exploit"),
371+
(MAILING_LIST, "Mailing List"),
372+
(BUG, "Bug"),
373+
(OTHER, "Other"),
374+
]
375+
376+
reference_type = models.CharField(max_length=20, choices=REFERENCE_TYPES, blank=True)
377+
362378
reference_id = models.CharField(
363379
max_length=200,
364380
help_text="An optional reference ID, such as DSA-4465-1 when available",
@@ -368,7 +384,7 @@ class VulnerabilityReference(models.Model):
368384
objects = VulnerabilityReferenceQuerySet.as_manager()
369385

370386
class Meta:
371-
ordering = ["reference_id", "url"]
387+
ordering = ["reference_id", "url", "reference_type"]
372388

373389
def __str__(self):
374390
reference_id = f" {self.reference_id}" if self.reference_id else ""

vulnerabilities/templates/vulnerability_details.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@
244244
<thead>
245245
<tr>
246246
<th style="width: 250px;"> Reference id </th>
247+
<th style="width: 250px;"> Reference type </th>
247248
<th> URL </th>
248249
</tr>
249250
</thead>
@@ -254,6 +255,13 @@
254255
{% else %}
255256
<td></td>
256257
{% endif %}
258+
259+
{% if ref.reference_type %}
260+
<td class="wrap-strings">{{ ref.get_reference_type_display }}</td>
261+
{% else %}
262+
<td></td>
263+
{% endif %}
264+
257265
<td class="wrap-strings"><a href="{{ ref.url }}" target="_blank">{{ ref.url }}<i
258266
class="fa fa-external-link fa_link_custom"></i></a></td>
259267
</tr>

vulnerabilities/tests/test_api.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from vulnerabilities.api import MinimalPackageSerializer
2323
from vulnerabilities.api import PackageSerializer
24+
from vulnerabilities.api import VulnerabilityReferenceSerializer
2425
from vulnerabilities.models import Alias
2526
from vulnerabilities.models import ApiUser
2627
from vulnerabilities.models import Package
@@ -161,6 +162,9 @@ def setUp(self):
161162
namespace="ubuntu",
162163
qualifiers={"distro": "jessie"},
163164
)
165+
self.ref = VulnerabilityReference.objects.create(
166+
reference_type="advisory", reference_id="CVE-xxx-xxx", url="https://example.com"
167+
)
164168
self.user = ApiUser.objects.create_api_user(username="[email protected]")
165169
self.auth = f"Token {self.user.auth_token.key}"
166170
self.client = APIClient(enforce_csrf_checks=True)
@@ -181,6 +185,16 @@ def test_package_serializer(self):
181185
purls = {r["purl"] for r in response}
182186
self.assertIn("pkg:deb/ubuntu/[email protected]?distro=jessie", purls)
183187

188+
def test_vulnerability_reference_serializer(self):
189+
response = VulnerabilityReferenceSerializer(instance=self.ref).data
190+
assert response == {
191+
"reference_url": "https://example.com",
192+
"reference_id": "CVE-xxx-xxx",
193+
"reference_type": "advisory",
194+
"scores": [],
195+
"url": "https://example.com",
196+
}
197+
184198

185199
class APITestCaseVulnerability(TransactionTestCase):
186200
def setUp(self):

vulnerabilities/tests/test_data/apache_httpd/CVE-1999-1199-apache-httpd-expected.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"references": [
2121
{
2222
"reference_id": "CVE-1999-1199",
23+
"reference_type": "",
2324
"url": "https://httpd.apache.org/security/json/CVE-1999-1199.json",
2425
"severities": [
2526
{

vulnerabilities/tests/test_data/apache_httpd/CVE-2017-9798-apache-httpd-expected.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"references": [
2121
{
2222
"reference_id": "CVE-2017-9798",
23+
"reference_type": "",
2324
"url": "https://httpd.apache.org/security/json/CVE-2017-9798.json",
2425
"severities": [
2526
{

0 commit comments

Comments
 (0)