Skip to content

Release: Merge release into master from: release/3.3.200 - #16023

Merged
rossops merged 63 commits into
masterfrom
release/3.3.200
Sep 21, 2026
Merged

rossops merged 63 commits into
masterfrom
release/3.3.200

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Release triggered by rossops

DefectDojo release bot and others added 30 commits September 14, 2026 18:19
…15917)

* docs(connectors): document the Aqua per-branch deduplication toggle

* docs(connectors): note that the connector owns the branch engagement dedupe setting

The connector re-applies its configured value on every branch resolve, so a value
an admin sets by hand on a branch engagement is reset on the next sync. Before
this feature the connector never touched the flag after creating the engagement,
so the hand-set value stuck. The docs now say which side owns the setting.
…100-3.4.0-dev (#15950)

* Update versions in application files

* Update versions in application files

---------

Co-authored-by: DefectDojo release bot <dojo-release-bot@users.noreply.github.com>
Co-authored-by: Ross E Esposito <rossespo@gmail.com>
The Qualys connector gains an opt-in "Create endpoints from hosts" option
that attaches each finding's host (DNS name, else NetBIOS, else IP, plus
the detection's port) as an endpoint. Documents the toggle, the naming
preference order, port handling, endpoint reuse, and the off-by-default
behavior.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Add the AI Agent Red Teaming capability page (onboarding an agent target, the
OpenAI-compatible and generic-JSON adapters, running a scan and what a finding
looks like, the /api/v2/agentsec/runtime/ check API, quotas, troubleshooting)
and a one-line mention in the Sensei overview. Text-only.
Adds improper output handling, retrieval (RAG) injection and unbounded
consumption to the technique list and their CWE mappings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Final prose pass on the outward-facing docs: replace rhetorical em-dashes with
plain punctuation (colons for term glosses, periods/commas/parentheses inline).
No facts, endpoints, or code changed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fill out the 3.3.100 changelog entry, which previously covered only the
Dedupe Pools / Matching Configuration feature. Summarize the remaining
user-facing work from the release: new connectors and connector controls,
shared dashboards, markdown inline images, the Vertex AI provider,
keyless/delegated cloud auth for Sensei, and a batch of connector, UI, API,
and reporting bug fixes. Dormant Go single-writer work, CI/test plumbing,
Vue table refactors, and docs-only PRs are omitted.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…15953)

The English message catalog set `msgstr "Поиск"` on the "Search",
"Simple Search", and "simple_search" entries, so the compiled `.mo`
served the Russian word in the English locale (visible in the navbar
search box). English is the source language, so those msgstr values
must be empty and fall back to the msgid.

Blank the three translations, drop the stale `#, fuzzy` markers, and
add a regression test asserting the English catalog stays free of
translated strings and fuzzy entries.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* docs(sensei): document Dynamic Scanning (DAST)

* docs(sensei): document the DAST scanners, API schema, and scan-on-deploy

Extends the Dynamic Scanning page for the scanner choice (Nuclei / ZAP / Schemathesis
with a "Choosing a scanner" section), the Schemathesis API Schema field, and the new
"Scan on deploy" automation (a successful GitHub deployment auto-launches a scan of the
matching, opted-in, still-verified target).

* docs(sensei): document scheduled DAST scans

Adds a "Scheduling scans" section: a verified target can run on a recurring cron schedule
(at most once per day), independent of the deploy trigger, via DefectDojo's scheduling
service; ownership is re-checked at each scheduled run.

* docs(sensei): document the DAST <-> Rules Engine integration

Adds a "Rules Engine" section: a rule can launch a dynamic scan (the Launch DAST Scan
action) and can react to a completed scan over its findings (the On DAST Scan Completed
trigger). Both surface only when dynamic scanning is enabled.

* docs(sensei): document AI triage of DAST findings

---------

Co-authored-by: Cody Maffucci <agent-cody@defectdojo.com>
…se sections (#15959)

Reorganize the self-hosted DefectDojo Pro on-prem docs so each deployment
method has its own section and method-specific guidance.

- Add Kubernetes (Helm) and Docker Compose subsections and move the
  method-specific pages into them, with backward-compat aliases.
- Split genuinely divergent pages per method (upload size limits) and use
  Kubernetes/Compose tabs on mostly-shared pages (hardware sizing,
  migrating, backing up, FIPS enablement) to avoid duplicating prose.
- Extract Amazon ECS/Fargate FIPS onto its own page.
- Add a dedicated Docker Compose upgrade guide and rescope the on-prem
  "Upgrading" page into a method-neutral hub.
- Add a Kubernetes migration runbook with an error-keyed troubleshooting
  index and a verification checklist.
- Hardware sizing: add a Docker Compose sizing tab (extrapolated from the
  Kubernetes tiers) and correct the uWSGI/Celery tuning guidance (keep
  threads low, scale with processes, watch DB connections).
- Surface both upgrade guides in the changelog (Pro Upgrades) left nav.

English pages only; translations regenerate via the i18n pipeline.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Add a "Schedule recurring scans" subsection to the AI Agent Red Teaming page: the
Schedule scans row action, the once-per-day cap and why it is stricter than the other
capabilities, and that the action only appears when the scheduling service is enabled.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(sensei): AI Agent Red Teaming capability page
…15991)

Clarify that a Defender "device" is one individual machine (one finding
per device / software version / CVE), document the new Device Groups
allowlist for importing in phases (plus the record-mapping alternative),
and explain setting a minimum severity per device group via a per-record
severity override.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…#15992)

Add the full regional CSPM Auth Host table (US/EU/Singapore/Sydney), state that
the Auth Host is separate from the Location edge host, and add a troubleshooting
note that a 405 during validation means the Auth Host is not the CSPM API host.

Docs for the matching Pro UI clarification; reported via a customer support ticket.
…ng toggles to the Classic UI and /api/v2 (#15990)

DefectDojo Pro reads the stored Locations and Organization / Asset Relabeling
toggles at start-up and applies them to the deployment settings the Classic UI,
/api/v2 and /api/v3 route wiring read. Operators no longer need to set
DD_V3_FEATURE_LOCATIONS or DD_ENABLE_V3_ORGANIZATION_ASSET_RELABEL to make a
restart move those surfaces; the env vars remain the upgrade seed and the
DB-down fallback. Adds the 3.3.200 upgrade note that corrects the 3.2.200 guidance.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Rename the automation docs section from "Rules Engine 2.0" to "Triage
Engine" to match the product name change, across English and all seven
translations.

- Move content/automation/rules_engine_2/ -> triage_engine/ (URL changes
  to /automation/triage_engine/); add aliases for the old
  /automation/rules_engine_2/ paths and keep the older rules_engine_v2
  aliases, so existing links keep resolving.
- Swap the display name in titles and prose (all 8 languages), and update
  cross-references from the classic Rules Engine page, messaging
  connectors, PAIN ratings, audit log, permission chart, page layouts and
  risk acceptance docs. The changelog and the sidebar redesign mapping
  table keep the historical name on purpose.
- Node reference: document three nodes that were missing (Assign to a
  Dedupe Pool, Publish to an SNS Topic, Set Potential Agency Impact) and
  correct the node count to 41.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
#15986)

* docs(onprem): document app-tier and database tuning knobs for hardware sizing

Add a "what each knob does" table for the uWSGI/Celery application-tier
settings, and a new "Tuning the database" section covering the PostgreSQL
settings that matter most for DefectDojo's aggregation-heavy reads
(shared_buffers, effective_cache_size, work_mem, maintenance_work_mem,
max_connections), plus a connection-budget subsection tying the application
tier and database together.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(docs): land deep links in the page's own edition (Pro/OSS)

Pages carry an audience (pro/opensource); general pages have none. Stamp
data-dd-version from the page's own audience before first paint and persist
it, so a deep link to a Pro page puts the reader in the Pro section (with the
matching sidebar) instead of leaving them in their stored edition's nav around
Pro content. General pages keep the stored preference.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…it Finding form (#15984)

The Pro UI Add/Edit Finding form now exposes EPSS Score, EPSS Percentile,
Known Exploited, Used in Ransomware and KEV Date Added in a Threat Intelligence
panel under Optional Fields. Document the panel, how the EPSS/KEV sync treats
hand-entered values (replaced on CVE-backed findings, kept on findings without a
CVE), that hand-set values feed priority and risk, and that a rule reacting to a
hand-set flag should use the KEV: Known Exploited condition because the FedRAMP
review template keys on Exploit Maturity from the threat-intelligence feed. Also
fix the "ESS" typo on the Pro Findings reference page.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* docs(pro): PCI DSS scope, patch clock, and scope inventory

Document the Pro PCI DSS v4.0.1 scope features: per-Asset scope and component
classification, the public-facing determination, scope confirmation, the
assessment anchor, the Requirement 6.3.3 patch-clock SLA, the instance entity
type, and the scope inventory export. Behind the pci_dss feature flag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(pro): add SLA start policy to the PCI DSS scope page

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(pro): add targeted risk analyses to the PCI DSS scope page

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(pci): reflect the reviewed PCI scope, SLA start and risk analysis behavior

The API is behind the flag with the UI, hand-set SLA starts are authoritative
and the default policy changes nothing, the fix-available date has no import
date fallback, a never-assessed Asset counts as not assessed, and targeted
risk analyses have one scope, a one-way lifecycle, and owner-directed review
alerts.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Protocol-less URLs (e.g. 'amazon.com') caused urlparse(matched).hostname
to return None, making different hosts share the same dupe_key and
hash_code — merging findings that should have remained distinct.

Prepend '//' before urlparse() so the hostname is correctly extracted.
This mirrors the existing pattern used for LocationData construction
on line 91 of the same file.
…g on disk (#15960)

* fix(files): return 404 instead of 500 when an uploaded file is missing on disk

Downloading an uploaded file whose FileUpload row exists in the database but
whose bytes are absent on disk raised a low-level FileNotFoundError that
surfaced as an unhandled HTTP 500. This happened when reading
file_object.file.size in generate_file_response (e.g. GET
/access_file/<id>/<oid>/Finding) and when opening a raw path in
generate_file_response_from_file_path (e.g. the engagement threat model
download).

Guard both helpers: when the file is not present on disk, raise Http404 so the
caller receives a clean "not found" response instead of a server error. This
covers every file-download path that routes through these helpers (the
access_file view, and the finding/test/engagement UI and API download
endpoints).

Add a regression test that parameterizes the present-file (control) and
missing-file cases for both helpers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015MoDChxuDr2CVnTTYjxZmR

* fix(files): derive missing file_name from path.stem in generate_file_response_from_file_path

The file_name-not-supplied branch called .rsplit() on a Path object
(file_path_without_extension was `path.parent / path.stem`, a PosixPath),
raising AttributeError: 'PosixPath' object has no attribute 'rsplit' and a 500.
Any caller that omits file_name hit this — notably the engagement threat-model
download (generate_file_response_from_file_path(eng.tmodel_path)).

Use path.stem, which is exactly the value the original code intended (the final
path component without its extension). Surfaced by the new regression test's
present-file control case for this helper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015MoDChxuDr2CVnTTYjxZmR

* test(files): close file handle directly to avoid closing the test DB connection

The present-file cases called response.close() on the FileResponse, which emits
Django's request_finished signal; its close_old_connections handler closed this
TestCase's DB connection, so every subsequent test in the class failed at
FileUpload.objects.create() with "the connection is closed". Close the underlying
file handle via response.file_to_stream.close() instead, which releases the handle
without firing the signal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015MoDChxuDr2CVnTTYjxZmR

---------

Co-authored-by: Claude <noreply@anthropic.com>
The v3 notes sub-resource read the parent relation directly. Its comment
said it mirrored v2, but v2 has routed note reads through visible_notes()
since 3.2.100, so the two paths disagreed on what private means.

The existing privacy test asserted the older behaviour and is inverted
here, and the rule is now checked on all three parents plus the envelope
count.
…ssion check (#15988)

The auto branch of POST /import dispatches on the numeric engagement field, while
the permission check only resolved the name fields. The check now builds the same
context the service resolves from, so both agree on the target.

Adds regression coverage for the denial, including the reimport leg.
…#15993)

The import, reimport, and metadata-import permission checks parse
request.data to resolve the target product/engagement/test before the
serializer runs. When a scan import submits more form fields than
DATA_UPLOAD_MAX_NUMBER_FIELDS (or a body larger than
DATA_UPLOAD_MAX_MEMORY_SIZE), Django's multipart parser raises a
SuspiciousOperation (TooManyFieldsSent / RequestDataTooBig) while
request.data is evaluated. That exception escaped the permission check
as an opaque error and generated error-reporting noise.

Catch those exceptions in the three import/reimport permission classes
and raise a DRF ValidationError with an actionable message instead.

Also make DATA_UPLOAD_MAX_NUMBER_FIELDS configurable via
DD_DATA_UPLOAD_MAX_NUMBER_FIELDS (default 10240), mirroring
DD_DATA_UPLOAD_MAX_MEMORY_SIZE, so operators can raise the limit for
instances that legitimately submit very large imports.

Adds unit tests covering all three permission classes and the setting
default.


Claude-Session: https://claude.ai/code/session_01EWbcF7wUybs9Z2bFCpEi49

Co-authored-by: Claude <noreply@anthropic.com>
KICS: TypeError when expected_value is null in dupe_key concatenation.
  Added query_id to dupe_key for proper differentiation.
AppSpider: AttributeError on unsaved_request typo (should be
  unsaved_req_resp) — every duplicate finding crashes.
KubeHunter: TypeError when vid is absent (vuln_id_from_tool is None)
  in dupe_key string concatenation.
Terrascan: TypeError from 'and' vs 'or' logic bug when results key
  is missing, plus None concat in dupe_key fields.
TFSec: TypeError when rule_provider is null (custom/trivy rules)
  in dupe_key concatenation.
ZAP: TypeError when requestbody/responsebody XML tags are absent
  (findtext returns None) in request/response assembly.

Each fix uses f-strings with 'or empty' guards. All existing tests
pass. New regression tests added for each parser.
* Show authorized finding groups to product members

Use the Finding Group authorization queryset for list views so groups are visible according to their owning test and product, including groups without member findings. Keep unauthorized products out of the list and cover the UI permission matrix.

Signed-off-by: ADİL ALPEREN ÇİFTCİ <134228585+adilalperenciftci@users.noreply.github.com>

* Cover finding group open and closed lists

Exercise the authorization matrix through the open and closed Finding Group list views so their queryset filtering remains covered.

Signed-off-by: ADİL ALPEREN ÇİFTCİ <134228585+adilalperenciftci@users.noreply.github.com>

* Preserve empty finding groups in ownership filters

Filter products and engagements through each Finding Group's owning test so authorized groups remain visible without member findings. Cover product and engagement filtering across authorized and unauthorized products.

Signed-off-by: ADİL ALPEREN ÇİFTCİ <134228585+adilalperenciftci@users.noreply.github.com>

---------

Signed-off-by: ADİL ALPEREN ÇİFTCİ <134228585+adilalperenciftci@users.noreply.github.com>
#15981)

The Location tag scoping added in #15784 covered the REST API and the
location pages. The classic search view and the Product Endpoint Report
options page were missed, so both still joined the raw tag relation on a
globally deduplicated row. Search also matched on it, which made a
substring operator an oracle over a value the page withholds.

Both now use dojo.location.queries.readable_tag_match, the same predicate
the API filters and the location templates use. Endpoint gains a
readable_tags mirror because simple_search.html serves either model.

Refs H1 #4005137.
devGregA and others added 14 commits September 20, 2026 23:36
Companion page to the PCI DSS scope docs, for the Requirement 11 evidence
features: how a test gets a PCI role, the facts a scan report cannot carry
(authenticated, ASV result, vendor and attestation reference), significant
changes and unauthenticated system exceptions, what each cell of the quarterly
grid means and the exact rule behind it, how the annual Requirement 11.4 checks
are measured, the dashboard tile and the end-of-quarter reminders, and what the
evidence workbook contains.

States plainly that DefectDojo records the ASV results an entity reports, does
not perform ASV scans, and does not validate an attestation, so a passing result
is never inferred from an absence of findings.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…l Eight) (#16007)

One Pro docs page for the Framework Presets settings page: what a preset
contains, what the two shipped presets encode and which published version,
how plan and apply work, why applying never reassigns assets, revert, drift,
versions, export and import, and the public API. States plainly that a preset
is our reading of a scheme at a point in time and not certification.

Co-authored-by: devGregA <greg-agent-2@defectdojo.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…16008)

* docs: describe vulnerability response policies on the priority and SLA page

Documents the policy table that replaces the hardcoded remediation ladder: how a policy is
attached to an SLA configuration, how a deadline is composed from severity or risk, the KEV
due date and the policy cell, and how each of the three grading axes is resolved.

Says plainly that a policy only ever tightens a deadline, that a value set by hand is never
overwritten, and that an unestablished fact is resolved to whichever value the policy treats
more urgently so it can never earn a finding more time. Notes that the shipped FedRAMP table
reflects one published version and that readers should confirm the version in force for their
own authorization.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: describe the evaluation clock and escalation on the priority and SLA page (#16012)

Continues the response policies section with the two obligations a published standard adds
beyond a deadline: evaluating every finding inside a window measured from detection, and
treating one combination of facts as an incident until it stops being true.

Says plainly that establishing a fact is what counts as evaluating, that the daily notification
is one per asset rather than one per finding and why, that closed findings are not queued, that
a rule never overwrites a person's answer, and that escalation is a flag and a view rather than
a separate record to manage.

Stacked on the response policies docs branch rather than amending it, so that pull request is
unchanged.

Co-authored-by: devGregA <greg-agent-2@defectdojo.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: devGregA <greg-agent-2@defectdojo.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
The assessment side of the PCI DSS work: what the authored catalog covers and
that every requirement statement in it is a paraphrase rather than the text of
the standard, how to scope an assessment to a cardholder data environment that
spans several Assets, which requirements DefectDojo evidences by itself and what
each one reads, how the shared obligation vocabulary is translated into Report on
Compliance wording in the workbook, and what each of the workbook's eight sheets
contains.

Says plainly that DefectDojo does not determine compliance: it reports what the
recorded evidence shows and the assessor decides what is in place. Two rules an
assessor needs before reading a result are called out rather than left implicit.
A partially satisfied obligation is reported as not in place, because PCI DSS has
no partial credit. In place with compensating control means somebody overrode the
result, because DefectDojo cannot tell a compensating control from any other
override, and the recorded reason needs checking.

Co-authored-by: Greg Anderson <greg@Gregs-MBP.lan>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* docs(sensei): document the Tier Advisor

Explains what the projection does, why it asks about cadence and estate
coverage rather than annualizing trial usage directly, what the headroom
wording means, and when it declines to answer.

No prices: the page describes which tier covers a volume without naming what
a tier costs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(sensei): ask how long findings should be kept, and say what retention covers

The question is about the reader's retention obligation, so it no longer says
"closed findings" in the question itself. The scope is stated plainly instead:
retention governs closed findings and scan history, and findings that are still
open are never aged out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Greg Anderson <greg-agent-2@defectdojo.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* perf: debounce product grade recalculation per product

Every finding save scheduled its own calculate_grade task, so a bulk
operation (an import, a rules run, a mass edit) queued one task per finding
for a value that only needs computing once per product per burst. On a large
instance that was thousands of identical tasks competing with the import
itself for the worker pool, with several recalculations of the same product
running at once.

schedule_product_grade() now coalesces background requests: the first change
in a window records a marker in the cache and queues one calculate_grade
task with a countdown of PRODUCT_GRADE_DEBOUNCE_SECONDS (default 30, env
DD_PRODUCT_GRADE_DEBOUNCE_SECONDS; 0 restores a task per change); later
changes in the window do nothing. The task drops the marker as it starts, so
a change that lands while it runs queues the follow-up it needs, and the
marker expires with the window, so an undelivered task cannot block grading.
Foreground recalculation (force_sync, or a user whose profile blocks
background execution) is unchanged: it runs at once and is never held back
by a marker.

Every dispatch site of calculate_grade goes through the helper; the two
synchronous calls in the bulk-edit views are unchanged.

* test: run the unit-test suites with the grade debounce window off

The debounce marker lives in the Django cache for the length of the window.
Under the test runner a dispatched grade task may never execute, so a marker
can outlive the test that set it and silently skip grading for the next test
whose product gets the same id, and a live window makes query-count baselines
depend on timing rather than on the code under test. Both unit-test compose
environments now set DD_PRODUCT_GRADE_DEBOUNCE_SECONDS=0, which queues a task
per change exactly as before; the debounce's own tests turn the window on
explicitly.
* docs(dashboards): document the Command Center scene

The flag-gated Home for Dashboards 2.0 in Pro: how the scene reads (top
sources into the flow rings inside the posture score, out to the Active and
Mitigated outcome families), the beam through the ribbons and what its glow
means, the score sectors and their captions, the honesty states, the window
and history controls, the kiosk, and the breadcrumb every door lands with.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(dashboards): the Command Center's flow rings tell their stories

Each flow ring divides into arcs (ingested by source, unique by severity,
actionable by risk band), every arc a door onto its slice; the screen carries
one continuous motion, the beam, and the rings beat with it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(dashboards): the Command Center's score sectors focus and explain themselves on hover

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(dashboards): the Command Center's flow ring arcs focus and card themselves, the rules receipt follows the flag

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(dashboards): the Command Center has its own page, and the grid is a preset

The scene lives at /command-center now, on its own route rather than under
the dashboards, so the page says that instead of pointing readers at
Dashboards > Command Center. The sidebar section is rewritten for the two
entries that exist: Home lands on the scene, Dashboards opens the
customizable grids. The third entry it described is gone.

The grid preset is no longer the starter either: new users are handed
Default Dashboard on first login, and the grid is a preset they can clone
like any other.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
The Command Center scene is the home page for every Pro user and needs
no feature flag. Customizable Dashboards keep their flag, and the
sidebar row under Home reads Dashboards (the customizable grids) while
that feature is on and Dashboard (the classic tile dashboard) while it
is off. The three dashboards pages say so; the Pro change ships beside
this on the same release line.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Go-only advisories (e.g. GO-2026-5932) come without any CVE/GHSA alias. The Govulncheck Scanner parser read aliases[0] unconditionally in both the legacy and the streaming output branches, so the import failed with KeyError: 'aliases'. Use the first alias when there is one and leave the CVE empty otherwise, like GovulncheckParserV2 already does. Findings of the legacy format that have no alias are grouped by OSV id.
…he location FK (#16020)

* fix(location): resolve location_type/location_value filters through the location FK

The /api/v2/location_findings/ and /api/v2/location_products/ endpoints are backed
by LocationFindingReferenceFilter and LocationProductReferenceFilter. Both declared
location_type and location_value as direct fields on the reference (through) model,
but those columns live on the related Location model. Any request that used one of
these filters (e.g. ?location_type_contains=...) or ordered by them raised:

    django.core.exceptions.FieldError: Cannot resolve keyword 'location_type' into
    field. Choices are: audit_time, auditor, ..., location, location_id, ...

which surfaced to the client as a 500.

Point both char filters and the ordering entries at the location__location_type /
location__location_value ORM path via the existing model_field_name / (orm, alias)
helper support, so they resolve through the location FK while the public query
parameter names (location_type_*, location_value_*, ordering=location_type|
location_value) stay unchanged for existing API clients and the UI. This mirrors how
created/updated are already aliased on these same filtersets.

Added unittests/test_location_reference_filters.py covering contains-match, a
zero-match case, and ordering for both filtersets; each reproduces the FieldError
before the fix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4KLUavvAVfs11WZKrexEm

* test(location): make reference-filter test self-contained (drop dojo_testdata)

The regression test loaded the dojo_testdata fixture, which carries deprecated
Endpoint rows and fails to install in the V3_FEATURE_LOCATIONS test lane
(EndpointDeprecatedError), erroring setUpClass. Build the minimal Product →
Engagement → Test → Finding graph and a reporter user directly instead, so the
test runs in both the locations-on and locations-off lanes without depending on
the fixture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L4KLUavvAVfs11WZKrexEm

---------

Co-authored-by: Claude <noreply@anthropic.com>
…ack (#16017)

* docs(fda): component support metadata and the cyber device evidence pack

Three changes, covering the cyber device work end to end.

The Locations SBOM page gains the supplier and support fields a component now
carries, and a section on where those facts come from: what each import format
supplies, that unknown is a valid recorded answer rather than a guess, and the
order a per-snapshot override, a recorded value and unknown resolve in. An edit
made by hand survives a later import, and the support source field is what tells
a reviewer which case applies.

The SBOM export page gains the supplier and support properties each format emits,
and says plainly that a component with an unknown support level emits no property
at all, because a consumer reading a support level should be reading a claim
somebody made rather than a placeholder.

A new page covers the cyber device profile, the three lifecycle metrics, the
assessment and the evidence pack. It describes each of the seven elements in our
own words with the statute cited, says which nine controls are evidenced from
data and which four are the manufacturer's paperwork, and states plainly that
DefectDojo records and reports what the manufacturer supplies, does not assess
whether a bill of materials is complete or accurate, and does not determine
whether a submission satisfies the FDA.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(fda): point the cross section link at the right depth

The page sits one level down, so reaching another top-level section takes two
levels up rather than one. The sibling link inside this section is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Greg Anderson <greg@Gregs-MBP.lan>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cody Maffucci <46459665+Maffooch@users.noreply.github.com>
…is not the fix) (#16022)

PR #16005 said a non-default branch must be pinned in Aqua before it imports.
Re-verifying against a live tenant with the connector's own credentials showed
that is wrong: Aqua's scan-results feed (which the connector reads) returns a
repository's default branch only for some sources such as Azure DevOps,
regardless of pinning or token scope, so pinning does not make the branch appear
in the feed.

Rewrite the Branch handling section to describe the actual behavior: the
connector imports whatever branches Aqua returns in its scan-results feed, some
sources expose only the default branch, and an operator who expects a missing
branch should contact support. Removes the pinning instruction.

Reported via a customer support ticket.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions github-actions Bot added the release-management Automated release-train PR label Sep 21, 2026
@rossops rossops closed this Sep 21, 2026
@rossops rossops reopened this Sep 21, 2026
@github-actions github-actions Bot added docker settings_changes Needs changes to settings.py based on changes in settings.dist.py included in this PR docs unittests ui parser helm localization labels Sep 21, 2026
@dryrunsecurity

dryrunsecurity Bot commented Sep 21, 2026

Copy link
Copy Markdown

DryRun Security

This pull request contains multiple low-severity findings where sensitive codepaths were modified by authors not on the allowed list. These changes involve various Python and HTML files within the dojo directory but are non-blocking.

Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/finding_group/views.py (drs_06f19c52)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/finding_group/views.py' matches configured sensitive codepath pattern 'dojo/finding_group/*.py' and was modified by 'adilalperenciftci' (commit e8164e3) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/endpoint/models.py (drs_15ab365e)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/endpoint/models.py' matches configured sensitive codepath pattern 'dojo/endpoint/*.py' and was modified by 'svader0' (commit 85e0a39) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/search/views.py (drs_d9e24c18)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/search/views.py' matches configured sensitive codepath pattern 'dojo/search/*.py' and was modified by 'svader0' (commit 85e0a39) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/templates/dojo/request_endpoint_report.html (drs_99eb4bfe)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/templates/dojo/request_endpoint_report.html' matches configured sensitive codepath pattern 'dojo/templates/**/*.html' and was modified by 'svader0' (commit 85e0a39) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/templates/dojo/simple_search.html (drs_3877d78f)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/templates/dojo/simple_search.html' matches configured sensitive codepath pattern 'dojo/templates/**/*.html' and was modified by 'svader0' (commit 85e0a39) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/urls.py (drs_f93ad7b7)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/urls.py' matches configured sensitive codepath pattern 'dojo/urls.py' and was modified by 'svader0' (commit cd52200) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/user/models.py (drs_5b514f95)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/user/models.py' matches configured sensitive codepath pattern 'dojo/user/*.py' and was modified by 'svader0' (commit cd52200) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/templates/dojo/view_product_details.html (drs_b5095aaa)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/templates/dojo/view_product_details.html' matches configured sensitive codepath pattern 'dojo/templates/**/*.html' and was modified by 'svader0' (commit 92598c9) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/templates/dojo/view_product_type.html (drs_f7e716e6)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/templates/dojo/view_product_type.html' matches configured sensitive codepath pattern 'dojo/templates/**/*.html' and was modified by 'svader0' (commit 92598c9) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/templates/dojo/view_user.html (drs_a453a239)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/templates/dojo/view_user.html' matches configured sensitive codepath pattern 'dojo/templates/**/*.html' and was modified by 'svader0' (commit 92598c9) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/metrics/views.py (drs_e238dc98)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/metrics/views.py' matches configured sensitive codepath pattern 'dojo/metrics/*.py' and was modified by 'svader0' (commit 1d8082d) who is not in the allowed authors list.
Configured Sensitive Codepath Modified by Non-Allowed Author in dojo/finding/helper.py (drs_ca4c3959)
Vulnerability Configured Sensitive Codepath Modified by Non-Allowed Author
Description File 'dojo/finding/helper.py' matches configured sensitive codepath pattern 'dojo/finding/*.py' and was modified by 'svader0' (commit d919c3b) who is not in the allowed authors list.

Comment to provide feedback on these findings.

Report false positive: @dryrunsecurity fp [FINDING ID] [FEEDBACK]
Report low-impact: @dryrunsecurity nit [FINDING ID] [FEEDBACK]

Example: @dryrunsecurity fp drs_90eda195 This code is not user-facing

All finding details can be found in the DryRun Security Dashboard.

@rossops
rossops merged commit 395f040 into master Sep 21, 2026
47 checks passed
@rossops
rossops deleted the release/3.3.200 branch September 21, 2026 16:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docker docs helm localization parser release-management Automated release-train PR settings_changes Needs changes to settings.py based on changes in settings.dist.py included in this PR ui unittests

Projects

None yet

Development

Successfully merging this pull request may close these issues.