Skip to content

Commit 474301d

Browse files
authored
Add support for reference_type (#1502)
Signed-off-by: ziadhany <[email protected]>
1 parent d7b66fb commit 474301d

File tree

97 files changed

+5116
-1457
lines changed

Some content is hidden

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

97 files changed

+5116
-1457
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: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Generated by Django 4.1.13 on 2024-07-18 21:56
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.AddField(
14+
model_name="vulnerabilityreference",
15+
name="reference_type",
16+
field=models.CharField(
17+
blank=True,
18+
choices=[
19+
("advisory", "Advisory"),
20+
("exploit", "Exploit"),
21+
("mailing_list", "Mailing List"),
22+
("bug", "Bug"),
23+
("other", "Other"),
24+
],
25+
max_length=20,
26+
),
27+
),
28+
]

vulnerabilities/models.py

Lines changed: 16 additions & 0 deletions
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",

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
{

vulnerabilities/tests/test_data/apache_httpd/CVE-2021-44224-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-2021-44224",
23+
"reference_type": "",
2324
"url": "https://httpd.apache.org/security/json/CVE-2021-44224.json",
2425
"severities": [
2526
{

vulnerabilities/tests/test_data/apache_httpd/CVE-2022-28614-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-2022-28614",
23+
"reference_type": "",
2324
"url": "https://httpd.apache.org/security/json/CVE-2022-28614.json",
2425
"severities": [
2526
{

vulnerabilities/tests/test_data/apache_httpd/apache-httpd-improver-expected.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"references": [
4444
{
4545
"reference_id": "CVE-2021-44224",
46+
"reference_type": "",
4647
"url": "https://httpd.apache.org/security/json/CVE-2021-44224.json",
4748
"severities": [
4849
{
@@ -91,6 +92,7 @@
9192
"references": [
9293
{
9394
"reference_id": "CVE-2021-44224",
95+
"reference_type": "",
9496
"url": "https://httpd.apache.org/security/json/CVE-2021-44224.json",
9597
"severities": [
9698
{

0 commit comments

Comments
 (0)