diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
index bc92b1571e1..84d7800bed7 100644
--- a/.github/workflows/gh-pages.yml
+++ b/.github/workflows/gh-pages.yml
@@ -23,7 +23,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v4
with:
- node-version: '16.x'
+ node-version: '20.x'
- name: Cache dependencies
uses: actions/cache@v4
diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml
new file mode 100644
index 00000000000..1e1882d4135
--- /dev/null
+++ b/.github/workflows/ruff.yml
@@ -0,0 +1,36 @@
+name: Ruff Linter
+
+on:
+ workflow_dispatch:
+ pull_request_target:
+ push:
+
+jobs:
+ ruff-linting:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target'
+ uses: actions/checkout@v4
+ # by default the pull_requst_target event checks out the base branch, i.e. dev
+ # so we need to explicitly checkout the head of the PR
+ # we use fetch-depth 0 to make sure the full history is checked out and we can compare against
+ # the base commit (branch) of the PR
+ # more info https://github.community/t/github-actions-are-severely-limited-on-prs/18179/16
+ # we checkout merge_commit here as this contains all new code from dev also. we don't need to compare against base_commit
+ with:
+ persist-credentials: false
+ fetch-depth: 0
+ ref: refs/pull/${{ github.event.pull_request.number }}/merge
+ # repository: ${{github.event.pull_request.head.repo.full_name}}
+
+ - name: Checkout
+ # for non PR runs we just checkout the default, which is a sha on a branch probably
+ if: github.event_name != 'pull_request' && github.event_name != 'pull_request_target'
+ uses: actions/checkout@v4
+
+ - name: Install Ruff Linter
+ run: pip install -r requirements-lint.txt
+
+ - name: Run Ruff Linter
+ run: ruff dojo
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 7edfe76d588..6eab69fb83e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,6 +38,7 @@ pip-delete-this-directory.txt
.tox/
.coverage
.cache
+.ruff_cache
nosetests.xml
coverage.xml
diff --git a/Dockerfile.django-alpine b/Dockerfile.django-alpine
index f777e41722f..10b34a77f24 100644
--- a/Dockerfile.django-alpine
+++ b/Dockerfile.django-alpine
@@ -75,6 +75,7 @@ COPY \
docker/entrypoint-unit-tests.sh \
docker/entrypoint-unit-tests-devDocker.sh \
docker/wait-for-it.sh \
+ docker/secret-file-loader.sh \
docker/certs/* \
/
COPY wsgi.py manage.py docker/unit-tests.sh ./
diff --git a/Dockerfile.django-debian b/Dockerfile.django-debian
index 3a245684aa6..f58f22b5be2 100644
--- a/Dockerfile.django-debian
+++ b/Dockerfile.django-debian
@@ -80,6 +80,7 @@ COPY \
docker/entrypoint-unit-tests.sh \
docker/entrypoint-unit-tests-devDocker.sh \
docker/wait-for-it.sh \
+ docker/secret-file-loader.sh \
docker/certs/* \
/
COPY wsgi.py manage.py docker/unit-tests.sh ./
diff --git a/Dockerfile.integration-tests-debian b/Dockerfile.integration-tests-debian
index d47a4518f9f..04cb7eeaf85 100644
--- a/Dockerfile.integration-tests-debian
+++ b/Dockerfile.integration-tests-debian
@@ -61,6 +61,7 @@ WORKDIR /app
COPY --from=openapitools /opt/openapi-generator/modules/openapi-generator-cli/target/openapi-generator-cli.jar /usr/local/bin/openapi-generator-cli.jar
COPY docker/wait-for-it.sh \
+ docker/secret-file-loader.sh \
docker/entrypoint-integration-tests.sh \
/
diff --git a/Dockerfile.nginx-alpine b/Dockerfile.nginx-alpine
index 3d479106c11..faa244612be 100644
--- a/Dockerfile.nginx-alpine
+++ b/Dockerfile.nginx-alpine
@@ -34,7 +34,7 @@ RUN CPUCOUNT=1 pip3 wheel --wheel-dir=/tmp/wheels -r ./requirements.txt
FROM build AS collectstatic
# Node installation from https://github.com/nodejs/docker-node
-ENV NODE_VERSION 14.21.2
+ENV NODE_VERSION 20.11.0
RUN addgroup -g 1000 node \
&& adduser -u 1000 -G node -s /bin/sh -D node \
diff --git a/Dockerfile.nginx-debian b/Dockerfile.nginx-debian
index 7af6520fc31..acec5dd551e 100644
--- a/Dockerfile.nginx-debian
+++ b/Dockerfile.nginx-debian
@@ -44,8 +44,8 @@ RUN \
apt-get -y update && \
apt-get -y install --no-install-recommends apt-transport-https ca-certificates curl wget gnupg && \
curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add --no-tty - && \
- echo 'deb https://deb.nodesource.com/node_14.x bullseye main' > /etc/apt/sources.list.d/nodesource.list && \
- echo 'deb-src https://deb.nodesource.com/node_14.x bullseye main' >> /etc/apt/sources.list.d/nodesource.list && \
+ echo 'deb https://deb.nodesource.com/node_20.x bullseye main' > /etc/apt/sources.list.d/nodesource.list && \
+ echo 'deb-src https://deb.nodesource.com/node_20.x bullseye main' >> /etc/apt/sources.list.d/nodesource.list && \
apt-get update -y -o Dir::Etc::sourcelist="sources.list.d/nodesource.list" \
-o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
diff --git a/docker/entrypoint-celery-worker.sh b/docker/entrypoint-celery-worker.sh
index 20b439eb2e4..9df9b9815bc 100755
--- a/docker/entrypoint-celery-worker.sh
+++ b/docker/entrypoint-celery-worker.sh
@@ -3,6 +3,8 @@ umask 0002
id
+. /secret-file-loader.sh
+
# Allow for bind-mount multiple settings.py overrides
FILES=$(ls /app/docker/extra_settings/* 2>/dev/null)
NUM_FILES=$(echo "$FILES" | wc -w)
diff --git a/docker/entrypoint-initializer.sh b/docker/entrypoint-initializer.sh
index e344fa29496..8246bb7ff18 100755
--- a/docker/entrypoint-initializer.sh
+++ b/docker/entrypoint-initializer.sh
@@ -1,5 +1,7 @@
#!/bin/sh
+. /secret-file-loader.sh
+
initialize_data()
{
# Test types shall be initialized every time by the initializer, to make sure test types are complete
diff --git a/docker/entrypoint-integration-tests.sh b/docker/entrypoint-integration-tests.sh
index e76bcac998e..8f18973fa0f 100755
--- a/docker/entrypoint-integration-tests.sh
+++ b/docker/entrypoint-integration-tests.sh
@@ -1,5 +1,7 @@
#!/bin/bash
+. /secret-file-loader.sh
+
echo "Testing DefectDojo Service"
echo "Waiting max 60s for services to start"
diff --git a/docker/entrypoint-unit-tests-devDocker.sh b/docker/entrypoint-unit-tests-devDocker.sh
index 3a5b8b2004e..a922bbe8795 100755
--- a/docker/entrypoint-unit-tests-devDocker.sh
+++ b/docker/entrypoint-unit-tests-devDocker.sh
@@ -6,6 +6,8 @@ set -x
set -e
set -v
+. /secret-file-loader.sh
+
cd /app
# Unset the database URL so that we can force the DD_TEST_DATABASE_NAME (see django "DATABASES" configuration in settings.dist.py)
unset DD_DATABASE_URL
diff --git a/docker/entrypoint-unit-tests.sh b/docker/entrypoint-unit-tests.sh
index 63008afcbb7..29a9bcfc960 100755
--- a/docker/entrypoint-unit-tests.sh
+++ b/docker/entrypoint-unit-tests.sh
@@ -6,6 +6,8 @@
# set -e
# set -v
+. /secret-file-loader.sh
+
cd /app
# Unset the database URL so that we can force the DD_TEST_DATABASE_NAME (see django "DATABASES" configuration in settings.dist.py)
unset DD_DATABASE_URL
diff --git a/docker/entrypoint-uwsgi-dev.sh b/docker/entrypoint-uwsgi-dev.sh
index 587452cd0f6..b8dd40cb1c4 100755
--- a/docker/entrypoint-uwsgi-dev.sh
+++ b/docker/entrypoint-uwsgi-dev.sh
@@ -1,5 +1,7 @@
#!/bin/sh
+. /secret-file-loader.sh
+
cd /app
diff --git a/docker/entrypoint-uwsgi.sh b/docker/entrypoint-uwsgi.sh
index 7caaa912aa2..0645760bcf5 100755
--- a/docker/entrypoint-uwsgi.sh
+++ b/docker/entrypoint-uwsgi.sh
@@ -1,5 +1,7 @@
#!/bin/sh
+. /secret-file-loader.sh
+
# Allow for bind-mount multiple settings.py overrides
FILES=$(ls /app/docker/extra_settings/* 2>/dev/null)
NUM_FILES=$(echo "$FILES" | wc -w)
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
index acd1ff490ff..3f549abe3e9 100755
--- a/docker/entrypoint.sh
+++ b/docker/entrypoint.sh
@@ -1,5 +1,7 @@
#!/bin/sh
+. /secret-file-loader.sh
+
# Waits for the database to come up.
./docker/wait-for-it.sh $DD_DATABASE_HOST:$DD_DATABASE_PORT
diff --git a/docker/secret-file-loader.sh b/docker/secret-file-loader.sh
new file mode 100644
index 00000000000..157b6512a40
--- /dev/null
+++ b/docker/secret-file-loader.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Convert all environment variables with names ending in _FILE into the content of
+# the file that they point at and use the name without the trailing _FILE.
+# This can be used to carry in Docker secrets.
+# Inspired by https://github.com/grafana/grafana-docker/pull/166
+# But rewrote for /bin/sh
+for VAR_NAME in $(env | grep '^DD_[^=]\+_FILE=.\+' | sed -r "s/([^=]*)_FILE=.*/\1/g"); do
+ VAR_NAME_FILE="$VAR_NAME"_FILE
+ if [ -n "$(eval echo "\$$VAR_NAME")" ]; then
+ echo >&2 "WARNING: Both $VAR_NAME and $VAR_NAME_FILE are set. Content of $VAR_NAME will be overridden."
+ fi
+ echo "Getting secret $VAR_NAME from $(eval echo "\$$VAR_NAME_FILE")"
+ export "$VAR_NAME"="$(cat "$(eval echo "\$$VAR_NAME_FILE")")"
+ unset "$VAR_NAME_FILE"
+done
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/acunetix.md b/docs/content/en/integrations/parsers/file/acunetix.md
index 9bc0122928f..96a2c2005cc 100644
--- a/docs/content/en/integrations/parsers/file/acunetix.md
+++ b/docs/content/en/integrations/parsers/file/acunetix.md
@@ -3,3 +3,6 @@ title: "Acunetix Scanner"
toc_hide: true
---
XML format
+
+### Sample Scan Data
+Sample Acunetix Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/acunetix).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/acunetix360.md b/docs/content/en/integrations/parsers/file/acunetix360.md
index 135dff88981..01b208bbeaa 100644
--- a/docs/content/en/integrations/parsers/file/acunetix360.md
+++ b/docs/content/en/integrations/parsers/file/acunetix360.md
@@ -3,3 +3,6 @@ title: "Acunetix 360 Scanner"
toc_hide: true
---
Vulnerabilities List - JSON report
+
+### Sample Scan Data
+Sample Acunetix 360 Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/acunetix360).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/anchore_enterprise.md b/docs/content/en/integrations/parsers/file/anchore_enterprise.md
index 7aff9a7c4ab..78d3441eb5c 100644
--- a/docs/content/en/integrations/parsers/file/anchore_enterprise.md
+++ b/docs/content/en/integrations/parsers/file/anchore_enterprise.md
@@ -3,3 +3,6 @@ title: "Anchore Enterprise Policy Check"
toc_hide: true
---
Anchore-CLI JSON policy check report format.
+
+### Sample Scan Data
+Sample Anchore Enterprise Policy Check scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchore_enterprise).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/anchore_grype.md b/docs/content/en/integrations/parsers/file/anchore_grype.md
index 1316d69c544..02bb647384f 100644
--- a/docs/content/en/integrations/parsers/file/anchore_grype.md
+++ b/docs/content/en/integrations/parsers/file/anchore_grype.md
@@ -12,7 +12,6 @@ Anchore Grype JSON files are created using the Grype CLI, using the '-o json' op
grype yourApp/example-page -o json > example_vulns.json
{{< /highlight >}}
-
### Acceptable JSON Format
All properties are expected as strings and are required by the parser.
diff --git a/docs/content/en/integrations/parsers/file/anchorectl_policies.md b/docs/content/en/integrations/parsers/file/anchorectl_policies.md
index 809ddbbd477..8ff36f72396 100644
--- a/docs/content/en/integrations/parsers/file/anchorectl_policies.md
+++ b/docs/content/en/integrations/parsers/file/anchorectl_policies.md
@@ -2,4 +2,7 @@
title: "AnchoreCTL Policies Report"
toc_hide: true
---
-AnchoreCTLs JSON policies report format
\ No newline at end of file
+AnchoreCTLs JSON policies report format
+
+### Sample Scan Data
+Sample AnchoreCTL Policies Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchorectl_policies).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/anchorectl_vulns.md b/docs/content/en/integrations/parsers/file/anchorectl_vulns.md
index 09d9d3ff90b..7f41b0e0a47 100644
--- a/docs/content/en/integrations/parsers/file/anchorectl_vulns.md
+++ b/docs/content/en/integrations/parsers/file/anchorectl_vulns.md
@@ -2,4 +2,7 @@
title: "AnchoreCTL Vuln Report"
toc_hide: true
---
-AnchoreCTLs JSON vulnerability report format
\ No newline at end of file
+AnchoreCTLs JSON vulnerability report format
+
+### Sample Scan Data
+Sample AnchoreCTL Vuln Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchorectl_vulns).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/appspider.md b/docs/content/en/integrations/parsers/file/appspider.md
index 6a030ca4cc1..0fd952c0f0d 100644
--- a/docs/content/en/integrations/parsers/file/appspider.md
+++ b/docs/content/en/integrations/parsers/file/appspider.md
@@ -4,3 +4,6 @@ toc_hide: true
---
Use the VulnerabilitiesSummary.xml file found in the zipped report
download.
+
+### Sample Scan Data
+Sample AppSpider (Rapid7) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/appspider).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/aqua.md b/docs/content/en/integrations/parsers/file/aqua.md
index 0186d3bf63d..78b5f0cb384 100644
--- a/docs/content/en/integrations/parsers/file/aqua.md
+++ b/docs/content/en/integrations/parsers/file/aqua.md
@@ -3,3 +3,6 @@ title: "Aqua"
toc_hide: true
---
JSON report format.
+
+### Sample Scan Data
+Sample Aqua scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aqua).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/arachni.md b/docs/content/en/integrations/parsers/file/arachni.md
index 296b0495dac..0c48e534d13 100644
--- a/docs/content/en/integrations/parsers/file/arachni.md
+++ b/docs/content/en/integrations/parsers/file/arachni.md
@@ -9,3 +9,6 @@ Reports are generated with `arachni_reporter` tool this way:
{{< highlight bash >}}
arachni_reporter --reporter 'json' js.com.afr
{{< /highlight >}}
+
+### Sample Scan Data
+Sample Arachni Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/arachni).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/asff.md b/docs/content/en/integrations/parsers/file/asff.md
index 75dafff9715..de830908aa2 100644
--- a/docs/content/en/integrations/parsers/file/asff.md
+++ b/docs/content/en/integrations/parsers/file/asff.md
@@ -8,3 +8,6 @@ AWS Security Hub consumes, aggregates, organizes, and prioritizes findings from
Reference: https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format.html
Prowler tool can generate this format with option `-M json-asff`.
+
+### Sample Scan Data
+Sample AWS Security Finding Format (ASFF) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/asff).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/auditjs.md b/docs/content/en/integrations/parsers/file/auditjs.md
index 7fadb7be0e4..03ed4e4bf8e 100644
--- a/docs/content/en/integrations/parsers/file/auditjs.md
+++ b/docs/content/en/integrations/parsers/file/auditjs.md
@@ -7,3 +7,6 @@ AuditJS scanning tool using OSSIndex database and generated with `--json` or `-j
{{< highlight bash >}}
auditjs ossi --json > auditjs_report.json
{{< /highlight >}}
+
+### Sample Scan Data
+Sample AuditJS (OSSIndex) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/auditjs).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/aws_prowler.md b/docs/content/en/integrations/parsers/file/aws_prowler.md
index 1d20fb615de..628b657ef07 100644
--- a/docs/content/en/integrations/parsers/file/aws_prowler.md
+++ b/docs/content/en/integrations/parsers/file/aws_prowler.md
@@ -3,3 +3,6 @@ title: "AWS Prowler Scanner"
toc_hide: true
---
Prowler file can be imported as a CSV (`-M csv`) or JSON (`-M json`) file.
+
+### Sample Scan Data
+Sample AWS Prowler Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aws_prowler).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/aws_prowler_v3.md b/docs/content/en/integrations/parsers/file/aws_prowler_v3.md
index 7e98fb826e9..17dcf9698ae 100644
--- a/docs/content/en/integrations/parsers/file/aws_prowler_v3.md
+++ b/docs/content/en/integrations/parsers/file/aws_prowler_v3.md
@@ -8,7 +8,6 @@ DefectDojo parser accepts a .json file. Please note: earlier versions of AWS Pr
JSON reports can be created from the [AWS Prowler V3 CLI](https://docs.prowler.cloud/en/latest/tutorials/reporting/#json) using the following command: `prowler -M json`
-
### Acceptable JSON Format
Parser expects an array of assessments. All properties are strings and are required by the parser.
diff --git a/docs/content/en/integrations/parsers/file/aws_scout2.md b/docs/content/en/integrations/parsers/file/aws_scout2.md
index ef2ce4d8f1c..2a5cbbf7157 100644
--- a/docs/content/en/integrations/parsers/file/aws_scout2.md
+++ b/docs/content/en/integrations/parsers/file/aws_scout2.md
@@ -12,3 +12,6 @@ Please switch to the new parser for ScoutSuite.
{{% alert title="Warning" color="warning" %}}
This parser is disactivated by default in releases >= 2.3.1 and will be removed in release >= 3.x.x.
{{% /alert %}}
+
+### Sample Scan Data
+Sample AWS Scout2 Scanner (deprecated) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aws_scout2).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/awssecurityhub.md b/docs/content/en/integrations/parsers/file/awssecurityhub.md
index 826eae53a5c..dc2a2f06b4d 100644
--- a/docs/content/en/integrations/parsers/file/awssecurityhub.md
+++ b/docs/content/en/integrations/parsers/file/awssecurityhub.md
@@ -7,7 +7,6 @@ DefectDojo parser accepts a .json file.
JSON reports can be created from the [AWS Security Hub CLI](https://docs.aws.amazon.com/cli/latest/reference/securityhub/get-findings.html) using the following command: `aws securityhub get-findings`.
-
### Acceptable JSON Format
Parser expects a .json file, with an array of Findings contained within a single JSON object. All properties are strings and are required by the parser.
diff --git a/docs/content/en/integrations/parsers/file/azure_security_center_recommendations.md b/docs/content/en/integrations/parsers/file/azure_security_center_recommendations.md
index 8220d347e3b..c4bffbd7a3a 100644
--- a/docs/content/en/integrations/parsers/file/azure_security_center_recommendations.md
+++ b/docs/content/en/integrations/parsers/file/azure_security_center_recommendations.md
@@ -3,3 +3,6 @@ title: "Azure Security Center Recommendations Scan"
toc_hide: true
---
Azure Security Center recommendations can be exported from the user interface in CSV format.
+
+### Sample Scan Data
+Sample Azure Security Center Recommendations Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/azure_security_center_recommendations).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/bandit.md b/docs/content/en/integrations/parsers/file/bandit.md
index cf2734e0f57..604bbdffb3c 100644
--- a/docs/content/en/integrations/parsers/file/bandit.md
+++ b/docs/content/en/integrations/parsers/file/bandit.md
@@ -9,7 +9,6 @@ DefectDojo parser accepts a .json file.
To export a .json file from Bandit, you will need to install and run the .json report formatter from your Bandit instance.
See Bandit documentation: https://bandit.readthedocs.io/en/latest/formatters/index.html
-
### Acceptable JSON Format
All properties are expected as strings, except "metrics" properties, which are expected as numbers. All properties are required by the parser.
diff --git a/docs/content/en/integrations/parsers/file/blackduck.md b/docs/content/en/integrations/parsers/file/blackduck.md
index 232d817ad10..7f8226fd1e6 100644
--- a/docs/content/en/integrations/parsers/file/blackduck.md
+++ b/docs/content/en/integrations/parsers/file/blackduck.md
@@ -8,4 +8,7 @@ toc_hide: true
The zip file must contain the security.csv and files.csv in order to
produce findings that bear file locations information.
* Import a single security.csv file. Findings will not have any file location
-information.
\ No newline at end of file
+information.
+
+### Sample Scan Data
+Sample Blackduck Hub scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/blackduck).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/blackduck_binary_analysis.md b/docs/content/en/integrations/parsers/file/blackduck_binary_analysis.md
index af573a1f0f7..a51cea701a3 100644
--- a/docs/content/en/integrations/parsers/file/blackduck_binary_analysis.md
+++ b/docs/content/en/integrations/parsers/file/blackduck_binary_analysis.md
@@ -18,3 +18,6 @@ Black Duck Binary Analysis can also detect if sensitive information like email a
#### **How** ####
* Initiate Black Duck Binary Analysis scans using the UI, REST API, or drivers such as [pwn_bdba_scan](https://github.com/0dayinc/pwn/blob/master/bin/pwn_bdba_scan) found within the security automation framework, [PWN](https://github.com/0dayinc/pwn)
* Import a single BDBA vulnerabilty csv results file into DefectDojo leveraging the UI, REST API, or drivers such as [pwn_defectdojo_importscan](https://github.com/0dayInc/pwn/blob/master/bin/pwn_defectdojo_importscan) or [pwn_defectdojo_reimportscan](https://github.com/0dayInc/pwn/blob/master/bin/pwn_defectdojo_reimportscan).
+
+### Sample Scan Data
+Sample Blackduck Binary Analysis scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/blackduck_binary_analysis).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/blackduck_component_risk.md b/docs/content/en/integrations/parsers/file/blackduck_component_risk.md
index 7344a94f775..0a8ff1e7b1e 100644
--- a/docs/content/en/integrations/parsers/file/blackduck_component_risk.md
+++ b/docs/content/en/integrations/parsers/file/blackduck_component_risk.md
@@ -2,4 +2,7 @@
title: "Blackduck Component Risk"
toc_hide: true
---
-Upload the zip file containing the security.csv and files.csv.
\ No newline at end of file
+Upload the zip file containing the security.csv and files.csv.
+
+### Sample Scan Data
+Sample Blackduck Component Risk scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/blackduck_component_risk).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/brakeman.md b/docs/content/en/integrations/parsers/file/brakeman.md
index 1a45149caf7..ca708641383 100644
--- a/docs/content/en/integrations/parsers/file/brakeman.md
+++ b/docs/content/en/integrations/parsers/file/brakeman.md
@@ -3,3 +3,6 @@ title: "Brakeman Scan"
toc_hide: true
---
Import Brakeman Scanner findings in JSON format.
+
+### Sample Scan Data
+Sample Brakeman Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/brakeman).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/bugcrowd.md b/docs/content/en/integrations/parsers/file/bugcrowd.md
index bd7bf343273..a04076f853e 100644
--- a/docs/content/en/integrations/parsers/file/bugcrowd.md
+++ b/docs/content/en/integrations/parsers/file/bugcrowd.md
@@ -3,3 +3,6 @@ title: "Bugcrowd"
toc_hide: true
---
Import Bugcrowd results in CSV format.
+
+### Sample Scan Data
+Sample Bugcrowd scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bugcrowd).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/bundler_audit.md b/docs/content/en/integrations/parsers/file/bundler_audit.md
index f1d94ef7f37..04d8bceb423 100644
--- a/docs/content/en/integrations/parsers/file/bundler_audit.md
+++ b/docs/content/en/integrations/parsers/file/bundler_audit.md
@@ -3,3 +3,6 @@ title: "Bundler-Audit"
toc_hide: true
---
Import the text output generated with bundle-audit check
+
+### Sample Scan Data
+Sample Bundler-Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bundler_audit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/burp_api.md b/docs/content/en/integrations/parsers/file/burp_api.md
index 887895437ed..686e781b043 100644
--- a/docs/content/en/integrations/parsers/file/burp_api.md
+++ b/docs/content/en/integrations/parsers/file/burp_api.md
@@ -2,4 +2,7 @@
title: "Burp REST API"
toc_hide: true
---
-Import Burp REST API scan data in JSON format (/scan/[task_id] endpoint).
\ No newline at end of file
+Import Burp REST API scan data in JSON format (/scan/[task_id] endpoint).
+
+### Sample Scan Data
+Sample Burp REST API scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_api).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/burp_enterprise.md b/docs/content/en/integrations/parsers/file/burp_enterprise.md
index 18338bbb5d5..a328ac1b135 100644
--- a/docs/content/en/integrations/parsers/file/burp_enterprise.md
+++ b/docs/content/en/integrations/parsers/file/burp_enterprise.md
@@ -9,6 +9,5 @@ DefectDojo parser accepts a Standard Report as an HTML file. To parse an XML fi
See also Burp documentation for info on how to export a Standard Report:
https://portswigger.net/burp/documentation/enterprise/work-with-scan-results/generate-reports
-
-### Sample Reports
-A standard Burp Enterprise HTML Report can be found at https://github.com/DefectDojo/django-DefectDojo/blob/master/unittests/scans/burp_enterprise/many_vulns.html.
+### Sample Scan Data
+Sample Burp Enterprise Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_enterprise).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/burp_graphql.md b/docs/content/en/integrations/parsers/file/burp_graphql.md
index 3ac18b987c3..90d60c4394b 100644
--- a/docs/content/en/integrations/parsers/file/burp_graphql.md
+++ b/docs/content/en/integrations/parsers/file/burp_graphql.md
@@ -104,3 +104,5 @@ Example GraphQL query to get issue details:
}
{{< /highlight >}}
+### Sample Scan Data
+Sample Burp GraphQL scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_graphql).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/cargo_audit.md b/docs/content/en/integrations/parsers/file/cargo_audit.md
index 37d7089c416..d56b41200c8 100644
--- a/docs/content/en/integrations/parsers/file/cargo_audit.md
+++ b/docs/content/en/integrations/parsers/file/cargo_audit.md
@@ -2,4 +2,7 @@
title: "CargoAudit Scan"
toc_hide: true
---
-Import JSON output of cargo-audit scan report
\ No newline at end of file
+Import JSON output of cargo-audit scan report
+
+### Sample Scan Data
+Sample CargoAudit Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cargo_audit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/checkmarx.md b/docs/content/en/integrations/parsers/file/checkmarx.md
index df62aae8032..679adf935f9 100644
--- a/docs/content/en/integrations/parsers/file/checkmarx.md
+++ b/docs/content/en/integrations/parsers/file/checkmarx.md
@@ -12,3 +12,6 @@ That will generate three files, two of which are needed for defectdojo. Build th
`jq -s . CxOSAVulnerabilities.json CxOSALibraries.json`
Data for SAST, SCA and KICS are supported.
+
+### Sample Scan Data
+Sample Checkmarx scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkmarx).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/checkov.md b/docs/content/en/integrations/parsers/file/checkov.md
index 8a34d1e969f..8c45815da14 100644
--- a/docs/content/en/integrations/parsers/file/checkov.md
+++ b/docs/content/en/integrations/parsers/file/checkov.md
@@ -49,4 +49,4 @@ JSON files can be created from the Checkov CLI: https://www.checkov.io/2.Basics/
~~~
### Sample Scan Data
-Sample Checkov scans can be found at https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkov
+Sample Checkov scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkov).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/chefinspect.md b/docs/content/en/integrations/parsers/file/chefinspect.md
new file mode 100644
index 00000000000..193dbb17817
--- /dev/null
+++ b/docs/content/en/integrations/parsers/file/chefinspect.md
@@ -0,0 +1,11 @@
+---
+title: "Chef Inspect Log"
+toc_hide: true
+---
+Chef Inspect outputs log from https://github.com/inspec/inspec
+
+### File Types
+DefectDojo parser accepts Chef Inspect log scan data as a .log or .txt file.
+
+### Sample Scan Data
+Sample Chef Inspect logs can be found at https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/chefinspect
diff --git a/docs/content/en/integrations/parsers/file/clair.md b/docs/content/en/integrations/parsers/file/clair.md
index e2e9bd6dc5a..235f801ee94 100644
--- a/docs/content/en/integrations/parsers/file/clair.md
+++ b/docs/content/en/integrations/parsers/file/clair.md
@@ -3,3 +3,6 @@ title: "Clair Scan"
toc_hide: true
---
Import JSON reports of Docker image vulnerabilities.
+
+### Sample Scan Data
+Sample Clair Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/clair).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/clair_klar.md b/docs/content/en/integrations/parsers/file/clair_klar.md
index 4328a17bda8..05651bf267c 100644
--- a/docs/content/en/integrations/parsers/file/clair_klar.md
+++ b/docs/content/en/integrations/parsers/file/clair_klar.md
@@ -3,4 +3,7 @@ title: "Clair Klar Scan"
toc_hide: true
---
Import JSON reports of Docker image vulnerabilities from clair klar
-client.
\ No newline at end of file
+client.
+
+### Sample Scan Data
+Sample Clair Klar Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/clair_klar).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/cloudsploit.md b/docs/content/en/integrations/parsers/file/cloudsploit.md
index 653a3b32899..8e178efdffa 100644
--- a/docs/content/en/integrations/parsers/file/cloudsploit.md
+++ b/docs/content/en/integrations/parsers/file/cloudsploit.md
@@ -2,4 +2,7 @@
title: "Cloudsploit (AquaSecurity)"
toc_hide: true
---
-From: https://github.com/aquasecurity/cloudsploit . Import the JSON output.
\ No newline at end of file
+From: https://github.com/aquasecurity/cloudsploit . Import the JSON output.
+
+### Sample Scan Data
+Sample Cloudsploit (AquaSecurity) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cloudsploit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/cobalt.md b/docs/content/en/integrations/parsers/file/cobalt.md
index 59a7d2d4db1..c17f0f662a5 100644
--- a/docs/content/en/integrations/parsers/file/cobalt.md
+++ b/docs/content/en/integrations/parsers/file/cobalt.md
@@ -3,3 +3,6 @@ title: "Cobalt.io Scan"
toc_hide: true
---
CSV Report
+
+### Sample Scan Data
+Sample Cobalt.io Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cobalt).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/codechecker.md b/docs/content/en/integrations/parsers/file/codechecker.md
index 71c2fb6c229..912fdcab269 100644
--- a/docs/content/en/integrations/parsers/file/codechecker.md
+++ b/docs/content/en/integrations/parsers/file/codechecker.md
@@ -19,3 +19,6 @@ then analyze it
```shell
CodeChecker analyze ./codechecker.log -o /path/to/codechecker/analyzer/output/directory
```
+
+### Sample Scan Data
+Sample Codechecker Report native scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/codechecker).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/contrast.md b/docs/content/en/integrations/parsers/file/contrast.md
index bfd1315b295..bf667bc7bd0 100644
--- a/docs/content/en/integrations/parsers/file/contrast.md
+++ b/docs/content/en/integrations/parsers/file/contrast.md
@@ -3,3 +3,6 @@ title: "Contrast Scanner"
toc_hide: true
---
CSV Report
+
+### Sample Scan Data
+Sample Contrast Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/contrast).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/coverity_api.md b/docs/content/en/integrations/parsers/file/coverity_api.md
index afc3d4ae494..8d72942a292 100644
--- a/docs/content/en/integrations/parsers/file/coverity_api.md
+++ b/docs/content/en/integrations/parsers/file/coverity_api.md
@@ -11,3 +11,6 @@ Currently these columns are mandatory:
* `firstDetected` (`First Detected` in the UI)
Other supported attributes: `cwe`, `displayFile`, `occurrenceCount` and `firstDetected`
+
+### Sample Scan Data
+Sample Coverity API scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/coverity_api).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/crashtest_security.md b/docs/content/en/integrations/parsers/file/crashtest_security.md
index 9c7c0f4a19f..cce1b524cf6 100644
--- a/docs/content/en/integrations/parsers/file/crashtest_security.md
+++ b/docs/content/en/integrations/parsers/file/crashtest_security.md
@@ -3,3 +3,6 @@ title: "Crashtest Security"
toc_hide: true
---
Import JSON Report Import XML Report in JUnit Format
+
+### Sample Scan Data
+Sample Crashtest Security scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/crashtest_security).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/cred_scan.md b/docs/content/en/integrations/parsers/file/cred_scan.md
index f3031bee281..7a52a74b141 100644
--- a/docs/content/en/integrations/parsers/file/cred_scan.md
+++ b/docs/content/en/integrations/parsers/file/cred_scan.md
@@ -3,3 +3,6 @@ title: "CredScan Report"
toc_hide: true
---
Import CSV credential scanner reports
+
+### Sample Scan Data
+Sample CredScan Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cred_scan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/cyclonedx.md b/docs/content/en/integrations/parsers/file/cyclonedx.md
index 543e70ee56c..d0d6a4e61a2 100644
--- a/docs/content/en/integrations/parsers/file/cyclonedx.md
+++ b/docs/content/en/integrations/parsers/file/cyclonedx.md
@@ -25,4 +25,7 @@ cyclonedx-py
-i - the alternate filename to a frozen requirements.txt
-o - the bom file to create
-j - generate JSON instead of XML
-{{< /highlight >}}
\ No newline at end of file
+{{< /highlight >}}
+
+### Sample Scan Data
+Sample CycloneDX scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cyclonedx).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/dawnscanner.md b/docs/content/en/integrations/parsers/file/dawnscanner.md
index 931d6417327..bc3682cf9a8 100644
--- a/docs/content/en/integrations/parsers/file/dawnscanner.md
+++ b/docs/content/en/integrations/parsers/file/dawnscanner.md
@@ -3,3 +3,6 @@ title: "DawnScanner"
toc_hide: true
---
Import report in JSON generated with -j option
+
+### Sample Scan Data
+Sample DawnScanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dawnscanner).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/dependency_check.md b/docs/content/en/integrations/parsers/file/dependency_check.md
index 0882a748857..ddc631a1279 100644
--- a/docs/content/en/integrations/parsers/file/dependency_check.md
+++ b/docs/content/en/integrations/parsers/file/dependency_check.md
@@ -8,3 +8,6 @@ OWASP Dependency Check output can be imported in Xml format. This parser ingests
* Suppressed vulnerabilities are marked as mitigated.
* If the suppression is missing any `` tag, it tags them as `no_suppression_document`.
* Related vulnerable dependencies are tagged with `related` tag.
+
+### Sample Scan Data
+Sample Dependency Check scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dependency_check).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/dependency_track.md b/docs/content/en/integrations/parsers/file/dependency_track.md
index 10e90f28e06..147d0afe4b5 100644
--- a/docs/content/en/integrations/parsers/file/dependency_track.md
+++ b/docs/content/en/integrations/parsers/file/dependency_track.md
@@ -9,3 +9,6 @@ https://docs.dependencytrack.org/integrations/defectdojo/
Alternatively, the Finding Packaging Format (FPF) from OWASP Dependency Track can be
imported in JSON format. See here for more info on this JSON format:
+
+### Sample Scan Data
+Sample Dependency Track scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dependency_track).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/detect_secrets.md b/docs/content/en/integrations/parsers/file/detect_secrets.md
index 7d0f9ae2ff3..b9a54199389 100644
--- a/docs/content/en/integrations/parsers/file/detect_secrets.md
+++ b/docs/content/en/integrations/parsers/file/detect_secrets.md
@@ -2,4 +2,7 @@
title: "Detect-secrets"
toc_hide: true
---
-Import of JSON report from
\ No newline at end of file
+Import of JSON report from
+
+### Sample Scan Data
+Sample Detect-secrets scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/detect_secrets).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/dockerbench.md b/docs/content/en/integrations/parsers/file/dockerbench.md
index 793850a1cbc..f4f2840fa75 100644
--- a/docs/content/en/integrations/parsers/file/dockerbench.md
+++ b/docs/content/en/integrations/parsers/file/dockerbench.md
@@ -3,4 +3,7 @@ title: "docker-bench-security Scanner"
toc_hide: true
---
Import JSON reports of OWASP [docker-bench-security](https://github.com/docker/docker-bench-security).
-docker-bench-security is a script that make tests based on [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker/).
\ No newline at end of file
+docker-bench-security is a script that make tests based on [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker/).
+
+### Sample Scan Data
+Sample docker-bench-security Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dockerbench).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/dockle.md b/docs/content/en/integrations/parsers/file/dockle.md
index f3732f225e6..b3944b174da 100644
--- a/docs/content/en/integrations/parsers/file/dockle.md
+++ b/docs/content/en/integrations/parsers/file/dockle.md
@@ -3,4 +3,7 @@ title: "Dockle Report"
toc_hide: true
---
Import JSON container image linter reports
-
\ No newline at end of file
+
+
+### Sample Scan Data
+Sample Dockle Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dockle).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/drheader.md b/docs/content/en/integrations/parsers/file/drheader.md
index b6c775ad2dc..26789703c9f 100644
--- a/docs/content/en/integrations/parsers/file/drheader.md
+++ b/docs/content/en/integrations/parsers/file/drheader.md
@@ -4,3 +4,6 @@ toc_hide: true
---
Import of JSON report from
+
+### Sample Scan Data
+Sample DrHeader scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/drheader).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/dsop.md b/docs/content/en/integrations/parsers/file/dsop.md
index 0fe62eaf4d4..cbee05be1b1 100644
--- a/docs/content/en/integrations/parsers/file/dsop.md
+++ b/docs/content/en/integrations/parsers/file/dsop.md
@@ -2,4 +2,7 @@
title: "DSOP Scan"
toc_hide: true
---
-Import XLSX findings from DSOP vulnerability scan pipelines.
\ No newline at end of file
+Import XLSX findings from DSOP vulnerability scan pipelines.
+
+### Sample Scan Data
+Sample DSOP Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dsop).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/edgescan.md b/docs/content/en/integrations/parsers/file/edgescan.md
index a208320f378..aca05133a74 100644
--- a/docs/content/en/integrations/parsers/file/edgescan.md
+++ b/docs/content/en/integrations/parsers/file/edgescan.md
@@ -3,3 +3,4 @@ title: "Edgescan"
toc_hide: true
---
Import Edgescan vulnerabilities by JSON file or [API - no file required](../../api/edgescan.md)
+
diff --git a/docs/content/en/integrations/parsers/file/eslint.md b/docs/content/en/integrations/parsers/file/eslint.md
index 27d5e6b845c..8bf3dbcafa0 100644
--- a/docs/content/en/integrations/parsers/file/eslint.md
+++ b/docs/content/en/integrations/parsers/file/eslint.md
@@ -3,3 +3,6 @@ title: "ESLint"
toc_hide: true
---
ESLint Json report format (-f json)
+
+### Sample Scan Data
+Sample ESLint scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/eslint).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/fortify.md b/docs/content/en/integrations/parsers/file/fortify.md
index 3f47bb64f3b..bbd44f4fff3 100644
--- a/docs/content/en/integrations/parsers/file/fortify.md
+++ b/docs/content/en/integrations/parsers/file/fortify.md
@@ -3,3 +3,6 @@ title: "Fortify"
toc_hide: true
---
Import Findings from XML file format.
+
+### Sample Scan Data
+Sample Fortify scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/fortify).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gcloud_artifact_scan.md b/docs/content/en/integrations/parsers/file/gcloud_artifact_scan.md
new file mode 100644
index 00000000000..cb752af29c5
--- /dev/null
+++ b/docs/content/en/integrations/parsers/file/gcloud_artifact_scan.md
@@ -0,0 +1,12 @@
+---
+title: "Google Cloud Artifact Vulnerability Scan"
+toc_hide: true
+---
+Google Cloud has a Artifact Registry that you can enable security scans https://cloud.google.com/artifact-registry/docs/analysis
+Once a scan is completed, results can be pulled via API/gcloud https://cloud.google.com/artifact-analysis/docs/metadata-storage and exported to JSON
+
+### File Types
+DefectDojo parser accepts Google Cloud Artifact Vulnerability Scan data as a .json file.
+
+### Sample Scan Data
+Sample reports can be found at https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gcloud_artifact_scan
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/generic.md b/docs/content/en/integrations/parsers/file/generic.md
index 062f96ba637..36e90ab6557 100644
--- a/docs/content/en/integrations/parsers/file/generic.md
+++ b/docs/content/en/integrations/parsers/file/generic.md
@@ -110,3 +110,6 @@ Example:
]
}
```
+
+### Sample Scan Data
+Sample Generic Findings Import scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/generic).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/ggshield.md b/docs/content/en/integrations/parsers/file/ggshield.md
index 6552df96b8e..4f106162e5e 100644
--- a/docs/content/en/integrations/parsers/file/ggshield.md
+++ b/docs/content/en/integrations/parsers/file/ggshield.md
@@ -2,4 +2,7 @@
title: "Ggshield"
toc_hide: true
---
-Import [Ggshield](https://github.com/GitGuardian/ggshield) findings in JSON format.
\ No newline at end of file
+Import [Ggshield](https://github.com/GitGuardian/ggshield) findings in JSON format.
+
+### Sample Scan Data
+Sample Ggshield scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ggshield).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/github_vulnerability.md b/docs/content/en/integrations/parsers/file/github_vulnerability.md
index fdde6cc3e02..8e4f3a8222e 100644
--- a/docs/content/en/integrations/parsers/file/github_vulnerability.md
+++ b/docs/content/en/integrations/parsers/file/github_vulnerability.md
@@ -209,3 +209,6 @@ def get_dependabot_alerts_repository(repo, owner):
)
return json.dumps(output_result, indent=2)
```
+
+### Sample Scan Data
+Sample Github Vulnerability scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/github_vulnerability).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitlab_api_fuzzing.md b/docs/content/en/integrations/parsers/file/gitlab_api_fuzzing.md
index cfa8afbc4ec..9ef8535dace 100644
--- a/docs/content/en/integrations/parsers/file/gitlab_api_fuzzing.md
+++ b/docs/content/en/integrations/parsers/file/gitlab_api_fuzzing.md
@@ -2,4 +2,7 @@
title: "GitLab API Fuzzing Report Scan"
toc_hide: true
---
-GitLab API Fuzzing Report report file can be imported in JSON format (option --json)
\ No newline at end of file
+GitLab API Fuzzing Report report file can be imported in JSON format (option --json)
+
+### Sample Scan Data
+Sample GitLab API Fuzzing Report Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_api_fuzzing).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitlab_container_scan.md b/docs/content/en/integrations/parsers/file/gitlab_container_scan.md
index 8d3a546f8fb..5ff26c7573a 100644
--- a/docs/content/en/integrations/parsers/file/gitlab_container_scan.md
+++ b/docs/content/en/integrations/parsers/file/gitlab_container_scan.md
@@ -2,4 +2,7 @@
title: "GitLab Container Scan"
toc_hide: true
---
-GitLab Container Scan report file can be imported in JSON format (option --json)
\ No newline at end of file
+GitLab Container Scan report file can be imported in JSON format (option --json)
+
+### Sample Scan Data
+Sample GitLab Container Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_container_scan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitlab_dast.md b/docs/content/en/integrations/parsers/file/gitlab_dast.md
index 000ad7760db..b3abcfcc8a4 100644
--- a/docs/content/en/integrations/parsers/file/gitlab_dast.md
+++ b/docs/content/en/integrations/parsers/file/gitlab_dast.md
@@ -2,4 +2,7 @@
title: "GitLab DAST Report"
toc_hide: true
---
-GitLab DAST Report in JSON format (option --json)
\ No newline at end of file
+GitLab DAST Report in JSON format (option --json)
+
+### Sample Scan Data
+Sample GitLab DAST Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_dast).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitlab_dep_scan.md b/docs/content/en/integrations/parsers/file/gitlab_dep_scan.md
index 46179e96e8d..bb5e9bfe30b 100644
--- a/docs/content/en/integrations/parsers/file/gitlab_dep_scan.md
+++ b/docs/content/en/integrations/parsers/file/gitlab_dep_scan.md
@@ -2,4 +2,7 @@
title: "GitLab Dependency Scanning Report"
toc_hide: true
---
-Import Dependency Scanning Report vulnerabilities in JSON format: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#reports-json-format
\ No newline at end of file
+Import Dependency Scanning Report vulnerabilities in JSON format: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#reports-json-format
+
+### Sample Scan Data
+Sample GitLab Dependency Scanning Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_dep_scan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitlab_sast.md b/docs/content/en/integrations/parsers/file/gitlab_sast.md
index 926b62a2043..e592da480a4 100644
--- a/docs/content/en/integrations/parsers/file/gitlab_sast.md
+++ b/docs/content/en/integrations/parsers/file/gitlab_sast.md
@@ -2,4 +2,7 @@
title: "GitLab SAST Report"
toc_hide: true
---
-Import SAST Report vulnerabilities in JSON format: https://docs.gitlab.com/ee/user/application_security/sast/#reports-json-format
\ No newline at end of file
+Import SAST Report vulnerabilities in JSON format: https://docs.gitlab.com/ee/user/application_security/sast/#reports-json-format
+
+### Sample Scan Data
+Sample GitLab SAST Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_sast).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitlab_secret_detection_report.md b/docs/content/en/integrations/parsers/file/gitlab_secret_detection_report.md
index 919227db94d..f3a0d2dc99a 100644
--- a/docs/content/en/integrations/parsers/file/gitlab_secret_detection_report.md
+++ b/docs/content/en/integrations/parsers/file/gitlab_secret_detection_report.md
@@ -2,4 +2,7 @@
title: "GitLab Secret Detection Report"
toc_hide: true
---
-GitLab Secret Detection Report file can be imported in JSON format (option --json).
\ No newline at end of file
+GitLab Secret Detection Report file can be imported in JSON format (option --json).
+
+### Sample Scan Data
+Sample GitLab Secret Detection Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_secret_detection_report).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gitleaks.md b/docs/content/en/integrations/parsers/file/gitleaks.md
index ed0555972e8..00b067e4677 100644
--- a/docs/content/en/integrations/parsers/file/gitleaks.md
+++ b/docs/content/en/integrations/parsers/file/gitleaks.md
@@ -3,3 +3,6 @@ title: "Gitleaks"
toc_hide: true
---
Import Gitleaks findings in JSON format.
+
+### Sample Scan Data
+Sample Gitleaks scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitleaks).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/gosec.md b/docs/content/en/integrations/parsers/file/gosec.md
index 5c4cec0be5f..fbe5bcbf2e2 100644
--- a/docs/content/en/integrations/parsers/file/gosec.md
+++ b/docs/content/en/integrations/parsers/file/gosec.md
@@ -3,3 +3,6 @@ title: "Gosec Scanner"
toc_hide: true
---
Import Gosec Scanner findings in JSON format.
+
+### Sample Scan Data
+Sample Gosec Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gosec).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/govulncheck.md b/docs/content/en/integrations/parsers/file/govulncheck.md
index 47eb5df7494..8637fc2a429 100644
--- a/docs/content/en/integrations/parsers/file/govulncheck.md
+++ b/docs/content/en/integrations/parsers/file/govulncheck.md
@@ -2,4 +2,7 @@
title: "Govulncheck"
toc_hide: true
---
-JSON vulnerability report generated by govulncheck tool, using a command like `govulncheck -json . >> report.json`
\ No newline at end of file
+JSON vulnerability report generated by govulncheck tool, using a command like `govulncheck -json . >> report.json`
+
+### Sample Scan Data
+Sample Govulncheck scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/govulncheck).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/h1.md b/docs/content/en/integrations/parsers/file/h1.md
index 3d93271a801..da01131f9c1 100644
--- a/docs/content/en/integrations/parsers/file/h1.md
+++ b/docs/content/en/integrations/parsers/file/h1.md
@@ -2,4 +2,7 @@
title: "HackerOne Cases"
toc_hide: true
---
-Import HackerOne cases findings in JSON format
\ No newline at end of file
+Import HackerOne cases findings in JSON format
+
+### Sample Scan Data
+Sample HackerOne Cases scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/h1).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/hadolint.md b/docs/content/en/integrations/parsers/file/hadolint.md
index 0f884b58ec6..ccc60f7b637 100644
--- a/docs/content/en/integrations/parsers/file/hadolint.md
+++ b/docs/content/en/integrations/parsers/file/hadolint.md
@@ -3,3 +3,6 @@ title: "Hadolint"
toc_hide: true
---
Hadolint Dockerfile scan in json format.
+
+### Sample Scan Data
+Sample Hadolint scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hadolint).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/harbor_vulnerability.md b/docs/content/en/integrations/parsers/file/harbor_vulnerability.md
index 12ff2a1c6a2..33878003bd0 100644
--- a/docs/content/en/integrations/parsers/file/harbor_vulnerability.md
+++ b/docs/content/en/integrations/parsers/file/harbor_vulnerability.md
@@ -3,4 +3,7 @@ title: "Harbor Vulnerability"
toc_hide: true
---
Import findings from Harbor registry container scan:
-
\ No newline at end of file
+
+
+### Sample Scan Data
+Sample Harbor Vulnerability scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/harbor_vulnerability).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/hcl_appscan.md b/docs/content/en/integrations/parsers/file/hcl_appscan.md
index ef2f68c5999..aae796606f3 100644
--- a/docs/content/en/integrations/parsers/file/hcl_appscan.md
+++ b/docs/content/en/integrations/parsers/file/hcl_appscan.md
@@ -3,3 +3,6 @@ title: "HCL Appscan"
toc_hide: true
---
The HCL Appscan has the possibiilty to export the results in PDF, XML and CSV formats within the portal. However, this parser only supports the import of XML generated from HCL Appscan on cloud.
+
+### Sample Scan Data
+Sample HCL Appscan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hcl_appscan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/horusec.md b/docs/content/en/integrations/parsers/file/horusec.md
index 7a6a4fecd19..b347bef33e0 100644
--- a/docs/content/en/integrations/parsers/file/horusec.md
+++ b/docs/content/en/integrations/parsers/file/horusec.md
@@ -10,4 +10,6 @@ Import findings from Horusec scan.
References:
* [GitHub repository](https://github.com/ZupIT/horusec)
-
\ No newline at end of file
+
+### Sample Scan Data
+Sample Horusec scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/horusec).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/humble.md b/docs/content/en/integrations/parsers/file/humble.md
index 56c3f73b52e..e2e4faaec80 100644
--- a/docs/content/en/integrations/parsers/file/humble.md
+++ b/docs/content/en/integrations/parsers/file/humble.md
@@ -3,4 +3,7 @@ title: "Humble Report"
toc_hide: true
---
Import JSON report of the Humble scanner
-
\ No newline at end of file
+
+
+### Sample Scan Data
+Sample Humble Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/humble).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/huskyci.md b/docs/content/en/integrations/parsers/file/huskyci.md
index 4ccdb31b570..660e00505b4 100644
--- a/docs/content/en/integrations/parsers/file/huskyci.md
+++ b/docs/content/en/integrations/parsers/file/huskyci.md
@@ -3,4 +3,7 @@ title: "HuskyCI Report"
toc_hide: true
---
Import JSON reports from
-[HuskyCI]()
\ No newline at end of file
+[HuskyCI]()
+
+### Sample Scan Data
+Sample HuskyCI Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/huskyci).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/hydra.md b/docs/content/en/integrations/parsers/file/hydra.md
index 701e8569a6e..abd5a644d89 100644
--- a/docs/content/en/integrations/parsers/file/hydra.md
+++ b/docs/content/en/integrations/parsers/file/hydra.md
@@ -38,3 +38,6 @@ Sample JSON report:
"success": false
}
```
+
+### Sample Scan Data
+Sample Hydra scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hydra).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/ibm_app.md b/docs/content/en/integrations/parsers/file/ibm_app.md
index e97d9f785db..71ffd51815a 100644
--- a/docs/content/en/integrations/parsers/file/ibm_app.md
+++ b/docs/content/en/integrations/parsers/file/ibm_app.md
@@ -3,3 +3,6 @@ title: "IBM AppScan DAST"
toc_hide: true
---
XML file from IBM App Scanner.
+
+### Sample Scan Data
+Sample IBM AppScan DAST scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ibm_app).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/immuniweb.md b/docs/content/en/integrations/parsers/file/immuniweb.md
index 503bb8a7131..6ab2cd139ad 100644
--- a/docs/content/en/integrations/parsers/file/immuniweb.md
+++ b/docs/content/en/integrations/parsers/file/immuniweb.md
@@ -3,3 +3,6 @@ title: "Immuniweb Scan"
toc_hide: true
---
XML Scan Result File from Immuniweb Scan.
+
+### Sample Scan Data
+Sample Immuniweb Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/immuniweb).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/intsights.md b/docs/content/en/integrations/parsers/file/intsights.md
index f6dd6cbba61..64b6e58860e 100644
--- a/docs/content/en/integrations/parsers/file/intsights.md
+++ b/docs/content/en/integrations/parsers/file/intsights.md
@@ -60,3 +60,6 @@ Example:
}
]
}
+
+### Sample Scan Data
+Sample IntSights Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/intsights).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/jfrog_xray_api_summary_artifact.md b/docs/content/en/integrations/parsers/file/jfrog_xray_api_summary_artifact.md
index 609a0a4da0c..748b77ea6ab 100644
--- a/docs/content/en/integrations/parsers/file/jfrog_xray_api_summary_artifact.md
+++ b/docs/content/en/integrations/parsers/file/jfrog_xray_api_summary_artifact.md
@@ -10,4 +10,4 @@ Accepts a JSON File, generated from the JFrog Artifact Summary API Call.
See unit test example: https://github.com/DefectDojo/django-DefectDojo/blob/master/unittests/scans/jfrog_xray_api_summary_artifact/one_vuln.json
### Link To Tool
-See JFrog Documentation: https://jfrog.com/help/r/jfrog-rest-apis/summary
+See JFrog Documentation: https://jfrog.com/help/r/jfrog-rest-apis/summary
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/jfrog_xray_on_demand_binary_scan.md b/docs/content/en/integrations/parsers/file/jfrog_xray_on_demand_binary_scan.md
index 2b877b1b04c..438bf065a39 100644
--- a/docs/content/en/integrations/parsers/file/jfrog_xray_on_demand_binary_scan.md
+++ b/docs/content/en/integrations/parsers/file/jfrog_xray_on_demand_binary_scan.md
@@ -3,7 +3,10 @@ title: "JFrog Xray On Demand Binary Scan"
toc_hide: true
---
Import the JSON format for the \"JFrog Xray On Demand Binary Scan\" file. Use this importer for Xray version 3.X
---
- JFrog file documentation:
+
+JFrog file documentation:
https://jfrog.com/help/r/jfrog-cli/on-demand-binary-scan
+
+### Sample Scan Data
+Sample JFrog Xray On Demand Binary Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/jfrog_xray_on_demand_binary_scan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/jfrog_xray_unified.md b/docs/content/en/integrations/parsers/file/jfrog_xray_unified.md
index cdc5708ff29..b8b55db0e79 100644
--- a/docs/content/en/integrations/parsers/file/jfrog_xray_unified.md
+++ b/docs/content/en/integrations/parsers/file/jfrog_xray_unified.md
@@ -3,3 +3,6 @@ title: "JFrog XRay Unified"
toc_hide: true
---
Import the JSON format for the \"Security & Compliance | Reports\" export. Jfrog's Xray tool is an add-on to their Artifactory repository that does Software Composition Analysis, see https://www.jfrog.com/confluence/display/JFROG/JFrog+Xray for more information. \"Xray Unified\" refers to Xray Version 3.0 and later.
+
+### Sample Scan Data
+Sample JFrog XRay Unified scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/jfrog_xray_unified).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/jfrogxray.md b/docs/content/en/integrations/parsers/file/jfrogxray.md
index 251c47dfb31..c3cb126fa20 100644
--- a/docs/content/en/integrations/parsers/file/jfrogxray.md
+++ b/docs/content/en/integrations/parsers/file/jfrogxray.md
@@ -3,3 +3,6 @@ title: "JFrogXRay"
toc_hide: true
---
Import the JSON format for the \"Security Export\" file. Use this importer for Xray version 2.X
+
+### Sample Scan Data
+Sample JFrogXRay scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/jfrogxray).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/kics.md b/docs/content/en/integrations/parsers/file/kics.md
index a0dbdd0b746..370421cce84 100644
--- a/docs/content/en/integrations/parsers/file/kics.md
+++ b/docs/content/en/integrations/parsers/file/kics.md
@@ -3,3 +3,6 @@ title: "KICS Scanner"
toc_hide: true
---
Import of JSON report from
+
+### Sample Scan Data
+Sample KICS Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kics).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/kiuwan.md b/docs/content/en/integrations/parsers/file/kiuwan.md
index 6ba50c6dca7..00189e87726 100644
--- a/docs/content/en/integrations/parsers/file/kiuwan.md
+++ b/docs/content/en/integrations/parsers/file/kiuwan.md
@@ -3,3 +3,6 @@ title: "Kiuwan Scanner"
toc_hide: true
---
Import Kiuwan Scan in CSV format. Export as CSV Results on Kiuwan.
+
+### Sample Scan Data
+Sample Kiuwan Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kiuwan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/kubebench.md b/docs/content/en/integrations/parsers/file/kubebench.md
index 38b865e5936..89e1e3c3a6b 100644
--- a/docs/content/en/integrations/parsers/file/kubebench.md
+++ b/docs/content/en/integrations/parsers/file/kubebench.md
@@ -3,3 +3,6 @@ title: "kube-bench Scanner"
toc_hide: true
---
Import JSON reports of Kubernetes CIS benchmark scans.
+
+### Sample Scan Data
+Sample kube-bench Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubebench).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/kubehunter.md b/docs/content/en/integrations/parsers/file/kubehunter.md
index 7b3de0a55b3..08f932d5f86 100644
--- a/docs/content/en/integrations/parsers/file/kubehunter.md
+++ b/docs/content/en/integrations/parsers/file/kubehunter.md
@@ -3,3 +3,6 @@ title: "kubeHunter Scanner"
toc_hide: true
---
Import JSON reports of kube-hunter scans. Use "kube-hunter --report json" to produce the report in json format.
+
+### Sample Scan Data
+Sample kubeHunter Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubehunter).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/meterian.md b/docs/content/en/integrations/parsers/file/meterian.md
index f07d16dc0a4..bf2d3bea8bc 100644
--- a/docs/content/en/integrations/parsers/file/meterian.md
+++ b/docs/content/en/integrations/parsers/file/meterian.md
@@ -3,3 +3,6 @@ title: "Meterian Scanner"
toc_hide: true
---
The Meterian JSON report output file can be imported.
+
+### Sample Scan Data
+Sample Meterian Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/meterian).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/microfocus_webinspect.md b/docs/content/en/integrations/parsers/file/microfocus_webinspect.md
index 91fc0cf3538..e087e4267e8 100644
--- a/docs/content/en/integrations/parsers/file/microfocus_webinspect.md
+++ b/docs/content/en/integrations/parsers/file/microfocus_webinspect.md
@@ -3,3 +3,6 @@ title: "Microfocus Webinspect Scanner"
toc_hide: true
---
Import XML report
+
+### Sample Scan Data
+Sample Microfocus Webinspect Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/microfocus_webinspect).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/mobsf.md b/docs/content/en/integrations/parsers/file/mobsf.md
index 63dcf20564f..44985929fdb 100644
--- a/docs/content/en/integrations/parsers/file/mobsf.md
+++ b/docs/content/en/integrations/parsers/file/mobsf.md
@@ -3,3 +3,6 @@ title: "MobSF Scanner"
toc_hide: true
---
Export a JSON file using the API, api/v1/report\_json.
+
+### Sample Scan Data
+Sample MobSF Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mobsf).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/mobsfscan.md b/docs/content/en/integrations/parsers/file/mobsfscan.md
index 626d90f2949..7209f80b403 100644
--- a/docs/content/en/integrations/parsers/file/mobsfscan.md
+++ b/docs/content/en/integrations/parsers/file/mobsfscan.md
@@ -3,3 +3,6 @@ title: "Mobsfscan"
toc_hide: true
---
Import JSON report from
+
+### Sample Scan Data
+Sample Mobsfscan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mobsfscan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/mozilla_observatory.md b/docs/content/en/integrations/parsers/file/mozilla_observatory.md
index c36ce869a8e..3d1150821d3 100644
--- a/docs/content/en/integrations/parsers/file/mozilla_observatory.md
+++ b/docs/content/en/integrations/parsers/file/mozilla_observatory.md
@@ -3,3 +3,6 @@ title: "Mozilla Observatory Scanner"
toc_hide: true
---
Import JSON report.
+
+### Sample Scan Data
+Sample Mozilla Observatory Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mozilla_observatory).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/ms_defender.md b/docs/content/en/integrations/parsers/file/ms_defender.md
index 0a2f7b480fb..2bf8c436ffd 100644
--- a/docs/content/en/integrations/parsers/file/ms_defender.md
+++ b/docs/content/en/integrations/parsers/file/ms_defender.md
@@ -4,4 +4,7 @@ toc_hide: true
---
This parser helps to parse Microsoft Defender Findings and supports two types of imports:
- You can import a JSON output file from the api/vulnerabilities/machinesVulnerabilities endpoint of Microsoft defender.
-- You can upload a custom zip file which include multiple JSON files from two Microsoft Defender Endpoints. For that you have to make your own zip file and include two folders (machines/ and vulnerabilities/) within the zip file. For vulnerabilities/ you can attach multiple JSON files from the api/vulnerabilities/machinesVulnerabilities REST API endpoint of Microsoft Defender. Furthermore, in machines/ you can attach the JSON output from the api/machines REST API endpoint of Microsoft Defender. Then, the parser uses the information in both folders to add more specific information like the affected IP Address to the finding.
\ No newline at end of file
+- You can upload a custom zip file which include multiple JSON files from two Microsoft Defender Endpoints. For that you have to make your own zip file and include two folders (machines/ and vulnerabilities/) within the zip file. For vulnerabilities/ you can attach multiple JSON files from the api/vulnerabilities/machinesVulnerabilities REST API endpoint of Microsoft Defender. Furthermore, in machines/ you can attach the JSON output from the api/machines REST API endpoint of Microsoft Defender. Then, the parser uses the information in both folders to add more specific information like the affected IP Address to the finding.
+
+### Sample Scan Data
+Sample MS Defender Parser scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ms_defender).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/netsparker.md b/docs/content/en/integrations/parsers/file/netsparker.md
index 255f7ef9750..7e46af07b12 100644
--- a/docs/content/en/integrations/parsers/file/netsparker.md
+++ b/docs/content/en/integrations/parsers/file/netsparker.md
@@ -3,3 +3,6 @@ title: "Netsparker"
toc_hide: true
---
Vulnerabilities List - JSON report
+
+### Sample Scan Data
+Sample Netsparker scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/netsparker).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/neuvector.md b/docs/content/en/integrations/parsers/file/neuvector.md
index 083adf707fb..5acf03267a2 100644
--- a/docs/content/en/integrations/parsers/file/neuvector.md
+++ b/docs/content/en/integrations/parsers/file/neuvector.md
@@ -2,4 +2,7 @@
title: "NeuVector (compliance)"
toc_hide: true
---
-Imports compliance scans returned by REST API.
\ No newline at end of file
+Imports compliance scans returned by REST API.
+
+### Sample Scan Data
+Sample NeuVector (compliance) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/neuvector).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/neuvector_compliance.md b/docs/content/en/integrations/parsers/file/neuvector_compliance.md
index 0a6e8cac660..cce614b2f90 100644
--- a/docs/content/en/integrations/parsers/file/neuvector_compliance.md
+++ b/docs/content/en/integrations/parsers/file/neuvector_compliance.md
@@ -2,4 +2,7 @@
title: "NeuVector (REST)"
toc_hide: true
---
-JSON output of /v1/scan/{entity}/{id} endpoint
\ No newline at end of file
+JSON output of /v1/scan/{entity}/{id} endpoint
+
+### Sample Scan Data
+Sample NeuVector (REST) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/neuvector_compliance).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/nexpose.md b/docs/content/en/integrations/parsers/file/nexpose.md
index d85810d926b..f2380a3666e 100644
--- a/docs/content/en/integrations/parsers/file/nexpose.md
+++ b/docs/content/en/integrations/parsers/file/nexpose.md
@@ -3,3 +3,6 @@ title: "Nexpose XML 2.0 (Rapid7)"
toc_hide: true
---
Use the full XML export template from Nexpose.
+
+### Sample Scan Data
+Sample Nexpose XML 2.0 (Rapid7) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nexpose).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/nikto.md b/docs/content/en/integrations/parsers/file/nikto.md
index 3389e3d4018..09bcce9c10a 100644
--- a/docs/content/en/integrations/parsers/file/nikto.md
+++ b/docs/content/en/integrations/parsers/file/nikto.md
@@ -9,4 +9,7 @@ The current parser support 3 sources:
- new XML output (with nxvmlversion=\"1.2\" type)
- JSON output
-See: https://github.com/sullo/nikto
\ No newline at end of file
+See: https://github.com/sullo/nikto
+
+### Sample Scan Data
+Sample Nikto scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nikto).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/nmap.md b/docs/content/en/integrations/parsers/file/nmap.md
index 9404d70acdc..cada9ad2d3c 100644
--- a/docs/content/en/integrations/parsers/file/nmap.md
+++ b/docs/content/en/integrations/parsers/file/nmap.md
@@ -3,3 +3,6 @@ title: "Nmap"
toc_hide: true
---
XML output (use -oX)
+
+### Sample Scan Data
+Sample Nmap scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nmap).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/npm_audit.md b/docs/content/en/integrations/parsers/file/npm_audit.md
index 44de32b6ab2..ebf280da964 100644
--- a/docs/content/en/integrations/parsers/file/npm_audit.md
+++ b/docs/content/en/integrations/parsers/file/npm_audit.md
@@ -4,3 +4,6 @@ toc_hide: true
---
Node Package Manager (NPM) Audit plugin output file can be imported in
JSON format. Only imports the \'advisories\' subtree.
+
+### Sample Scan Data
+Sample NPM Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/npm_audit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/nsp.md b/docs/content/en/integrations/parsers/file/nsp.md
index ab7fdf54e18..916495ecdf2 100644
--- a/docs/content/en/integrations/parsers/file/nsp.md
+++ b/docs/content/en/integrations/parsers/file/nsp.md
@@ -3,3 +3,6 @@ title: "Node Security Platform"
toc_hide: true
---
Node Security Platform (NSP) output file can be imported in JSON format.
+
+### Sample Scan Data
+Sample Node Security Platform scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nsp).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/nuclei.md b/docs/content/en/integrations/parsers/file/nuclei.md
index edf1f765879..3e63a2b9429 100644
--- a/docs/content/en/integrations/parsers/file/nuclei.md
+++ b/docs/content/en/integrations/parsers/file/nuclei.md
@@ -3,3 +3,6 @@ title: "Nuclei"
toc_hide: true
---
Import JSON output of nuclei scan report
+
+### Sample Scan Data
+Sample Nuclei scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nuclei).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/openscap.md b/docs/content/en/integrations/parsers/file/openscap.md
index 7bab7e5335d..220f27d66e0 100644
--- a/docs/content/en/integrations/parsers/file/openscap.md
+++ b/docs/content/en/integrations/parsers/file/openscap.md
@@ -3,3 +3,6 @@ title: "Openscap Vulnerability Scan"
toc_hide: true
---
Import Openscap Vulnerability Scan in XML formats.
+
+### Sample Scan Data
+Sample Openscap Vulnerability Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/openscap).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/openvas.md b/docs/content/en/integrations/parsers/file/openvas.md
new file mode 100644
index 00000000000..ab93b2498f4
--- /dev/null
+++ b/docs/content/en/integrations/parsers/file/openvas.md
@@ -0,0 +1,5 @@
+---
+title: "OpenVAS Parser"
+toc_hide: true
+---
+You can either upload the exported results of an OpenVAS Scan in a .csv or .xml format.
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/openvas_csv.md b/docs/content/en/integrations/parsers/file/openvas_csv.md
deleted file mode 100644
index 621f055a41d..00000000000
--- a/docs/content/en/integrations/parsers/file/openvas_csv.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "OpenVAS CSV"
-toc_hide: true
----
-Import OpenVAS Scan in CSV format. Export as CSV Results on OpenVAS.
diff --git a/docs/content/en/integrations/parsers/file/openvas_xml.md b/docs/content/en/integrations/parsers/file/openvas_xml.md
deleted file mode 100644
index c361a1c44b0..00000000000
--- a/docs/content/en/integrations/parsers/file/openvas_xml.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: "OpenVAS XML"
-toc_hide: true
----
-Import Greenbone OpenVAS Scan in XML format. Export as XML Results on OpenVAS.
diff --git a/docs/content/en/integrations/parsers/file/ort.md b/docs/content/en/integrations/parsers/file/ort.md
index e12181ade4c..2aac161efd3 100644
--- a/docs/content/en/integrations/parsers/file/ort.md
+++ b/docs/content/en/integrations/parsers/file/ort.md
@@ -2,4 +2,7 @@
title: "ORT evaluated model Importer"
toc_hide: true
---
-Import Outpost24 endpoint vulnerability scan in XML format.
\ No newline at end of file
+Import Outpost24 endpoint vulnerability scan in XML format.
+
+### Sample Scan Data
+Sample ORT evaluated model Importer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ort).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/ossindex_devaudit.md b/docs/content/en/integrations/parsers/file/ossindex_devaudit.md
index f21c5f20e33..cb007e5a3e3 100644
--- a/docs/content/en/integrations/parsers/file/ossindex_devaudit.md
+++ b/docs/content/en/integrations/parsers/file/ossindex_devaudit.md
@@ -3,4 +3,7 @@ title: "OssIndex Devaudit"
toc_hide: true
---
Import JSON formatted output from \[OSSIndex
-Devaudit\]().
\ No newline at end of file
+Devaudit\]().
+
+### Sample Scan Data
+Sample OssIndex Devaudit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ossindex_devaudit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/outpost24.md b/docs/content/en/integrations/parsers/file/outpost24.md
index e87ce615304..2c0f974f02e 100644
--- a/docs/content/en/integrations/parsers/file/outpost24.md
+++ b/docs/content/en/integrations/parsers/file/outpost24.md
@@ -2,4 +2,7 @@
title: "Outpost24 Scan"
toc_hide: true
---
-Import Outpost24 endpoint vulnerability scan in XML format.
\ No newline at end of file
+Import Outpost24 endpoint vulnerability scan in XML format.
+
+### Sample Scan Data
+Sample Outpost24 Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/outpost24).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/php_security_audit_v2.md b/docs/content/en/integrations/parsers/file/php_security_audit_v2.md
index 33760aec450..1abcb0e741c 100644
--- a/docs/content/en/integrations/parsers/file/php_security_audit_v2.md
+++ b/docs/content/en/integrations/parsers/file/php_security_audit_v2.md
@@ -3,3 +3,6 @@ title: "PHP Security Audit v2"
toc_hide: true
---
Import PHP Security Audit v2 Scan in JSON format.
+
+### Sample Scan Data
+Sample PHP Security Audit v2 scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/php_security_audit_v2).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/php_symfony_security_check.md b/docs/content/en/integrations/parsers/file/php_symfony_security_check.md
index 912522e83d7..27552cb8395 100644
--- a/docs/content/en/integrations/parsers/file/php_symfony_security_check.md
+++ b/docs/content/en/integrations/parsers/file/php_symfony_security_check.md
@@ -3,3 +3,6 @@ title: "PHP Symfony Security Checker"
toc_hide: true
---
Import results from the PHP Symfony Security Checker.
+
+### Sample Scan Data
+Sample PHP Symfony Security Checker scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/php_symfony_security_check).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/pip_audit.md b/docs/content/en/integrations/parsers/file/pip_audit.md
index 50156ee1acc..df24cdbe7a3 100644
--- a/docs/content/en/integrations/parsers/file/pip_audit.md
+++ b/docs/content/en/integrations/parsers/file/pip_audit.md
@@ -2,4 +2,7 @@
title: "pip-audit Scan"
toc_hide: true
---
-Import pip-audit JSON scan report
\ No newline at end of file
+Import pip-audit JSON scan report
+
+### Sample Scan Data
+Sample pip-audit Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/pip_audit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/pmd.md b/docs/content/en/integrations/parsers/file/pmd.md
index aea80c507a9..ebb4d951764 100644
--- a/docs/content/en/integrations/parsers/file/pmd.md
+++ b/docs/content/en/integrations/parsers/file/pmd.md
@@ -2,4 +2,7 @@
title: "PMD Scan"
toc_hide: true
---
-CSV Report
\ No newline at end of file
+CSV Report
+
+### Sample Scan Data
+Sample PMD Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/pmd).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/popeye.md b/docs/content/en/integrations/parsers/file/popeye.md
index f36e62cddcb..82dbdd89582 100644
--- a/docs/content/en/integrations/parsers/file/popeye.md
+++ b/docs/content/en/integrations/parsers/file/popeye.md
@@ -64,3 +64,5 @@ To match it to DefectDojo severity formula, Secerity 0 (Ok) findings from Popeye
- Severity 2 (Warning) Popeye findings will be created as Severity "Low" findings in DefectDojo.
- Severity 3 (Errors) Popeye findings will be created as Severity "High" findingsi in DefectDojo.
+### Sample Scan Data
+Sample Popeye scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/popeye).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/pwn_sast.md b/docs/content/en/integrations/parsers/file/pwn_sast.md
index 7de6b3e7139..241f2c0ca6d 100644
--- a/docs/content/en/integrations/parsers/file/pwn_sast.md
+++ b/docs/content/en/integrations/parsers/file/pwn_sast.md
@@ -4,4 +4,7 @@ toc_hide: true
---
- (Main Page)\[\]
- pwn_sast: Import the JSON results generated by the pwn_sast Driver. This driver scans source code repositories for security anti-patterns that may result in vulnerability identification.
-- More driver results coming soon...
\ No newline at end of file
+- More driver results coming soon...
+
+### Sample Scan Data
+Sample PWN Security Automation Framework scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/pwn_sast).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/qualys.md b/docs/content/en/integrations/parsers/file/qualys.md
index 870f4633753..7fd532c79a8 100644
--- a/docs/content/en/integrations/parsers/file/qualys.md
+++ b/docs/content/en/integrations/parsers/file/qualys.md
@@ -16,3 +16,6 @@ A CSV formatted Qualys Scan Report can also be used. Ensure the following values
* Patches and Workarounds
* Virtual Patches and Mitigating Controls
* Results
+
+### Sample Scan Data
+Sample Qualys Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/qualys_infrascan_webgui.md b/docs/content/en/integrations/parsers/file/qualys_infrascan_webgui.md
index 67e8c8a44f0..bba44904df1 100644
--- a/docs/content/en/integrations/parsers/file/qualys_infrascan_webgui.md
+++ b/docs/content/en/integrations/parsers/file/qualys_infrascan_webgui.md
@@ -2,4 +2,7 @@
title: "Qualys Infrastructure Scan (WebGUI XML)"
toc_hide: true
---
-Qualys WebGUI output files can be imported in XML format.
\ No newline at end of file
+Qualys WebGUI output files can be imported in XML format.
+
+### Sample Scan Data
+Sample Qualys Infrastructure Scan (WebGUI XML) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys_infrascan_webgui).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/qualys_webapp.md b/docs/content/en/integrations/parsers/file/qualys_webapp.md
index 44ce03d98b2..b8a4017b113 100644
--- a/docs/content/en/integrations/parsers/file/qualys_webapp.md
+++ b/docs/content/en/integrations/parsers/file/qualys_webapp.md
@@ -3,3 +3,6 @@ title: "Qualys Webapp Scan"
toc_hide: true
---
Qualys WebScan output files can be imported in XML format.
+
+### Sample Scan Data
+Sample Qualys Webapp Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys_webapp).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/retirejs.md b/docs/content/en/integrations/parsers/file/retirejs.md
index cc9e626a8b1..b975aa7b603 100644
--- a/docs/content/en/integrations/parsers/file/retirejs.md
+++ b/docs/content/en/integrations/parsers/file/retirejs.md
@@ -3,3 +3,6 @@ title: "Retire.js"
toc_hide: true
---
Retire.js JavaScript scan (\--js) output file can be imported in JSON format.
+
+### Sample Scan Data
+Sample Retire.js scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/retirejs).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/risk_recon.md b/docs/content/en/integrations/parsers/file/risk_recon.md
index 79231f3c808..917b7ed3bc5 100644
--- a/docs/content/en/integrations/parsers/file/risk_recon.md
+++ b/docs/content/en/integrations/parsers/file/risk_recon.md
@@ -55,3 +55,6 @@ Import findings from Risk Recon via the API. Configure your own JSON report as f
the \"companies\" field.
- Removing both fields will allow retrieval of all findings in the
Risk Recon instance.
+
+### Sample Scan Data
+Sample Risk Recon API Importer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/risk_recon).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/rubocop.md b/docs/content/en/integrations/parsers/file/rubocop.md
index 1faf68d8612..8a90bd8eda4 100644
--- a/docs/content/en/integrations/parsers/file/rubocop.md
+++ b/docs/content/en/integrations/parsers/file/rubocop.md
@@ -3,3 +3,6 @@ title: "Rubocop Scan"
toc_hide: true
---
Import Rubocop JSON scan report (with option -f json).
+
+### Sample Scan Data
+Sample Rubocop Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/rubocop).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/rusty_hog.md b/docs/content/en/integrations/parsers/file/rusty_hog.md
index ee10c565e8f..52849c8d99b 100644
--- a/docs/content/en/integrations/parsers/file/rusty_hog.md
+++ b/docs/content/en/integrations/parsers/file/rusty_hog.md
@@ -12,4 +12,7 @@ DefectDojo currently supports the parsing of the following Rusty Hog JSON output
- Essex Hog: Scans for secrets in a Confluence page.
RustyHog scans only one target at a time. This is not efficient if you want to scan all targets (e.g. all JIRA tickets) and upload each single report to DefectDojo.
-[Rusty-Hog-Wrapper](https://github.com/manuel-sommer/Rusty-Hog-Wrapper) deals with this and scans a whole JIRA Project or Confluence Space, merges the findings into a valid file which can be uploaded to DefectDojo. (This is no official recommendation from DefectDojo, but rather a pointer in a direction on how to use this vulnerability scanner in a more efficient way.)
\ No newline at end of file
+[Rusty-Hog-Wrapper](https://github.com/manuel-sommer/Rusty-Hog-Wrapper) deals with this and scans a whole JIRA Project or Confluence Space, merges the findings into a valid file which can be uploaded to DefectDojo. (This is no official recommendation from DefectDojo, but rather a pointer in a direction on how to use this vulnerability scanner in a more efficient way.)
+
+### Sample Scan Data
+Sample Rusty Hog parser scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/rusty_hog).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/sarif.md b/docs/content/en/integrations/parsers/file/sarif.md
index b3b189f2a7f..2b7f2d1009e 100644
--- a/docs/content/en/integrations/parsers/file/sarif.md
+++ b/docs/content/en/integrations/parsers/file/sarif.md
@@ -24,3 +24,6 @@ It's possible to activate de-duplication based on this data by customizing setti
# in your settings.py file
DEDUPLICATION_ALGORITHM_PER_PARSER["SARIF"] = DEDUPE_ALGO_UNIQUE_ID_FROM_TOOL_OR_HASH_CODE
```
+
+### Sample Scan Data
+Sample SARIF scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sarif).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/scantist.md b/docs/content/en/integrations/parsers/file/scantist.md
index b0894ac9eb0..a29f1392d58 100644
--- a/docs/content/en/integrations/parsers/file/scantist.md
+++ b/docs/content/en/integrations/parsers/file/scantist.md
@@ -3,4 +3,7 @@ title: "Scantist Scan"
toc_hide: true
---
Scantist is an open source management platform. Scan and remediate open source security, licensing and compliance risks across your software development lifecycle.
-Here you can find more information:
\ No newline at end of file
+Here you can find more information:
+
+### Sample Scan Data
+Sample Scantist Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/scantist).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/scout_suite.md b/docs/content/en/integrations/parsers/file/scout_suite.md
index d68c20089fc..7e97dbfd309 100644
--- a/docs/content/en/integrations/parsers/file/scout_suite.md
+++ b/docs/content/en/integrations/parsers/file/scout_suite.md
@@ -6,4 +6,7 @@ Multi-Cloud security auditing tool. It uses APIs exposed by cloud
providers. Scan results are located at
`scan-reports/scoutsuite-results/scoutsuite\_\*.json` files.
Multiple scans will create multiple files if they are runing agains
-different Cloud projects. See
\ No newline at end of file
+different Cloud projects. See
+
+### Sample Scan Data
+Sample ScoutSuite scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/scout_suite).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/semgrep.md b/docs/content/en/integrations/parsers/file/semgrep.md
index f174f130a06..b88c8ed9d66 100644
--- a/docs/content/en/integrations/parsers/file/semgrep.md
+++ b/docs/content/en/integrations/parsers/file/semgrep.md
@@ -3,3 +3,6 @@ title: "Semgrep JSON Report"
toc_hide: true
---
Import Semgrep output (--json)
+
+### Sample Scan Data
+Sample Semgrep JSON Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/semgrep).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/skf.md b/docs/content/en/integrations/parsers/file/skf.md
index c3b3faa9416..c2fcfa27411 100644
--- a/docs/content/en/integrations/parsers/file/skf.md
+++ b/docs/content/en/integrations/parsers/file/skf.md
@@ -3,3 +3,6 @@ title: "SKF Scan"
toc_hide: true
---
Output of SKF Sprint summary export.
+
+### Sample Scan Data
+Sample SKF Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/skf).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/snyk.md b/docs/content/en/integrations/parsers/file/snyk.md
index 21dcff4d8e9..f8cc7463789 100644
--- a/docs/content/en/integrations/parsers/file/snyk.md
+++ b/docs/content/en/integrations/parsers/file/snyk.md
@@ -4,3 +4,6 @@ toc_hide: true
---
Snyk output file (snyk test \--json \> snyk.json) can be imported in
JSON format. Only SCA (Software Composition Analysis) report is supported (SAST report not supported yet).
+
+### Sample Scan Data
+Sample Snyk scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/snyk).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/solar_appscreener.md b/docs/content/en/integrations/parsers/file/solar_appscreener.md
index 1fe049b3a75..80ab6a894d1 100644
--- a/docs/content/en/integrations/parsers/file/solar_appscreener.md
+++ b/docs/content/en/integrations/parsers/file/solar_appscreener.md
@@ -2,4 +2,7 @@
title: "Solar Appscreener Scan"
toc_hide: true
---
-Solar Appscreener report file can be imported in CSV format from Detailed_Results.csv
\ No newline at end of file
+Solar Appscreener report file can be imported in CSV format from Detailed_Results.csv
+
+### Sample Scan Data
+Sample Solar Appscreener Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/solar_appscreener).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/sonarqube.md b/docs/content/en/integrations/parsers/file/sonarqube.md
index 5b5ae90e923..9e4da8c6f99 100644
--- a/docs/content/en/integrations/parsers/file/sonarqube.md
+++ b/docs/content/en/integrations/parsers/file/sonarqube.md
@@ -19,3 +19,6 @@ To generate the report, see
Version: \>= 1.1.0
+
+### Sample Scan Data
+Sample SonarQube scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sonarqube).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/sonatype.md b/docs/content/en/integrations/parsers/file/sonatype.md
index aa317c00aa0..c993fdd3f15 100644
--- a/docs/content/en/integrations/parsers/file/sonatype.md
+++ b/docs/content/en/integrations/parsers/file/sonatype.md
@@ -3,3 +3,6 @@ title: "Sonatype"
toc_hide: true
---
JSON output.
+
+### Sample Scan Data
+Sample Sonatype scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sonatype).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/spotbugs.md b/docs/content/en/integrations/parsers/file/spotbugs.md
index 049d1b78372..69a288e5b5b 100644
--- a/docs/content/en/integrations/parsers/file/spotbugs.md
+++ b/docs/content/en/integrations/parsers/file/spotbugs.md
@@ -3,3 +3,6 @@ title: "SpotBugs"
toc_hide: true
---
XML report of textui cli.
+
+### Sample Scan Data
+Sample SpotBugs scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/spotbugs).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/ssh_audit.md b/docs/content/en/integrations/parsers/file/ssh_audit.md
index e5877f79380..29f95a82260 100644
--- a/docs/content/en/integrations/parsers/file/ssh_audit.md
+++ b/docs/content/en/integrations/parsers/file/ssh_audit.md
@@ -2,4 +2,7 @@
title: "SSH Audit"
toc_hide: true
---
-Import JSON output of ssh_audit report. See
\ No newline at end of file
+Import JSON output of ssh_audit report. See
+
+### Sample Scan Data
+Sample SSH Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ssh_audit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/ssl_labs.md b/docs/content/en/integrations/parsers/file/ssl_labs.md
index 41544357653..cd5972e126b 100644
--- a/docs/content/en/integrations/parsers/file/ssl_labs.md
+++ b/docs/content/en/integrations/parsers/file/ssl_labs.md
@@ -3,3 +3,6 @@ title: "SSL Labs"
toc_hide: true
---
JSON Output of ssllabs-scan cli.
+
+### Sample Scan Data
+Sample SSL Labs scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ssl_labs).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/sslscan.md b/docs/content/en/integrations/parsers/file/sslscan.md
index 056c7ebcda9..0255e5858ab 100644
--- a/docs/content/en/integrations/parsers/file/sslscan.md
+++ b/docs/content/en/integrations/parsers/file/sslscan.md
@@ -3,3 +3,6 @@ title: "Sslscan"
toc_hide: true
---
Import XML output of sslscan report.
+
+### Sample Scan Data
+Sample Sslscan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sslscan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/sslyze.md b/docs/content/en/integrations/parsers/file/sslyze.md
index c46209e11f9..8abfd44b8fa 100644
--- a/docs/content/en/integrations/parsers/file/sslyze.md
+++ b/docs/content/en/integrations/parsers/file/sslyze.md
@@ -3,9 +3,10 @@ title: "Sslyze Scan"
toc_hide: true
---
## Sslyze Scan
-
XML report of SSLyze version 2 scan
## SSLyze 3 Scan (JSON)
+JSON report of SSLyze version 3 scan
-JSON report of SSLyze version 3 scan
\ No newline at end of file
+### Sample Scan Data
+Sample Sslyze Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sslyze).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/stackhawk.md b/docs/content/en/integrations/parsers/file/stackhawk.md
index 281f5dde890..4f66fb5a82c 100644
--- a/docs/content/en/integrations/parsers/file/stackhawk.md
+++ b/docs/content/en/integrations/parsers/file/stackhawk.md
@@ -3,4 +3,7 @@ title: "StackHawk HawkScan"
toc_hide: true
---
Import the JSON webhook event from StackHawk.
-For more information, check out our [docs on hooking up StackHawk to Defect Dojo](https://docs.stackhawk.com/workflow-integrations/defect-dojo.html)
\ No newline at end of file
+For more information, check out our [docs on hooking up StackHawk to Defect Dojo](https://docs.stackhawk.com/workflow-integrations/defect-dojo.html)
+
+### Sample Scan Data
+Sample StackHawk HawkScan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/stackhawk).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/sysdig_reports.md b/docs/content/en/integrations/parsers/file/sysdig_reports.md
index 39037ad8068..1560f445cee 100644
--- a/docs/content/en/integrations/parsers/file/sysdig_reports.md
+++ b/docs/content/en/integrations/parsers/file/sysdig_reports.md
@@ -5,4 +5,7 @@ toc_hide: true
Import CSV report files from Sysdig.
Parser will accept Pipeline, Registry and Runtime reports created from the UI
-More information available at [our reporting docs page](https://docs.sysdig.com/en/docs/sysdig-secure/vulnerabilities/reporting)
\ No newline at end of file
+More information available at [our reporting docs page](https://docs.sysdig.com/en/docs/sysdig-secure/vulnerabilities/reporting)
+
+### Sample Scan Data
+Sample Sysdig Vulnerability Reports scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sysdig_reports).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/talisman.md b/docs/content/en/integrations/parsers/file/talisman.md
index 851618dcd85..c542a1f0f2d 100644
--- a/docs/content/en/integrations/parsers/file/talisman.md
+++ b/docs/content/en/integrations/parsers/file/talisman.md
@@ -38,4 +38,7 @@ else
# If talisman did not find any issues, exit with a zero status code
exit 0
fi
-```
\ No newline at end of file
+```
+
+### Sample Scan Data
+Sample Talisman scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/talisman).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/tenable.md b/docs/content/en/integrations/parsers/file/tenable.md
index d4666ee9017..a4f0ad59030 100644
--- a/docs/content/en/integrations/parsers/file/tenable.md
+++ b/docs/content/en/integrations/parsers/file/tenable.md
@@ -3,5 +3,7 @@ title: "Tenable"
toc_hide: true
---
Reports can be imported in the CSV, and .nessus (XML) report formats.
-
Legacy Nessus and Nessus WAS reports are supported
+
+### Sample Scan Data
+Sample Tenable scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/tenable).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/terrascan.md b/docs/content/en/integrations/parsers/file/terrascan.md
index 8f900e7b32b..c5d6016c5a0 100644
--- a/docs/content/en/integrations/parsers/file/terrascan.md
+++ b/docs/content/en/integrations/parsers/file/terrascan.md
@@ -3,3 +3,6 @@ title: "Terrascan"
toc_hide: true
---
Import JSON output of terrascan scan report
+
+### Sample Scan Data
+Sample Terrascan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/terrascan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/testssl.md b/docs/content/en/integrations/parsers/file/testssl.md
index 0cec96fc113..501cb8b8a7a 100644
--- a/docs/content/en/integrations/parsers/file/testssl.md
+++ b/docs/content/en/integrations/parsers/file/testssl.md
@@ -3,3 +3,6 @@ title: "Testssl Scan"
toc_hide: true
---
Import CSV output of testssl scan report.
+
+### Sample Scan Data
+Sample Testssl Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/testssl).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/tfsec.md b/docs/content/en/integrations/parsers/file/tfsec.md
index 256a291b62f..7a0aca9d57a 100644
--- a/docs/content/en/integrations/parsers/file/tfsec.md
+++ b/docs/content/en/integrations/parsers/file/tfsec.md
@@ -3,3 +3,6 @@ title: "TFSec"
toc_hide: true
---
Import of JSON report from
+
+### Sample Scan Data
+Sample TFSec scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/tfsec).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/trivy.md b/docs/content/en/integrations/parsers/file/trivy.md
index 78a6aef1be8..01823598b70 100644
--- a/docs/content/en/integrations/parsers/file/trivy.md
+++ b/docs/content/en/integrations/parsers/file/trivy.md
@@ -3,3 +3,6 @@ title: "Trivy"
toc_hide: true
---
JSON report of [trivy scanner](https://github.com/aquasecurity/trivy).
+
+### Sample Scan Data
+Sample Trivy scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trivy).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/trivy_operator.md b/docs/content/en/integrations/parsers/file/trivy_operator.md
index 47a93f7ebdf..1433b8231fe 100644
--- a/docs/content/en/integrations/parsers/file/trivy_operator.md
+++ b/docs/content/en/integrations/parsers/file/trivy_operator.md
@@ -5,3 +5,6 @@ toc_hide: true
JSON report of [trivy operator scanner](https://github.com/aquasecurity/trivy-operator).
To import the generated Vulnerability Reports, you can also use the [trivy-dojo-report-operator](https://github.com/telekom-mms/trivy-dojo-report-operator).
+
+### Sample Scan Data
+Sample Trivy Operator scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trivy_operator).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/trufflehog.md b/docs/content/en/integrations/parsers/file/trufflehog.md
index 14673a7214b..c787e8e8105 100644
--- a/docs/content/en/integrations/parsers/file/trufflehog.md
+++ b/docs/content/en/integrations/parsers/file/trufflehog.md
@@ -3,3 +3,6 @@ title: "Trufflehog"
toc_hide: true
---
JSON Output of Trufflehog. Supports version 2 and 3 of https://github.com/trufflesecurity/trufflehog
+
+### Sample Scan Data
+Sample Trufflehog scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trufflehog).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/trufflehog3.md b/docs/content/en/integrations/parsers/file/trufflehog3.md
index 58f1811f257..44fd436d541 100644
--- a/docs/content/en/integrations/parsers/file/trufflehog3.md
+++ b/docs/content/en/integrations/parsers/file/trufflehog3.md
@@ -3,3 +3,6 @@ title: "Trufflehog3"
toc_hide: true
---
JSON Output of Trufflehog3, a fork of TruffleHog located at https://github.com/feeltheajf/truffleHog3
+
+### Sample Scan Data
+Sample Trufflehog3 scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trufflehog3).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/trustwave.md b/docs/content/en/integrations/parsers/file/trustwave.md
index 0b463123b32..e5c6305ea7b 100644
--- a/docs/content/en/integrations/parsers/file/trustwave.md
+++ b/docs/content/en/integrations/parsers/file/trustwave.md
@@ -3,3 +3,6 @@ title: "Trustwave"
toc_hide: true
---
CSV output of Trustwave vulnerability scan.
+
+### Sample Scan Data
+Sample Trustwave scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trustwave).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/trustwave_fusion_api.md b/docs/content/en/integrations/parsers/file/trustwave_fusion_api.md
index 47967276535..d4f61fd0570 100644
--- a/docs/content/en/integrations/parsers/file/trustwave_fusion_api.md
+++ b/docs/content/en/integrations/parsers/file/trustwave_fusion_api.md
@@ -2,4 +2,7 @@
title: "Trustwave Fusion API Scan"
toc_hide: true
---
-Trustwave Fusion API report file can be imported in JSON format
\ No newline at end of file
+Trustwave Fusion API report file can be imported in JSON format
+
+### Sample Scan Data
+Sample Trustwave Fusion API Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trustwave_fusion_api).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/twistlock.md b/docs/content/en/integrations/parsers/file/twistlock.md
index 027e931ff9b..e682da7402b 100644
--- a/docs/content/en/integrations/parsers/file/twistlock.md
+++ b/docs/content/en/integrations/parsers/file/twistlock.md
@@ -9,3 +9,6 @@ JSON output of the `twistcli` tool. Example:
{{< /highlight >}}
The CSV output from the UI is now also accepted.
+
+### Sample Scan Data
+Sample Twistlock scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/twistlock).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/vcg.md b/docs/content/en/integrations/parsers/file/vcg.md
index ed44be99d60..568b57bffd8 100644
--- a/docs/content/en/integrations/parsers/file/vcg.md
+++ b/docs/content/en/integrations/parsers/file/vcg.md
@@ -3,3 +3,4 @@ title: "Visual Code Grepper (VCG)"
toc_hide: true
---
VCG output can be imported in CSV or Xml formats.
+
diff --git a/docs/content/en/integrations/parsers/file/veracode.md b/docs/content/en/integrations/parsers/file/veracode.md
index 54978e23059..77237860413 100644
--- a/docs/content/en/integrations/parsers/file/veracode.md
+++ b/docs/content/en/integrations/parsers/file/veracode.md
@@ -46,3 +46,6 @@ Veracode reports can be ingested in either XML or JSON Format
}
}
```
+
+### Sample Scan Data
+Sample Veracode scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/veracode).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/veracode_sca.md b/docs/content/en/integrations/parsers/file/veracode_sca.md
index fd855d52694..59db59d2a31 100644
--- a/docs/content/en/integrations/parsers/file/veracode_sca.md
+++ b/docs/content/en/integrations/parsers/file/veracode_sca.md
@@ -3,3 +3,6 @@ title: "Veracode SourceClear"
toc_hide: true
---
Import Project CSV or JSON report
+
+### Sample Scan Data
+Sample Veracode SourceClear scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/veracode_sca).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/wapiti.md b/docs/content/en/integrations/parsers/file/wapiti.md
index d15d6581e40..53a4cd619b0 100644
--- a/docs/content/en/integrations/parsers/file/wapiti.md
+++ b/docs/content/en/integrations/parsers/file/wapiti.md
@@ -3,3 +3,6 @@ title: "Wapiti Scan"
toc_hide: true
---
Import XML report.
+
+### Sample Scan Data
+Sample Wapiti Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wapiti).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/wazuh.md b/docs/content/en/integrations/parsers/file/wazuh.md
index fcfcb95b519..329372ff84d 100644
--- a/docs/content/en/integrations/parsers/file/wazuh.md
+++ b/docs/content/en/integrations/parsers/file/wazuh.md
@@ -46,4 +46,7 @@ Parser expects a .json file structured as below.
"error": 0,
"message": "All selected vulnerabilities were returned"
}
-~~~
\ No newline at end of file
+~~~
+
+### Sample Scan Data
+Sample Wazuh Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wazuh).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/wfuzz.md b/docs/content/en/integrations/parsers/file/wfuzz.md
index c7a198d87e2..2aa4add793b 100644
--- a/docs/content/en/integrations/parsers/file/wfuzz.md
+++ b/docs/content/en/integrations/parsers/file/wfuzz.md
@@ -12,4 +12,7 @@ HTTP Return Code | Severity
401 | Medium
403 | Medium
407 | Medium
-500 | Low
\ No newline at end of file
+500 | Low
+
+### Sample Scan Data
+Sample Wfuzz JSON importer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wfuzz).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/whispers.md b/docs/content/en/integrations/parsers/file/whispers.md
index 7da1946550f..dfa5b104ef7 100644
--- a/docs/content/en/integrations/parsers/file/whispers.md
+++ b/docs/content/en/integrations/parsers/file/whispers.md
@@ -3,5 +3,7 @@ title: "Whispers"
toc_hide: true
---
Import Whispers JSON results.
+https://github.com/adeptex/whispers
-https://github.com/adeptex/whispers
\ No newline at end of file
+### Sample Scan Data
+Sample Whispers scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/whispers).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/whitehat_sentinel.md b/docs/content/en/integrations/parsers/file/whitehat_sentinel.md
index 61a79fd7b01..756fac5069a 100644
--- a/docs/content/en/integrations/parsers/file/whitehat_sentinel.md
+++ b/docs/content/en/integrations/parsers/file/whitehat_sentinel.md
@@ -2,4 +2,7 @@
title: "WhiteHat Sentinel"
toc_hide: true
---
-WhiteHat Sentinel output from api/vuln/query_site can be imported in JSON format.
\ No newline at end of file
+WhiteHat Sentinel output from api/vuln/query_site can be imported in JSON format.
+
+### Sample Scan Data
+Sample WhiteHat Sentinel scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/whitehat_sentinel).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/whitesource.md b/docs/content/en/integrations/parsers/file/whitesource.md
index d647d7cc96f..62b9a4b8420 100644
--- a/docs/content/en/integrations/parsers/file/whitesource.md
+++ b/docs/content/en/integrations/parsers/file/whitesource.md
@@ -3,3 +3,6 @@ title: "Whitesource Scan"
toc_hide: true
---
Import JSON report
+
+### Sample Scan Data
+Sample Whitesource Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/whitesource).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/wpscan.md b/docs/content/en/integrations/parsers/file/wpscan.md
index 7a26c51cbb3..3e47e2bc6f8 100644
--- a/docs/content/en/integrations/parsers/file/wpscan.md
+++ b/docs/content/en/integrations/parsers/file/wpscan.md
@@ -3,3 +3,6 @@ title: "Wpscan Scanner"
toc_hide: true
---
Import JSON report.
+
+### Sample Scan Data
+Sample Wpscan Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wpscan).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/xanitizer.md b/docs/content/en/integrations/parsers/file/xanitizer.md
index 705f0aa869b..553292b5928 100644
--- a/docs/content/en/integrations/parsers/file/xanitizer.md
+++ b/docs/content/en/integrations/parsers/file/xanitizer.md
@@ -3,4 +3,7 @@ title: "Xanitizer"
toc_hide: true
---
Import XML findings list report, preferably with parameter
-\'generateDetailsInFindingsListReport=true\'.
\ No newline at end of file
+\'generateDetailsInFindingsListReport=true\'.
+
+### Sample Scan Data
+Sample Xanitizer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/xanitizer).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/yarn_audit.md b/docs/content/en/integrations/parsers/file/yarn_audit.md
index 7e8e4f6efc5..e7de450a756 100644
--- a/docs/content/en/integrations/parsers/file/yarn_audit.md
+++ b/docs/content/en/integrations/parsers/file/yarn_audit.md
@@ -3,3 +3,6 @@ title: "Yarn Audit"
toc_hide: true
---
Import Yarn Audit scan report in JSON format. Use something like `yarn audit --json > yarn_report.json`.
+
+### Sample Scan Data
+Sample Yarn Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/yarn_audit).
\ No newline at end of file
diff --git a/docs/content/en/integrations/parsers/file/zap.md b/docs/content/en/integrations/parsers/file/zap.md
index e31268b16ca..43fd58e05c7 100644
--- a/docs/content/en/integrations/parsers/file/zap.md
+++ b/docs/content/en/integrations/parsers/file/zap.md
@@ -3,3 +3,6 @@ title: "Zed Attack Proxy"
toc_hide: true
---
ZAP XML report format (with or without requests and responses).
+
+### Sample Scan Data
+Sample Zed Attack Proxy scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/zap).
\ No newline at end of file
diff --git a/docs/package-lock.json b/docs/package-lock.json
index 3da14d5d770..5decab97de0 100644
--- a/docs/package-lock.json
+++ b/docs/package-lock.json
@@ -5,7 +5,7 @@
"packages": {
"": {
"devDependencies": {
- "autoprefixer": "10.4.16",
+ "autoprefixer": "10.4.17",
"postcss": "8.4.33",
"postcss-cli": "10.1.0"
}
@@ -83,9 +83,9 @@
}
},
"node_modules/autoprefixer": {
- "version": "10.4.16",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
- "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "version": "10.4.17",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz",
+ "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
"dev": true,
"funding": [
{
@@ -102,9 +102,9 @@
}
],
"dependencies": {
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001538",
- "fraction.js": "^4.3.6",
+ "browserslist": "^4.22.2",
+ "caniuse-lite": "^1.0.30001578",
+ "fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
@@ -141,9 +141,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.21.10",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
- "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
"dev": true,
"funding": [
{
@@ -160,10 +160,10 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001517",
- "electron-to-chromium": "^1.4.477",
- "node-releases": "^2.0.13",
- "update-browserslist-db": "^1.0.11"
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
},
"bin": {
"browserslist": "cli.js"
@@ -173,9 +173,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001538",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz",
- "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==",
+ "version": "1.0.30001578",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001578.tgz",
+ "integrity": "sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==",
"dev": true,
"funding": [
{
@@ -270,9 +270,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.490",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz",
- "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==",
+ "version": "1.4.635",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.635.tgz",
+ "integrity": "sha512-iu/2D0zolKU3iDGXXxdOzNf72Jnokn+K1IN6Kk4iV6l1Tr2g/qy+mvmtfAiBwZe5S3aB5r92vp+zSZ69scYRrg==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -328,9 +328,9 @@
}
},
"node_modules/fraction.js": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
- "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true,
"engines": {
"node": "*"
@@ -548,9 +548,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
"dev": true
},
"node_modules/normalize-path": {
@@ -898,9 +898,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"dev": true,
"funding": [
{
@@ -1043,14 +1043,14 @@
}
},
"autoprefixer": {
- "version": "10.4.16",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
- "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "version": "10.4.17",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz",
+ "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==",
"dev": true,
"requires": {
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001538",
- "fraction.js": "^4.3.6",
+ "browserslist": "^4.22.2",
+ "caniuse-lite": "^1.0.30001578",
+ "fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
@@ -1072,21 +1072,21 @@
}
},
"browserslist": {
- "version": "4.21.10",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
- "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001517",
- "electron-to-chromium": "^1.4.477",
- "node-releases": "^2.0.13",
- "update-browserslist-db": "^1.0.11"
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
}
},
"caniuse-lite": {
- "version": "1.0.30001538",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz",
- "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==",
+ "version": "1.0.30001578",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001578.tgz",
+ "integrity": "sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==",
"dev": true
},
"chokidar": {
@@ -1147,9 +1147,9 @@
}
},
"electron-to-chromium": {
- "version": "1.4.490",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz",
- "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==",
+ "version": "1.4.635",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.635.tgz",
+ "integrity": "sha512-iu/2D0zolKU3iDGXXxdOzNf72Jnokn+K1IN6Kk4iV6l1Tr2g/qy+mvmtfAiBwZe5S3aB5r92vp+zSZ69scYRrg==",
"dev": true
},
"emoji-regex": {
@@ -1196,9 +1196,9 @@
}
},
"fraction.js": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
- "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true
},
"fs-extra": {
@@ -1340,9 +1340,9 @@
"dev": true
},
"node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
"dev": true
},
"normalize-path": {
@@ -1551,9 +1551,9 @@
"dev": true
},
"update-browserslist-db": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
"dev": true,
"requires": {
"escalade": "^3.1.1",
diff --git a/docs/package.json b/docs/package.json
index b457069379a..6237c9d8d47 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -1,7 +1,7 @@
{
"devDependencies": {
"postcss": "8.4.33",
- "autoprefixer": "10.4.16",
+ "autoprefixer": "10.4.17",
"postcss-cli": "10.1.0"
}
}
diff --git a/dojo/api_v2/views.py b/dojo/api_v2/views.py
index 47415125c24..40bc45b892b 100644
--- a/dojo/api_v2/views.py
+++ b/dojo/api_v2/views.py
@@ -111,7 +111,6 @@
from django.conf import settings
from datetime import datetime
from dojo.utils import (
- get_period_counts_legacy,
get_system_setting,
get_setting,
async_delete,
@@ -582,9 +581,6 @@ def notes(self, request, pk=None):
serialized_note = serializers.NoteSerializer(
{"author": author, "entry": entry, "private": private}
)
- result = serializers.EngagementToNotesSerializer(
- {"engagement_id": engagement, "notes": [serialized_note.data]}
- )
return Response(
serialized_note.data, status=status.HTTP_201_CREATED
)
@@ -1229,9 +1225,6 @@ def notes(self, request, pk=None):
serialized_note = serializers.NoteSerializer(
{"author": author, "entry": entry, "private": private}
)
- result = serializers.FindingToNotesSerializer(
- {"finding_id": finding, "notes": [serialized_note.data]}
- )
return Response(
serialized_note.data, status=status.HTTP_201_CREATED
)
@@ -2592,9 +2585,6 @@ def notes(self, request, pk=None):
serialized_note = serializers.NoteSerializer(
{"author": author, "entry": entry, "private": private}
)
- result = serializers.TestToNotesSerializer(
- {"test_id": test, "notes": [serialized_note.data]}
- )
return Response(
serialized_note.data, status=status.HTTP_201_CREATED
)
@@ -3286,7 +3276,6 @@ def report_generate(request, obj, options):
test = None
endpoint = None
endpoints = None
- endpoint_monthly_counts = None
include_finding_notes = False
include_finding_images = False
@@ -3320,16 +3309,7 @@ def report_generate(request, obj, options):
)
),
)
- products = Product.objects.filter(
- prod_type=product_type, engagement__test__finding__in=findings.qs
- ).distinct()
- engagements = Engagement.objects.filter(
- product__prod_type=product_type, test__finding__in=findings.qs
- ).distinct()
- tests = Test.objects.filter(
- engagement__product__prod_type=product_type,
- finding__in=findings.qs,
- ).distinct()
+
if len(findings.qs) > 0:
start_date = timezone.make_aware(
datetime.combine(findings.qs.last().date, datetime.min.time())
@@ -3344,15 +3324,6 @@ def report_generate(request, obj, options):
# include current month
months_between += 1
- endpoint_monthly_counts = get_period_counts_legacy(
- findings.qs.order_by("numerical_severity"),
- findings.qs.order_by("numerical_severity"),
- None,
- months_between,
- start_date,
- relative_delta="months",
- )
-
elif type(obj).__name__ == "Product":
product = obj
@@ -3365,11 +3336,6 @@ def report_generate(request, obj, options):
Finding.objects.filter(test__engagement__product=product)
),
)
- ids = set(finding.id for finding in findings.qs)
- engagements = Engagement.objects.filter(
- test__finding__id__in=ids
- ).distinct()
- tests = Test.objects.filter(finding__id__in=ids).distinct()
ids = get_endpoint_ids(
Endpoint.objects.filter(product=product).distinct()
)
@@ -3387,7 +3353,6 @@ def report_generate(request, obj, options):
report_name = "Engagement Report: " + str(engagement)
ids = set(finding.id for finding in findings.qs)
- tests = Test.objects.filter(finding__id__in=ids).distinct()
ids = get_endpoint_ids(
Endpoint.objects.filter(product=engagement.product).distinct()
)
diff --git a/dojo/cred/views.py b/dojo/cred/views.py
index 2c12c14d27d..53d3315be18 100644
--- a/dojo/cred/views.py
+++ b/dojo/cred/views.py
@@ -214,11 +214,6 @@ def view_cred_product_engagement(request, eid, ttid):
title="Credential Manager", top_level=False, request=request)
cred_type = "Engagement"
edit_link = ""
- view_link = reverse(
- 'view_cred_product_engagement', args=(
- eid,
- cred.id,
- ))
delete_link = reverse(
'delete_cred_engagement', args=(
eid,
@@ -270,11 +265,6 @@ def view_cred_engagement_test(request, tid, ttid):
title="Credential Manager", top_level=False, request=request)
cred_type = "Test"
edit_link = None
- view_link = reverse(
- 'view_cred_engagement_test', args=(
- tid,
- cred.id,
- ))
delete_link = reverse(
'delete_cred_test', args=(
tid,
@@ -326,11 +316,6 @@ def view_cred_finding(request, fid, ttid):
title="Credential Manager", top_level=False, request=request)
cred_type = "Finding"
edit_link = None
- view_link = reverse(
- 'view_cred_finding', args=(
- fid,
- cred.id,
- ))
delete_link = reverse(
'delete_cred_finding', args=(
fid,
diff --git a/dojo/endpoint/utils.py b/dojo/endpoint/utils.py
index 99da6fb33bf..06afb192424 100644
--- a/dojo/endpoint/utils.py
+++ b/dojo/endpoint/utils.py
@@ -11,6 +11,7 @@
from django.core.validators import validate_ipv46_address
from django.core.exceptions import ValidationError
from django.db.models import Q, Count
+from django.http import HttpResponseRedirect
from dojo.models import Endpoint, DojoMeta
@@ -308,13 +309,12 @@ def endpoint_meta_import(file, product, create_endpoints, create_tags, create_me
content = file.read()
sig = content.decode('utf-8-sig')
content = sig.encode("utf-8")
- if type(content) is bytes:
+ if isinstance(content, bytes):
content = content.decode('utf-8')
reader = csv.DictReader(io.StringIO(content))
if 'hostname' not in reader.fieldnames:
if origin == 'UI':
- from django.http import HttpResponseRedirect
messages.add_message(
request,
messages.ERROR,
@@ -322,7 +322,6 @@ def endpoint_meta_import(file, product, create_endpoints, create_tags, create_me
extra_tags='alert-danger')
return HttpResponseRedirect(reverse('import_endpoint_meta', args=(product.id, )))
elif origin == 'API':
- from rest_framework.serializers import ValidationError
raise ValidationError('The column "hostname" must be present to map host to Endpoint.')
keys = [key for key in reader.fieldnames if key != 'hostname']
@@ -368,8 +367,6 @@ def endpoint_meta_import(file, product, create_endpoints, create_tags, create_me
def remove_broken_endpoint_statuses(apps):
- Finding = apps.get_model('dojo', 'Finding')
- Endpoint = apps.get_model('dojo', 'Endpoint')
Endpoint_Status = apps.get_model('dojo', 'endpoint_status')
broken_eps = Endpoint_Status.objects.filter(Q(endpoint=None) | Q(finding=None))
if broken_eps.count() == 0:
diff --git a/dojo/engagement/views.py b/dojo/engagement/views.py
index 45b45833e0b..20804e1fb06 100644
--- a/dojo/engagement/views.py
+++ b/dojo/engagement/views.py
@@ -213,7 +213,6 @@ def edit_engagement(request, eid):
jira_project_form = None
jira_epic_form = None
jira_project = None
- jira_error = False
if request.method == 'POST':
form = EngForm(request.POST, instance=engagement, cicd=is_ci_cd, product=engagement.product, user=request.user)
@@ -430,7 +429,6 @@ def view_engagement(request, eid):
form = TypedNoteForm(available_note_types=available_note_types)
else:
form = NoteForm()
- url = request.build_absolute_uri(reverse("view_engagement", args=(eng.id,)))
title = "Engagement: %s on %s" % (eng.name, eng.product.name)
messages.add_message(request,
messages.SUCCESS,
@@ -1107,7 +1105,8 @@ def view_edit_risk_acceptance(request, eid, raid, edit_mode=False):
@user_is_authorized(Engagement, Permissions.Risk_Acceptance, 'eid')
def expire_risk_acceptance(request, eid, raid):
risk_acceptance = get_object_or_404(prefetch_for_expiration(Risk_Acceptance.objects.all()), pk=raid)
- eng = get_object_or_404(Engagement, pk=eid)
+ # Validate the engagement ID exists before moving forward
+ get_object_or_404(Engagement, pk=eid)
ra_helper.expire_now(risk_acceptance)
@@ -1231,7 +1230,7 @@ def engagement_ics(request, eid):
def get_list_index(list, index):
try:
element = list[index]
- except Exception as e:
+ except Exception:
element = None
return element
diff --git a/dojo/filters.py b/dojo/filters.py
index eb9dcbe389b..ebb7aeb1b9e 100644
--- a/dojo/filters.py
+++ b/dojo/filters.py
@@ -228,7 +228,7 @@ def cwe_options(queryset):
cwe = dict()
cwe = dict([cwe, cwe]
for cwe in queryset.order_by().values_list('cwe', flat=True).distinct()
- if type(cwe) is int and cwe is not None and cwe > 0)
+ if isinstance(cwe, int) and cwe is not None and cwe > 0)
cwe = collections.OrderedDict(sorted(cwe.items()))
return list(cwe.items())
@@ -267,7 +267,7 @@ def get_tags_model_from_field_name(field):
parts = field.split('__')
model_name = parts[-2]
return apps.get_model('dojo.%s' % model_name, require_ready=True), exclude
- except Exception as e:
+ except Exception:
return None, exclude
diff --git a/dojo/forms.py b/dojo/forms.py
index fd2b6844ec3..b544c09d05f 100755
--- a/dojo/forms.py
+++ b/dojo/forms.py
@@ -49,6 +49,7 @@
from dojo.user.queries import get_authorized_users_for_product_and_product_type, get_authorized_users
from dojo.user.utils import get_configuration_permissions_fields
from dojo.group.queries import get_authorized_groups, get_group_member_roles
+import dojo.jira_link.helper as jira_helper
logger = logging.getLogger(__name__)
@@ -111,7 +112,6 @@ def render(self, name, value, attrs=None, renderer=None):
if match:
year_val,
month_val,
- day_val = [int(v) for v in match.groups()]
output = []
@@ -673,7 +673,7 @@ class MergeFindings(forms.ModelForm):
help_text="The action to take on the merged finding. Set the findings to inactive or delete the findings.")
def __init__(self, *args, **kwargs):
- finding = kwargs.pop('finding')
+ _ = kwargs.pop('finding')
findings = kwargs.pop('findings')
super(MergeFindings, self).__init__(*args, **kwargs)
@@ -2279,7 +2279,8 @@ def clean(self):
form_data = self.cleaned_data
try:
- jira = jira_helper.get_jira_connection_raw(form_data['url'], form_data['username'], form_data['password'])
+ # Attempt to validate the credentials before moving forward
+ _ = jira_helper.get_jira_connection_raw(form_data['url'], form_data['username'], form_data['password'])
logger.debug('valid JIRA config!')
except Exception as e:
# form only used by admins, so we can show full error message using str(e) which can help debug any problems
@@ -2306,7 +2307,8 @@ def clean(self):
form_data = self.cleaned_data
try:
- jira = jira_helper.get_jira_connection_raw(form_data['url'], form_data['username'], form_data['password'],)
+ # Attempt to validate the credentials before moving forward
+ _ = jira_helper.get_jira_connection_raw(form_data['url'], form_data['username'], form_data['password'],)
logger.debug('valid JIRA config!')
except Exception as e:
# form only used by admins, so we can show full error message using str(e) which can help debug any problems
@@ -2817,8 +2819,7 @@ def __init__(self, *args, **kwargs):
def clean(self):
logger.debug('jform clean')
- import dojo.jira_link.helper as jira_helper
- cleaned_data = super(JIRAFindingForm, self).clean()
+ super(JIRAFindingForm, self).clean()
jira_issue_key_new = self.cleaned_data.get('jira_issue')
finding = self.instance
jira_project = self.jira_project
@@ -3021,8 +3022,6 @@ def __init__(self, *args, **kwargs):
initial=initial_answer,
)
- answer = self.fields['answer']
-
def save(self):
if not self.is_valid():
raise forms.ValidationError('form is not valid')
@@ -3095,7 +3094,7 @@ def clean_answer(self):
real_answer = self.cleaned_data.get('answer')
# for single choice questions, the selected answer is a single string
- if type(real_answer) is not list:
+ if not isinstance(real_answer, list):
real_answer = [real_answer]
return real_answer
diff --git a/dojo/group/utils.py b/dojo/group/utils.py
index 67dc2868aee..be7f5ea1d63 100644
--- a/dojo/group/utils.py
+++ b/dojo/group/utils.py
@@ -15,7 +15,8 @@ def get_auth_group_name(group, attempt=0):
auth_group_name = group.name + '_' + str(attempt)
try:
- auth_group = Group.objects.get(name=auth_group_name)
+ # Attempt to fetch an existing group before moving forward with the real operation
+ _ = Group.objects.get(name=auth_group_name)
return get_auth_group_name(group, attempt + 1)
except Group.DoesNotExist:
return auth_group_name
diff --git a/dojo/importers/importer/importer.py b/dojo/importers/importer/importer.py
index baed2c8d421..cb7af1e728a 100644
--- a/dojo/importers/importer/importer.py
+++ b/dojo/importers/importer/importer.py
@@ -72,7 +72,6 @@ def process_parsed_findings(self, test, parsed_findings, scan_type, user, active
new_findings = []
items = parsed_findings
logger.debug('starting import of %i items.', len(items) if items else 0)
- i = 0
group_names_to_findings_dict = {}
for item in items:
diff --git a/dojo/importers/reimporter/reimporter.py b/dojo/importers/reimporter/reimporter.py
index 39db0d7e3e0..107068d11fa 100644
--- a/dojo/importers/reimporter/reimporter.py
+++ b/dojo/importers/reimporter/reimporter.py
@@ -49,7 +49,6 @@ def process_parsed_findings(
items = parsed_findings
original_items = list(test.finding_set.all())
new_items = []
- mitigated_count = 0
finding_count = 0
finding_added_count = 0
reactivated_count = 0
diff --git a/dojo/jira_link/helper.py b/dojo/jira_link/helper.py
index 82ee5477be6..8a8b208d45f 100644
--- a/dojo/jira_link/helper.py
+++ b/dojo/jira_link/helper.py
@@ -99,7 +99,7 @@ def can_be_pushed_to_jira(obj, form=None):
# findings or groups already having an existing jira issue can always be pushed
return True, None, None
- if type(obj) is Finding:
+ if isinstance(obj, Finding):
if form:
active = form['active'].value()
verified = form['verified'].value()
@@ -122,7 +122,7 @@ def can_be_pushed_to_jira(obj, form=None):
if jira_minimum_threshold and jira_minimum_threshold > Finding.get_number_severity(severity):
logger.debug('Finding below the minimum JIRA severity threshold (%s).' % System_Settings.objects.get().jira_minimum_severity)
return False, 'Finding below the minimum JIRA severity threshold (%s).' % System_Settings.objects.get().jira_minimum_severity, 'below_minimum_threshold'
- elif type(obj) is Finding_Group:
+ elif isinstance(obj, Finding_Group):
if not obj.findings.all():
return False, '%s cannot be pushed to jira as it is empty.' % to_str_typed(obj), 'error_empty'
if 'Active' not in obj.status():
@@ -383,8 +383,6 @@ def get_jira_connection_raw(jira_server, jira_username, jira_password):
# Gets a connection to a Jira server based on the finding
def get_jira_connection(obj):
- jira = None
-
jira_instance = obj
if not isinstance(jira_instance, JIRA_Instance):
jira_instance = get_jira_instance(obj)
@@ -521,10 +519,10 @@ def get_labels(obj):
labels.append(prod_name_label)
if system_settings.add_vulnerability_id_to_jira_label or jira_project and jira_project.add_vulnerability_id_to_jira_label:
- if type(obj) is Finding and obj.vulnerability_ids:
+ if isinstance(obj, Finding) and obj.vulnerability_ids:
for id in obj.vulnerability_ids:
labels.append(id)
- elif type(obj) is Finding_Group:
+ elif isinstance(obj, Finding_Group):
for finding in obj.findings.all():
for id in finding.vulnerability_ids:
labels.append(id)
@@ -540,7 +538,7 @@ def get_tags(obj):
if obj_tags:
for tag in obj_tags:
tags.append(str(tag.name.replace(' ', '-')))
- if type(obj) is Finding_Group:
+ if isinstance(obj, Finding_Group):
for finding in obj.findings.all():
obj_tags = finding.tags.all()
if obj_tags:
@@ -553,11 +551,9 @@ def get_tags(obj):
def jira_summary(obj):
summary = ''
-
- if type(obj) is Finding:
+ if isinstance(obj, Finding):
summary = obj.title
-
- if type(obj) is Finding_Group:
+ if isinstance(obj, Finding_Group):
summary = obj.name
return summary.replace('\r', '').replace('\n', '')[:255]
@@ -584,9 +580,9 @@ def jira_priority(obj):
def jira_environment(obj):
- if type(obj) is Finding:
+ if isinstance(obj, Finding):
return "\n".join([str(endpoint) for endpoint in obj.endpoints.all()])
- elif type(obj) is Finding_Group:
+ elif isinstance(obj, Finding_Group):
return "\n".join([jira_environment(finding) for finding in obj.findings.all()])
else:
return ''
@@ -715,7 +711,7 @@ def add_jira_issue(obj, *args, **kwargs):
obj_can_be_pushed_to_jira, error_message, error_code = can_be_pushed_to_jira(obj)
if not obj_can_be_pushed_to_jira:
- if type(obj) is Finding and obj.duplicate and not obj.active:
+ if isinstance(obj, Finding) and obj.duplicate and not obj.active:
logger.warning("%s will not be pushed to JIRA as it's a duplicate finding", to_str_typed(obj))
else:
log_jira_alert(error_message, obj)
@@ -762,7 +758,7 @@ def add_jira_issue(obj, *args, **kwargs):
# Upload dojo finding screenshots to Jira
findings = [obj]
- if type(obj) is Finding_Group:
+ if isinstance(obj, Finding_Group):
findings = obj.findings.all()
for find in findings:
@@ -794,7 +790,7 @@ def add_jira_issue(obj, *args, **kwargs):
j_issue.jira_creation = timezone.now()
j_issue.jira_change = timezone.now()
j_issue.save()
- issue = jira.issue(new_issue.id)
+ jira.issue(new_issue.id)
logger.info('Created the following jira issue for %d:%s', obj.id, to_str_typed(obj))
@@ -884,7 +880,7 @@ def update_jira_issue(obj, *args, **kwargs):
# Upload dojo finding screenshots to Jira
findings = [obj]
- if type(obj) is Finding_Group:
+ if isinstance(obj, Finding_Group):
findings = obj.findings.all()
for find in findings:
@@ -1030,12 +1026,12 @@ def get_issuetype_fields(
project = None
try:
project = meta['projects'][0]
- except Exception as e:
+ except Exception:
raise JIRAError("Project misconfigured or no permissions in Jira ?")
try:
issuetype_fields = project['issuetypes'][0]['fields'].keys()
- except Exception as e:
+ except Exception:
raise JIRAError("Misconfigured default issue type ?")
else:
@@ -1062,7 +1058,7 @@ def get_issuetype_fields(
try:
issuetype_fields = [f['fieldId'] for f in issuetype_fields['values']]
- except Exception as e:
+ except Exception:
raise JIRAError("Misconfigured default issue type ?")
except JIRAError as e:
@@ -1080,7 +1076,7 @@ def is_jira_project_valid(jira_project):
jira = get_jira_connection(jira_project)
get_issuetype_fields(jira, jira_project.project_key, jira_project.jira_instance.default_issue_type)
return True
- except JIRAError as e:
+ except JIRAError:
logger.debug("invalid JIRA Project Config, can't retrieve metadata for '%s'", jira_project)
return False
@@ -1345,8 +1341,6 @@ def finding_link_jira(request, finding, new_jira_issue_key):
finding.save(push_to_jira=False, dedupe_option=False, issue_updater_option=False)
- jira_issue_url = get_jira_url(finding)
-
return True
@@ -1377,8 +1371,6 @@ def finding_group_link_jira(request, finding_group, new_jira_issue_key):
finding_group.save()
- jira_issue_url = get_jira_url(finding_group)
-
return True
@@ -1390,8 +1382,6 @@ def unlink_jira(request, obj):
logger.debug('removing linked jira issue %s for %i:%s', obj.jira_issue.jira_key, obj.id, to_str_typed(obj))
obj.jira_issue.delete()
# finding.save(push_to_jira=False, dedupe_option=False, issue_updater_option=False)
- # jira_issue_url = get_jira_url(finding)
- return True
# return True if no errors
diff --git a/dojo/jira_link/views.py b/dojo/jira_link/views.py
index 9f3aafda056..e05ea5ce219 100644
--- a/dojo/jira_link/views.py
+++ b/dojo/jira_link/views.py
@@ -326,7 +326,8 @@ def new_jira(request):
jira_password = jform.cleaned_data.get('password')
logger.debug('calling get_jira_connection_raw')
- jira = jira_helper.get_jira_connection_raw(jira_server, jira_username, jira_password)
+ # Make sure the connection can be completed
+ jira_helper.get_jira_connection_raw(jira_server, jira_username, jira_password)
new_j = jform.save(commit=False)
new_j.url = jira_server
diff --git a/dojo/management/commands/csv_findings_export.py b/dojo/management/commands/csv_findings_export.py
index 009e57cbd80..80c2e2b591e 100644
--- a/dojo/management/commands/csv_findings_export.py
+++ b/dojo/management/commands/csv_findings_export.py
@@ -26,10 +26,6 @@ def handle(self, *args, **options):
findings = Finding.objects.filter(verified=True,
active=True).select_related(
"test__engagement__product")
- opts = findings.model._meta
- model = findings.model
-
- model = findings.model
writer = csv.writer(open(file_path, 'w'))
headers = []
diff --git a/dojo/management/commands/migrate_surveys.py b/dojo/management/commands/migrate_surveys.py
index bba80706323..25d38c028c7 100644
--- a/dojo/management/commands/migrate_surveys.py
+++ b/dojo/management/commands/migrate_surveys.py
@@ -39,7 +39,7 @@ def handle(self, *args, **options):
# Get unique ploymorphic id for the system
ctype_id = 0
# First create a temp question to pull the polymorphic_ctype_id from
- created_question = TextQuestion.objects.create(optional=False, order=1, text='What is love?')
+ TextQuestion.objects.create(optional=False, order=1, text='What is love?')
# Get the ID used in this system
cursor.execute("select polymorphic_ctype_id from dojo_question;")
row = cursor.fetchone()
diff --git a/dojo/metrics/views.py b/dojo/metrics/views.py
index 342c7b1229c..e00cbcb857a 100644
--- a/dojo/metrics/views.py
+++ b/dojo/metrics/views.py
@@ -390,7 +390,6 @@ def metrics(request, mtype):
request.GET._mutable = True
request.GET.appendlist('test__engagement__product__prod_type', mtype)
request.GET._mutable = False
- product = pt[0].name
show_pt_filter = False
page_name = _('%(product_type)s Metrics') % {'product_type': mtype}
prod_type = pt
diff --git a/dojo/models.py b/dojo/models.py
index 71c6f7ad2df..527d58aac2c 100755
--- a/dojo/models.py
+++ b/dojo/models.py
@@ -2810,7 +2810,8 @@ def github(self):
def has_github_issue(self):
try:
- issue = self.github_issue
+ # Attempt to access the github issue if it exists. If not, an exception will be caught
+ _ = self.github_issue
return True
except GITHUB_Issue.DoesNotExist:
return False
diff --git a/dojo/note_type/views.py b/dojo/note_type/views.py
index 00a0ef663e8..76d9c051b99 100644
--- a/dojo/note_type/views.py
+++ b/dojo/note_type/views.py
@@ -111,7 +111,7 @@ def add_note_type(request):
if request.method == 'POST':
form = NoteTypeForm(request.POST)
if form.is_valid():
- note_type = form.save()
+ form.save()
messages.add_message(request,
messages.SUCCESS,
'Note Type added successfully.',
diff --git a/dojo/okta.py b/dojo/okta.py
index e600668b397..c42b065250c 100644
--- a/dojo/okta.py
+++ b/dojo/okta.py
@@ -85,7 +85,7 @@ def validate_and_return_id_token(self, id_token, access_token):
except ExpiredSignatureError:
k = key
break
- except JWTError as e:
+ except JWTError:
if k is None and client_id == 'a-key':
k = self.get_jwks_keys()[0]
pass
diff --git a/dojo/product/views.py b/dojo/product/views.py
index aeb6415ea69..be1b9afe0c8 100755
--- a/dojo/product/views.py
+++ b/dojo/product/views.py
@@ -61,15 +61,7 @@
def product(request):
- # validate prod_type param
- product_type = None
- if 'prod_type' in request.GET:
- p = request.GET.getlist('prod_type', [])
- if len(p) == 1:
- product_type = get_object_or_404(Product_Type, id=p[0])
-
prods = get_authorized_products(Permissions.Product_View)
-
# perform all stuff for filtering and pagination first, before annotation/prefetching
# otherwise the paginator will perform all the annotations/prefetching already only to count the total number of records
# see https://code.djangoproject.com/ticket/23771 and https://code.djangoproject.com/ticket/25375
@@ -516,7 +508,6 @@ def view_product_metrics(request, pid):
start_date = filters['start_date']
end_date = filters['end_date']
- week_date = filters['week']
tests = Test.objects.filter(engagement__product=prod).prefetch_related('finding_set', 'test_type')
tests = tests.annotate(verified_finding_count=Count('finding__id', filter=Q(finding__verified=True)))
@@ -535,7 +526,6 @@ def view_product_metrics(request, pid):
add_breadcrumb(parent=prod, top_level=False, request=request)
open_close_weekly = OrderedDict()
- new_weekly = OrderedDict()
severity_weekly = OrderedDict()
critical_weekly = OrderedDict()
high_weekly = OrderedDict()
@@ -604,10 +594,6 @@ def view_product_metrics(request, pid):
open_objs_by_severity[v.severity] += 1
for a in filters.get('accepted', None):
- if view == 'Finding':
- finding = a
- elif view == 'Endpoint':
- finding = v.finding
iso_cal = a.date.isocalendar()
x = iso_to_gregorian(iso_cal[0], iso_cal[1], 1)
y = x.strftime("%m/%d %Y")
@@ -888,7 +874,6 @@ def edit_product(request, pid):
jira_project = jira_helper.get_jira_project(product)
if form.is_valid():
form.save()
- tags = request.POST.getlist('tags')
messages.add_message(request,
messages.SUCCESS,
_('Product updated successfully.'),
@@ -1002,16 +987,13 @@ def delete_product(request, pid):
@user_is_authorized(Product, Permissions.Engagement_Add, 'pid')
def new_eng_for_app(request, pid, cicd=False):
- jira_project = None
jira_project_form = None
jira_epic_form = None
product = Product.objects.get(id=pid)
- jira_error = False
if request.method == 'POST':
form = EngForm(request.POST, cicd=cicd, product=product, user=request.user)
- jira_project = jira_helper.get_jira_project(product)
logger.debug('new_eng_for_app')
if form.is_valid():
@@ -1070,7 +1052,6 @@ def new_eng_for_app(request, pid, cicd=False):
product=product, user=request.user)
if get_system_setting('enable_jira'):
- jira_project = jira_helper.get_jira_project(product)
logger.debug('showing jira-project-form')
jira_project_form = JIRAProjectForm(target='engagement', product=product)
logger.debug('showing jira-epic-form')
@@ -1376,7 +1357,6 @@ def process_jira_form(self, request: HttpRequest, finding: Finding, context: dic
# if the jira issue key was changed, update database
new_jira_issue_key = context["jform"].cleaned_data.get('jira_issue')
if finding.has_jira_issue:
- jira_issue = finding.jira_issue
# everything in DD around JIRA integration is based on the internal id of the issue in JIRA
# instead of on the public jira issue key.
# I have no idea why, but it means we have to retrieve the issue from JIRA to get the internal JIRA id.
diff --git a/dojo/remote_user.py b/dojo/remote_user.py
index fab272bb8d3..875291c7ba2 100644
--- a/dojo/remote_user.py
+++ b/dojo/remote_user.py
@@ -28,6 +28,9 @@ def authenticate(self, request):
class RemoteUserMiddleware(OriginalRemoteUserMiddleware):
def process_request(self, request):
+ if not settings.AUTH_REMOTEUSER_ENABLED:
+ return
+
# process only if request is comming from the trusted proxy node
if IPAddress(request.META['REMOTE_ADDR']) in settings.AUTH_REMOTEUSER_TRUSTED_PROXY:
self.header = settings.AUTH_REMOTEUSER_USERNAME_HEADER
diff --git a/dojo/reports/views.py b/dojo/reports/views.py
index 119f099d3c9..d4697dd2dd9 100644
--- a/dojo/reports/views.py
+++ b/dojo/reports/views.py
@@ -130,12 +130,6 @@ def report_findings(request):
paged_findings = get_page_items(request, findings.qs.distinct().order_by('numerical_severity'), 25)
- product_type = None
- if 'test__engagement__product__prod_type' in request.GET:
- p = request.GET.getlist('test__engagement__product__prod_type', [])
- if len(p) == 1:
- product_type = get_object_or_404(Product_Type, id=p[0])
-
return render(request,
'dojo/report_findings.html',
{"findings": paged_findings,
@@ -221,7 +215,6 @@ def endpoint_host_report(request, eid):
@user_is_authorized(Product, Permissions.Product_View, 'pid')
def product_endpoint_report(request, pid):
- user = Dojo_User.objects.get(id=request.user.id)
product = get_object_or_404(Product.objects.all().prefetch_related('engagement_set__test_set__test_type', 'engagement_set__test_set__environment'), id=pid)
endpoint_ids = Endpoint.objects.filter(product=product,
finding__active=True,
@@ -247,13 +240,7 @@ def product_endpoint_report(request, pid):
generate = "_generate" in request.GET
add_breadcrumb(parent=product, title="Vulnerable Product Endpoints Report", top_level=False, request=request)
report_form = ReportOptionsForm()
-
template = "dojo/product_endpoint_pdf_report.html"
- report_name = "Product Endpoint Report: " + str(product)
- report_title = "Product Endpoint Report"
- report_subtitle = str(product)
- report_info = "Generated By %s on %s" % (
- user.get_full_name(), (timezone.now().strftime("%m/%d/%Y %I:%M%p %Z")))
try:
start_date = Finding.objects.filter(endpoints__in=endpoints.qs).order_by('date')[:1][0].date
@@ -354,14 +341,7 @@ def generate_report(request, obj, host_view=False):
test = None
endpoint = None
endpoints = None
- accepted_findings = None
- open_findings = None
- closed_findings = None
- verified_findings = None
report_title = None
- report_subtitle = None
- report_info = "Generated By %s on %s" % (
- user.get_full_name(), (timezone.now().strftime("%m/%d/%Y %I:%M%p %Z")))
if type(obj).__name__ == "Product_Type":
user_has_permission_or_403(request.user, obj, Permissions.Product_Type_View)
@@ -393,14 +373,12 @@ def generate_report(request, obj, host_view=False):
disclaimer = 'Please configure in System Settings.'
generate = "_generate" in request.GET
report_name = str(obj)
- report_type = type(obj).__name__
add_breadcrumb(title="Generate Report", top_level=False, request=request)
if type(obj).__name__ == "Product_Type":
product_type = obj
template = "dojo/product_type_pdf_report.html"
report_name = "Product Type Report: " + str(product_type)
report_title = "Product Type Report"
- report_subtitle = str(product_type)
findings = ReportFindingFilter(request.GET, prod_type=product_type, queryset=prefetch_related_findings_for_report(Finding.objects.filter(
test__engagement__product__prod_type=product_type)))
@@ -452,7 +430,6 @@ def generate_report(request, obj, host_view=False):
template = "dojo/product_pdf_report.html"
report_name = "Product Report: " + str(product)
report_title = "Product Report"
- report_subtitle = str(product)
findings = ReportFindingFilter(request.GET, product=product, queryset=prefetch_related_findings_for_report(Finding.objects.filter(
test__engagement__product=product)))
ids = set(finding.id for finding in findings.qs)
@@ -485,7 +462,6 @@ def generate_report(request, obj, host_view=False):
report_name = "Engagement Report: " + str(engagement)
template = 'dojo/engagement_pdf_report.html'
report_title = "Engagement Report"
- report_subtitle = str(engagement)
ids = set(finding.id for finding in findings.qs)
tests = Test.objects.filter(finding__id__in=ids).distinct()
@@ -515,7 +491,6 @@ def generate_report(request, obj, host_view=False):
template = "dojo/test_pdf_report.html"
report_name = "Test Report: " + str(test)
report_title = "Test Report"
- report_subtitle = str(test)
context = {'test': test,
'report_name': report_name,
@@ -539,13 +514,10 @@ def generate_report(request, obj, host_view=False):
endpoints = Endpoint.objects.filter(host=endpoint.host,
product=endpoint.product).distinct()
report_title = "Endpoint Host Report"
- report_subtitle = endpoint.host
else:
report_name = "Endpoint Report: " + str(endpoint)
endpoints = Endpoint.objects.filter(pk=endpoint.id).distinct()
report_title = "Endpoint Report"
- report_subtitle = str(endpoint)
- report_type = "Endpoint"
template = 'dojo/endpoint_pdf_report.html'
findings = ReportFindingFilter(request.GET,
queryset=prefetch_related_findings_for_report(Finding.objects.filter(endpoints__in=endpoints)))
@@ -568,10 +540,8 @@ def generate_report(request, obj, host_view=False):
elif type(obj).__name__ in ["QuerySet", "CastTaggedQuerySet", "TagulousCastTaggedQuerySet"]:
findings = ReportFindingFilter(request.GET, queryset=prefetch_related_findings_for_report(obj).distinct())
report_name = 'Finding'
- report_type = 'Finding'
template = 'dojo/finding_pdf_report.html'
report_title = "Finding Report"
- report_subtitle = ''
context = {'findings': findings.qs.distinct().order_by('numerical_severity'),
'report_name': report_name,
@@ -726,7 +696,7 @@ def generate_quick_report(request, findings, obj=None):
def get_list_index(list, index):
try:
element = list[index]
- except Exception as e:
+ except Exception:
element = None
return element
diff --git a/dojo/reports/widgets.py b/dojo/reports/widgets.py
index 6715e8fbd70..8de81af33be 100644
--- a/dojo/reports/widgets.py
+++ b/dojo/reports/widgets.py
@@ -28,7 +28,7 @@ class CustomReportJsonForm(forms.Form):
def clean_json(self):
jdata = self.cleaned_data['json']
try:
- json_data = json.loads(jdata)
+ json.loads(jdata)
except:
raise forms.ValidationError("Invalid data in json")
return jdata
@@ -405,8 +405,6 @@ def report_widget_factory(json_data=None, request=None, user=None, finding_notes
d.appendlist(item['name'], item['value'])
else:
d[item['name']] = item['value']
- from dojo.endpoint.views import get_endpoint_ids
- ids = get_endpoint_ids(endpoints)
endpoints = Endpoint.objects.filter(id__in=endpoints)
endpoints = EndpointFilter(d, queryset=endpoints, user=request.user)
diff --git a/dojo/risk_acceptance/helper.py b/dojo/risk_acceptance/helper.py
index a27529e68ee..1412d7a230b 100644
--- a/dojo/risk_acceptance/helper.py
+++ b/dojo/risk_acceptance/helper.py
@@ -278,8 +278,6 @@ def risk_unaccept(finding, perform_save=True):
logger.debug('unaccepting finding %i:%s if it is currently risk accepted', finding.id, finding)
if finding.risk_accepted:
logger.debug('unaccepting finding %i:%s', finding.id, finding)
- # keep reference to ra to for posting comments later
- risk_acceptance = finding.risk_acceptance
# removing from ManyToMany will not fail for non-existing entries
remove_from_any_risk_acceptance(finding)
if not finding.mitigated and not finding.false_p and not finding.out_of_scope:
diff --git a/dojo/settings/settings.dist.py b/dojo/settings/settings.dist.py
index 2b6c16950d4..e843da1372a 100644
--- a/dojo/settings/settings.dist.py
+++ b/dojo/settings/settings.dist.py
@@ -16,7 +16,7 @@
root = environ.Path(__file__) - 3 # Three folders back
# reference: https://pypi.org/project/django-environ/
-env = environ.Env(
+env = environ.FileAwareEnv(
# Set casting and default values
DD_SITE_URL=(str, 'http://localhost:8080'),
DD_DEBUG=(bool, False),
@@ -174,7 +174,7 @@
DD_AUTH_REMOTEUSER_GROUPS_HEADER=(str, ''),
DD_AUTH_REMOTEUSER_GROUPS_CLEANUP=(bool, True),
# Comma separated list of IP ranges with trusted proxies
- DD_AUTH_REMOTEUSER_TRUSTED_PROXY=(list, ['127.0.0.0/32']),
+ DD_AUTH_REMOTEUSER_TRUSTED_PROXY=(list, ['127.0.0.1/32']),
# REMOTE_USER will be processed only on login page. Check https://docs.djangoproject.com/en/3.2/howto/auth-remote-user/#using-remote-user-on-login-pages-only
DD_AUTH_REMOTEUSER_LOGIN_ONLY=(bool, False),
# if somebody is using own documentation how to use DefectDojo in his own company
@@ -1055,28 +1055,28 @@ def saml2_attrib_map_format(dict):
# ------------------------------------------------------------------------------
AUTH_REMOTEUSER_ENABLED = env('DD_AUTH_REMOTEUSER_ENABLED')
-if AUTH_REMOTEUSER_ENABLED:
- AUTH_REMOTEUSER_USERNAME_HEADER = env('DD_AUTH_REMOTEUSER_USERNAME_HEADER')
- AUTH_REMOTEUSER_EMAIL_HEADER = env('DD_AUTH_REMOTEUSER_EMAIL_HEADER')
- AUTH_REMOTEUSER_FIRSTNAME_HEADER = env('DD_AUTH_REMOTEUSER_FIRSTNAME_HEADER')
- AUTH_REMOTEUSER_LASTNAME_HEADER = env('DD_AUTH_REMOTEUSER_LASTNAME_HEADER')
- AUTH_REMOTEUSER_GROUPS_HEADER = env('DD_AUTH_REMOTEUSER_GROUPS_HEADER')
- AUTH_REMOTEUSER_GROUPS_CLEANUP = env('DD_AUTH_REMOTEUSER_GROUPS_CLEANUP')
-
- AUTH_REMOTEUSER_TRUSTED_PROXY = IPSet()
- for ip_range in env('DD_AUTH_REMOTEUSER_TRUSTED_PROXY'):
- AUTH_REMOTEUSER_TRUSTED_PROXY.add(IPNetwork(ip_range))
-
- if env('DD_AUTH_REMOTEUSER_LOGIN_ONLY'):
- RemoteUserMiddleware = 'dojo.remote_user.PersistentRemoteUserMiddleware'
- else:
- RemoteUserMiddleware = 'dojo.remote_user.RemoteUserMiddleware'
- # we need to add middleware just behindAuthenticationMiddleware as described in https://docs.djangoproject.com/en/3.2/howto/auth-remote-user/#configuration
- for i in range(len(MIDDLEWARE)):
- if MIDDLEWARE[i] == 'django.contrib.auth.middleware.AuthenticationMiddleware':
- MIDDLEWARE.insert(i + 1, RemoteUserMiddleware)
- break
+AUTH_REMOTEUSER_USERNAME_HEADER = env('DD_AUTH_REMOTEUSER_USERNAME_HEADER')
+AUTH_REMOTEUSER_EMAIL_HEADER = env('DD_AUTH_REMOTEUSER_EMAIL_HEADER')
+AUTH_REMOTEUSER_FIRSTNAME_HEADER = env('DD_AUTH_REMOTEUSER_FIRSTNAME_HEADER')
+AUTH_REMOTEUSER_LASTNAME_HEADER = env('DD_AUTH_REMOTEUSER_LASTNAME_HEADER')
+AUTH_REMOTEUSER_GROUPS_HEADER = env('DD_AUTH_REMOTEUSER_GROUPS_HEADER')
+AUTH_REMOTEUSER_GROUPS_CLEANUP = env('DD_AUTH_REMOTEUSER_GROUPS_CLEANUP')
+
+AUTH_REMOTEUSER_TRUSTED_PROXY = IPSet()
+for ip_range in env('DD_AUTH_REMOTEUSER_TRUSTED_PROXY'):
+ AUTH_REMOTEUSER_TRUSTED_PROXY.add(IPNetwork(ip_range))
+
+if env('DD_AUTH_REMOTEUSER_LOGIN_ONLY'):
+ RemoteUserMiddleware = 'dojo.remote_user.PersistentRemoteUserMiddleware'
+else:
+ RemoteUserMiddleware = 'dojo.remote_user.RemoteUserMiddleware'
+# we need to add middleware just behindAuthenticationMiddleware as described in https://docs.djangoproject.com/en/3.2/howto/auth-remote-user/#configuration
+for i in range(len(MIDDLEWARE)):
+ if MIDDLEWARE[i] == 'django.contrib.auth.middleware.AuthenticationMiddleware':
+ MIDDLEWARE.insert(i + 1, RemoteUserMiddleware)
+ break
+if AUTH_REMOTEUSER_ENABLED:
REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = \
('dojo.remote_user.RemoteUserAuthentication',) + \
REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES']
diff --git a/dojo/survey/views.py b/dojo/survey/views.py
index d1647e7ddea..f3043b1b757 100644
--- a/dojo/survey/views.py
+++ b/dojo/survey/views.py
@@ -71,7 +71,6 @@ def delete_engagement_survey(request, eid, sid):
def answer_questionnaire(request, eid, sid):
survey = get_object_or_404(Answered_Survey, id=sid)
engagement = get_object_or_404(Engagement, id=eid)
- prod = engagement.product
system_settings = System_Settings.objects.all()[0]
if not system_settings.allow_anonymous_survey_repsonse:
@@ -398,13 +397,11 @@ def edit_questionnaire_questions(request, sid):
@user_is_configuration_authorized('dojo.view_engagement_survey')
def questionnaire(request):
- user = request.user
surveys = Engagement_Survey.objects.all()
surveys = QuestionnaireFilter(request.GET, queryset=surveys)
paged_surveys = get_page_items(request, surveys.qs, 25)
general_surveys = General_Survey.objects.all()
for survey in general_surveys:
- survey_exp = survey.expiration
if survey.expiration < tz.now():
survey.delete()
@@ -503,7 +500,6 @@ def create_question(request):
@user_is_configuration_authorized('dojo.change_question')
def edit_question(request, qid):
- error = False
question = get_object_or_404(Question, id=qid)
survey = Engagement_Survey.objects.filter(questions__in=[question])
reverted = False
diff --git a/dojo/system_settings/views.py b/dojo/system_settings/views.py
index f2c570211fe..d8e885599de 100644
--- a/dojo/system_settings/views.py
+++ b/dojo/system_settings/views.py
@@ -71,7 +71,7 @@ def system_settings(request):
'Settings cannot be saved: Retroactive false positive history can not be set without False positive history.',
extra_tags='alert-warning')
else:
- new_settings = form.save()
+ form.save()
messages.add_message(request,
messages.SUCCESS,
'Settings saved.',
diff --git a/dojo/templatetags/display_tags.py b/dojo/templatetags/display_tags.py
index fd5b88ca80a..d0251eaad43 100644
--- a/dojo/templatetags/display_tags.py
+++ b/dojo/templatetags/display_tags.py
@@ -986,9 +986,9 @@ def import_history(finding, autoescape=True):
return ''
if autoescape:
- esc = conditional_escape
+ conditional_escape
else:
- esc = lambda x: x
+ lambda x: x
# prefetched, so no filtering here
status_changes = finding.test_import_finding_action_set.all()
diff --git a/dojo/test/views.py b/dojo/test/views.py
index 9ad18d9091c..36a7080c312 100644
--- a/dojo/test/views.py
+++ b/dojo/test/views.py
@@ -256,7 +256,7 @@ def edit_test(request, tid):
if request.method == 'POST':
form = TestForm(request.POST, instance=test)
if form.is_valid():
- new_test = form.save()
+ form.save()
messages.add_message(request,
messages.SUCCESS,
_('Test saved.'),
@@ -532,7 +532,6 @@ def process_jira_form(self, request: HttpRequest, finding: Finding, context: dic
# if the jira issue key was changed, update database
new_jira_issue_key = context["jform"].cleaned_data.get('jira_issue')
if finding.has_jira_issue:
- jira_issue = finding.jira_issue
# everything in DD around JIRA integration is based on the internal id of the issue in JIRA
# instead of on the public jira issue key.
# I have no idea why, but it means we have to retrieve the issue from JIRA to get the internal JIRA id.
diff --git a/dojo/tools/asff/parser.py b/dojo/tools/asff/parser.py
index 6cbe527ff45..e66102d0f46 100644
--- a/dojo/tools/asff/parser.py
+++ b/dojo/tools/asff/parser.py
@@ -1,10 +1,8 @@
import json
-
import dateutil
+from netaddr import IPAddress
+from dojo.models import Endpoint, Finding
-from dojo.models import Finding
-
-# https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_Severity.html
SEVERITY_MAPPING = {
"INFORMATIONAL": "Info", # No issue was found.
"LOW": "Low", # The issue does not require action on its own.
@@ -36,18 +34,41 @@ def get_findings(self, file, test):
else:
mitigation = None
references = None
- result.append(
- Finding(
- title=item.get("Title"),
- description=item.get("Description"),
- date=dateutil.parser.parse(item.get("CreatedAt")),
- mitigation=mitigation,
- references=references,
- severity=self.get_severity(item.get("Severity")),
- active=True, # TODO manage attribute 'RecordState'
- unique_id_from_tool=item.get("Id"),
- )
+
+ finding = Finding(
+ title=item.get("Title"),
+ description=item.get("Description"),
+ date=dateutil.parser.parse(item.get("CreatedAt")),
+ mitigation=mitigation,
+ references=references,
+ severity=self.get_severity(item.get("Severity")),
+ active=True, # TODO: manage attribute 'RecordState'
+ unique_id_from_tool=item.get("Id"),
)
+
+ if "Resources" in item:
+ endpoints = []
+ for resource in item["Resources"]:
+ if resource["Type"] == "AwsEc2Instance" and "Details" in resource:
+ details = resource["Details"]["AwsEc2Instance"]
+ for ip in details.get("IpV4Addresses", []):
+ # Adding only private IP addresses as endpoints:
+ #
+ # 1. **Stability**: In AWS, the private IP address of an EC2 instance remains consistent
+ # unless the instance is terminated. In contrast, public IP addresses in AWS are separate
+ # resources from the EC2 instances and can change (e.g., when an EC2 instance stops and starts).
+ #
+ # 2. **Reliability**: By focusing on private IP addresses, we reduce potential ambiguities.
+ # If we were to include every IP address, DefectDojo would create an endpoint for each,
+ # leading to potential redundancies and confusion.
+ #
+ # By limiting our endpoints to private IP addresses, we're ensuring that the data remains
+ # relevant even if the AWS resources undergo changes, and we also ensure a cleaner representation.
+ if IPAddress(ip).is_private():
+ endpoints.append(Endpoint(host=ip))
+ finding.unsaved_endpoints = endpoints
+
+ result.append(finding)
return result
def get_severity(self, data):
diff --git a/dojo/tools/blackduck_binary_analysis/importer.py b/dojo/tools/blackduck_binary_analysis/importer.py
index b6bf1aff89b..fcbe4d49a88 100644
--- a/dojo/tools/blackduck_binary_analysis/importer.py
+++ b/dojo/tools/blackduck_binary_analysis/importer.py
@@ -42,7 +42,6 @@ def _process_vuln_results(
Process findings for each project.
"""
for sha1_hash_key in sha1_hash_keys:
- locations = set()
for vuln in vulnerabilities[sha1_hash_key]:
vuln_dict = dict(vuln)
diff --git a/dojo/tools/openvas_xml/__init__.py b/dojo/tools/chefinspect/__init__.py
similarity index 100%
rename from dojo/tools/openvas_xml/__init__.py
rename to dojo/tools/chefinspect/__init__.py
diff --git a/dojo/tools/chefinspect/parser.py b/dojo/tools/chefinspect/parser.py
new file mode 100644
index 00000000000..adf85eb5eaa
--- /dev/null
+++ b/dojo/tools/chefinspect/parser.py
@@ -0,0 +1,58 @@
+import json
+from dojo.models import Finding
+
+
+class ChefInspectParser(object):
+ def get_scan_types(self):
+ return ["Chef Inspect Log"]
+
+ def get_label_for_scan_types(self, scan_type):
+ return scan_type
+
+ def get_description_for_scan_types(self, scan_type):
+ return """Chef Inspect log file"""
+
+ def convert_score(self, raw_value):
+ val = float(raw_value)
+ if val == 0.0:
+ return "Info"
+ elif val < 0.4:
+ return "Low"
+ elif val < 0.7:
+ return "Medium"
+ elif val < 0.9:
+ return "High"
+ else:
+ return "Critical"
+
+ def get_findings(self, file, test):
+ lines = file.read()
+ result = []
+ if isinstance(lines, bytes):
+ lines = lines.decode("utf-8")
+ loglines = lines.split("\n")
+ for line in loglines:
+ if len(line) != 0:
+ json_object = json.loads(line)
+ description = str(json_object.get('description')) + "\n\n"
+ description += "batch_runtime: " + str(json_object.get('batch_runtime')) + "\n"
+ description += "application_group: " + str(json_object.get('application_group')) + "\n"
+ description += "zone: " + str(json_object.get('zone')) + "\n"
+ description += "office: " + str(json_object.get('office')) + "\n"
+ description += "dc: " + str(json_object.get('dc')) + "\n"
+ description += "environment: " + str(json_object.get('environment')) + "\n"
+ description += "id: " + str(json_object.get('id')) + "\n"
+ description += "control_tags: " + str(json_object.get('control_tags')) + "\n"
+ description += "platform: " + str(json_object.get('platform')) + "\n"
+ description += "profile: " + str(json_object.get('profile')) + "\n"
+ description += "group: " + str(json_object.get('group')) + "\n"
+ description += "results: " + str(json_object.get('results')) + "\n"
+ result.append(
+ Finding(
+ title=json_object.get("title"),
+ description=description,
+ severity=self.convert_score(json_object.get("impact")),
+ active=True,
+ )
+ )
+ return result
diff --git a/dojo/tools/drheader/parser.py b/dojo/tools/drheader/parser.py
index 50fd5554f6d..eeeed1e5e17 100644
--- a/dojo/tools/drheader/parser.py
+++ b/dojo/tools/drheader/parser.py
@@ -42,7 +42,7 @@ def get_findings(self, filename, test):
items = []
try:
data = json.load(filename)
- except ValueError as err:
+ except ValueError:
data = {}
if data != {} and data[0].get("url") is not None:
for item in data:
diff --git a/dojo/tools/gcloud_artifact_scan/__init__.py b/dojo/tools/gcloud_artifact_scan/__init__.py
new file mode 100644
index 00000000000..99e8e118c6a
--- /dev/null
+++ b/dojo/tools/gcloud_artifact_scan/__init__.py
@@ -0,0 +1 @@
+__author__ = "manuel_sommer"
diff --git a/dojo/tools/gcloud_artifact_scan/parser.py b/dojo/tools/gcloud_artifact_scan/parser.py
new file mode 100644
index 00000000000..9785d12d678
--- /dev/null
+++ b/dojo/tools/gcloud_artifact_scan/parser.py
@@ -0,0 +1,55 @@
+import json
+from dojo.models import Finding
+
+
+class GCloudArtifactScanParser(object):
+ def get_scan_types(self):
+ return ["Google Cloud Artifact Vulnerability Scan"]
+
+ def get_label_for_scan_types(self, scan_type):
+ return scan_type # no custom label for now
+
+ def get_description_for_scan_types(self, scan_type):
+ return "Import Google Cloud Artifact Vulnerability scans in JSON format."
+
+ def parse_json(self, json_output):
+ try:
+ data = json_output.read()
+ try:
+ tree = json.loads(str(data, "utf-8"))
+ except Exception:
+ tree = json.loads(data)
+ except Exception:
+ raise ValueError("Invalid format")
+ return tree
+
+ def get_findings(self, json_output, test):
+ findings = []
+ if json_output is None:
+ return findings
+ tree = self.parse_json(json_output)
+ if tree:
+ for severity in tree["package_vulnerability_summary"]["vulnerabilities"]:
+ for vuln in tree["package_vulnerability_summary"]["vulnerabilities"][severity]:
+ description = "name: " + str(vuln["name"]) + "\n\n"
+ description += "resourceUri: " + str(vuln["resourceUri"]) + "\n"
+ description += "fixAvailable: " + str(vuln["vulnerability"]["fixAvailable"]) + "\n"
+ description += "packageIssue: " + str(vuln["vulnerability"]["packageIssue"]) + "\n"
+ description += "CVE: " + str(vuln["vulnerability"]["shortDescription"]) + "\n"
+ reference = ""
+ for ref in vuln["vulnerability"]["relatedUrls"]:
+ reference += ref["url"] + "\n"
+ finding = Finding(
+ title=vuln["noteName"],
+ test=test,
+ description=description,
+ severity=severity.lower().capitalize(),
+ references=reference,
+ component_name="affectedCPEUri: " + vuln["vulnerability"]["packageIssue"][0]["affectedCpeUri"] + " affectedPackage: " + vuln["vulnerability"]["packageIssue"][0]["affectedPackage"],
+ component_version=vuln["vulnerability"]["packageIssue"][0]["affectedVersion"]["fullName"],
+ static_finding=True,
+ dynamic_finding=False,
+ cvssv3_score=vuln["vulnerability"]["cvssScore"]
+ )
+ findings.append(finding)
+ return findings
diff --git a/dojo/tools/govulncheck/parser.py b/dojo/tools/govulncheck/parser.py
index a10f5759649..31b8ec0c75b 100644
--- a/dojo/tools/govulncheck/parser.py
+++ b/dojo/tools/govulncheck/parser.py
@@ -37,6 +37,37 @@ def get_location(data, node):
def get_version(data, node):
return data["Requires"]["Modules"][str(node)]["Version"]
+ def get_finding_trace_info(self, data, osv_id):
+ # Browse the findings to look for matching OSV-id. If the OSV-id is matching, extract traces.
+ trace_info_strs = []
+ for elem in data:
+ if 'finding' in elem.keys():
+ finding = elem["finding"]
+ if finding.get("osv") == osv_id:
+ trace_info = finding.get("trace", [])
+ for trace in trace_info:
+ module = trace.get("module", "Unknown module")
+ version = trace.get("version", "Unknown version")
+ package = trace.get("module", "Unknown package")
+ function = trace.get("function", "Unknown function")
+ filename = filename = trace.get("position", {}).get("filename", "Unknown filename")
+ line = trace.get("position", {}).get("line", "Unknown line")
+ trace_info_str = f"\tModule: {module}, Version: {version}, Package: {package}, Function: {function}, File: {filename}, Line: {line}"
+ trace_info_strs.append(trace_info_str)
+ return "\n".join(trace_info_strs)
+
+ def get_affected_version(self, data, osv_id):
+ # Browse the findings to look for matching OSV-id. If the OSV-id is matching, extract the first affected version.
+ for elem in data:
+ if 'finding' in elem.keys():
+ finding = elem["finding"]
+ if finding.get("osv") == osv_id:
+ trace_info = finding.get("trace", [])
+ for trace in trace_info:
+ if 'version' in trace.keys():
+ return trace.get("version")
+ return ""
+
def get_findings(self, scan_file, test):
findings = []
try:
@@ -46,6 +77,7 @@ def get_findings(self, scan_file, test):
else:
if isinstance(data, dict):
if data["Vulns"]:
+ # Parsing for old govulncheck output format
list_vulns = data["Vulns"]
for cve, elems in groupby(
list_vulns, key=lambda vuln: vuln["OSV"]["aliases"][0]
@@ -92,26 +124,78 @@ def get_findings(self, scan_file, test):
] = f"Vulnerable functions: {'; '.join(vuln_methods)}"
findings.append(Finding(**d))
elif isinstance(data, list):
+ # Parsing for new govulncheck output format
for elem in data:
if 'osv' in elem.keys():
cve = elem["osv"]["aliases"][0]
+ osv_data = elem["osv"]
+ affected_package = osv_data["affected"][0]["package"]
+ affected_ranges = osv_data["affected"][0]["ranges"]
+ affected_ecosystem = affected_package.get("ecosystem", "Unknown")
+ impact = osv_data.get('details', 'Unknown')
+ formatted_ranges = []
+ summary = osv_data.get('summary', 'Unknown')
+ component_name = affected_package["name"]
+ id = osv_data["id"]
+
+ for r in affected_ranges:
+ events = r['events']
+ event_pairs = []
+ for i in range(0, len(events), 2):
+ # Events come in pairs: introduced, then fixed
+ introduced = events[i].get('introduced', 'Unknown')
+ fixed = events[i + 1].get('fixed', 'Unknown') if i + 1 < len(events) else 'Unknown'
+ event_pairs.append(f"\n\t\tIntroduced in {introduced}, fixed in {fixed}")
+ formatted_ranges.append(f"type {r['type']}: {'. '.join(event_pairs)}")
+ range_info = "\n ".join(formatted_ranges)
+
+ vuln_functions = ", ".join(
+ set(osv_data["affected"][0]["ecosystem_specific"]["imports"][0].get("symbols", []))
+ )
+
+ description = (
+ f"**Summary:** {summary}\n"
+ f"**Vulnerable functions:** {vuln_functions}\n"
+ f"**Affected Ecosystem:** {affected_ecosystem}\n"
+ f"**Affected Versions:** {range_info}\n"
+ f"**Vulnerable Package:** {affected_package['name']}\n"
+ f"**Traces found :**\n{self.get_finding_trace_info(data, osv_data['id'])}"
+ )
+
+ references = [f"{ref['type']}: {ref['url']}" for ref in osv_data["references"]]
+ db_specific_url = osv_data["database_specific"].get("url", "Unknown")
+ if db_specific_url:
+ references.append(f"Database: {db_specific_url}")
+ references = "\n".join(references)
+
+ ecosystem_specific = osv_data["affected"][0].get("ecosystem_specific", {})
+ imports = ecosystem_specific.get("imports", [{}])
+ path = imports[0].get("path", "") if imports else ""
+ if path:
+ title = f"{osv_data['id']} - {affected_package['name']} - {path}"
+ else:
+ title = f"{osv_data['id']} - {affected_package['name']}"
+
+ affected_version = self.get_affected_version(data, osv_data['id'])
+
+ if 'severity' in elem["osv"].keys():
+ severity = elem["osv"]["severity"]
+ else:
+ severity = SEVERITY
+
d = {
"cve": cve,
- "severity": SEVERITY,
- "title": elem["osv"]["id"],
- "component_name": elem["osv"]["affected"][0]["package"]["name"],
- "component_version": elem["osv"]["schema_version"]
+ "severity": severity,
+ "title": title,
+ "component_name": component_name,
+ "component_version": affected_version,
+ "description": description,
+ "impact": impact,
+ "references": references,
+ "file_path": path,
+ "url": db_specific_url,
+ "unique_id_from_tool": id
}
- d["references"] = elem["osv"]["references"][0]["url"]
- d["url"] = elem["osv"]["database_specific"]["url"]
- d["unique_id_from_tool"] = elem["osv"]["id"]
- vuln_methods = set(
- elem["osv"]["affected"][0][
- "ecosystem_specific"
- ]["imports"][0].get("symbols", [])
- )
- d[
- "description"
- ] = f"Vulnerable functions: {'; '.join(vuln_methods)}"
+
findings.append(Finding(**d))
return findings
diff --git a/dojo/tools/humble/parser.py b/dojo/tools/humble/parser.py
index 689ce080187..68ec2741bd3 100644
--- a/dojo/tools/humble/parser.py
+++ b/dojo/tools/humble/parser.py
@@ -18,7 +18,7 @@ def get_findings(self, filename, test):
items = []
try:
data = json.load(filename)
- except ValueError as err:
+ except ValueError:
data = {}
if data != {}:
url = data['[0. Info]']['URL']
diff --git a/dojo/tools/kiuwan/parser.py b/dojo/tools/kiuwan/parser.py
index e1b7d540ec2..a79c828ecda 100644
--- a/dojo/tools/kiuwan/parser.py
+++ b/dojo/tools/kiuwan/parser.py
@@ -62,11 +62,14 @@ def get_findings(self, filename, test):
+ row["Software characteristic"]
+ "\n\n"
+ "**Vulnerability type** : "
- + row["Vulnerability type"]
+ + (row["Vulnerability type"] if "Vulnerability type" in row else "")
+ "\n\n"
+ "**CWE Scope** : "
+ row["CWE Scope"]
+ "\n\n"
+ + "**File** : "
+ + row["File"]
+ + "\n\n"
+ "**Line number** : "
+ row["Line number"]
+ "\n\n"
diff --git a/dojo/tools/microfocus_webinspect/parser.py b/dojo/tools/microfocus_webinspect/parser.py
index 114e11d59c4..1c12528ee14 100644
--- a/dojo/tools/microfocus_webinspect/parser.py
+++ b/dojo/tools/microfocus_webinspect/parser.py
@@ -55,17 +55,13 @@ def get_findings(self, file, test):
cwe = 0
description = ""
classifications = issue.find("Classifications")
- for content in classifications.findall("Classification"):
- # detect CWE number
- # TODO support more than one CWE number
- if (
- "kind" in content.attrib
- and "CWE" == content.attrib["kind"]
- ):
- cwe = MicrofocusWebinspectParser.get_cwe(
- content.attrib["identifier"]
- )
- description += "\n\n" + content.text + "\n"
+ if classifications is not None:
+ for content in classifications.findall('Classification'):
+ # detect CWE number
+ # TODO support more than one CWE number
+ if "kind" in content.attrib and "CWE" == content.attrib["kind"]:
+ cwe = MicrofocusWebinspectParser.get_cwe(content.attrib['identifier'])
+ description += "\n\n" + content.text + "\n"
finding = Finding(
title=issue.findtext("Name"),
@@ -114,6 +110,8 @@ def convert_severity(val):
return "Medium"
elif val == "3":
return "High"
+ elif val == "4":
+ return "Critical"
else:
return "Info"
diff --git a/dojo/tools/mobsf/parser.py b/dojo/tools/mobsf/parser.py
index 09ce4ab9b7c..da355496fd5 100644
--- a/dojo/tools/mobsf/parser.py
+++ b/dojo/tools/mobsf/parser.py
@@ -88,7 +88,7 @@ def get_findings(self, filename, test):
# Mobile Permissions
if "permissions" in data:
# for permission, details in data["permissions"].items():
- if type(data["permissions"]) is list:
+ if isinstance(data["permissions"], list):
for details in data["permissions"]:
mobsf_item = {
"category": "Mobile Permissions",
@@ -153,7 +153,7 @@ def get_findings(self, filename, test):
# Manifest Analysis
if "manifest_analysis" in data:
- if data["manifest_analysis"] != {} and type(data["manifest_analysis"]) is dict:
+ if data["manifest_analysis"] != {} and isinstance(data["manifest_analysis"], dict):
if data["manifest_analysis"]["manifest_findings"]:
for details in data["manifest_analysis"]["manifest_findings"]:
mobsf_item = {
@@ -204,7 +204,7 @@ def get_findings(self, filename, test):
# Binary Analysis
if "binary_analysis" in data:
- if type(data["binary_analysis"]) is list:
+ if isinstance(data["binary_analysis"], list):
for details in data["binary_analysis"]:
for binary_analysis_type in details:
if "name" != binary_analysis_type:
diff --git a/dojo/tools/nikto/parser.py b/dojo/tools/nikto/parser.py
index b5c9cafe4b9..0fad521af11 100644
--- a/dojo/tools/nikto/parser.py
+++ b/dojo/tools/nikto/parser.py
@@ -43,7 +43,7 @@ def get_findings(self, filename, test):
def process_json(self, file, test):
data = json.load(file)
- if len(data) == 1 and type(data) is list:
+ if len(data) == 1 and isinstance(data, list):
data = data[0]
dupes = dict()
host = data.get("host")
diff --git a/dojo/tools/openvas/__init__.py b/dojo/tools/openvas/__init__.py
new file mode 100644
index 00000000000..99e8e118c6a
--- /dev/null
+++ b/dojo/tools/openvas/__init__.py
@@ -0,0 +1 @@
+__author__ = "manuel_sommer"
diff --git a/dojo/tools/openvas_csv/parser.py b/dojo/tools/openvas/parser.py
old mode 100644
new mode 100755
similarity index 67%
rename from dojo/tools/openvas_csv/parser.py
rename to dojo/tools/openvas/parser.py
index 04d6166b231..9a8c9b79ad4
--- a/dojo/tools/openvas_csv/parser.py
+++ b/dojo/tools/openvas/parser.py
@@ -1,10 +1,10 @@
import csv
import hashlib
import io
-
from dateutil.parser import parse
-
-from dojo.models import Endpoint, Finding
+from xml.dom import NamespaceErr
+from defusedxml import ElementTree as ET
+from dojo.models import Finding, Endpoint
class ColumnMappingStrategy(object):
@@ -194,7 +194,7 @@ def map_column_value(self, finding, column_value):
finding.duplicate = self.evaluate_bool_value(column_value)
-class OpenVASCsvParser(object):
+class OpenVASParser(object):
def create_chain(self):
date_column_strategy = DateColumnMappingStrategy()
title_column_strategy = TitleColumnMappingStrategy()
@@ -240,62 +240,115 @@ def read_column_names(self, row):
return column_names
def get_scan_types(self):
- return ["OpenVAS CSV"]
+ return ["OpenVAS Parser"]
def get_label_for_scan_types(self, scan_type):
return scan_type # no custom label for now
def get_description_for_scan_types(self, scan_type):
- return "Import OpenVAS Scan in CSV format. Export as CSV Results on OpenVAS."
+ return "Import CSV or XML output of Greenbone OpenVAS report."
+
+ def convert_cvss_score(self, raw_value):
+ val = float(raw_value)
+ if val == 0.0:
+ return "Info"
+ elif val < 4.0:
+ return "Low"
+ elif val < 7.0:
+ return "Medium"
+ elif val < 9.0:
+ return "High"
+ else:
+ return "Critical"
def get_findings(self, filename, test):
- column_names = dict()
- dupes = dict()
- chain = self.create_chain()
+ if str(filename.name).endswith('.csv'):
+ column_names = dict()
+ dupes = dict()
+ chain = self.create_chain()
+
+ content = filename.read()
+ if isinstance(content, bytes):
+ content = content.decode("utf-8")
+ reader = csv.reader(io.StringIO(content), delimiter=",", quotechar='"')
+
+ row_number = 0
+ for row in reader:
+ finding = Finding(test=test)
+ finding.unsaved_endpoints = [Endpoint()]
+
+ if row_number == 0:
+ column_names = self.read_column_names(row)
+ row_number += 1
+ continue
+
+ column_number = 0
+ for column in row:
+ chain.process_column(
+ column_names[column_number], column, finding
+ )
+ column_number += 1
+
+ if finding is not None and row_number > 0:
+ if finding.title is None:
+ finding.title = ""
+ if finding.description is None:
+ finding.description = ""
+
+ key = hashlib.sha256(
+ (
+ str(finding.unsaved_endpoints[0])
+ + "|"
+ + finding.severity
+ + "|"
+ + finding.title
+ + "|"
+ + finding.description
+ ).encode("utf-8")
+ ).hexdigest()
+
+ if key not in dupes:
+ dupes[key] = finding
- content = filename.read()
- if isinstance(content, bytes):
- content = content.decode("utf-8")
- reader = csv.reader(io.StringIO(content), delimiter=",", quotechar='"')
-
- row_number = 0
- for row in reader:
- finding = Finding(test=test)
- finding.unsaved_endpoints = [Endpoint()]
-
- if row_number == 0:
- column_names = self.read_column_names(row)
row_number += 1
- continue
-
- column_number = 0
- for column in row:
- chain.process_column(
- column_names[column_number], column, finding
+ return list(dupes.values())
+ elif str(filename.name).endswith('.xml'):
+ findings = []
+ tree = ET.parse(filename)
+ root = tree.getroot()
+ if "report" not in root.tag:
+ raise NamespaceErr(
+ "This doesn't seem to be a valid Greenbone OpenVAS XML file."
+ )
+ report = root.find("report")
+ results = report.find("results")
+ for result in results:
+ for finding in result:
+ if finding.tag == "name":
+ title = finding.text
+ description = [f"**Name**: {finding.text}"]
+ if finding.tag == "host":
+ title = title + "_" + finding.text
+ description.append(f"**Host**: {finding.text}")
+ if finding.tag == "port":
+ title = title + "_" + finding.text
+ description.append(f"**Port**: {finding.text}")
+ if finding.tag == "nvt":
+ description.append(f"**NVT**: {finding.text}")
+ if finding.tag == "severity":
+ severity = self.convert_cvss_score(finding.text)
+ description.append(f"**Severity**: {finding.text}")
+ if finding.tag == "qod":
+ description.append(f"**QOD**: {finding.text}")
+ if finding.tag == "description":
+ description.append(f"**Description**: {finding.text}")
+
+ finding = Finding(
+ title=str(title),
+ description="\n".join(description),
+ severity=severity,
+ dynamic_finding=True,
+ static_finding=False
)
- column_number += 1
-
- if finding is not None and row_number > 0:
- if finding.title is None:
- finding.title = ""
- if finding.description is None:
- finding.description = ""
-
- key = hashlib.sha256(
- (
- str(finding.unsaved_endpoints[0])
- + "|"
- + finding.severity
- + "|"
- + finding.title
- + "|"
- + finding.description
- ).encode("utf-8")
- ).hexdigest()
-
- if key not in dupes:
- dupes[key] = finding
-
- row_number += 1
-
- return list(dupes.values())
+ findings.append(finding)
+ return findings
diff --git a/dojo/tools/openvas_xml/parser.py b/dojo/tools/openvas_xml/parser.py
deleted file mode 100755
index 65449e8c812..00000000000
--- a/dojo/tools/openvas_xml/parser.py
+++ /dev/null
@@ -1,68 +0,0 @@
-from xml.dom import NamespaceErr
-from defusedxml import ElementTree as ET
-from dojo.models import Finding
-
-
-class OpenVASXMLParser(object):
- def get_scan_types(self):
- return ["OpenVAS XML"]
-
- def get_label_for_scan_types(self, scan_type):
- return scan_type # no custom label for now
-
- def get_description_for_scan_types(self, scan_type):
- return "Import XML output of Greenbone OpenVAS XML report."
-
- def convert_cvss_score(self, raw_value):
- val = float(raw_value)
- if val == 0.0:
- return "Info"
- elif val < 4.0:
- return "Low"
- elif val < 7.0:
- return "Medium"
- elif val < 9.0:
- return "High"
- else:
- return "Critical"
-
- def get_findings(self, file, test):
- findings = []
- tree = ET.parse(file)
- root = tree.getroot()
- if "report" not in root.tag:
- raise NamespaceErr(
- "This doesn't seem to be a valid Greenbone OpenVAS xml file."
- )
- report = root.find("report")
- results = report.find("results")
- for result in results:
- for finding in result:
- if finding.tag == "name":
- title = finding.text
- description = [f"**Name**: {finding.text}"]
- if finding.tag == "host":
- title = title + "_" + finding.text
- description.append(f"**Host**: {finding.text}")
- if finding.tag == "port":
- title = title + "_" + finding.text
- description.append(f"**Port**: {finding.text}")
- if finding.tag == "nvt":
- description.append(f"**NVT**: {finding.text}")
- if finding.tag == "severity":
- severity = self.convert_cvss_score(finding.text)
- description.append(f"**Severity**: {finding.text}")
- if finding.tag == "qod":
- description.append(f"**QOD**: {finding.text}")
- if finding.tag == "description":
- description.append(f"**Description**: {finding.text}")
-
- finding = Finding(
- title=str(title),
- description="\n".join(description),
- severity=severity,
- dynamic_finding=True,
- static_finding=False
- )
- findings.append(finding)
- return findings
diff --git a/dojo/tools/outpost24/parser.py b/dojo/tools/outpost24/parser.py
index 8fd244cc425..af07759f1ec 100644
--- a/dojo/tools/outpost24/parser.py
+++ b/dojo/tools/outpost24/parser.py
@@ -57,9 +57,6 @@ def get_findings(self, file, test):
else:
severity = "Critical"
cvss_description = detail.findtext("cvss_vector_description")
- cvss_vector = detail.findtext("cvss_v3_vector") or detail.findtext(
- "cvss_vector"
- )
severity_justification = "{}\n{}".format(
cvss_score, cvss_description
)
diff --git a/dojo/tools/qualys/csv_parser.py b/dojo/tools/qualys/csv_parser.py
index 9c28f423f7b..3ea9bcbabc6 100644
--- a/dojo/tools/qualys/csv_parser.py
+++ b/dojo/tools/qualys/csv_parser.py
@@ -46,7 +46,8 @@ def get_report_findings(csv_reader) -> [dict]:
for row in csv_reader:
if row.get("Title") and row["Title"] != "Title":
report_findings.append(row)
-
+ elif row.get("VULN TITLE"):
+ report_findings.append(row)
return report_findings
@@ -108,7 +109,6 @@ def build_findings_from_dict(report_findings: [dict]) -> [Finding]:
"5": "Critical",
}
dojo_findings = []
-
for report_finding in report_findings:
if report_finding.get("FQDN"):
endpoint = Endpoint.from_uri(report_finding.get("FQDN"))
@@ -129,44 +129,56 @@ def build_findings_from_dict(report_findings: [dict]) -> [Finding]:
if finding_with_id:
finding = finding_with_id
else:
- finding = Finding(
- title=f"QID-{report_finding['QID']} | {report_finding['Title']}",
- mitigation=report_finding["Solution"],
- description=f"{report_finding['Threat']}\nResult Evidence: \n{report_finding.get('Threat', 'Not available')}",
- severity=severity_lookup.get(report_finding["Severity"], "Info"),
- impact=report_finding["Impact"],
- date=parser.parse(
- report_finding["Last Detected"].replace("Z", "")
- ),
- vuln_id_from_tool=report_finding["QID"],
- cvssv3=cvssv3
- )
-
- cve_data = report_finding.get("CVE ID")
- finding.unsaved_vulnerability_ids = (
- cve_data.split(",") if "," in cve_data else [cve_data]
- )
+ if report_finding.get("Title"):
+ finding = Finding(
+ title=f"QID-{report_finding['QID']} | {report_finding['Title']}",
+ mitigation=report_finding["Solution"],
+ description=f"{report_finding['Threat']}\nResult Evidence: \n{report_finding.get('Threat', 'Not available')}",
+ severity=severity_lookup.get(report_finding["Severity"], "Info"),
+ impact=report_finding["Impact"],
+ date=parser.parse(
+ report_finding["Last Detected"].replace("Z", "")
+ ),
+ vuln_id_from_tool=report_finding["QID"],
+ cvssv3=cvssv3
+ )
+ cve_data = report_finding.get("CVE ID")
+ # Qualys reports regression findings as active, but with a Date Last
+ # Fixed.
+ if report_finding["Date Last Fixed"]:
+ finding.mitigated = datetime.strptime(
+ report_finding["Date Last Fixed"], "%m/%d/%Y %H:%M:%S"
+ )
+ finding.is_mitigated = True
+ else:
+ finding.is_mitigated = False
+
+ finding.active = report_finding["Vuln Status"] in (
+ "Active",
+ "Re-Opened",
+ "New",
+ )
- # Qualys reports regression findings as active, but with a Date Last
- # Fixed.
- if report_finding["Date Last Fixed"]:
- finding.mitigated = datetime.strptime(
- report_finding["Date Last Fixed"], "%m/%d/%Y %H:%M:%S"
- )
- finding.is_mitigated = True
- else:
- finding.is_mitigated = False
+ if finding.active:
+ finding.mitigated = None
+ finding.is_mitigated = False
+ elif report_finding.get("VULN TITLE"):
+ finding = Finding(
+ title=f"QID-{report_finding['QID']} | {report_finding['VULN TITLE']}",
+ mitigation=report_finding["SOLUTION"],
+ description=f"{report_finding['THREAT']}\nResult Evidence: \n{report_finding.get('THREAT', 'Not available')}",
+ severity=report_finding["SEVERITY"],
+ impact=report_finding["IMPACT"],
+ date=parser.parse(
+ report_finding["LAST SCAN"].replace("Z", "")
+ ),
+ vuln_id_from_tool=report_finding["QID"]
+ )
+ cve_data = report_finding.get("CVEID")
- finding.active = report_finding["Vuln Status"] in (
- "Active",
- "Re-Opened",
- "New",
+ finding.unsaved_vulnerability_ids = (
+ cve_data.split(",") if "," in cve_data else [cve_data]
)
-
- if finding.active:
- finding.mitigated = None
- finding.is_mitigated = False
-
finding.verified = True
finding.unsaved_endpoints.append(endpoint)
if not finding_with_id:
diff --git a/dojo/tools/qualys_webapp/parser.py b/dojo/tools/qualys_webapp/parser.py
index 843d497a5bb..c564c76cd22 100644
--- a/dojo/tools/qualys_webapp/parser.py
+++ b/dojo/tools/qualys_webapp/parser.py
@@ -193,7 +193,6 @@ def get_unique_vulnerabilities(
# Iterate through all vulnerabilites to pull necessary info
for vuln in vulnerabilities:
urls = []
- requests = response = ""
qid = int(vuln.findtext("QID"))
url = vuln.findtext("URL")
if url is not None:
@@ -261,7 +260,6 @@ def get_vulnerabilities(
# Iterate through all vulnerabilites to pull necessary info
for vuln in vulnerabilities:
urls = []
- requests = response = ""
qid = int(vuln.findtext("QID"))
url = vuln.findtext("URL")
if url is not None:
diff --git a/dojo/tools/semgrep/parser.py b/dojo/tools/semgrep/parser.py
index 1a39e42d9d0..f22364854ab 100644
--- a/dojo/tools/semgrep/parser.py
+++ b/dojo/tools/semgrep/parser.py
@@ -101,6 +101,10 @@ def get_description(self, item):
snippet = item["extra"].get("lines")
if snippet is not None:
- description += "**Snippet:**\n```{}```\n".format(snippet)
+ if " SysdigData:
return ()
content = filename.read()
- if type(content) is bytes:
+ if isinstance(content, bytes):
content = content.decode('utf-8')
reader = csv.DictReader(io.StringIO(content), delimiter=',', quotechar='"')
diff --git a/dojo/tools/twistlock/parser.py b/dojo/tools/twistlock/parser.py
index 2c8a3e335d0..5c7c23d887d 100644
--- a/dojo/tools/twistlock/parser.py
+++ b/dojo/tools/twistlock/parser.py
@@ -22,7 +22,7 @@ def parse_issue(self, row, test):
row.get("Id", "")
data_severity = row.get("Severity", "")
data_cvss = row.get("CVSS", "")
- data_description = description_column = row.get("Description", "")
+ data_description = row.get("Description", "")
if data_vulnerability_id and data_package_name:
title = (
diff --git a/dojo/tools/utils.py b/dojo/tools/utils.py
index 8a26b44302d..4820382ef8f 100644
--- a/dojo/tools/utils.py
+++ b/dojo/tools/utils.py
@@ -14,7 +14,7 @@ def get_npm_cwe(item_node):
"""
cwe_node = item_node.get('cwe')
if cwe_node:
- if type(cwe_node) == list:
+ if isinstance(cwe_node, list):
return int(cwe_node[0][4:])
elif cwe_node.startswith('CWE-'):
cwe_string = cwe_node[4:]
diff --git a/dojo/tools/wpscan/parser.py b/dojo/tools/wpscan/parser.py
index 1792de7700b..b6f3bd01afe 100644
--- a/dojo/tools/wpscan/parser.py
+++ b/dojo/tools/wpscan/parser.py
@@ -138,6 +138,7 @@ def get_findings(self, file, test):
finding = Finding(
title=f"Interesting finding: {interesting_finding.get('to_s')}",
description=description,
+ references=references,
severity="Info",
dynamic_finding=True,
static_finding=False,
diff --git a/dojo/user/views.py b/dojo/user/views.py
index ebbd6cad258..f021aa00460 100644
--- a/dojo/user/views.py
+++ b/dojo/user/views.py
@@ -181,12 +181,12 @@ def delete_alerts(request):
alerts = Alerts.objects.filter(user_id=request.user)
if request.method == 'POST':
- removed_alerts = request.POST.getlist('alert_select')
alerts.filter().delete()
- messages.add_message(request,
- messages.SUCCESS,
- _('Alerts removed.'),
- extra_tags='alert-success')
+ messages.add_message(
+ request,
+ messages.SUCCESS,
+ _('Alerts removed.'),
+ extra_tags='alert-success')
return HttpResponseRedirect('alerts')
return render(request,
@@ -270,9 +270,7 @@ def change_password(request):
if request.method == 'POST':
form = ChangePasswordForm(request.POST, user=user)
if form.is_valid():
- current_password = form.cleaned_data['current_password']
new_password = form.cleaned_data['new_password']
- confirm_password = form.cleaned_data['confirm_password']
user.set_password(new_password)
Dojo_User.disable_force_password_reset(user)
diff --git a/dojo/utils.py b/dojo/utils.py
index 4d32d416c13..eac65b08a47 100644
--- a/dojo/utils.py
+++ b/dojo/utils.py
@@ -665,7 +665,6 @@ def add_breadcrumb(parent=None,
url=None,
request=None,
clear=False):
- title_done = False
if clear:
request.session['dojo_breadcrumbs'] = None
return
@@ -682,7 +681,6 @@ def add_breadcrumb(parent=None,
if parent is not None and getattr(parent, "get_breadcrumbs", None):
crumbs += parent.get_breadcrumbs()
else:
- title_done = True
crumbs += [{
'title': title,
'url': request.get_full_path() if url is None else url
@@ -697,7 +695,6 @@ def add_breadcrumb(parent=None,
'url': request.get_full_path() if url is None else url
}]
else:
- title_done = True
obj_crumbs = [{
'title': title,
'url': request.get_full_path() if url is None else url
@@ -903,7 +900,7 @@ def get_period_counts_legacy(findings,
else:
risks_a = None
- crit_count, high_count, med_count, low_count, closed_count = [
+ crit_count, high_count, med_count, low_count, _ = [
0, 0, 0, 0, 0
]
for finding in findings:
@@ -923,7 +920,7 @@ def get_period_counts_legacy(findings,
[(tcalendar.timegm(new_date.timetuple()) * 1000), new_date,
crit_count, high_count, med_count, low_count, total,
closed_in_range_count])
- crit_count, high_count, med_count, low_count, closed_count = [
+ crit_count, high_count, med_count, low_count, _ = [
0, 0, 0, 0, 0
]
if risks_a is not None:
@@ -1000,13 +997,13 @@ def get_period_counts(findings,
else:
risks_a = None
- f_crit_count, f_high_count, f_med_count, f_low_count, f_closed_count = [
+ f_crit_count, f_high_count, f_med_count, f_low_count, _ = [
0, 0, 0, 0, 0
]
- ra_crit_count, ra_high_count, ra_med_count, ra_low_count, ra_closed_count = [
+ ra_crit_count, ra_high_count, ra_med_count, ra_low_count, _ = [
0, 0, 0, 0, 0
]
- active_crit_count, active_high_count, active_med_count, active_low_count, active_closed_count = [
+ active_crit_count, active_high_count, active_med_count, active_low_count, _ = [
0, 0, 0, 0, 0
]
@@ -1490,8 +1487,6 @@ def prepare_for_view(encrypted_value):
encrypted_values = encrypted_value.split(":")
if len(encrypted_values) > 1:
- type = encrypted_values[0]
-
iv = binascii.a2b_hex(encrypted_values[1])
value = encrypted_values[2]
@@ -1747,7 +1742,7 @@ def user_post_save(sender, instance, created, **kwargs):
notifications.template = False
notifications.user = instance
logger.info('creating default set (from template) of notifications for: ' + str(instance))
- except Exception as err:
+ except Exception:
notifications = Notifications(user=instance)
logger.info('creating default set of notifications for: ' + str(instance))
diff --git a/helm/defectdojo/values.yaml b/helm/defectdojo/values.yaml
index 99b648f6a8a..c6eddcba413 100644
--- a/helm/defectdojo/values.yaml
+++ b/helm/defectdojo/values.yaml
@@ -457,7 +457,7 @@ cloudsql:
image:
# set repo and image tag of gce-proxy
repository: gcr.io/cloudsql-docker/gce-proxy
- tag: 1.33.15
+ tag: 1.33.16
pullPolicy: IfNotPresent
# set CloudSQL instance: 'project:zone:instancename'
instance: ""
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000000..9207b1fce1d
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,44 @@
+[tool.ruff]
+ # Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default.
+ # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
+ # McCabe complexity (`C901`) by default.
+ select = ["E", "F"]
+ ignore = ["E501", "E722", "E402", "E731", "E713", "F821", "F601", "F403"]
+
+ # Allow autofix for all enabled rules (when `--fix`) is provided.
+ fixable = ["ALL"]
+ unfixable = []
+
+ # Exclude a variety of commonly ignored directories.
+ exclude = [
+ ".bzr",
+ ".direnv",
+ ".eggs",
+ ".git",
+ ".git-rewrite",
+ ".hg",
+ ".mypy_cache",
+ ".nox",
+ ".pants.d",
+ ".pytype",
+ ".ruff_cache",
+ ".svn",
+ ".tox",
+ ".venv",
+ "__pypackages__",
+ "_build",
+ "buck-out",
+ "build",
+ "dist",
+ "node_modules",
+ "venv",
+ # Not for the dojo specific stuff
+ "dojo/db_migrations"
+ ]
+ per-file-ignores = {}
+
+ # Same as Black.
+ line-length = 120
+
+ # Allow unused variables when underscore-prefixed.
+ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
\ No newline at end of file
diff --git a/requirements-lint.txt b/requirements-lint.txt
new file mode 100644
index 00000000000..418a3037fb1
--- /dev/null
+++ b/requirements-lint.txt
@@ -0,0 +1 @@
+ruff==0.1.13
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 1f5777ce7c5..6fea96c1f2b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -73,13 +73,13 @@ django-fieldsignals==0.7.0
hyperlink==21.0.0
django-test-migrations==1.3.0
djangosaml2==1.9.0
-drf-spectacular==0.27.0
+drf-spectacular==0.27.1
drf-spectacular-sidecar==2024.1.1
django-ratelimit==4.1.0
argon2-cffi==23.1.0
blackduck==1.1.0
pycurl==7.45.2 # Required for Celery Broker AWS (SQS) support
-boto3==1.34.20 # Required for Celery Broker AWS (SQS) support
+boto3==1.34.22 # Required for Celery Broker AWS (SQS) support
netaddr==0.8.0
vulners==2.1.2
fontawesomefree==6.5.1
diff --git a/unittests/scans/asff/many_vulns.json b/unittests/scans/asff/many_vulns.json
new file mode 100644
index 00000000000..bf22112af9f
--- /dev/null
+++ b/unittests/scans/asff/many_vulns.json
@@ -0,0 +1,766 @@
+[
+ {
+ "SchemaVersion": "2018-10-08",
+ "Id": "arn:aws:inspector2:eu-west-1:123456789123:finding/e7dd7a6979b7ce39de463533b1e6cd44",
+ "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/inspector",
+ "ProductName": "Inspector",
+ "CompanyName": "Amazon",
+ "Region": "eu-west-1",
+ "GeneratorId": "AWSInspector",
+ "AwsAccountId": "123456789123",
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ],
+ "FirstObservedAt": "2023-08-30T20:07:14Z",
+ "LastObservedAt": "2023-09-15T07:00:24Z",
+ "CreatedAt": "2023-08-30T20:07:14Z",
+ "UpdatedAt": "2023-09-15T07:00:24Z",
+ "Severity": {
+ "Label": "HIGH",
+ "Normalized": 70
+ },
+ "Title": "CVE-2017-9735 - org.eclipse.jetty:jetty-server, org.eclipse.jetty:jetty-util",
+ "Description": "Jetty through 9.4.x is prone to a timing channel in util/security/Password.java, which makes it easier for remote attackers to obtain access by observing elapsed times before rejection of incorrect passwords.",
+ "Remediation": {
+ "Recommendation": {
+ "Text": "Remediation is available. Please refer to the Fixed version in the vulnerability details section above.For detailed remediation guidance for each of the affected packages, refer to the vulnerabilities section of the detailed finding JSON."
+ }
+ },
+ "ProductFields": {
+ "aws/inspector/ProductVersion": "2",
+ "aws/inspector/FindingStatus": "ACTIVE",
+ "aws/inspector/inspectorScore": "7.5",
+ "aws/inspector/instanceId": "i-0asd2da21c8csd28s",
+ "aws/inspector/resources/1/resourceDetails/awsEc2InstanceDetails/platform": "UBUNTU_20_04",
+ "aws/securityhub/FindingId": "arn:aws:securityhub:eu-west-1::product/aws/inspector/arn:aws:inspector2:eu-west-1:123456789123:finding/e7dd7a6979b7ce39de463533b1e6cd44",
+ "aws/securityhub/ProductName": "Inspector",
+ "aws/securityhub/CompanyName": "Amazon"
+ },
+ "Resources": [
+ {
+ "Type": "AwsEc2Instance",
+ "Id": "arn:aws:ec2:eu-west-1:123456789123:instance/i-0asd2da21c8csd28s",
+ "Partition": "aws",
+ "Region": "eu-west-1",
+ "Tags": {
+ "OS": "Ubuntu",
+ "envtype": "production",
+ "name": "MyServer1 - new",
+ "OS-version": "18.04",
+ "department": "it",
+ "envcategory": "production",
+ "Name": "MyServer1"
+ },
+ "Details": {
+ "AwsEc2Instance": {
+ "Type": "m5d.large",
+ "ImageId": "ami-1234shgh268csd28s",
+ "IpV4Addresses": [
+ "123.123.123.123",
+ "172.31.0.31"
+ ],
+ "KeyName": "MySSHkey",
+ "IamInstanceProfileArn": "arn:aws:iam::123456789123:instance-profile/AmazonSSMRole",
+ "VpcId": "vpc-12kk2qwe",
+ "SubnetId": "subnet-s12u28as",
+ "LaunchedAt": "2023-08-30T05:09:41Z"
+ }
+ }
+ }
+ ],
+ "WorkflowState": "NEW",
+ "Workflow": {
+ "Status": "NEW"
+ },
+ "RecordState": "ACTIVE",
+ "Vulnerabilities": [
+ {
+ "Id": "CVE-2017-9735",
+ "VulnerablePackages": [
+ {
+ "Name": "org.eclipse.jetty:jetty-server",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.server_8.1.14.v20131031.jar",
+ "FixedInVersion": "9.4.6.v20170531",
+ "Remediation": "Update jetty-server to 9.4.6.v20170531"
+ },
+ {
+ "Name": "org.eclipse.jetty:jetty-util",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.util_8.1.14.v20131031.jar",
+ "FixedInVersion": "9.4.6.v20170531",
+ "Remediation": "Update jetty-util to 9.4.6.v20170531"
+ }
+ ],
+ "Cvss": [
+ {
+ "Version": "2.0",
+ "BaseScore": 5,
+ "BaseVector": "AV:N/AC:L/Au:N/C:P/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 7.5,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 7.5,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
+ "Source": "NVD"
+ }
+ ],
+ "Vendor": {
+ "Name": "NVD",
+ "Url": "https://nvd.nist.gov/vuln/detail/CVE-2017-9735",
+ "VendorSeverity": "HIGH",
+ "VendorCreatedAt": "2017-06-16T21:29:00Z",
+ "VendorUpdatedAt": "2022-03-15T14:55:00Z"
+ },
+ "ReferenceUrls": [
+ "https://lists.debian.org/debian-lts-announce/2021/05/msg00016.html",
+ "https://lists.apache.org/thread.html/053d9ce4d579b02203db18545fee5e33f35f2932885459b74d1e4272@%3Cissues.activemq.apache.org%3E",
+ "https://lists.apache.org/thread.html/36870f6c51f5bc25e6f7bb1fcace0e57e81f1524019b11f466738559@%3Ccommon-dev.hadoop.apache.org%3E",
+ "https://www.oracle.com/technetwork/security-advisory/cpuoct2019-5072832.html",
+ "https://bugs.debian.org/864631",
+ "https://www.oracle.com/security-alerts/cpuoct2020.html",
+ "https://lists.apache.org/thread.html/ff8dcfe29377088ab655fda9d585dccd5b1f07fabd94ae84fd60a7f8@%3Ccommits.pulsar.apache.org%3E",
+ "https://lists.apache.org/thread.html/519eb0fd45642dcecd9ff74cb3e71c20a4753f7d82e2f07864b5108f@%3Cdev.drill.apache.org%3E",
+ "https://www.oracle.com//security-alerts/cpujul2021.html",
+ "https://lists.apache.org/thread.html/f887a5978f5e4c62b9cfe876336628385cff429e796962649649ec8a@%3Ccommon-issues.hadoop.apache.org%3E",
+ "https://lists.apache.org/thread.html/f9bc3e55f4e28d1dcd1a69aae6d53e609a758e34d2869b4d798e13cc@%3Cissues.drill.apache.org%3E"
+ ],
+ "FixAvailable": "YES",
+ "ExploitAvailable": "YES"
+ }
+ ],
+ "FindingProviderFields": {
+ "Severity": {
+ "Label": "HIGH"
+ },
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ]
+ }
+ },
+ {
+ "SchemaVersion": "2018-10-08",
+ "Id": "arn:aws:inspector2:eu-west-1:123456789123:finding/96a4d357714e4eb40e17e4a9c6171ce4",
+ "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/inspector",
+ "ProductName": "Inspector",
+ "CompanyName": "Amazon",
+ "Region": "eu-west-1",
+ "GeneratorId": "AWSInspector",
+ "AwsAccountId": "123456789123",
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ],
+ "FirstObservedAt": "2023-08-30T20:07:14Z",
+ "LastObservedAt": "2023-09-15T07:00:24Z",
+ "CreatedAt": "2023-08-30T20:07:14Z",
+ "UpdatedAt": "2023-09-15T07:00:24Z",
+ "Severity": {
+ "Label": "MEDIUM",
+ "Normalized": 40
+ },
+ "Title": "CVE-2019-10247 - org.eclipse.jetty:jetty-server",
+ "Description": "In Eclipse Jetty version 7.x, 8.x, 9.2.27 and older, 9.3.26 and older, and 9.4.16 and older, the server running on any OS and Jetty version combination will reveal the configured fully qualified directory base resource location on the output of the 404 error for not finding a Context that matches the requested path. The default server behavior on jetty-distribution and jetty-home will include at the end of the Handler tree a DefaultHandler, which is responsible for reporting this 404 error, it presents the various configured contexts as HTML for users to click through to. This produced HTML includes output that contains the configured fully qualified directory base resource location for each context.",
+ "Remediation": {
+ "Recommendation": {
+ "Text": "Remediation is available. Please refer to the Fixed version in the vulnerability details section above.For detailed remediation guidance for each of the affected packages, refer to the vulnerabilities section of the detailed finding JSON."
+ }
+ },
+ "ProductFields": {
+ "aws/inspector/ProductVersion": "2",
+ "aws/inspector/FindingStatus": "ACTIVE",
+ "aws/inspector/inspectorScore": "5.3",
+ "aws/inspector/instanceId": "i-0asd2da21c8csd28s",
+ "aws/inspector/resources/1/resourceDetails/awsEc2InstanceDetails/platform": "UBUNTU_20_04",
+ "aws/securityhub/FindingId": "arn:aws:securityhub:eu-west-1::product/aws/inspector/arn:aws:inspector2:eu-west-1:123456789123:finding/96a4d357714e4eb40e17e4a9c6171ce4",
+ "aws/securityhub/ProductName": "Inspector",
+ "aws/securityhub/CompanyName": "Amazon"
+ },
+ "Resources": [
+ {
+ "Type": "AwsEc2Instance",
+ "Id": "arn:aws:ec2:eu-west-1:123456789123:instance/i-0asd2da21c8csd28s",
+ "Partition": "aws",
+ "Region": "eu-west-1",
+ "Tags": {
+ "Name": "MyServer1"
+ },
+ "Details": {
+ "AwsEc2Instance": {
+ "Type": "m5d.large",
+ "ImageId": "ami-1234shgh268csd28s",
+ "IpV4Addresses": [
+ "123.123.123.123",
+ "172.31.0.31"
+ ],
+ "KeyName": "MySSHkey",
+ "IamInstanceProfileArn": "arn:aws:iam::123456789123:instance-profile/AmazonSSMRole",
+ "VpcId": "vpc-12kk2qwe",
+ "SubnetId": "subnet-s12u28as",
+ "LaunchedAt": "2023-08-30T05:09:41Z"
+ }
+ }
+ }
+ ],
+ "WorkflowState": "NEW",
+ "Workflow": {
+ "Status": "NEW"
+ },
+ "RecordState": "ACTIVE",
+ "Vulnerabilities": [
+ {
+ "Id": "CVE-2019-10247",
+ "VulnerablePackages": [
+ {
+ "Name": "org.eclipse.jetty:jetty-server",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.server_8.1.14.v20131031.jar",
+ "FixedInVersion": "9.4.17.v20190418",
+ "Remediation": "Update jetty-server to 9.4.17.v20190418"
+ }
+ ],
+ "Cvss": [
+ {
+ "Version": "2.0",
+ "BaseScore": 5,
+ "BaseVector": "AV:N/AC:L/Au:N/C:P/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 5.3,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 5.3,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
+ "Source": "NVD"
+ }
+ ],
+ "Vendor": {
+ "Name": "NVD",
+ "Url": "https://nvd.nist.gov/vuln/detail/CVE-2019-10247",
+ "VendorSeverity": "MEDIUM",
+ "VendorCreatedAt": "2019-04-22T20:29:00Z",
+ "VendorUpdatedAt": "2022-04-22T20:09:00Z"
+ },
+ "ReferenceUrls": [
+ "https://lists.apache.org/thread.html/053d9ce4d579b02203db18545fee5e33f35f2932885459b74d1e4272@%3Cissues.activemq.apache.org%3E",
+ "https://www.oracle.com/security-alerts/cpuapr2020.html",
+ "https://www.oracle.com/technetwork/security-advisory/cpuoct2019-5072832.html",
+ "https://www.oracle.com/security-alerts/cpuApr2021.html",
+ "https://www.oracle.com/security-alerts/cpuoct2020.html",
+ "https://lists.apache.org/thread.html/bcce5a9c532b386c68dab2f6b3ce8b0cc9b950ec551766e76391caa3@%3Ccommits.nifi.apache.org%3E",
+ "https://lists.apache.org/thread.html/ac51944aef91dd5006b8510b0bef337adaccfe962fb90e7af9c22db4@%3Cissues.activemq.apache.org%3E",
+ "https://www.oracle.com/security-alerts/cpujan2021.html",
+ "https://lists.debian.org/debian-lts-announce/2021/05/msg00016.html",
+ "https://lists.apache.org/thread.html/rca37935d661f4689cb4119f1b3b224413b22be161b678e6e6ce0c69b@%3Ccommits.nifi.apache.org%3E",
+ "https://www.debian.org/security/2021/dsa-4949",
+ "https://lists.apache.org/thread.html/519eb0fd45642dcecd9ff74cb3e71c20a4753f7d82e2f07864b5108f@%3Cdev.drill.apache.org%3E",
+ "https://www.oracle.com/security-alerts/cpujul2020.html",
+ "https://www.oracle.com/security-alerts/cpuapr2022.html",
+ "https://www.oracle.com/security-alerts/cpujan2020.html",
+ "https://lists.apache.org/thread.html/f9bc3e55f4e28d1dcd1a69aae6d53e609a758e34d2869b4d798e13cc@%3Cissues.drill.apache.org%3E",
+ "https://bugs.eclipse.org/bugs/show_bug.cgi?id=546577"
+ ],
+ "FixAvailable": "YES",
+ "ExploitAvailable": "NO"
+ }
+ ],
+ "FindingProviderFields": {
+ "Severity": {
+ "Label": "MEDIUM"
+ },
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ]
+ }
+ },
+ {
+ "SchemaVersion": "2018-10-08",
+ "Id": "arn:aws:inspector2:eu-west-1:123456789123:finding/957fcab569b7cfd5faa067a3be3c0728",
+ "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/inspector",
+ "ProductName": "Inspector",
+ "CompanyName": "Amazon",
+ "Region": "eu-west-1",
+ "GeneratorId": "AWSInspector",
+ "AwsAccountId": "123456789123",
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ],
+ "FirstObservedAt": "2023-08-30T20:07:14Z",
+ "LastObservedAt": "2023-09-15T07:00:24Z",
+ "CreatedAt": "2023-08-30T20:07:14Z",
+ "UpdatedAt": "2023-09-15T07:00:24Z",
+ "Severity": {
+ "Label": "MEDIUM",
+ "Normalized": 40
+ },
+ "Title": "CVE-2023-26048 - org.eclipse.jetty:jetty-server",
+ "Description": "Jetty is a java based web server and servlet engine. In affected versions servlets with multipart support (e.g. annotated with `@MultipartConfig`) that call `HttpServletRequest.getParameter()` or `HttpServletRequest.getParts()` may cause `OutOfMemoryError` when the client sends a multipart request with a part that has a name but no filename and very large content. This happens even with the default settings of `fileSizeThreshold=0` which should stream the whole part content to disk. An attacker client may send a large multipart request and cause the server to throw `OutOfMemoryError`. However, the server may be able to recover after the `OutOfMemoryError` and continue its service -- although it may take some time. This issue has been patched in versions 9.4.51, 10.0.14, and 11.0.14. Users are advised to upgrade. Users unable to upgrade may set the multipart parameter `maxRequestSize` which must be set to a non-negative value, so the whole multipart content is limited (although still read into memory).",
+ "Remediation": {
+ "Recommendation": {
+ "Text": "Remediation is available. Please refer to the Fixed version in the vulnerability details section above.For detailed remediation guidance for each of the affected packages, refer to the vulnerabilities section of the detailed finding JSON."
+ }
+ },
+ "ProductFields": {
+ "aws/inspector/ProductVersion": "2",
+ "aws/inspector/FindingStatus": "ACTIVE",
+ "aws/inspector/inspectorScore": "5.3",
+ "aws/inspector/instanceId": "i-0asd2da21c8csd28s",
+ "aws/inspector/resources/1/resourceDetails/awsEc2InstanceDetails/platform": "UBUNTU_20_04",
+ "aws/securityhub/FindingId": "arn:aws:securityhub:eu-west-1::product/aws/inspector/arn:aws:inspector2:eu-west-1:123456789123:finding/957fcab569b7cfd5faa067a3be3c0728",
+ "aws/securityhub/ProductName": "Inspector",
+ "aws/securityhub/CompanyName": "Amazon"
+ },
+ "Resources": [
+ {
+ "Type": "AwsEc2Instance",
+ "Id": "arn:aws:ec2:eu-west-1:123456789123:instance/i-0asd2da21c8csd28s",
+ "Partition": "aws",
+ "Region": "eu-west-1",
+ "Tags": {
+ "Name": "MyServer1"
+ },
+ "Details": {
+ "AwsEc2Instance": {
+ "Type": "m5d.large",
+ "ImageId": "ami-1234shgh268csd28s",
+ "IpV4Addresses": [
+ "123.123.123.123",
+ "172.31.0.31"
+ ],
+ "KeyName": "MySSHkey",
+ "IamInstanceProfileArn": "arn:aws:iam::123456789123:instance-profile/AmazonSSMRole",
+ "VpcId": "vpc-12kk2qwe",
+ "SubnetId": "subnet-s12u28as",
+ "LaunchedAt": "2023-08-30T05:09:41Z"
+ }
+ }
+ }
+ ],
+ "WorkflowState": "NEW",
+ "Workflow": {
+ "Status": "NEW"
+ },
+ "RecordState": "ACTIVE",
+ "Vulnerabilities": [
+ {
+ "Id": "CVE-2023-26048",
+ "VulnerablePackages": [
+ {
+ "Name": "org.eclipse.jetty:jetty-server",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.server_8.1.14.v20131031.jar",
+ "FixedInVersion": "12.0.0.beta0",
+ "Remediation": "Update jetty-server to 12.0.0.beta0"
+ }
+ ],
+ "Cvss": [
+ {
+ "Version": "3.1",
+ "BaseScore": 5.3,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 5.3,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L",
+ "Source": "NVD"
+ }
+ ],
+ "Vendor": {
+ "Name": "NVD",
+ "Url": "https://nvd.nist.gov/vuln/detail/CVE-2023-26048",
+ "VendorSeverity": "MEDIUM",
+ "VendorCreatedAt": "2023-04-18T21:15:00Z",
+ "VendorUpdatedAt": "2023-05-26T20:15:00Z"
+ },
+ "FixAvailable": "YES",
+ "ExploitAvailable": "YES"
+ }
+ ],
+ "FindingProviderFields": {
+ "Severity": {
+ "Label": "MEDIUM"
+ },
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ]
+ }
+ },
+ {
+ "SchemaVersion": "2018-10-08",
+ "Id": "arn:aws:inspector2:eu-west-1:123456789123:finding/723630f6ce983dbf1b8d2a5f3d6df888",
+ "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/inspector",
+ "ProductName": "Inspector",
+ "CompanyName": "Amazon",
+ "Region": "eu-west-1",
+ "GeneratorId": "AWSInspector",
+ "AwsAccountId": "123456789123",
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ],
+ "FirstObservedAt": "2023-08-30T20:07:14Z",
+ "LastObservedAt": "2023-09-15T07:00:24Z",
+ "CreatedAt": "2023-08-30T20:07:14Z",
+ "UpdatedAt": "2023-09-15T07:00:24Z",
+ "Severity": {
+ "Label": "HIGH",
+ "Normalized": 70
+ },
+ "Title": "CVE-2021-28165 - org.eclipse.jetty:jetty-io",
+ "Description": "In Eclipse Jetty 7.2.2 to 9.4.38, 10.0.0.alpha0 to 10.0.1, and 11.0.0.alpha0 to 11.0.1, CPU usage can reach 100% upon receiving a large invalid TLS frame.",
+ "Remediation": {
+ "Recommendation": {
+ "Text": "Remediation is available. Please refer to the Fixed version in the vulnerability details section above.For detailed remediation guidance for each of the affected packages, refer to the vulnerabilities section of the detailed finding JSON."
+ }
+ },
+ "ProductFields": {
+ "aws/inspector/ProductVersion": "2",
+ "aws/inspector/FindingStatus": "ACTIVE",
+ "aws/inspector/inspectorScore": "7.5",
+ "aws/inspector/instanceId": "i-0asd2da21c8csd28s",
+ "aws/inspector/resources/1/resourceDetails/awsEc2InstanceDetails/platform": "UBUNTU_20_04",
+ "aws/securityhub/FindingId": "arn:aws:securityhub:eu-west-1::product/aws/inspector/arn:aws:inspector2:eu-west-1:123456789123:finding/723630f6ce983dbf1b8d2a5f3d6df888",
+ "aws/securityhub/ProductName": "Inspector",
+ "aws/securityhub/CompanyName": "Amazon"
+ },
+ "Resources": [
+ {
+ "Type": "AwsEc2Instance",
+ "Id": "arn:aws:ec2:eu-west-1:123456789123:instance/i-0asd2da21c8csd28s",
+ "Partition": "aws",
+ "Region": "eu-west-1",
+ "Tags": {
+ "Name": "MyServer1"
+ },
+ "Details": {
+ "AwsEc2Instance": {
+ "Type": "m5d.large",
+ "ImageId": "ami-1234shgh268csd28s",
+ "IpV4Addresses": [
+ "123.123.123.123",
+ "172.31.0.31"
+ ],
+ "KeyName": "MySSHkey",
+ "IamInstanceProfileArn": "arn:aws:iam::123456789123:instance-profile/AmazonSSMRole",
+ "VpcId": "vpc-12kk2qwe",
+ "SubnetId": "subnet-s12u28as",
+ "LaunchedAt": "2023-08-30T05:09:41Z"
+ }
+ }
+ }
+ ],
+ "WorkflowState": "NEW",
+ "Workflow": {
+ "Status": "NEW"
+ },
+ "RecordState": "ACTIVE",
+ "Vulnerabilities": [
+ {
+ "Id": "CVE-2021-28165",
+ "VulnerablePackages": [
+ {
+ "Name": "org.eclipse.jetty:jetty-io",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.io_8.1.14.v20131031.jar",
+ "FixedInVersion": "11.0.2",
+ "Remediation": "Update jetty-io to 11.0.2"
+ }
+ ],
+ "Cvss": [
+ {
+ "Version": "2.0",
+ "BaseScore": 7.8,
+ "BaseVector": "AV:N/AC:L/Au:N/C:N/I:N/A:C",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 7.5,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 7.5,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
+ "Source": "NVD"
+ }
+ ],
+ "Vendor": {
+ "Name": "NVD",
+ "Url": "https://nvd.nist.gov/vuln/detail/CVE-2021-28165",
+ "VendorSeverity": "HIGH",
+ "VendorCreatedAt": "2021-04-01T15:15:00Z",
+ "VendorUpdatedAt": "2022-07-29T17:05:00Z"
+ },
+ "ReferenceUrls": [
+ "https://lists.apache.org/thread.html/r7c40fb3a66a39b6e6c83b0454bc6917ffe6c69e3131322be9c07a1da@%3Cissues.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r6f256a1d15505f79f4050a69bb8f27b34cb353604dd2f765c9da5df7@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r9db72e9c33b93eba45a214af588f1d553839b5c3080fc913854a49ab@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r520c56519b8820955a86966f499e7a0afcbcf669d6f7da59ef1eb155@%3Ccommits.pulsar.apache.org%3E",
+ "https://lists.apache.org/thread.html/ra9dd15ba8a4fb7e42c7fe948a6d6b3868fd6bbf8e3fb37fcf33b2cd0@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r90327f55db8f1d079f9a724aabf1f5eb3c00c1de49dc7fd04cad1ebc@%3Ccommits.pulsar.apache.org%3E",
+ "https://lists.apache.org/thread.html/r5b3693da7ecb8a75c0e930b4ca26a5f97aa0207d9dae4aa8cc65fe6b@%3Cissues.ignite.apache.org%3E",
+ "https://lists.apache.org/thread.html/rd0471252aeb3384c3cfa6d131374646d4641b80dd313e7b476c47a9c@%3Cissues.solr.apache.org%3E",
+ "https://lists.apache.org/thread.html/re0545ecced2d468c94ce4dcfa37d40a9573cc68ef5f6839ffca9c1c1@%3Ccommits.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/rc4779abc1cface47e956cf9f8910f15d79c24477e7b1ac9be076a825@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r002258611ed0c35b82b839d284b43db9dcdec120db8afc1c993137dc@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://www.oracle.com/security-alerts/cpuoct2021.html",
+ "https://lists.apache.org/thread.html/r06d54a297cb8217c66e5190912a955fb870ba47da164002bf2baffe5@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rb2d34abb67cdf525945fe4b821c5cdbca29a78d586ae1f9f505a311c@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rd755dfe5f658c42704540ad7950cebd136739089c3231658e398cf38@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/rdde34d53aa80193cda016272d61e6749f8a9044ccb37a30768938f7e@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/ra21b3e6bd9669377139fe33fb46edf6fece3f31375bc42a0dcc964b2@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r0a241b0649beef90d422b42a26a2470d336e59e66970eafd54f9c3e2@%3Ccommits.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r72bf813ed4737196ea3ed26494e949577be587fd5939fe8be09907c7@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rc6c43c3180c0efe00497c73dd374cd34b62036cb67987ad42c1f2dce@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r05db8e0ef01e1280cc7543575ae0fa1c2b4d06a8b928916ef65dd2ad@%3Creviews.spark.apache.org%3E",
+ "https://www.oracle.com/security-alerts/cpujan2022.html",
+ "https://lists.apache.org/thread.html/r33eb3889ca0aa12720355e64fc2f8f1e8c0c28a4d55b3b4b8891becb@%3Ccommits.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/rfc9f51b4e21022b3cd6cb6f90791a6a6999560212e519b5f09db0aed@%3Ccommits.pulsar.apache.org%3E",
+ "https://lists.apache.org/thread.html/re3a1617d16a7367f767b8209b2151f4c19958196354b39568c532f26@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rf1b02dfccd27b8bbc3afd119b212452fa32e9ed7d506be9357a3a7ec@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r17e26cf9a1e3cbc09522d15ece5d7c7a00cdced7641b92a22a783287@%3Cissues.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/re577736ca7da51952c910b345a500b7676ea9931c9b19709b87f292b@%3Cissues.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r077b76cafb61520c14c87c4fc76419ed664002da0ddac5ad851ae7e7@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r83453ec252af729996476e5839d0b28f07294959d60fea1bd76f7d81@%3Cissues.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r4abbd760d24bab2b8f1294c5c9216ae915100099c4391ad64e9ae38b@%3Cdev.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/r81748d56923882543f5be456043c67daef84d631cf54899082058ef1@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r694e57d74fcaa48818a03c282aecfa13ae68340c798dfcb55cb7acc7@%3Cdev.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r0bf3aa065abd23960fc8bdc8090d6bc00d5e391cf94ec4e1f4537ae3@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/rbba0b02a3287e34af328070dd58f7828612f96e2e64992137f4dc63d@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r411d75dc6bcefadaaea246549dd18e8d391a880ddf28a796f09ce152@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rbcd7b477df55857bb6cae21fcc4404683ac98aac1a47551f0dc55486@%3Cissues.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/rb8f5a6ded384eb00608e6137e87110e7dd7d5054cc34561cb89b81af@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r4891d45625cc522fe0eb764ac50d48bcca9c0db4805ea4a998d4c225@%3Cissues.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/raea6e820644e8c5a577f77d4e2044f8ab52183c2536b00c56738beef@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r71031d0acb1de55c9ab32f4750c50ce2f28543252e887ca03bd5621e@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r65daad30d13f7c56eb5c3d7733ad8dddbf62c469175410777a78d812@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r6b070441871a4e6ce8bb63e190c879bb60da7c5e15023de29ebd4f9f@%3Cjira.kafka.apache.org%3E",
+ "https://www.oracle.com//security-alerts/cpujul2021.html",
+ "https://lists.apache.org/thread.html/r0f02034a33076fd7243cf3a8807d2766e373f5cb2e7fd0c9a78f97c4@%3Cissues.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/r401b1c592f295b811608010a70792b11c91885b72af9f9410cffbe35@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r4a66bfbf62281e31bc1345ebecbfd96f35199eecd77bfe4e903e906f@%3Cissues.ignite.apache.org%3E",
+ "https://lists.apache.org/thread.html/r7bf7004c18c914fae3d5a6a0191d477e5b6408d95669b3afbf6efa36@%3Ccommits.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r0a4797ba6ceea8074f47574a4f3cc11493d514c1fab8203ebd212add@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rdf4fe435891e8c35e70ea5da033b4c3da78760f15a8c4212fad89d9f@%3Ccommits.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/rb1624b9777a3070135e94331a428c6653a6a1edccd56fa9fb7a547f2@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rc907ed7b089828364437de5ed57fa062330970dc1bc5cd214b711f77@%3Ccommits.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/rfd3ff6e66b6bbcfb2fefa9f5a20328937c0369b2e142e3e1c6774743@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rd6c1eb9a8a94b3ac8a525d74d792924e8469f201b77e1afcf774e7a6@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/ree1895a256a9db951e0d97a76222909c2e1f28c1a3d89933173deed6@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rb66ed0b4bb74836add60dd5ddf9172016380b2aeefb7f96fe348537b@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/re6614b4fe7dbb945409daadb9e1cc73c02383df68bf9334736107a6e@%3Cdev.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r6ce2907b2691c025250ba010bc797677ef78d5994d08507a2e5477c9@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rd9ea411a58925cc82c32e15f541ead23cb25b4b2d57a2bdb0341536e@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/ra210e38ae0bf615084390b26ba01bb5d66c0a76f232277446ae0948a@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r5f172f2dd8fb02f032ef4437218fd4f610605a3dd4f2a024c1e43b94@%3Cissues.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r5d1f16dca2e010193840068f1a1ec17b7015e91acc646607cbc0a4da@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rb11a13e623218c70b9f2a2d0d122fdaaf905e04a2edcd23761894464@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/rb00345f6b1620b553d2cc1acaf3017aa75cea3776b911e024fa3b187@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r03ca0b69db1e3e5f72fe484b71370d537cd711cbf334e2913332730a@%3Cissues.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r940f15db77a96f6aea92d830bc94d8d95f26cc593394d144755824da@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r2ea2f0541121f17e470a0184843720046c59d4bde6d42bf5ca6fad81@%3Cissues.solr.apache.org%3E",
+ "https://lists.apache.org/thread.html/r4b1fef117bccc7f5fd4c45fd2cabc26838df823fe5ca94bc42a4fd46@%3Cissues.ignite.apache.org%3E",
+ "https://lists.apache.org/thread.html/rdbf2a2cd1800540ae50dd78b57411229223a6172117d62b8e57596aa@%3Cissues.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/r9fae5a4087d9ed1c9d4f0c7493b6981a4741cfb4bebb2416da638424@%3Cissues.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r0841b06b48324cfc81325de3c05a92e53f997185f9d71ff47734d961@%3Cissues.solr.apache.org%3E",
+ "https://lists.apache.org/thread.html/r111f1ce28b133a8090ca4f809a1bdf18a777426fc058dc3a16c39c66@%3Cissues.solr.apache.org%3E",
+ "https://lists.apache.org/thread.html/r6ac9e263129328c0db9940d72b4a6062e703c58918dd34bd22cdf8dd@%3Cissues.ignite.apache.org%3E",
+ "https://lists.apache.org/thread.html/r0cd1a5e3f4ad4770b44f8aa96572fc09d5b35bec149c0cc247579c42@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rcdea97f4d3233298296aabc103c9fcefbf629425418c2b69bb16745f@%3Ccommits.pulsar.apache.org%3E",
+ "https://lists.apache.org/thread.html/r6535b2beddf0ed2d263ab64ff365a5f790df135a1a2f45786417adb7@%3Cdev.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/rf6de4c249bd74007f5f66f683c110535f46e719d2f83a41e8faf295f@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rf99f9a25ca24fe519c9346388f61b5b3a09be31b800bf37f01473ad7@%3Cnotifications.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/r7189bf41cb0c483629917a01cf296f9fbdbda3987084595192e3845d@%3Cissues.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/r40136c2010fccf4fb2818a965e5d7ecca470e5f525c232ec5b8eb83a@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r23785214d47673b811ef119ca3a40f729801865ea1e891572d15faa6@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r47a7542ab61da865fff3db0fe74bfe76c89a37b6e6d2c2a423f8baee@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r780c3c210a05c5bf7b4671303f46afc3fe56758e92864e1a5f0590d0@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r2afc72af069a7fe89ca2de847f3ab3971cb1d668a9497c999946cd78@%3Ccommits.spark.apache.org%3E",
+ "https://www.oracle.com/security-alerts/cpuapr2022.html",
+ "https://lists.apache.org/thread.html/rbab9e67ec97591d063905bc7d4743e6a673f1bc457975fc0445ac97f@%3Cissues.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/rbc075a4ac85e7a8e47420b7383f16ffa0af3b792b8423584735f369f@%3Cissues.solr.apache.org%3E",
+ "https://lists.apache.org/thread.html/rdfe5f1c071ba9dadba18d7fb0ff13ea6ecb33da624250c559999eaeb@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r56e5568ac73daedcb3b5affbb4b908999f03d3c1b1ada3920b01e959@%3Cdev.zookeeper.apache.org%3E",
+ "https://lists.apache.org/thread.html/rd7c8fb305a8637480dc943ba08424c8992dccad018cd1405eb2afe0e@%3Cdev.ignite.apache.org%3E",
+ "https://lists.apache.org/thread.html/ra50519652b0b7f869a14fbfb4be9758a29171d7fe561bb7e036e8449@%3Cissues.hbase.apache.org%3E",
+ "https://lists.apache.org/thread.html/r64ff94118f6c80e6c085c6e2d51bbb490eaefad0642db8c936e4f0b7@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r746434be6abff9ad321ff54ecae09e1f09c1c7c139021f40a5774090@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r9974f64723875052e02787b2a5eda689ac5247c71b827d455e5dc9a6@%3Cissues.solr.apache.org%3E",
+ "https://lists.apache.org/thread.html/rc4dbc9907b0bdd634200ac90a15283d9c143c11af66e7ec72128d020@%3Cjira.kafka.apache.org%3E",
+ "https://lists.apache.org/thread.html/r31f591a0deac927ede8ccc3eac4bb92697ee2361bf01549f9e3440ca@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rd24d8a059233167b4a5aebda4b3534ca1d86caa8a85b10a73403ee97@%3Ccommits.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rae8bbc5a516f3e21b8a55e61ff6ad0ced03bdbd116d2170a3eed9f5c@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r769155244ca2da2948a44091bb3bb9a56e7e1c71ecc720b8ecf281f0@%3Creviews.spark.apache.org%3E",
+ "https://www.debian.org/security/2021/dsa-4949",
+ "https://lists.apache.org/thread.html/r9b793db9f395b546e66fb9c44fe1cd75c7755029e944dfee31b8b779@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r942f4a903d0abb25ac75c592e57df98dea51350e8589269a72fd7913@%3Cissues.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/r2f2d9c3b7cc750a6763d6388bcf5db0c7b467bd8be6ac4d6aea4f0cf@%3Creviews.spark.apache.org%3E",
+ "https://lists.apache.org/thread.html/rbd9a837a18ca57ac0d9b4165a6eec95ee132f55d025666fe41099f33@%3Creviews.spark.apache.org%3E"
+ ],
+ "FixAvailable": "YES",
+ "ExploitAvailable": "YES"
+ }
+ ],
+ "FindingProviderFields": {
+ "Severity": {
+ "Label": "HIGH"
+ },
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ]
+ }
+ },
+ {
+ "SchemaVersion": "2018-10-08",
+ "Id": "arn:aws:inspector2:eu-west-1:123456789123:finding/71344c6204b894be7a0c28bed223bf9b",
+ "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/inspector",
+ "ProductName": "Inspector",
+ "CompanyName": "Amazon",
+ "Region": "eu-west-1",
+ "GeneratorId": "AWSInspector",
+ "AwsAccountId": "123456789123",
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ],
+ "FirstObservedAt": "2023-08-30T20:07:14Z",
+ "LastObservedAt": "2023-09-15T07:00:24Z",
+ "CreatedAt": "2023-08-30T20:07:14Z",
+ "UpdatedAt": "2023-09-15T07:00:24Z",
+ "Severity": {
+ "Label": "MEDIUM",
+ "Normalized": 40
+ },
+ "Title": "CVE-2023-26049 - org.eclipse.jetty:jetty-server, org.eclipse.jetty:jetty-http",
+ "Description": "Jetty is a java based web server and servlet engine. Nonstandard cookie parsing in Jetty may allow an attacker to smuggle cookies within other cookies, or otherwise perform unintended behavior by tampering with the cookie parsing mechanism. If Jetty sees a cookie VALUE that starts with `\"` (double quote), it will continue to read the cookie string until it sees a closing quote -- even if a semicolon is encountered. So, a cookie header such as: `DISPLAY_LANGUAGE=\"b; JSESSIONID=1337; c=d\"` will be parsed as one cookie, with the name DISPLAY_LANGUAGE and a value of b; JSESSIONID=1337; c=d instead of 3 separate cookies. This has security implications because if, say, JSESSIONID is an HttpOnly cookie, and the DISPLAY_LANGUAGE cookie value is rendered on the page, an attacker can smuggle the JSESSIONID cookie into the DISPLAY_LANGUAGE cookie and thereby exfiltrate it. This is significant when an intermediary is enacting some policy based on cookies, so a smuggled cookie can bypass that policy yet still ...Truncated",
+ "Remediation": {
+ "Recommendation": {
+ "Text": "Remediation is available. Please refer to the Fixed version in the vulnerability details section above.For detailed remediation guidance for each of the affected packages, refer to the vulnerabilities section of the detailed finding JSON."
+ }
+ },
+ "ProductFields": {
+ "aws/inspector/ProductVersion": "2",
+ "aws/inspector/FindingStatus": "ACTIVE",
+ "aws/inspector/inspectorScore": "5.3",
+ "aws/inspector/instanceId": "i-0asd2da21c8csd28s",
+ "aws/inspector/resources/1/resourceDetails/awsEc2InstanceDetails/platform": "UBUNTU_20_04",
+ "aws/securityhub/FindingId": "arn:aws:securityhub:eu-west-1::product/aws/inspector/arn:aws:inspector2:eu-west-1:123456789123:finding/71344c6204b894be7a0c28bed223bf9b",
+ "aws/securityhub/ProductName": "Inspector",
+ "aws/securityhub/CompanyName": "Amazon"
+ },
+ "Resources": [
+ {
+ "Type": "AwsEc2Instance",
+ "Id": "arn:aws:ec2:eu-west-1:123456789123:instance/i-0asd2da21c8csd28s",
+ "Partition": "aws",
+ "Region": "eu-west-1",
+ "Tags": {
+ "Name": "MyServer1"
+ },
+ "Details": {
+ "AwsEc2Instance": {
+ "Type": "m5d.large",
+ "ImageId": "ami-1234shgh268csd28s",
+ "IpV4Addresses": [
+ "123.123.123.123",
+ "172.31.0.31"
+ ],
+ "KeyName": "MySSHkey",
+ "IamInstanceProfileArn": "arn:aws:iam::123456789123:instance-profile/AmazonSSMRole",
+ "VpcId": "vpc-12kk2qwe",
+ "SubnetId": "subnet-s12u28as",
+ "LaunchedAt": "2023-08-30T05:09:41Z"
+ }
+ }
+ }
+ ],
+ "WorkflowState": "NEW",
+ "Workflow": {
+ "Status": "NEW"
+ },
+ "RecordState": "ACTIVE",
+ "Vulnerabilities": [
+ {
+ "Id": "CVE-2023-26049",
+ "VulnerablePackages": [
+ {
+ "Name": "org.eclipse.jetty:jetty-server",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.server_8.1.14.v20131031.jar",
+ "FixedInVersion": "12.0.0.beta0",
+ "Remediation": "Update jetty-server to 12.0.0.beta0"
+ },
+ {
+ "Name": "org.eclipse.jetty:jetty-http",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.http_8.1.14.v20131031.jar",
+ "FixedInVersion": "12.0.0.beta0",
+ "Remediation": "Update jetty-http to 12.0.0.beta0"
+ }
+ ],
+ "Cvss": [
+ {
+ "Version": "3.1",
+ "BaseScore": 5.3,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 5.3,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
+ "Source": "NVD"
+ }
+ ],
+ "Vendor": {
+ "Name": "NVD",
+ "Url": "https://nvd.nist.gov/vuln/detail/CVE-2023-26049",
+ "VendorSeverity": "MEDIUM",
+ "VendorCreatedAt": "2023-04-18T21:15:00Z",
+ "VendorUpdatedAt": "2023-05-26T20:15:00Z"
+ },
+ "ReferenceUrls": [
+ "https://www.rfc-editor.org/rfc/rfc6265",
+ "https://www.rfc-editor.org/rfc/rfc2965"
+ ],
+ "FixAvailable": "YES",
+ "ExploitAvailable": "YES"
+ }
+ ],
+ "FindingProviderFields": {
+ "Severity": {
+ "Label": "MEDIUM"
+ },
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ]
+ }
+ }
+]
\ No newline at end of file
diff --git a/unittests/scans/asff/one_vuln.json b/unittests/scans/asff/one_vuln.json
new file mode 100644
index 00000000000..6b339bd32fb
--- /dev/null
+++ b/unittests/scans/asff/one_vuln.json
@@ -0,0 +1,147 @@
+[
+ {
+ "SchemaVersion": "2018-10-08",
+ "Id": "arn:aws:inspector2:eu-west-1:123456789123:finding/e7dd7a6979b7ce39de463533b1e6cd44",
+ "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/inspector",
+ "ProductName": "Inspector",
+ "CompanyName": "Amazon",
+ "Region": "eu-west-1",
+ "GeneratorId": "AWSInspector",
+ "AwsAccountId": "123456789123",
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ],
+ "FirstObservedAt": "2023-08-30T20:07:14Z",
+ "LastObservedAt": "2023-09-15T07:00:24Z",
+ "CreatedAt": "2023-08-30T20:07:14Z",
+ "UpdatedAt": "2023-09-15T07:00:24Z",
+ "Severity": {
+ "Label": "HIGH",
+ "Normalized": 70
+ },
+ "Title": "CVE-2017-9735 - org.eclipse.jetty:jetty-server, org.eclipse.jetty:jetty-util",
+ "Description": "Jetty through 9.4.x is prone to a timing channel in util/security/Password.java, which makes it easier for remote attackers to obtain access by observing elapsed times before rejection of incorrect passwords.",
+ "Remediation": {
+ "Recommendation": {
+ "Text": "Remediation is available. Please refer to the Fixed version in the vulnerability details section above.For detailed remediation guidance for each of the affected packages, refer to the vulnerabilities section of the detailed finding JSON."
+ }
+ },
+ "ProductFields": {
+ "aws/inspector/ProductVersion": "2",
+ "aws/inspector/FindingStatus": "ACTIVE",
+ "aws/inspector/inspectorScore": "7.5",
+ "aws/inspector/instanceId": "i-0sdg8sa1k2l3j11m2",
+ "aws/inspector/resources/1/resourceDetails/awsEc2InstanceDetails/platform": "UBUNTU_20_04",
+ "aws/securityhub/FindingId": "arn:aws:securityhub:eu-west-1::product/aws/inspector/arn:aws:inspector2:eu-west-1:123456789123:finding/e7dd7a6979b7ce39de463533b1e6cd44",
+ "aws/securityhub/ProductName": "Inspector",
+ "aws/securityhub/CompanyName": "Amazon"
+ },
+ "Resources": [
+ {
+ "Type": "AwsEc2Instance",
+ "Id": "arn:aws:ec2:eu-west-1:123456789123:instance/i-0sdg8sa1k2l3j11m2",
+ "Partition": "aws",
+ "Region": "eu-west-1",
+ "Tags": {
+ "Name": "MyWebServer"
+ },
+ "Details": {
+ "AwsEc2Instance": {
+ "Type": "m5d.large",
+ "ImageId": "ami-0211k2j12l987bg2h7",
+ "IpV4Addresses": [
+ "123.123.123.123",
+ "172.31.0.31"
+ ],
+ "KeyName": "MySSHkey",
+ "IamInstanceProfileArn": "arn:aws:iam::123456789123:instance-profile/AmazonSSMRole",
+ "VpcId": "vpc-12jh8mgg",
+ "SubnetId": "subnet-k12i88jh",
+ "LaunchedAt": "2023-08-30T05:09:41Z"
+ }
+ }
+ }
+
+ ],
+ "WorkflowState": "NEW",
+ "Workflow": {
+ "Status": "NEW"
+ },
+ "RecordState": "ACTIVE",
+ "Vulnerabilities": [
+ {
+ "Id": "CVE-2017-9735",
+ "VulnerablePackages": [
+ {
+ "Name": "org.eclipse.jetty:jetty-server",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.server_8.1.14.v20131031.jar",
+ "FixedInVersion": "9.4.6.v20170531",
+ "Remediation": "Update jetty-server to 9.4.6.v20170531"
+ },
+ {
+ "Name": "org.eclipse.jetty:jetty-util",
+ "Version": "8.1.14.v20131031",
+ "Epoch": "0",
+ "PackageManager": "JAR",
+ "FilePath": "/usr/lib/jvm/java-8-oracle/lib/missioncontrol/plugins/org.eclipse.jetty.util_8.1.14.v20131031.jar",
+ "FixedInVersion": "9.4.6.v20170531",
+ "Remediation": "Update jetty-util to 9.4.6.v20170531"
+ }
+ ],
+ "Cvss": [
+ {
+ "Version": "2.0",
+ "BaseScore": 5,
+ "BaseVector": "AV:N/AC:L/Au:N/C:P/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 7.5,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
+ "Source": "NVD"
+ },
+ {
+ "Version": "3.1",
+ "BaseScore": 7.5,
+ "BaseVector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
+ "Source": "NVD"
+ }
+ ],
+ "Vendor": {
+ "Name": "NVD",
+ "Url": "https://nvd.nist.gov/vuln/detail/CVE-2017-9735",
+ "VendorSeverity": "HIGH",
+ "VendorCreatedAt": "2017-06-16T21:29:00Z",
+ "VendorUpdatedAt": "2022-03-15T14:55:00Z"
+ },
+ "ReferenceUrls": [
+ "https://lists.debian.org/debian-lts-announce/2021/05/msg00016.html",
+ "https://lists.apache.org/thread.html/053d9ce4d579b02203db18545fee5e33f35f2932885459b74d1e4272@%3Cissues.activemq.apache.org%3E",
+ "https://lists.apache.org/thread.html/36870f6c51f5bc25e6f7bb1fcace0e57e81f1524019b11f466738559@%3Ccommon-dev.hadoop.apache.org%3E",
+ "https://www.oracle.com/technetwork/security-advisory/cpuoct2019-5072832.html",
+ "https://bugs.debian.org/864631",
+ "https://www.oracle.com/security-alerts/cpuoct2020.html",
+ "https://lists.apache.org/thread.html/ff8dcfe29377088ab655fda9d585dccd5b1f07fabd94ae84fd60a7f8@%3Ccommits.pulsar.apache.org%3E",
+ "https://lists.apache.org/thread.html/519eb0fd45642dcecd9ff74cb3e71c20a4753f7d82e2f07864b5108f@%3Cdev.drill.apache.org%3E",
+ "https://www.oracle.com//security-alerts/cpujul2021.html",
+ "https://lists.apache.org/thread.html/f887a5978f5e4c62b9cfe876336628385cff429e796962649649ec8a@%3Ccommon-issues.hadoop.apache.org%3E",
+ "https://lists.apache.org/thread.html/f9bc3e55f4e28d1dcd1a69aae6d53e609a758e34d2869b4d798e13cc@%3Cissues.drill.apache.org%3E"
+ ],
+ "FixAvailable": "YES",
+ "ExploitAvailable": "YES"
+ }
+ ],
+ "FindingProviderFields": {
+ "Severity": {
+ "Label": "HIGH"
+ },
+ "Types": [
+ "Software and Configuration Checks/Vulnerabilities/CVE"
+ ]
+ }
+ }
+]
\ No newline at end of file
diff --git a/unittests/scans/chefinspect/many_findings.log b/unittests/scans/chefinspect/many_findings.log
new file mode 100644
index 00000000000..f1b61a489c2
--- /dev/null
+++ b/unittests/scans/chefinspect/many_findings.log
@@ -0,0 +1,10 @@
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.1.1","title":"Ensure time synchronization is in use","impact":0.0,"control_tags":{"ISO27001_2013":["A.12.4.4"],"cis":"distribution-independent-linux:2.2.1.1","level":1},"description":"System time should be synchronized between all systems in an environment. This is typically done by establishing an authoritative time server or set of servers and having all systems synchronize their clocks to them.\n\nRationale: Time synchronization is important to support time sensitive security mechanisms like Kerberos and also ensures log files have consistent time records across the enterprise, which aids in forensic investigations.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"System Package chrony is expected to be installed","run_time":0.00044244,"start_time":"2022-10-03T11:02:14+00:00"},{"status":"passed","code_desc":"Command: `chronyd` is expected to exist","run_time":0.00015116,"start_time":"2022-10-03T11:02:14+00:00"}],"control_runtime":0.0005936}
+{"status":"skipped","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.1.2","title":"Ensure ntp is configured","impact":1.0,"control_tags":{"ISO27001_2013":["A.12.4.4"],"cis":"distribution-independent-linux:2.2.1.2","level":1},"description":"ntp is a daemon which implements the Network Time Protocol (NTP). It is designed to synchronize system clocks across a variety of systems and use a source that is highly accurate. More information on NTP can be found at http://www.ntp.org. ntp can be configured to be a client and/or a server.\nThis recommendation only applies if ntp is in use on the system.\n\nRationale: If ntp is in use on the system proper configuration is vital to ensuring time synchronization is working properly.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"skipped","code_desc":"No-op","run_time":7.893e-06,"start_time":"2022-10-03T11:02:14+00:00","resource":"No-op","skip_message":"Skipped control due to only_if condition."}],"control_runtime":7.893e-06}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.1.3","title":"Ensure chrony is configured","impact":1.0,"control_tags":{"ISO27001_2013":["A.12.4.4"],"cis":"distribution-independent-linux:2.2.1.3","level":1},"description":"chrony is a daemon which implements the Network Time Protocol (NTP) is designed to synchronize system clocks across a variety of systems and use a source that is highly accurate. More information on chrony can be found at http://chrony.tuxfamily.org/. chrony can be configured to be a client and/or a server.\n\nRationale: If chrony is in use on the system proper configuration is vital to ensuring time synchronization is working properly.\nThis recommendation only applies if chrony is in use on the system.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"File /etc/chrony.conf content is expected to match /^server\\s+\\S+/","run_time":0.000128649,"start_time":"2022-10-03T11:02:14+00:00"},{"status":"passed","code_desc":"Processes chronyd users is expected to cmp == \"chrony\"","run_time":0.000184573,"start_time":"2022-10-03T11:02:14+00:00"}],"control_runtime":0.000313222}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.2","title":"Ensure X Window System is not installed","impact":1.0,"control_tags":{"ISO27001_2013":["A.12.5.1"],"cis":"distribution-independent-linux:2.2.2","level":1},"description":"The X Window System provides a Graphical User Interface (GUI) where users can have multiple windows in which to run programs and various add on. The X Windows system is typically used on workstations where users login, but not on servers where users typically do not login.\n\nRationale: Unless your organization specifically requires graphical login access via X Windows, remove it to reduce the potential attack surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Packages /^xserver-xorg.*/ names is expected to be empty","run_time":0.014531242,"start_time":"2022-10-03T11:02:14+00:00"},{"status":"passed","code_desc":"Packages /^xorg-x11-server.*/ names is expected to be empty","run_time":0.00461028,"start_time":"2022-10-03T11:02:14+00:00"}],"control_runtime":0.019141522}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.3","title":"Ensure Avahi Server is not enabled","impact":1.0,"control_tags":{"ISO27001_2013":["A.13.1.3"],"cis":"distribution-independent-linux:2.2.3","level":1},"description":"Avahi is a free zeroconf implementation, including a system for multicast DNS/DNS-SD service discovery. Avahi allows programs to publish and discover services and hosts running on a local network with no specific configuration. For example, a user can plug a computer into a network and Avahi automatically finds printers to print to, files to look at and people to talk to, as well as network services running on the machine.\n\nRationale: Automatic discovery of network services is not normally required for system functionality. It is recommended to disable the service to reduce the potential attach surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Service avahi-daemon is expected not to be enabled","run_time":0.599389271,"start_time":"2022-10-03T11:02:14+00:00"},{"status":"passed","code_desc":"Service avahi-daemon is expected not to be running","run_time":0.000153889,"start_time":"2022-10-03T11:02:15+00:00"}],"control_runtime":0.59954316}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.4","title":"Ensure CUPS is not enabled","impact":1.0,"control_tags":{"ISO27001_2013":["A.13.1.3"],"cis":"distribution-independent-linux:2.2.4","level":1},"description":"The Common Unix Print System (CUPS) provides the ability to print to both local and network printers. A system running CUPS can also accept print jobs from remote systems and print them to local printers. It also provides a web based remote administration capability.\n\nRationale: If the system does not need to print jobs or accept print jobs from other systems, it is recommended that CUPS be disabled to reduce the potential attack surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Service cups is expected not to be enabled","run_time":0.633429634,"start_time":"2022-10-03T11:02:15+00:00"},{"status":"passed","code_desc":"Service cups is expected not to be running","run_time":0.000191051,"start_time":"2022-10-03T11:02:15+00:00"}],"control_runtime":0.633620685}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.5","title":"Ensure DHCP Server is not enabled","impact":1.0,"control_tags":{"ISO27001_2013":["A.13.1.3"],"cis":"distribution-independent-linux:2.2.5","level":1},"description":"The Dynamic Host Configuration Protocol (DHCP) is a service that allows machines to be dynamically assigned IP addresses.\n\nRationale: Unless a system is specifically set up to act as a DHCP server, it is recommended that this service be deleted to reduce the potential attack surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Service isc-dhcp-server is expected not to be enabled","run_time":0.639691591,"start_time":"2022-10-03T11:02:15+00:00"},{"status":"passed","code_desc":"Service isc-dhcp-server is expected not to be running","run_time":0.000160418,"start_time":"2022-10-03T11:02:16+00:00"},{"status":"passed","code_desc":"Service isc-dhcp-server6 is expected not to be enabled","run_time":0.644534045,"start_time":"2022-10-03T11:02:16+00:00"},{"status":"passed","code_desc":"Service isc-dhcp-server6 is expected not to be running","run_time":0.000268166,"start_time":"2022-10-03T11:02:17+00:00"},{"status":"passed","code_desc":"Service dhcpd is expected not to be enabled","run_time":0.643181648,"start_time":"2022-10-03T11:02:17+00:00"},{"status":"passed","code_desc":"Service dhcpd is expected not to be running","run_time":0.000231542,"start_time":"2022-10-03T11:02:17+00:00"}],"control_runtime":1.92806741}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.6","title":"Ensure LDAP server is not enabled","impact":1.0,"control_tags":{"ISO27001_2013":["A.13.1.3"],"cis":"distribution-independent-linux:2.2.6","level":1},"description":"The Lightweight Directory Access Protocol (LDAP) was introduced as a replacement for NIS/YP. It is a service that provides a method for looking up information from a central database.\n\nRationale: If the system will not need to act as an LDAP server, it is recommended that the software be disabled to reduce the potential attack surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Service slapd is expected not to be enabled","run_time":0.630785667,"start_time":"2022-10-03T11:02:17+00:00"},{"status":"passed","code_desc":"Service slapd is expected not to be running","run_time":0.000193827,"start_time":"2022-10-03T11:02:18+00:00"}],"control_runtime":0.6309794940000001}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.7","title":"Ensure NFS and RPC are not enabled","impact":1.0,"control_tags":{"ISO27001_2013":["A.13.1.3"],"cis":"distribution-independent-linux:2.2.7","level":1},"description":"The Network File System (NFS) is one of the first and most widely distributed file systems in the UNIX environment. It provides the ability for systems to mount file systems of other servers through the network.\n\nRationale: If the system does not export NFS shares or act as an NFS client, it is recommended that these services be disabled to reduce remote attack surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Service nfs-kernel-server is expected not to be enabled","run_time":0.632784742,"start_time":"2022-10-03T11:02:18+00:00"},{"status":"passed","code_desc":"Service nfs-kernel-server is expected not to be running","run_time":0.000166672,"start_time":"2022-10-03T11:02:19+00:00"},{"status":"passed","code_desc":"Service nfs is expected not to be enabled","run_time":0.640653182,"start_time":"2022-10-03T11:02:19+00:00"},{"status":"passed","code_desc":"Service nfs is expected not to be running","run_time":0.000215897,"start_time":"2022-10-03T11:02:19+00:00"},{"status":"passed","code_desc":"Service rpcbind is expected not to be enabled","run_time":0.643515006,"start_time":"2022-10-03T11:02:19+00:00"},{"status":"passed","code_desc":"Service rpcbind is expected not to be running","run_time":0.000154942,"start_time":"2022-10-03T11:02:20+00:00"}],"control_runtime":1.917490441}
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.8","title":"Ensure DNS Server is not enabled","impact":1.0,"control_tags":{"ISO27001_2013":["A.13.1.3"],"cis":"distribution-independent-linux:2.2.8","level":1},"description":"The Domain Name System (DNS) is a hierarchical naming system that maps names to IP addresses for computers, services and other resources connected to a network.\n\nRationale: Unless a system is specifically designated to act as a DNS server, it is recommended that the package be deleted to reduce the potential attack surface.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"Service named is expected not to be enabled","run_time":0.632303089,"start_time":"2022-10-03T11:02:20+00:00"},{"status":"passed","code_desc":"Service named is expected not to be running","run_time":0.000154262,"start_time":"2022-10-03T11:02:20+00:00"},{"status":"passed","code_desc":"Service bind is expected not to be enabled","run_time":0.654657749,"start_time":"2022-10-03T11:02:20+00:00"},{"status":"passed","code_desc":"Service bind is expected not to be running","run_time":0.000212705,"start_time":"2022-10-03T11:02:21+00:00"},{"status":"passed","code_desc":"Service bind9 is expected not to be enabled","run_time":0.642811638,"start_time":"2022-10-03T11:02:21+00:00"},{"status":"passed","code_desc":"Service bind9 is expected not to be running","run_time":0.000207277,"start_time":"2022-10-03T11:02:22+00:00"}],"control_runtime":1.9303467199999997}
diff --git a/dojo/tools/openvas_csv/__init__.py b/unittests/scans/chefinspect/no_finding.log
similarity index 100%
rename from dojo/tools/openvas_csv/__init__.py
rename to unittests/scans/chefinspect/no_finding.log
diff --git a/unittests/scans/chefinspect/one_finding.log b/unittests/scans/chefinspect/one_finding.log
new file mode 100644
index 00000000000..5a599ab5fac
--- /dev/null
+++ b/unittests/scans/chefinspect/one_finding.log
@@ -0,0 +1 @@
+{"status":"passed","batch_runtime":"2022-10-03","application_group":"logserver","zone":"domain","office":"officename","dc":null,"environment":"unknown","id":"cis-dil-benchmark-2.2.1.1","title":"Ensure time synchronization is in use","impact":0.0,"control_tags":{"ISO27001_2013":["A.12.4.4"],"cis":"distribution-independent-linux:2.2.1.1","level":1},"description":"System time should be synchronized between all systems in an environment. This is typically done by establishing an authoritative time server or set of servers and having all systems synchronize their clocks to them.\n\nRationale: Time synchronization is important to support time sensitive security mechanisms like Kerberos and also ensures log files have consistent time records across the enterprise, which aids in forensic investigations.","platform":{"name":"redhat","release":"8.5","target_id":"logsrv01.domain.dk"},"profile":{"name":"cis-dil-benchmark","title":"CIS Distribution Independent Linux Benchmark Profile","version":"0.3.0","supports":"[{\"platform-family\":\"linux\"}]"},"group":{"id":"controls/2_2_special_purpose_services.rb","title":"2.2 Special Purpose Services"},"results":[{"status":"passed","code_desc":"System Package chrony is expected to be installed","run_time":0.00044244,"start_time":"2022-10-03T11:02:14+00:00"},{"status":"passed","code_desc":"Command: `chronyd` is expected to exist","run_time":0.00015116,"start_time":"2022-10-03T11:02:14+00:00"}],"control_runtime":0.0005936}
diff --git a/unittests/scans/gcloud_artifact_scan/many_vulns.json b/unittests/scans/gcloud_artifact_scan/many_vulns.json
new file mode 100644
index 00000000000..2ab43ad9617
--- /dev/null
+++ b/unittests/scans/gcloud_artifact_scan/many_vulns.json
@@ -0,0 +1,514 @@
+{
+ "discovery_summary": {
+ "discovery": [
+ {
+ "createTime": "2023-08-23T16:57:29.302830Z",
+ "discovery": {
+ "analysisCompleted": {
+ "analysisType": [
+ "OS",
+ "GO",
+ "MAVEN",
+ "PYPI",
+ "NPM"
+ ]
+ },
+ "analysisStatus": "FINISHED_SUCCESS",
+ "continuousAnalysis": "ACTIVE",
+ "lastScanTime": "2023-08-23T16:57:34.358092699Z"
+ },
+ "kind": "DISCOVERY",
+ "name": "projects/test/occurrences/1ae41139-7c9c-4c43-817e-9186d7583563",
+ "noteName": "projects/goog-analysis/notes/PACKAGE_VULNERABILITY",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.487918Z"
+ }
+ ]
+ },
+ "image_summary": {
+ "digest": "sha256:d2eecb48a0d1c6be1ec96d2d0a52c3b95936c4cdde2208299c04d6106b769658",
+ "fully_qualified_digest": "northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "registry": "northamerica-northeast1-docker.pkg.dev",
+ "repository": "testing",
+ "slsa_build_level": "unknown"
+ },
+ "package_vulnerability_summary": {
+ "vulnerabilities": {
+ "CRITICAL": [
+ {
+ "createTime": "2023-08-23T16:57:34.258042Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/17762f5b-88a9-4e15-b92d-ce5b4de56519",
+ "noteName": "projects/goog-vulnz/notes/CVE-2023-29405",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.258042Z",
+ "vulnerability": {
+ "cvssScore": 9.8,
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 9.8,
+ "confidentialityImpact": "IMPACT_HIGH",
+ "exploitabilityScore": 3.9,
+ "impactScore": 5.9,
+ "integrityImpact": "IMPACT_HIGH",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.19.10",
+ "kind": "NORMAL",
+ "name": "1.19.10"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2023-29405"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-29405"
+ }
+ ],
+ "severity": "CRITICAL",
+ "shortDescription": "CVE-2023-29405"
+ }
+ },
+ {
+ "createTime": "2023-08-23T16:57:34.195901Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/9375502a-c7a7-4605-88f7-caf1ca8137ae",
+ "noteName": "projects/goog-vulnz/notes/CVE-2023-29402",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.195901Z",
+ "vulnerability": {
+ "cvssScore": 9.8,
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 9.8,
+ "confidentialityImpact": "IMPACT_HIGH",
+ "exploitabilityScore": 3.9,
+ "impactScore": 5.9,
+ "integrityImpact": "IMPACT_HIGH",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.19.10",
+ "kind": "NORMAL",
+ "name": "1.19.10"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2023-29402"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-29402"
+ }
+ ],
+ "severity": "CRITICAL",
+ "shortDescription": "CVE-2023-29402"
+ }
+ },
+ {
+ "createTime": "2023-08-23T16:57:34.291202Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/94d3ba5b-8ea5-4df9-9e4b-6719f3549046",
+ "noteName": "projects/goog-vulnz/notes/CVE-2023-29404",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.291202Z",
+ "vulnerability": {
+ "cvssScore": 9.8,
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 9.8,
+ "confidentialityImpact": "IMPACT_HIGH",
+ "exploitabilityScore": 3.9,
+ "impactScore": 5.9,
+ "integrityImpact": "IMPACT_HIGH",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.19.10",
+ "kind": "NORMAL",
+ "name": "1.19.10"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2023-29404"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-29404"
+ }
+ ],
+ "severity": "CRITICAL",
+ "shortDescription": "CVE-2023-29404"
+ }
+ },
+ {
+ "createTime": "2023-08-23T16:57:34.110140Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/9534a1c6-84cf-4141-b5d2-3b80fb6935cb",
+ "noteName": "projects/goog-vulnz/notes/CVE-2023-24540",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.110140Z",
+ "vulnerability": {
+ "cvssScore": 9.8,
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 9.8,
+ "confidentialityImpact": "IMPACT_HIGH",
+ "exploitabilityScore": 3.9,
+ "impactScore": 5.9,
+ "integrityImpact": "IMPACT_HIGH",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.19.9",
+ "kind": "NORMAL",
+ "name": "1.19.9"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2023-24540"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-24540"
+ }
+ ],
+ "severity": "CRITICAL",
+ "shortDescription": "CVE-2023-24540"
+ }
+ },
+ {
+ "createTime": "2023-08-23T16:57:34.290433Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/99c6aa0f-018a-4cc9-bb93-1d90b0dbc97e",
+ "noteName": "projects/goog-vulnz/notes/CVE-2023-24538",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.290433Z",
+ "vulnerability": {
+ "cvssScore": 9.8,
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 9.8,
+ "confidentialityImpact": "IMPACT_HIGH",
+ "exploitabilityScore": 3.9,
+ "impactScore": 5.9,
+ "integrityImpact": "IMPACT_HIGH",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.19.8",
+ "kind": "NORMAL",
+ "name": "1.19.8"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2023-24538"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-24538"
+ }
+ ],
+ "severity": "CRITICAL",
+ "shortDescription": "CVE-2023-24538"
+ }
+ },
+ {
+ "createTime": "2023-08-23T16:57:33.746649Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/b0e9e452-35cd-4c14-b929-3b5e6b270903",
+ "noteName": "projects/goog-vulnz/notes/CVE-2022-23806",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:33.746649Z",
+ "vulnerability": {
+ "cvssScore": 9.1,
+ "cvssV2": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "authentication": "AUTHENTICATION_NONE",
+ "availabilityImpact": "IMPACT_PARTIAL",
+ "baseScore": 6.4,
+ "confidentialityImpact": "IMPACT_NONE",
+ "integrityImpact": "IMPACT_PARTIAL"
+ },
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 9.1,
+ "confidentialityImpact": "IMPACT_NONE",
+ "exploitabilityScore": 3.9,
+ "impactScore": 5.2,
+ "integrityImpact": "IMPACT_HIGH",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "CRITICAL",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.17.7",
+ "kind": "NORMAL",
+ "name": "1.17.7"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2022-23806"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2022-23806"
+ }
+ ],
+ "severity": "CRITICAL",
+ "shortDescription": "CVE-2022-23806"
+ }
+ }
+ ],
+ "HIGH": [
+ {
+ "createTime": "2023-08-23T16:57:34.166285Z",
+ "kind": "VULNERABILITY",
+ "name": "projects/test/occurrences/0339e7f1-7a8a-4a89-b121-65040b8d3c84",
+ "noteName": "projects/goog-vulnz/notes/CVE-2022-41715",
+ "resourceUri": "https://northamerica-northeast1-docker.pkg.dev/testing/test-docker/test-image@sha256:deadbeef0000000000000000000000000000000000",
+ "updateTime": "2023-08-23T16:57:34.166285Z",
+ "vulnerability": {
+ "cvssScore": 7.5,
+ "cvssVersion": "CVSS_VERSION_3",
+ "cvssv3": {
+ "attackComplexity": "ATTACK_COMPLEXITY_LOW",
+ "attackVector": "ATTACK_VECTOR_NETWORK",
+ "availabilityImpact": "IMPACT_HIGH",
+ "baseScore": 7.5,
+ "confidentialityImpact": "IMPACT_NONE",
+ "exploitabilityScore": 3.9,
+ "impactScore": 3.6,
+ "integrityImpact": "IMPACT_NONE",
+ "privilegesRequired": "PRIVILEGES_REQUIRED_NONE",
+ "scope": "SCOPE_UNCHANGED",
+ "userInteraction": "USER_INTERACTION_NONE"
+ },
+ "effectiveSeverity": "HIGH",
+ "fixAvailable": true,
+ "longDescription": "NIST vectors: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
+ "packageIssue": [
+ {
+ "affectedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "affectedPackage": "go",
+ "affectedVersion": {
+ "fullName": "1.17.6",
+ "kind": "NORMAL",
+ "name": "1.17.6"
+ },
+ "effectiveSeverity": "HIGH",
+ "fileLocation": [
+ {
+ "filePath": "/tmp/pdscan"
+ }
+ ],
+ "fixAvailable": true,
+ "fixedCpeUri": "cpe:/o:debian:debian_linux:12",
+ "fixedPackage": "go",
+ "fixedVersion": {
+ "fullName": "1.18.7",
+ "kind": "NORMAL",
+ "name": "1.18.7"
+ },
+ "packageType": "GO_STDLIB"
+ }
+ ],
+ "relatedUrls": [
+ {
+ "label": "More Info",
+ "url": "https://security-tracker.debian.org/tracker/CVE-2022-41715"
+ },
+ {
+ "label": "More Info",
+ "url": "https://nvd.nist.gov/vuln/detail/CVE-2022-41715"
+ }
+ ],
+ "severity": "HIGH",
+ "shortDescription": "CVE-2022-41715"
+ }
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/unittests/scans/govulncheck/many_vulns_new_version_custom_severity.json b/unittests/scans/govulncheck/many_vulns_new_version_custom_severity.json
new file mode 100644
index 00000000000..4f37dbeb652
--- /dev/null
+++ b/unittests/scans/govulncheck/many_vulns_new_version_custom_severity.json
@@ -0,0 +1,196 @@
+[
+ {
+ "config": {
+ "protocol_version": "v1.0.0",
+ "scanner_name": "govulncheck",
+ "scanner_version": "v1.0.1",
+ "db": "https://vuln.go.dev",
+ "db_last_modified": "2024-01-04T18:39:51Z",
+ "go_version": "go1.21.4",
+ "scan_level": "symbol"
+ }
+ },
+ {
+ "progress": {
+ "message": "Scanning your code and 47 packages across 1 dependent module for known vulnerabilities..."
+ }
+ },
+ {
+ "osv": {
+ "schema_version": "1.3.1",
+ "id": "GO-2021-0113",
+ "modified": "2023-06-12T18:45:41Z",
+ "published": "2021-10-06T17:51:21Z",
+ "severity":"Low",
+ "aliases": [
+ "CVE-2021-38561",
+ "GHSA-ppp9-7jff-5vj2"
+ ],
+ "summary": "Out-of-bounds read in golang.org/x/text/language",
+ "details": "Due to improper index calculation, an incorrectly formatted language tag can cause Parse to panic via an out of bounds read. If Parse is used to process untrusted user inputs, this may be used as a vector for a denial of service attack.",
+ "affected": [
+ {
+ "package": {
+ "name": "golang.org/x/text",
+ "ecosystem": "Go"
+ },
+ "ranges": [
+ {
+ "type": "SEMVER",
+ "events": [
+ {
+ "introduced": "0"
+ },
+ {
+ "fixed": "0.3.7"
+ }
+ ]
+ }
+ ],
+ "ecosystem_specific": {
+ "imports": [
+ {
+ "path": "golang.org/x/text/language",
+ "symbols": [
+ "MatchStrings",
+ "MustParse",
+ "Parse",
+ "ParseAcceptLanguage"
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "references": [
+ {
+ "type": "FIX",
+ "url": "https://go.dev/cl/340830"
+ },
+ {
+ "type": "FIX",
+ "url": "https://go.googlesource.com/text/+/383b2e75a7a4198c42f8f87833eefb772868a56f"
+ }
+ ],
+ "credits": [
+ {
+ "name": "Guido Vranken"
+ }
+ ],
+ "database_specific": {
+ "url": "https://pkg.go.dev/vuln/GO-2021-0113"
+ }
+ }
+ },
+ {
+ "finding": {
+ "osv": "GO-2021-0113",
+ "fixed_version": "v0.3.7",
+ "trace": [
+ {
+ "module": "golang.org/x/text",
+ "version": "v0.3.5",
+ "package": "golang.org/x/text/language",
+ "function": "Parse"
+ },
+ {
+ "module": "vuln.tutorial",
+ "package": "vuln.tutorial",
+ "function": "main",
+ "position": {
+ "filename": "govulncheck/vulnerable/main.go",
+ "offset": 189,
+ "line": 12,
+ "column": 43
+ }
+ }
+ ]
+ }
+ },
+ {
+ "osv": {
+ "schema_version": "1.3.1",
+ "id": "GO-2022-1059",
+ "modified": "2023-06-12T18:45:41Z",
+ "published": "2022-10-11T18:16:24Z",
+ "severity": "High",
+ "aliases": [
+ "CVE-2022-32149",
+ "GHSA-69ch-w2m2-3vjp"
+ ],
+ "summary": "Denial of service via crafted Accept-Language header in golang.org/x/text/language",
+ "details": "An attacker may cause a denial of service by crafting an Accept-Language header which ParseAcceptLanguage will take significant time to parse.",
+ "affected": [
+ {
+ "package": {
+ "name": "golang.org/x/text",
+ "ecosystem": "Go"
+ },
+ "ranges": [
+ {
+ "type": "SEMVER",
+ "events": [
+ {
+ "introduced": "0"
+ },
+ {
+ "fixed": "0.3.8"
+ }
+ ]
+ }
+ ],
+ "ecosystem_specific": {
+ "imports": [
+ {
+ "path": "golang.org/x/text/language",
+ "symbols": [
+ "MatchStrings",
+ "ParseAcceptLanguage"
+ ]
+ }
+ ]
+ }
+ }
+ ],
+ "references": [
+ {
+ "type": "REPORT",
+ "url": "https://go.dev/issue/56152"
+ },
+ {
+ "type": "FIX",
+ "url": "https://go.dev/cl/442235"
+ },
+ {
+ "type": "WEB",
+ "url": "https://groups.google.com/g/golang-announce/c/-hjNw559_tE/m/KlGTfid5CAAJ"
+ }
+ ],
+ "credits": [
+ {
+ "name": "Adam Korczynski (ADA Logics)"
+ },
+ {
+ "name": "OSS-Fuzz"
+ }
+ ],
+ "database_specific": {
+ "url": "https://pkg.go.dev/vuln/GO-2022-1059"
+ }
+ }
+ },
+ {
+ "finding": {
+ "osv": "GO-2022-1059",
+ "fixed_version": "v0.3.8",
+ "trace": [
+ {
+ "module": "golang.org/x/text",
+ "version": "v0.3.5",
+ "package": "golang.org/x/text/language"
+ }
+ ]
+ }
+ }
+]
+
\ No newline at end of file
diff --git a/unittests/scans/govulncheck/no_vulns_new_version.json b/unittests/scans/govulncheck/no_vulns_new_version.json
new file mode 100644
index 00000000000..4ff229e385c
--- /dev/null
+++ b/unittests/scans/govulncheck/no_vulns_new_version.json
@@ -0,0 +1,18 @@
+[
+ {
+ "config": {
+ "protocol_version": "v1.0.0",
+ "scanner_name": "govulncheck",
+ "scanner_version": "v1.0.1",
+ "db": "https://vuln.go.dev",
+ "db_last_modified": "2024-01-04T18:39:51Z",
+ "go_version": "go1.21.4",
+ "scan_level": "symbol"
+ }
+ },
+ {
+ "progress": {
+ "message": "Scanning your code and 0 packages across 0 dependent modules for known vulnerabilities..."
+ }
+ }
+]
\ No newline at end of file
diff --git a/unittests/scans/kiuwan/issue_9308.csv b/unittests/scans/kiuwan/issue_9308.csv
index f4326fcd287..6ff8c197e18 100644
--- a/unittests/scans/kiuwan/issue_9308.csv
+++ b/unittests/scans/kiuwan/issue_9308.csv
@@ -1,3 +1,3 @@
Rule code,Rule,Priority,CWE,Software characteristic,Vulnerability type,Language,Effort,File,Line number,Line text,Source file,Source line number,Source line text,Muted,Normative,Status,CWE Scope,Framework
OPT.JAVASCRIPT.ERRORCOMUN.UnusedLocalVar,Avoid unused local variable,High,101,Maintainability,Other,Typescript,03m,file.js,12,self = this,,,,No,"Agile Alliance:Concise-CDED,CWE:563",none,,
-OPT.JAVASCRIPT.ERRORCOMUN.UnusedLocalVar,Avoid unused local variable,High,102,Maintainability,Other,Typescript,03m,another-file.js,12,self = this,,,,No,"Agile Alliance:Concise-CDED,CWE:563",none,,
+OPT.JAVASCRIPT.ERRORCOMUN.UnusedLocalVar,Avoid unused local variable,High,101,Maintainability,Other,Typescript,03m,another-file.js,12,self = this,,,,No,"Agile Alliance:Concise-CDED,CWE:563",none,,
diff --git a/unittests/scans/kiuwan/kiuwan_defects.csv b/unittests/scans/kiuwan/kiuwan_defects.csv
new file mode 100644
index 00000000000..87c6de3873c
--- /dev/null
+++ b/unittests/scans/kiuwan/kiuwan_defects.csv
@@ -0,0 +1,2 @@
+Rule code,Rule,Priority,Software characteristic,Language,Effort,File,Line number,Line text,Source file,Source line number,Source line text,Muted,Normative,Status,CWE Scope,Framework
+OPT.PLSQL.GEN_PLSQL.VAR2,"Define variables as VARCHAR2, nor as VARCHAR",Very High,Efficiency,PL-SQL,03m,file.sql,3," userid varchar(250),",,,,No,,none,,
diff --git a/unittests/scans/microfocus_webinspect/issue_7690.xml b/unittests/scans/microfocus_webinspect/issue_7690.xml
new file mode 100644
index 00000000000..fc64093c0c9
--- /dev/null
+++ b/unittests/scans/microfocus_webinspect/issue_7690.xml
@@ -0,0 +1,38859 @@
+http://zero.webappsecurity.com:80/httpzero.webappsecurity.com80Best Practices1154655970Privacy Violation: AutocompleteCWE-525: Information Exposure Through Browser CachingSecurity FeaturesPrivacy Violation: AutocompleteSummaryImplicationExecutionFixReference InfoMicrosoft: Autocomplete Security]]>Vulnerability11551113091Web Server Misconfiguration: Insecure Content-Type SettingCWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')CWE-116: Improper Encoding or Escaping of OutputEnvironmentWeb Server Misconfiguration: Insecure Content-Type SettingSummaryContent-Type specified by the application in specific cases or ignoring the content when no mime type is specified. Inconsistencies introduced by the mime sniffing techniques could allow attackers to conduct Cross-Site Scripting attacks or steal sensitive user data. WebInspect has determined that the application fails to instruct the browser to strictly enforce the Content-Type specification supplied in the response.
+Web server misconfiguration can cause an application to send HTTP responses with the missing Content-Type header or specify a mime type that does not match up accurately with the response content. When a browser receives such a response, it attempts to programmatically determine the mime type based on the content returned in the response. The mime type derived by the browser, however, might not accurately match the one intended by the application developer. Such inconsistencies have historically allowed attackers to conduct Cross-Site Scripting or data theft using Cascading Style Sheets (CSS) by letting them bypass server-side filters using mime type checking and yet have the malicious payload with misleading mime type specification executed on the client-side due to the browser mime sniffing policies.
+Microsoft Internet Explorer (IE) introduced the X-Content-Type-Options: nosniff specification that application developers can include in all responses to ensure that mime sniffing does not occur on the client-side. This protection mechanism is limited to Microsoft Internet Explorer versions 9 and above.]]>ImplicationExecution1. Build a test page that includes a reference to an external JavaScript or CSS resource2. Configure the server to return the external resource with an incorrect mime type specification3. Visit the test page using an old version of Microsoft’s Internet Explorer (version IE 8) browser4. Interpretation of the external content as JavaScript or CSS by the browser despite the misleading mime type specification indicates a potential for compromise.]]>FixX-Content-Type-Options: nosniff specification in the response headers. In addition, ensure that following safety precautions are also put in place:
+
1. Verify that the web server configuration will send the accurate mime type information in the Content-Type header of each HTTP response2. Configure the server to send a default Content-Type of text-plain or application/octet-stream to tackle failure scenarios3. Ensure that appropriate Character Set is specified in the Content-Type header4. Configure the server to send Content-Disposition: attachment; filename=name; for content without an explicit content type specification.
CSS Data Theft: CVE-2010-0654]]>Info11674116760HLI: Detected LibrariesSummary Hacker Level Insights provides developers and security professionals with more context relating to the overall security posture of their application. The version was detected to be in use by during this scan. While these findings do not necessarily represent a security vulnerability, it is important to note that attackers commonly perform reconnaissance of their target in an attempt to identify known weaknesses or patterns. Knowing what the hacker can see provides context which can help teams better secure their applications. ]]>ImplicationExecutionFixReference InfoBest PracticesCUSTOM55460Compliance Failure: Missing Privacy PolicySecurity FeaturesCompliance Failure: Missing Privacy PolicySummaryA privacy policy was not supplied by the web application within the scope of this audit. Many legislative initiatives require that organizations place a publicly accessible document within their web application that defines their website’s privacy policy. As a general rule, these privacy policies must detail what information an organization collects, the purpose for collecting it, potential avenues of disclosure, and methods for addressing potential grievances.
Various laws governing privacy policies include the Gramm-Leach-Bliley Act, Health Insurance Portability and Accountability Act (HIPAA), the California Online Privacy Protection Act of 2003, European Union's Data Protection Directive and others.
]]>ImplicationExecutionAll of the web pages accessible within the scope of the scan are sampled for textual content that often constitutes a privacy policy statement. A violation is reported upon completion of the web application crawl without a successful match against any of the web pages.
Note that the privacy policy of your application could be located on another host or within a section of the site that was not configured as part of the scan. To validate, please try to access the privacy policy of your website and check to see if it was part of the scan.
]]>Fix Descriptions:
+Any standard web application privacy policy should include the following components:
+
A description of the intended purpose for collecting the data.
A description of the use of the data.
Methods for limiting the use and disclosure of the information.
A list of the types of third parties to whom the information might be disclosed.
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
Use Zero to view the most up-to-date listings of your deposits, withdrawals, interest payments, and a number of other useful transactions.
+
+
+
+
+
+
Transfer Funds
+
Use Zero to safely and securely transfer funds between accounts. There is no hold placed on online money transfers, so your funds are available when you need them.
+
+
+
+
+
+
My Money Map
+
Use Zero to set up and monitor your personalized money map. A money map is an easy-to-use online tool that helps you manage your finances efficiently. With Money Map, you can create a budget, sort your finances into spending and savings categories, check the interest your accounts are earning, and gain new understanding of your patterns with the help of Zero’s clear charts and graphs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
Use Zero to view the most up-to-date listings of your deposits, withdrawals, interest payments, and a number of other useful transactions.
+
+
+
+
+
+
Transfer Funds
+
Use Zero to safely and securely transfer funds between accounts. There is no hold placed on online money transfers, so your funds are available when you need them.
+
+
+
+
+
+
My Money Map
+
Use Zero to set up and monitor your personalized money map. A money map is an easy-to-use online tool that helps you manage your finances efficiently. With Money Map, you can create a budget, sort your finances into spending and savings categories, check the interest your accounts are earning, and gain new understanding of your patterns with the help of Zero’s clear charts and graphs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
Use Zero to view the most up-to-date listings of your deposits, withdrawals, interest payments, and a number of other useful transactions.
+
+
+
+
+
+
Transfer Funds
+
Use Zero to safely and securely transfer funds between accounts. There is no hold placed on online money transfers, so your funds are available when you need them.
+
+
+
+
+
+
My Money Map
+
Use Zero to set up and monitor your personalized money map. A money map is an easy-to-use online tool that helps you manage your finances efficiently. With Money Map, you can create a budget, sort your finances into spending and savings categories, check the interest your accounts are earning, and gain new understanding of your patterns with the help of Zero’s clear charts and graphs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
+
+
+
+
+
+
+
Online Banking
+
Welcome to Zero Online Banking. Zero provides a greener and more convenient way to manage your money. Zero enables you to check your account balances, pay your bills, transfer money, and keep detailed records of your transactions, wherever there is an internet connection.
Use Zero to view the most up-to-date listings of your deposits, withdrawals, interest payments, and a number of other useful transactions.
+
+
+
+
+
+
Transfer Funds
+
Use Zero to safely and securely transfer funds between accounts. There is no hold placed on online money transfers, so your funds are available when you need them.
+
+
+
+
+
+
My Money Map
+
Use Zero to set up and monitor your personalized money map. A money map is an easy-to-use online tool that helps you manage your finances efficiently. With Money Map, you can create a budget, sort your finances into spending and savings categories, check the interest your accounts are earning, and gain new understanding of your patterns with the help of Zero’s clear charts and graphs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+
+
+
+
+]]>DateFri, 24 Feb 2023 14:01:47 GMTServerApache-Coyote/1.1Access-Control-Allow-Origin*Cache-Controlno-cache, max-age=0, must-revalidate, no-storeContent-Typetext/html;charset=UTF-8Content-Languageen-USKeep-Alivetimeout=5, max=100ConnectionKeep-AliveContent-Length8714http://zero.webappsecurity.com:80/login.htmlhttpzero.webappsecurity.com80Vulnerability11542105953Often Misused: LoginAPI AbuseOften Misused: LoginCWE-311: Missing Encryption of Sensitive DataSummaryImplicationAn attacker who exploited this design vulnerability would be able to utilize the information to escalate their method of attack, possibly leading to impersonation of a legitimate user, the theft of proprietary data, or execution of actions not intended by the application developers.]]>ExecutionFixEnsure that sensitive areas of your web application have proper encryption protocols in place to prevent login information and other data that could be helpful to an attacker from being intercepted.]]>Reference InfoAdvisory:http://www.kb.cert.org/vuls/id/466433 ]]>Vulnerability1154247223Insecure TransportCWE-319: Cleartext Transmission of Sensitive InformationSecurity FeaturesInsecure TransportSummaryImplicationAn attacker who exploited this design vulnerability would be able to utilize the information to escalate their method of attack, possibly leading to impersonation of a legitimate user, the theft of proprietary data, or execution of actions not intended by the application developers.]]>ExecutionFixFor Security Operations: Ensure that sensitive areas of your web application have proper encryption protocols in place to prevent login information and other data that could be helpful to an attacker from being intercepted.
+
For Development: Ensure that sensitive areas of your web application have proper encryption protocols in place to prevent login information and other data that could be helpful to an attacker from being intercepted.
+
For QA: Test the application not only from the perspective of a normal user, but also from the perspective of a malicious one.]]>Reference InfoVulnerability11548112933Cross-Frame ScriptingSecurity FeaturesCross-Frame ScriptingCWE-1021: Improper Restriction of Rendered UI Layers or FramesSummaryA Cross-Frame Scripting (XFS) vulnerability can allow an attacker to load the vulnerable application inside an HTML iframe tag on a malicious page. The attacker could use this weakness to devise a Clickjacking attack to conduct phishing, frame sniffing, social engineering or Cross-Site Request Forgery attacks.
+
Clickjacking
+The goal of a Clickjacking attack is to deceive the victim (user) into interacting with UI elements of the attacker’s choice on the target web site without their knowledge and then executing privileged functionality on the victim’s behalf. To achieve this goal, the attacker must exploit the XFS vulnerability to load the attack target inside an iframe tag, hide it using Cascading Style Sheets (CSS) and overlay the phishing content on the malicious page. By placing the UI elements on the phishing page so they overlap with those on the page targeted in the attack, the attacker can ensure that the victim must interact with the UI elements on the target page not visible to the victim.
+WebInspect has detected a page which potentially handles sensitive information using an HTML form with a password input field and is missing XFS protection. ]]>ImplicationA Cross-Frame Scripting weakness could allow an attacker to embed the vulnerable application inside an iframe. Exploitation of this weakness could result in:
Hijacking of user events such as keystrokes
Theft of sensitive information
Execution of privileged functionality through combination with Cross-Site Request Forgery attacks
]]>ExecutionCreate a test page containing an HTML iframe tag whose src attribute is set to ~FullURL~. Successful framing of the target page indicates that the application is susceptibile to XFS.
Note that WebInspect will report only one instance of this check across each host within the scope of the scan. The other visible pages on the site may, however, be vulnerable to XFS as well and therefore should be protected against it with an appropriate fix.]]>FixThe Content Security Policy (CSP) frame-ancestors directive obsoletes the X-Frame-Options header. Both provide for a policy-based mitigation technique against cross-frame scripting vulnerabilities. The difference is that while the X-Frame-Options technique only checks against the top-level document’s location, the CSP frame-ancestors header checks for conformity from all ancestors.
+If both CSP frame-ancestors and X-Frame-Options headers are present and supported, the CSP directive will prevail. WebInspect recommends using both CSP frame-ancestors and X-Frame-Options headers as CSP is not supported by Internet Explorer and many older versions of other browsers.
+In addition, developers must also use client-side frame busting JavaScript as a protection against XFS. This will enable users of older browsers that do not support the X-Frame-Options header to also be protected from Clickjacking attacks.
X-Frame-Options Developers can use this header to instruct the browser about appropriate actions to perform if their site is included inside an iframe.
+Developers must set the X-Frame-Options header to one of the following permitted values:
+
DENY
+Deny all attempts to frame the page
SAMEORIGIN
+The page can be framed by another page only if it belongs to the same origin as the page being framed
ALLOW-FROM origin
+Developers can specify a list of trusted origins in the origin attribute. Only pages on origin are permitted to load this page inside an iframe
Content-Security-Policy: frame-ancestors Developers can use the CSP header with the frame-ancestors directive, which replaces the X-Frame-Options header, to instruct the browser about appropriate actions to perform if their site is included inside an iframe. Developers can set the frame-ancestors attribute to one of the following permitted values:
+
+‘none’ Equivalent to “DENY” - deny all attempts to frame the page
‘self’ Equivalent to “SAMEORIGIN” - the page can be framed by another page only if it belongs to the same origin as the page being framed
<host-source> Equivalent to “ALLOW-FROM” - developers can specify a list of trusted origins which maybe host name or IP address or URL scheme. Only pages on this list of trusted origin are permitted to load this page inside an iframe
<scheme-source> Developers can also specify a schema such as http: or https: that can frame the page.
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+
+
+
+
+]]>DateFri, 24 Feb 2023 14:01:47 GMTServerApache-Coyote/1.1Access-Control-Allow-Origin*Cache-Controlno-cache, max-age=0, must-revalidate, no-storeContent-Typetext/html;charset=UTF-8Content-Languageen-USKeep-Alivetimeout=5, max=100ConnectionKeep-AliveContent-Length7318http://zero.webappsecurity.com:80/online-banking.htmlhttpzero.webappsecurity.com80Best Practices1154655970Privacy Violation: AutocompleteCWE-525: Information Exposure Through Browser CachingSecurity FeaturesPrivacy Violation: AutocompleteSummaryImplicationExecutionFixReference InfoMicrosoft: Autocomplete Security]]>Info11674116760HLI: Detected LibrariesSummary Hacker Level Insights provides developers and security professionals with more context relating to the overall security posture of their application. The version was detected to be in use by during this scan. While these findings do not necessarily represent a security vulnerability, it is important to note that attackers commonly perform reconnaissance of their target in an attempt to identify known weaknesses or patterns. Knowing what the hacker can see provides context which can help teams better secure their applications. ]]>ImplicationExecutionFixReference Info
+
+
+
+ Zero - Free Access to Online Banking
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Our Bank is trusted by over 1,000,000 customers world wide.
+ Sign in now!
+
+
+
+
+
+
+
+
+
+ Account Summary
+
+
+
See all of your account balances at a glance.
+
+
+
+
+
+ Account Activity
+
+
+
View the most up-to-date listings of your deposits, withdrawals, interest payments, and other transactions.
+
+
+
+
Transfer Funds
+
+
Safely and securely transfer funds between accounts.
+
+
+
+
+
+
Pay Bills
+
+
Pay your bills quickly and securely online.
+
+
+
+
My Money Map
+
+
Use Zero to set up and monitor your personalized money map. A money map is an easy-to-use online tool that helps you manage your finances efficiently.
+
+
+
+
Online Statements
+
+
View the statement history of all your accounts.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
Our Bank is trusted by over 1,000,000 customers world wide.
+ Sign in now!
+
+
+
+
+
+
+
+
+
+ Account Summary
+
+
+
See all of your account balances at a glance.
+
+
+
+
+
+ Account Activity
+
+
+
View the most up-to-date listings of your deposits, withdrawals, interest payments, and other transactions.
+
+
+
+
Transfer Funds
+
+
Safely and securely transfer funds between accounts.
+
+
+
+
+
+
Pay Bills
+
+
Pay your bills quickly and securely online.
+
+
+
+
My Money Map
+
+
Use Zero to set up and monitor your personalized money map. A money map is an easy-to-use online tool that helps you manage your finances efficiently.
+
+
+
+
Online Statements
+
+
View the statement history of all your accounts.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+
+
+
+
+]]>DateFri, 24 Feb 2023 14:01:48 GMTServerApache-Coyote/1.1Access-Control-Allow-Origin*Cache-Controlno-cache, max-age=0, must-revalidate, no-storeContent-Typetext/html;charset=UTF-8Content-Languageen-USKeep-Alivetimeout=5, max=99ConnectionKeep-AliveContent-Length11353http://zero.webappsecurity.com:80/feedback.htmlhttpzero.webappsecurity.com80Best Practices1154655970Privacy Violation: AutocompleteCWE-525: Information Exposure Through Browser CachingSecurity FeaturesPrivacy Violation: AutocompleteSummaryImplicationExecutionFixReference InfoMicrosoft: Autocomplete Security]]>Info11674116760HLI: Detected LibrariesSummary Hacker Level Insights provides developers and security professionals with more context relating to the overall security posture of their application. The version was detected to be in use by during this scan. While these findings do not necessarily represent a security vulnerability, it is important to note that attackers commonly perform reconnaissance of their target in an attempt to identify known weaknesses or patterns. Knowing what the hacker can see provides context which can help teams better secure their applications. ]]>ImplicationExecutionFixReference Info
+
+
+
+ Zero - Contact Us
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Our Frequently Asked Questions area will help you with many
+ of your inquiries.
+
+ If you can't find your question, return to this page and use the e-mail form below.
+
+
+
+ IMPORTANT! This feedback facility is not secure. Please do not send any
+
+ account information in a message sent from here.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+
+ Our Frequently Asked Questions area will help you with many
+ of your inquiries.
+
+ If you can't find your question, return to this page and use the e-mail form below.
+
+
+
+ IMPORTANT! This feedback facility is not secure. Please do not send any
+
+ account information in a message sent from here.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Download WebInspect
+
+
+
+
+
+
Terms of Use
+
+
+
+
+
+
Contact Micro Focus
+
Privacy Statement
+
+
+
+
+
+
+
+ The Free Online Bank Web site is published by Micro Focus Fortify for the sole purpose of demonstrating
+ the functionality and effectiveness of Micro Focus Fortify’s WebInspect products in detecting and reporting
+ Web application vulnerabilities. This site is not a real banking site and any similarities to third party products
+ and/or Web sites are purely coincidental. This site is provided "as is" without warranty of any kind,
+ either express or implied. Micro Focus Fortify does not assume any risk in relation to your use of this Web site.
+ Use of this Web site indicates that you have read and agree to Micro Focus Fortify’s Terms of Use found at
+ https://www.microfocus.com/about/legal/#privacy
+ and Micro Focus Fortify’s Online Privacy Statement found at
+ https://www.microfocus.com/about/legal/#privacy.
+
+