Skip to content

Commit 6b30c45

Browse files
authored
Merge pull request #12515 from DefectDojo/release/2.46.4
Release: Merge release into master from: release/2.46.4
2 parents 5cd9876 + 4e646aa commit 6b30c45

40 files changed

+909
-492
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ Core Moderators can help you with pull requests or feedback on dev ideas:
129129

130130
Moderators can help you with pull requests or feedback on dev ideas:
131131
* Charles Neill ([@cneill](https://github.com/cneill) | [@ccneill](https://twitter.com/ccneill))
132-
* Jay Paz ([@jjpaz](https://twitter.com/jjpaz))
133132
* Blake Owens ([@blakeaowens](https://github.com/blakeaowens))
134133

135134
## Hall of Fame

components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "defectdojo",
3-
"version": "2.46.3",
3+
"version": "2.46.4",
44
"license" : "BSD-3-Clause",
55
"private": true,
66
"dependencies": {

docker/entrypoint-initializer.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ echo "Creating Announcement Banner"
2626
cat <<EOD | python3 manage.py shell
2727
from dojo.models import Announcement, UserAnnouncement, Dojo_User
2828
announcement, created = Announcement.objects.get_or_create(id=1)
29-
announcement.message = '<a href="https://defectdojo.com/contact" target="_blank">Cloud and On-Premise Subscriptions Now Available! Click here for more details</a>'
29+
announcement.message = '<a href="https://cloud.defectdojo.com/accounts/onboarding/plg_step_1" target="_blank">DefectDojo Pro Cloud and On-Premise Subscriptions Now Available! Create an account to try Pro for free!</a>'
3030
announcement.dismissable = True
3131
announcement.save()
3232
for dojo_user in Dojo_User.objects.all():
174 KB
Loading

docs/content/en/changelog/changelog.md

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,66 @@ Here are the release notes for **DefectDojo Pro (Cloud Version)**. These release
88

99
For Open Source release notes, please see the [Releases page on GitHub](https://github.com/DefectDojo/django-DefectDojo/releases), or alternatively consult the Open Source [upgrade notes](/en/open_source/upgrading/upgrading_guide/).
1010

11+
12+
## May 2025: v2.46
13+
14+
### ⚠️ Tag Format Change
15+
16+
As of version 2.46.0, Tags can no longer contain the following characters:
17+
- Commas (,)
18+
- Quotations (both single ' and double ")
19+
- Spaces
20+
21+
To ensure a smooth transition, an automatic migration will be applied to existing tags as follows:
22+
- Commas → Replaced with hyphens (-)
23+
- Quotations (single and double) → Removed
24+
- Spaces → Replaced with underscores (_)
25+
Examples
26+
- example,tag → example-tag
27+
- 'SingleQuoted' → SingleQuoted
28+
- "DoubleQuoted" → DoubleQuoted
29+
- space separated tag → space_separated_tag
30+
31+
This update improves consistency, enhances DefectDojo's search capabilities, and aligns with best practices for tag formatting.
32+
33+
We recommend reviewing your current tags to ensure they align with the new format. Following the deployment of these new behaviors, requests sent to the API or through the UI with any of the violations listed above will result in an error, with the details of the error raised in the response.
34+
35+
### May 19, 2025: v2.46.3
36+
37+
- **(Calendar)** New filters have been added to Calendar view: Unassigned Lead, and Engagement/Test Type.
38+
- **(Dashboard)** Added Finding Status filter for Dashboard tiles.
39+
- **(Engagements)** A repository URI can be added to an Engagement via **Edit Engagement > Optional Fields > Repo**. If this field is set, Findings under that Engagement will automatically generate clickable links to the source code if File Path is set on the Finding. See [docs](/en/working_with_findings/organizing_engagements_tests/source-code-repositories/) for more details.
40+
- **(Findings)** Added "Jira Issue URL" column to the CSV export of Finding tables.
41+
- **(Metrics)** Priority Dashboard has been added to Metrics, to display your organization's risk profile at a glance.
42+
![image](images/pro_dashboard_priority.png)
43+
- **(Universal Parser)** Added a 'SOC Alerts' flag to Universal Parser, to indicate whether the Findings from the parser originate from a Security Operations Center.
44+
45+
### May 12, 2025: v2.46.2
46+
47+
- **(Findings)** Component Name and Version have been added to the metadata table on a Finding View.
48+
- **(Metrics)** Pro Insights Dashboards can now be filtered by Tag.
49+
- **(Users)** The Users table can now be exported as a .csv file.
50+
51+
### May 7, 2025: v2.46.1
52+
53+
Hotfix release - no significant feature changes.
54+
55+
### May 5, 2025: v2.46.0
56+
57+
58+
- **(Import)** Mitigated timestamp in reports are no longer ignored/overwritten on Reimport.
59+
- **(Tools)** Fortify Webinspect has been added as a supported tool.
60+
- **(Tools)** Added JSON as a supported tool for Immuniweb.
61+
- **(Tools)** Nessus (Tenable) parser now handles additional fields.
62+
- **(Tools)** Wiz parser now handles additional fields and unique_id_from_tool.
63+
64+
1165
## Apr 2025: v2.45
1266

1367
### Apr 28, 2025: v2.45.3
1468

15-
- **(Tools)** Fortify parser can now assign False Positive status to Findings according to the audit.xml file.
1669
- **(Import)** Reimporting a scan can now handle special statuses assigned by a tool. Now, if a Finding was initially imported as Active, but the status was changed to False Positive, Out Of Scope or Risk Accepted by a subsequent report, that status will now be respected and applied to the Finding by Reimport.
70+
- **(Tools)** Fortify parser can now assign False Positive status to Findings according to the audit.xml file.
1771

1872
### Apr 22, 2025: v2.45.2
1973

@@ -35,35 +89,29 @@ For Open Source release notes, please see the [Releases page on GitHub](https://
3589

3690
## Mar 2025: v2.44
3791

38-
### Mar 31, 2025: v2.44.4
92+
#### Mar 31, 2025: v2.44.4
3993

4094
- **(Pro UI)** Group and Configuration permissions can now be assigned quickly from a User page. For more information, see [DefectDojo Pro Permissions](/en/customize_dojo/user_management/pro_permissions_overhaul/).
4195

42-
### Mar 24, 2025: v2.44.3
96+
#### Mar 24, 2025: v2.44.3
4397

4498
- **(Import)** Generic Findings Import will now parse tags in the JSON payload when Async Import is enabled.
4599

46-
### Mar 17, 2025: v2.44.2
100+
#### Mar 17, 2025: v2.44.2
47101

48102
- **(Pro UI)** Added a new method to quickly assign permissions to Products or Product Types. See our [Pro Permissions](/en/customize_dojo/user_management/pro_permissions_overhaul/) for more details.
49103

50104
![image](images/pro_permissions_2.png)
51105

52-
### Mar 10, 2025: v2.44.1
106+
#### Mar 10, 2025: v2.44.1
53107

54108
- **(Pro UI)** Added a field in the View Engagement page which allows a user to navigate to the linked Jira Epic, if one exists.
55109
- **(Universal Parser)** XML is now a supported file type for Universal Parser.
56110
- **(SSO)** SSO can now be set up with any kind of [OIDC Configuration](https://auth0.com/docs/authenticate/protocols/openid-connect-protocol). See OIDC Settings in the Pro UI:
57111

58112
![image](images/oidc.png)
59113

60-
### Mar 3, 2025: v2.44.0
61-
62-
- **(Pro UI)** Breadcrumbs have been overhauled to better represent the context each page exists in. Breadcrumbs will now include filtering and query parameters. The titles of tables now better represent their context, for example when looking at the Engagements list for a particular Product, the view will be titled {Product Name} Engagements, rather than All Engagements as before.
63-
64-
## Mar 2025: v2.44
65-
66-
### Mar 3, 2025: v2.44.0
114+
#### Mar 3, 2025: v2.44.0
67115

68116
- **(Pro UI)** Breadcrumbs have been overhauled to better represent the context each page exists in. Breadcrumbs will now include filtering and query parameters. The titles of tables now better represent their context, for example when looking at the Engagements list for a particular Product, the view will be titled {Product Name} Engagements, rather than All Engagements as before.
69117

docs/content/en/connecting_your_tools/parsers/file/anchorectl_policies.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,16 @@
22
title: "AnchoreCTL Policies Report"
33
toc_hide: true
44
---
5-
AnchoreCTLs JSON policies report format
5+
AnchoreCTLs JSON policies report format. Both legacy list-based format and new evaluation-based format are supported.
6+
7+
## Usage
8+
9+
To generate a policy report that can be imported into DefectDojo:
10+
11+
```bash
12+
# Evaluate policies and output to JSON format
13+
anchorectl policy evaluate -o json > policy_report.json
14+
```
615

716
### Sample Scan Data
817
Sample AnchoreCTL Policies Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchorectl_policies).

docs/content/en/open_source/contributing/how-to-write-a-parser.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ $ docker compose build --build-arg uid=1000
3737
|`unittests/scans/<parser_dir>/{many_vulns,no_vuln,one_vuln}.json` | Sample files containing meaningful data for unit tests. The minimal set.
3838
|`unittests/tools/test_<parser_name>_parser.py` | Unit tests of the parser.
3939
|`dojo/settings/settings.dist.py` | If you want to use a modern hashcode based deduplication algorithm
40-
|`docs/content/en/connecting_your_tools/parsers/<file/api>/<parser_file>.md` | Documentation, what kind of file format is required and how it should be obtained
41-
40+
|`docs/content/en/connecting_your_tools/parsers/<file/api>/<parser_file>.md` | Documentation, what kind of file format is required and how it should be obtained
41+
4242

4343
## Factory contract
4444

@@ -57,6 +57,7 @@ Parsers are loaded dynamicaly with a factory pattern. To have your parser loaded
5757
3. `def get_description_for_scan_types(self, scan_type):` This function return a string used to provide some text in the UI (long description)
5858
4. `def get_findings(self, file, test)` This function return a list of findings
5959
6. If your parser have more than 1 scan_type (for detailled mode) you **MUST** implement `def set_mode(self, mode)` method
60+
7. The parser instance is re-used over all imports performed for this scan_type, so do not store any data at class level
6061

6162
Example:
6263

@@ -145,7 +146,7 @@ Very bad example:
145146
Various file formats are handled through libraries. In order to keep DefectDojo slim and also don't extend the attack surface, keep the number of libraries used minimal and take other parsers as an example.
146147

147148
#### defusedXML in favour of lxml
148-
As xml is by default an unsecure format, the information parsed from various xml output has to be parsed in a secure way. Within an evaluation, we determined that defusedXML is the library which we will use in the future to parse xml files in parsers as this library is rated more secure. Thus, we will only accept PRs with the defusedxml library.
149+
As xml is by default an unsecure format, the information parsed from various xml output has to be parsed in a secure way. Within an evaluation, we determined that defusedXML is the library which we will use in the future to parse xml files in parsers as this library is rated more secure. Thus, we will only accept PRs with the defusedxml library.
149150

150151
### Not all attributes are mandatory
151152

@@ -232,7 +233,8 @@ Bad example (DIY):
232233

233234
By default a new parser uses the 'legacy' deduplication algorithm documented at https://documentation.defectdojo.com/usage/features/#deduplication-algorithms
234235

235-
Please use a pre-defined deduplication algorithm where applicable.
236+
Please use a pre-defined deduplication algorithm where applicable. When using the `unique_id_from_tool` or `vuln_id_from_tool` fields in the hash code configuration, it's important that these are uqniue for the finding and constant over time across subsequent scans. If this is not the case, the values can still be useful to set on the finding model without using them for deduplication.
237+
The values must be coming from the report directly and must not be something that is calculated by the parser internally.
236238

237239
## Unit tests
238240

@@ -366,4 +368,3 @@ Please add a new .md file in [`docs/content/en/connecting_your_tools/parsers`] w
366368
* A link to the scanner itself - (e.g. GitHub or vendor link)
367369

368370
Here is an example of a completed Parser documentation page: [https://github.com/DefectDojo/django-DefectDojo/blob/master/docs/content/en/connecting_your_tools/parsers/file/acunetix.md](https://github.com/DefectDojo/django-DefectDojo/blob/master/docs/content/en/connecting_your_tools/parsers/file/acunetix.md)
369-

docs/content/en/working_with_findings/organizing_engagements_tests/source-code-repositories.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ Certain tools (particularly SAST tools) will include the associated file name an
1010
## Setting the repository in the Engagement and Test
1111

1212
### Engagement
13-
While editing the Engagement, users can set the URL of the specific SCM repo.
13+
14+
While editing the Engagement, users can set the URL of the specific Source Code Management repo. **(In the Pro UI, this field can be set under Edit Engagement > Optional Fields > Repo)**.
1415

1516
For an Interactive Engagement, it needs to be a URL that specifies the branch:
1617
- for GitHub - like https://github.com/DefectDojo/django-DefectDojo/tree/dev

dojo/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
# Django starts so that shared_task will use this app.
55
from .celery import app as celery_app # noqa: F401
66

7-
__version__ = "2.46.3"
7+
__version__ = "2.46.4"
88
__url__ = "https://github.com/DefectDojo/django-DefectDojo"
99
__docs__ = "https://documentation.defectdojo.com"

dojo/announcement/signals.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def add_announcement_to_new_user(sender, instance, **kwargs):
1212
dojo_user = Dojo_User.objects.get(id=instance.id)
1313
announcement = announcements.first()
1414
cloud_announcement = (
15-
"Cloud and On-Premise Subscriptions Now Available!"
15+
"DefectDojo Pro Cloud and On-Premise Subscriptions Now Available!"
1616
in announcement.message
1717
)
1818
if not cloud_announcement or settings.CREATE_CLOUD_BANNER:

dojo/context_processors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def globalize_vars(request):
2929
"DOCUMENTATION_URL": settings.DOCUMENTATION_URL,
3030
"API_TOKENS_ENABLED": settings.API_TOKENS_ENABLED,
3131
"API_TOKEN_AUTH_ENDPOINT_ENABLED": settings.API_TOKEN_AUTH_ENDPOINT_ENABLED,
32+
"CREATE_CLOUD_BANNER": settings.CREATE_CLOUD_BANNER,
3233
}
3334

3435

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.8 on 2025-05-19 16:14
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('dojo', '0228_alter_jira_username_password'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='finding',
15+
name='unique_id_from_tool',
16+
field=models.CharField(blank=True, help_text='Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.', max_length=500, null=True, verbose_name='Unique ID from tool'),
17+
),
18+
]

dojo/importers/default_reimporter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ def match_new_finding_to_existing_finding(
404404
# If you have use cases going through this section, you're advised to create a deduplication configuration for your parser
405405
logger.warning("Legacy reimport. In case of issue, you're advised to create a deduplication configuration in order not to go through this section")
406406
return Finding.objects.filter(
407-
title=unsaved_finding.title,
407+
title__iexact=unsaved_finding.title,
408408
test=self.test,
409409
severity=unsaved_finding.severity,
410410
numerical_severity=Finding.get_numerical_severity(unsaved_finding.severity)).order_by("id")

dojo/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2562,7 +2562,7 @@ class Finding(models.Model):
25622562
blank=True,
25632563
max_length=500,
25642564
verbose_name=_("Unique ID from tool"),
2565-
help_text=_("Vulnerability technical id from the source tool. Allows to track unique vulnerabilities."))
2565+
help_text=_("Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans."))
25662566
vuln_id_from_tool = models.CharField(null=True,
25672567
blank=True,
25682568
max_length=500,

dojo/settings/settings.dist.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
DD_CELERY_BEAT_SCHEDULE_FILENAME=(str, root("dojo.celery.beat.db")),
8484
DD_CELERY_TASK_SERIALIZER=(str, "pickle"),
8585
DD_CELERY_PASS_MODEL_BY_ID=(str, True),
86+
DD_CELERY_LOG_LEVEL=(str, "INFO"),
8687
DD_FOOTER_VERSION=(str, ""),
8788
# models should be passed to celery by ID, default is False (for now)
8889
DD_FORCE_LOWERCASE_TAGS=(bool, True),
@@ -1146,6 +1147,7 @@ def saml2_attrib_map_format(din):
11461147
CELERY_ACCEPT_CONTENT = ["pickle", "json", "msgpack", "yaml"]
11471148
CELERY_TASK_SERIALIZER = env("DD_CELERY_TASK_SERIALIZER")
11481149
CELERY_PASS_MODEL_BY_ID = env("DD_CELERY_PASS_MODEL_BY_ID")
1150+
CELERY_LOG_LEVEL = env("DD_CELERY_LOG_LEVEL")
11491151

11501152
if len(env("DD_CELERY_BROKER_TRANSPORT_OPTIONS")) > 0:
11511153
CELERY_BROKER_TRANSPORT_OPTIONS = json.loads(env("DD_CELERY_BROKER_TRANSPORT_OPTIONS"))
@@ -1433,6 +1435,8 @@ def saml2_attrib_map_format(din):
14331435
# legacy one with multiple conditions (default mode)
14341436
DEDUPE_ALGO_LEGACY = "legacy"
14351437
# based on dojo_finding.unique_id_from_tool only (for checkmarx detailed, or sonarQube detailed for example)
1438+
# When using the `unique_id_from_tool` or `vuln_id_from_tool` fields for dedupication, it's important that these are uqniue for the finding and constant over time across subsequent scans.
1439+
# If this is not the case, the values can still be useful to set on the finding model without using them for deduplication.
14361440
DEDUPE_ALGO_UNIQUE_ID_FROM_TOOL = "unique_id_from_tool"
14371441
# based on dojo_finding.hash_code only
14381442
DEDUPE_ALGO_HASH_CODE = "hash_code"
@@ -1702,7 +1706,7 @@ def saml2_attrib_map_format(din):
17021706
},
17031707
"celery": {
17041708
"handlers": [rf"{LOGGING_HANDLER}"],
1705-
"level": str(LOG_LEVEL),
1709+
"level": str(CELERY_LOG_LEVEL),
17061710
"propagate": False,
17071711
# workaround some celery logging known issue
17081712
"worker_hijack_root_logger": False,
@@ -1807,7 +1811,9 @@ def saml2_attrib_map_format(din):
18071811
VULNERABILITY_URLS = {
18081812
"ALAS": "https://alas.aws.amazon.com/AL2/&&.html", # e.g. https://alas.aws.amazon.com/alas2.html
18091813
"ALBA-": "https://osv.dev/vulnerability/", # e.g. https://osv.dev/vulnerability/ALBA-2019:3411
1814+
"ALEA-": "https://errata.almalinux.org/8/&&.html", # e.g. https://errata.almalinux.org/8/ALEA-2022-1998.html
18101815
"ALINUX2-SA-": "https://mirrors.aliyun.com/alinux/cve/", # e.g. https://mirrors.aliyun.com/alinux/cve/alinux2-sa-20250007.xml
1816+
"ALINUX3-SA-": "https://mirrors.aliyun.com/alinux/3/cve/", # e.g. https://mirrors.aliyun.com/alinux/3/cve/alinux3-sa-20250059.xml
18111817
"ALSA-": "https://osv.dev/vulnerability/", # e.g. https://osv.dev/vulnerability/ALSA-2024:0827
18121818
"ASA-": "https://security.archlinux.org/", # e.g. https://security.archlinux.org/ASA-202003-8
18131819
"AVD": "https://avd.aquasec.com/misconfig/", # e.g. https://avd.aquasec.com/misconfig/avd-ksv-01010

dojo/tasks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def evaluate_pro_proposition(*args, **kwargs):
204204
entry in announcement.message
205205
for entry in [
206206
"",
207-
"Cloud and On-Premise Subscriptions Now Available!",
207+
"DefectDojo Pro Cloud and On-Premise Subscriptions Now Available!",
208208
"Findings/Endpoints in their systems",
209209
]
210210
):

dojo/templates/base.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,14 @@
194194
</a>
195195
</li>
196196
{% endif %}
197+
{% if CREATE_CLOUD_BANNER %}
198+
<li>
199+
<a href="https://cloud.defectdojo.com/accounts/onboarding/plg_step_1">
200+
<i class="fa-solid fa-level-up fa-fw"></i>
201+
{% trans "Try Pro for Free!" %}
202+
</a>
203+
</li>
204+
{% endif %}
197205
<li>
198206
<a href="{% url 'logout' %}">
199207
<i class="fa-solid fa-right-from-bracket fa-fw"></i>

0 commit comments

Comments
 (0)