From 90baf6042c46f4fdea6dc1b171a9293ddfdc631b Mon Sep 17 00:00:00 2001 From: DefectDojo release bot Date: Mon, 7 Jul 2025 16:00:53 +0000 Subject: [PATCH 1/9] Update versions in application files --- components/package.json | 2 +- helm/defectdojo/Chart.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/package.json b/components/package.json index 876f72885b1..1b89eba6d67 100644 --- a/components/package.json +++ b/components/package.json @@ -1,6 +1,6 @@ { "name": "defectdojo", - "version": "2.48.0", + "version": "2.49.0-dev", "license" : "BSD-3-Clause", "private": true, "dependencies": { diff --git a/helm/defectdojo/Chart.yaml b/helm/defectdojo/Chart.yaml index 3146660b627..78f85b5fbe6 100644 --- a/helm/defectdojo/Chart.yaml +++ b/helm/defectdojo/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v2 -appVersion: "2.48.0" +appVersion: "2.49.0-dev" description: A Helm chart for Kubernetes to install DefectDojo name: defectdojo -version: 1.6.195 +version: 1.6.196-dev icon: https://www.defectdojo.org/img/favicon.ico maintainers: - name: madchap From 88b9a8723d709055025a94a8e5869315ac54b8a4 Mon Sep 17 00:00:00 2001 From: Leonardo de Oliveira Maia <101437950+LeoOMaia@users.noreply.github.com> Date: Mon, 7 Jul 2025 15:20:59 -0300 Subject: [PATCH 2/9] include vuln_id_from_tool in group_by (#12744) --- dojo/finding/helper.py | 3 +++ dojo/models.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dojo/finding/helper.py b/dojo/finding/helper.py index d5636129cda..4693c53fee9 100644 --- a/dojo/finding/helper.py +++ b/dojo/finding/helper.py @@ -255,6 +255,9 @@ def get_group_by_group_name(finding, finding_group_by_option): group_name = f"Filepath {finding.file_path}" elif finding_group_by_option == "finding_title": group_name = finding.title + elif finding_group_by_option == "vuln_id_from_tool": + if finding.vuln_id_from_tool: + group_name = f"Vulnerability ID {finding.vuln_id_from_tool}" if finding.vuln_id_from_tool else "None" else: msg = f"Invalid group_by option {finding_group_by_option}" raise ValueError(msg) diff --git a/dojo/models.py b/dojo/models.py index 68ab2092c3d..fa5f553b1be 100644 --- a/dojo/models.py +++ b/dojo/models.py @@ -3449,7 +3449,8 @@ class Finding_Group(TimeStampedModel): GROUP_BY_OPTIONS = [("component_name", "Component Name"), ("component_name+component_version", "Component Name + Version"), ("file_path", "File path"), - ("finding_title", "Finding Title")] + ("finding_title", "Finding Title"), + ("vuln_id_from_tool", "Vulnerability ID from Tool")] name = models.CharField(max_length=255, blank=False, null=False) test = models.ForeignKey(Test, on_delete=models.CASCADE) From d1e1534428eddf87a44ed6a911ef57b72462516a Mon Sep 17 00:00:00 2001 From: valentijnscholten Date: Tue, 8 Jul 2025 18:36:10 +0200 Subject: [PATCH 3/9] risk acceptance: display more info on add risk acceptance view (#12745) --- dojo/engagement/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dojo/engagement/views.py b/dojo/engagement/views.py index 13ce89828b5..311b61af6d1 100644 --- a/dojo/engagement/views.py +++ b/dojo/engagement/views.py @@ -1239,11 +1239,14 @@ def add_risk_acceptance(request, eid, fid=None): risk_acceptance_title_suggestion = f"Accept: {finding}" form = RiskAcceptanceForm(initial={"owner": request.user, "name": risk_acceptance_title_suggestion}) - finding_choices = Finding.objects.filter(duplicate=False, test__engagement=eng).filter(NOT_ACCEPTED_FINDINGS_QUERY).order_by("title") + finding_choices = Finding.objects.filter(duplicate=False, test__engagement=eng).filter(NOT_ACCEPTED_FINDINGS_QUERY).prefetch_related("test", "finding_group_set").order_by("test__id", "numerical_severity", "title") form.fields["accepted_findings"].queryset = finding_choices if fid: + # Set the initial selected finding form.fields["accepted_findings"].initial = {fid} + # Change the label for each finding in the dropdown + form.fields["accepted_findings"].label_from_instance = lambda obj: f"({obj.test.scan_type}) - ({obj.severity}) - {obj.title} - {obj.date} - {obj.status()} - {obj.finding_group})" product_tab = Product_Tab(eng.product, title="Risk Acceptance", tab="engagements") product_tab.setEngagement(eng) From f61743179f319927c27cb84a45b7bbfb12d8407e Mon Sep 17 00:00:00 2001 From: Paul Osinski <42211303+paulOsinski@users.noreply.github.com> Date: Tue, 8 Jul 2025 12:37:06 -0400 Subject: [PATCH 4/9] update changelog 2.47.3/4 (#12746) Co-authored-by: Paul Osinski --- docs/assets/images/pro_ics_export.png | Bin 0 -> 76328 bytes docs/assets/images/pro_product_type_modal.png | Bin 0 -> 107386 bytes docs/content/en/changelog/changelog.md | 27 ++++++++++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 docs/assets/images/pro_ics_export.png create mode 100644 docs/assets/images/pro_product_type_modal.png diff --git a/docs/assets/images/pro_ics_export.png b/docs/assets/images/pro_ics_export.png new file mode 100644 index 0000000000000000000000000000000000000000..670ce3080c968379c8c2f9f2588a0ecc22c5af57 GIT binary patch literal 76328 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�h z%C1DSl`1?uL#%rW#yR1Ny|0P;7(?YETloCQ>@8}SQJheZ6yq7=XWs01kI8qN{NC=C z-VK^ECruLNgzeP8;k^R+B^LG1lkwGIF8B%JzCefMiS+}sv%K_cJ=;9g`R;?uaM_z6 zL4}ys)wC@q$%&EamI$hC$H&YsnMe30H2={ z6C_vNgnv_*x1IkqUv>_l*S}LP&BgRfM{n#XnjX<~84bF1P`+^XsvbrxQV68#U?)Be z)1Iw;Q@8H6mwZ|%?6!t!m0J*9ug)bTo}v<@}M=G08!?Yd{6Df@R&8J@R@L_`)FL z>!*lp`mD<1n2IgLky|vcIm}|h5(QedU~`$8?ta?vXjeHrsTQT(EI0=h8lZ|gOmUK5 zD8N-UvLGBgckm}?fDwXO&gK&d2^6Pyg#g+EI6`>^V~g)P30 zwDz+LZ5kzke~A$Mr;c_VJed)npKl~(^V_-UI7>!adD#Y1CC!N;M+ z(V8Yy@nWt#8ksG*&g@yTANj-9H`p??*ee;758+IA{TuO4P;FD8{<|5TD!br-yV{0*JPA^LNa`jpNZ2XY65gmvSxoQ?h%1DZEl%5(It)$R8 zK6~oivJ)=W`}08=-(i$rTcS_x81krI3H8tjJ0tr}hgy%`UjK2C_wz%1@trcVwM$XG z^{cK%9!IvKtZ~syuKBV*!lLW5?mv5oa!AUE=6UBm={N9@@+oR=N%>?CaDFG7ME0Dl z{JJ3XZ9q($!Ez!n7*oU`asBkffWBU@G z<~IK8io#XT@>W$Z z$+21WF^1oSfofl51qEK6 zQicNP|30wCF2HsiZ)h43I$z)J-AmTNlgBeqe0?DQ#mBEE(M5)KmVvdX7Fsy+BabGs z{*-MiLTFJUy{@1ZUE7NNhPcYgHu7;^vy%A@K5c{?B1cEsC zYlr*wxa}~wo=kVs+V2<*HQDOCiP9sQf9UcKvGkKQ@~dKQN_Xn2n`)L~-_21Q;q^H7 zDsBnpcSX7}#Ic2GvSN<9jHnrSsCLTOu@B15UeZJNZ*JMG9iX9Q-ph?PCtgkBZDDj{ zCw8-&H2Oqr4S}zZXiyf5%<(2&Sko*+wV}b59CMzs#xe*vBdrZwH!Fv0BeE)Z)Ts^Ut}iLI zfPp5~>t@cQahTzDx31TUjZvpOeCWjEZb8WVi^)!N!SVWCfgN*>N{z?Vm-gTk)w&Gy zVicR_U31kFhU{C4RhM5)Yt84neEsqqrBfEHt#_ubLay_h$QVCl_tpKZOHM49VoqlF zavaLmRjD;l*FmNb=q7bM3SdWczCl!OxCx&cD{)c|i0+u*u^Jn<&>(ZDC7>aBH&P;} zVP$0zo)m97zeV0+Z52}E)1r3HHg9oyr*#!`xp11b!%)aKi&P;pf@+iejm){9$KBPb zg4O2dLz$c52nG#BOZM#i0SE4dgb#RqC1$!c8eSqc{Q5Wth<@MjUobZBR6vTX3Rur* zuIWRD2)j~g@AjmwyhTDxkFIZ0An>&pI)|;2XV*7F4c1f4oq0orzf;e-Rff)e*uQ6N z;nmAMbbwk6v6MmEOhO!)=+o>}BP!m1QZ7(Z`cZ$lgW>++BKLg>9y(KV?&tnxwq$eq zD&cYA%V>G(1d|`Pkeh`*w&#W3%p2dKeay9&WjmYKy#j)74k8pRW~Qh1TX+k`81eRH zgeF%;_q%8EsISLUs;3#Smk1`A3&x&bt45_Xrcn;Yip5-u|MX9ET$Ytuk9`}Ol0V4s zQqBt<5tCzkX6y5Gztgd1hFtUkG|#>d9cyl-@UUZAsCllheP!ROX*_D~^9Rp%?%~-^ zU3Rf)?}PYoDYosL2{}Pmd%HstgE6kJS6M5kba&+CMPsGm(|k!kD)HoiC;5yG%z~Z$%$|t#lG^4YAje>L+<*aW3`6Bz(Vfk5wrz zSDMiay(*2$Fjv}D*6ayY)*l=XwnaKpqc~e$c8YKbH6tmv*%f;36C|0Pa#dZ>IVMoawDj~_q&%Cxact~=;2SDa-S z;kw=3aA#Lg%QQ)Y*7#i%946$HzPDtN=w90j5xU&Ybo`wB+#C|RMmwR_G^gmKx_2c$ zJCRAbAWgY-`#r@=1)K5Jn}_~AJ1X8?_GtlHSUr>r8kD^}#<`9bC$_$~smk`oWfz;N z%2w>JAO)XW6T@mpBOa1JKPk4}U0yzusz`avR*>&>jGM9TKD;;GF}jDQ`*UU}9P$v} z3(4=~hu3(H8)Ab0yEjC>!RQ$R{GB5!F>q_I&@XR1_VkFRhh%$tzrUsK#o9^lz(>UH zj1Y^8_G3UvNDfr^_#^2}UL3naj#F&| ze=wmVPH?qYLbSgnO2W2Piqy}TK^cg`m#nmJ9c@w(;nn1Ql9bN(t5l@vq2JrKDI{9dEPc+upDuLXT=WTBn zZ~VvrHJkJ?b|ig8lZyA8qi;2fn@FonOPVeSILl9OF@5;|juv*ug1cQ6kS| zw$V6HhSJ#Jafmdp+MnS?@+3-1g&zy!hz}Pk^_98~&!%|pPHSZJjqW&)kJmSJT549z ztT7aFqL6>kH3UV3dsMLC5V_D1`57sjzfDFHqf+`jfUlty6HU(Ui~1b4c(A$P zd&SGML&0ys5F^6I4BH^087>{|{uNpT-zj>T=$R#9bJj_H{{-Rx>nGy$pBO-)Hg{GJ zL*@OSzb1ms#slAP*zat@lbUXi9?x6-R60?3`SSk1NwL8vef?kH;fR5cK4ru%$HFYd zYv5}3Si?Mi)kGzY_~AR--!AY|726Lpl^vwmdsfAY4Dk^V+&^O{=HtbI@(5Sq1+3M< z8DfJX&pH)Px*r@5WkIYWL_9w+vM`|;itE9?2R^|%I5%cE=l(YEcHe7$H{<_mN-+8$ zmekFIA))(*bv_K(l=R&zW-LLk3s8C;Me@}1d6Y^Zw#G6*z zuS-4&Y0Sw6XlztU><@5PEx{C&i9z@O((>i-d>56x84G6$N9s6bY(J6{tpIczu(7tD z!lsE5Th@1MZPs)(l)JC{7dJvxqzEU+6Li@0qrP|r`euj{uy+5im9XYUuu7dv$B`3| zY^O%c6n3f7!xMzH?RoYwOhR5MhWR6LQiH6G2(pJH^U#Ai=GC>$;v2Iel?8ipG-Ku&|h zIj)j$`CFnMaV#@f7kKvZ{XWK0{9(mrpVG4i(iwVhPqm&0ds*OxVB@!IJ2F@Nzp*BE zguF@=D!Hq1FbC9p-!e&9D)1vcU# z3x`2_ak3^PWFdBe!Wha@c+bjV@ci$51_o@Jfnp98j7(=9-ihFXYe8rRu})M2+v)_-c1SelKSAe+!yp4+%DFugxrJ3d3 zd9d3tlH1_=l`Auvnw*6DkJskU>B8;rL zpZ{yPAr+Qr&|>ny`UW?B?f;*E=l1{6o3vv3SBA}QhT-Agx1L;3u5NZnA9tvVtXQ*V zOY!TsTsBpa)sunx!mKhbD6G9@Vs8F=KCp6z2L=kOk%Mc>)TuYaN@oD?Lu<*3-Oe(@ zbV-!(zoSVT9gO+fZZV7DN^1ffItx7iPLXmJ{@v>w=HLrD{$z|%*skqDW1iA;5H7g9{4A6 z;l$IfF0Rinmw)|jGd*rQ+lIMx;Xs1U~)r|-t=kHX8roL z_P0sV&FI|i>@&71@@|*2C|IDWrB&9L7L-=;XAh(p#`M8m{RI+hnNH{Cu1y18B)qU# zuRIU99LS(rdhM!JM!>@zwp(9(7L+EC@ht^-`x>?c#mKTrf5CxGK}jN_qBDW#@B@>` zu{C)q``Kpfou+*uCNwnH-Aw$ZL-Fd&{QPpq^u1*zB^6h3nkDc-Gaw)!fs30v)*y1d zs_N0QB}KD&waim&H@q=j>CSZK-Z4?j@V>OCe>F5Uec$Z(Zn+*us4_79W7*TVM_0G{ z+2QV^NqUo8_Afnr_0>g&;vH(6MQ|o_5te`aYb2N73o-1;2i_>p;OXk;vd$@?2>=U% By%+!h literal 0 HcmV?d00001 diff --git a/docs/assets/images/pro_product_type_modal.png b/docs/assets/images/pro_product_type_modal.png new file mode 100644 index 0000000000000000000000000000000000000000..056df908075bc904a8e9f61e6592bbbf8d02c5b0 GIT binary patch literal 107386 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

@59iVUq!+^|4%UB1e8= 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 Hq5l6Lt`X)D literal 0 HcmV?d00001 diff --git a/docs/content/en/changelog/changelog.md b/docs/content/en/changelog/changelog.md index 2471612711b..64d612e383d 100644 --- a/docs/content/en/changelog/changelog.md +++ b/docs/content/en/changelog/changelog.md @@ -11,6 +11,22 @@ For Open Source release notes, please see the [Releases page on GitHub](https:// ## June 2025: v2.47 +### July 1, 2025: v2.47.4 + +- **(Pro UI)** Products, Engagements, Tests, Findings and Endpoints can be edited directly from their respective tables via a modal. +- **(Pro UI)** Calendar view now supports additional query parameters for filtering Tests or Engagements. +- **(Pro UI)** Engagements, Tests and the entire Calendar can be exported as .ics files. + +![image](images/pro_ics_export.png) + +### June 23, 2025: v2.47.3 + +- **(Pro UI)** Finding Templates can now be added in the Pro UI, from **Findings > Finding Templates** on the sidebar. +- **(Pro UI)** A better error message is displayed when Jira Instance deletion is unsuccessful. +- **(Pro UI)** Product Types can now be edited through a modal: **"â‹®" > Edit Product Type** will open a pop-up modal window instead of taking a user to a new page. + +![image](images/pro_product_type_modal.png) + ### June 16, 2025: v2.47.2 - **(Pro UI)** Endpoint Metadata can now be uploaded to Products. You can now import a .csv list of all endpoints associated with a Product, from **View Product > Endpoints > Import Endpoint Metadata** @@ -27,7 +43,6 @@ For Open Source release notes, please see the [Releases page on GitHub](https:// ![image](images/pro_login.png) - ### June 9, 2025: v2.47.1 - **(Pro UI)** Vulnerable Endpoints table has now been added to Finding pages. @@ -71,7 +86,7 @@ This update improves consistency, enhances DefectDojo's search capabilities, and We recommend reviewing your current tags to ensure they align with the new format. Following the deployment of these new behaviors, requests sent to the API or through the UI with any of the violations listed above will result in an error, with the details of the error raised in the response. -### May 26, 2025: v2.46.4 +#### May 26, 2025: v2.46.4 - **(Pro Metrics)** Rework of filter menu within insights dashboards to remove cross Product Type and Product filtering capabilities. - **(Pro UI)** Clickable links within insights dashboards. @@ -87,7 +102,7 @@ The Priority Insights dashboard can quickly render a list of all SOC or AppSec F - **(Pro UI)** More detailed messages in Bulk Edit provide a better explanation of why some Findings may have been skipped. -### May 19, 2025: v2.46.3 +#### May 19, 2025: v2.46.3 - **(Calendar)** New filters have been added to Calendar view: Unassigned Lead, and Engagement/Test Type. - **(Dashboard)** Added Finding Status filter for Dashboard tiles. @@ -97,17 +112,17 @@ The Priority Insights dashboard can quickly render a list of all SOC or AppSec F ![image](images/pro_dashboard_priority.png) - **(Universal Parser)** Added a 'SOC Alerts' flag to Universal Parser, to indicate whether the Findings from the parser originate from a Security Operations Center. -### May 12, 2025: v2.46.2 +#### May 12, 2025: v2.46.2 - **(Findings)** Component Name and Version have been added to the metadata table on a Finding View. - **(Metrics)** Pro Insights Dashboards can now be filtered by Tag. - **(Users)** The Users table can now be exported as a .csv file. -### May 7, 2025: v2.46.1 +#### May 7, 2025: v2.46.1 Hotfix release - no significant feature changes. -### May 5, 2025: v2.46.0 +#### May 5, 2025: v2.46.0 - **(Import)** Mitigated timestamp in reports are no longer ignored/overwritten on Reimport. From adadb8e5522087a85bb008a1bd02217d41c7c7a5 Mon Sep 17 00:00:00 2001 From: valentijnscholten Date: Tue, 8 Jul 2025 23:14:02 +0200 Subject: [PATCH 5/9] Zap: Add test case with more request/response pairs (#12733) * zap: add req-resp unittest v2.26.1 * check number of req-resp pairs * fix ports * fix ports * fix ports --- .../scans/zap/zap_2.16.1_with_req_resp.xml | 989 ++++++++++++++++++ unittests/tools/test_zap_parser.py | 233 +++++ 2 files changed, 1222 insertions(+) create mode 100644 unittests/scans/zap/zap_2.16.1_with_req_resp.xml diff --git a/unittests/scans/zap/zap_2.16.1_with_req_resp.xml b/unittests/scans/zap/zap_2.16.1_with_req_resp.xml new file mode 100644 index 00000000000..aed785ac4d5 --- /dev/null +++ b/unittests/scans/zap/zap_2.16.1_with_req_resp.xml @@ -0,0 +1,989 @@ + + + + + + 10111 + 10111 + Authentication Request Identified + Authentication Request Identified + 0 + 1 + Informational (Low) + Low + The given request has been identified as an authentication request. The 'Other Info' field contains a set of key=value lines which identify any relevant fields. If the request is in a context which has an Authentication Method set to "Auto-Detect" then this rule will change the authentication to match the request identified. + + + https://example-domain.com/cpapi/api/account/verifypasswordless + POST + user_identifier + + passwordless_code + + userParam=user_identifier + userValue=string + passwordParam=passwordless_code + + + POST https://example-domain.com/cpapi/api/account/verifypasswordless HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + content-type: application/json-patch+json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 89 + authorization: Bearer [REDACTED] + + + {"user_identifier":"string","method":0,"client_id":"string","passwordless_code":"string"} + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + + + + + + 1 + This is an informational alert rather than a vulnerability and so there is nothing to fix. + + userParam=user_identifier + userValue=string + passwordParam=passwordless_code + + https://www.zaproxy.org/docs/desktop/addons/authentication-helper/auth-req-id/ + -1 + -1 + 449 + + + + 10029 + 10029 + Cookie Poisoning + Cookie Poisoning + 0 + 1 + Informational (Low) + Low + This check looks at user-supplied input in query string parameters and POST data to identify where cookie parameters might be controlled. This is called a cookie poisoning attack, and becomes exploitable when an attacker can manipulate the cookie in various ways. In some cases this will not be exploitable, however, allowing URL parameters to set cookie values is generally considered a bug. + + + https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true + GET + clearCache + + + + An attacker may be able to poison cookie values through URL parameters. Try injecting a semicolon to see if you can add cookie values (e.g. name=controlledValue;name=anotherValue;). + + This was identified at: + + https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true + + User-input was found in the following cookie: + HttpOnly=true + + The user input was: + clearCache=true + + + GET https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:24 GMT + + + + + + https://example-domain.com/cpapi/api/consumer/dynamic/bundle?addToSession=true + POST + addToSession + + + + An attacker may be able to poison cookie values through POST parameters. To test if this is a more serious issue, you should try resending that request as a GET, with the POST parameter included as a query string parameter. For example: https://nottrusted.com/page?value=maliciousInput. + + This was identified at: + + https://example-domain.com/cpapi/api/consumer/dynamic/bundle?addToSession=true + + User-input was found in the following cookie: + HttpOnly=true + + The user input was: + addToSession=true + + + POST https://example-domain.com/cpapi/api/consumer/dynamic/bundle?addToSession=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + sessionId: "[REDACTED]" + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:23 GMT + + + + + + https://example-domain.com/cpapi/api/consumer/ola/dynamic/PartialSave?allowPartialSave=true + POST + allowPartialSave + + + + An attacker may be able to poison cookie values through POST parameters. To test if this is a more serious issue, you should try resending that request as a GET, with the POST parameter included as a query string parameter. For example: https://nottrusted.com/page?value=maliciousInput. + + This was identified at: + + https://example-domain.com/cpapi/api/consumer/ola/dynamic/PartialSave?allowPartialSave=true + + User-input was found in the following cookie: + HttpOnly=true + + The user input was: + allowPartialSave=true + + + POST https://example-domain.com/cpapi/api/consumer/ola/dynamic/PartialSave?allowPartialSave=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + sessionId: "[REDACTED]" + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:24 GMT + + + + + + https://example-domain.com/cpapi/api/InvalidateCacheByKey?rehydrate=true + POST + rehydrate + + + + An attacker may be able to poison cookie values through POST parameters. To test if this is a more serious issue, you should try resending that request as a GET, with the POST parameter included as a query string parameter. For example: https://nottrusted.com/page?value=maliciousInput. + + This was identified at: + + https://example-domain.com/cpapi/api/InvalidateCacheByKey?rehydrate=true + + User-input was found in the following cookie: + HttpOnly=true + + The user input was: + rehydrate=true + + + POST https://example-domain.com/cpapi/api/InvalidateCacheByKey?rehydrate=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + content-type: application/json-patch+json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 6 + authorization: Bearer [REDACTED] + + + string + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:23 GMT + + + + + + https://example-domain.com/cpapi/api/consumer/dynamic/bundle?allowPartialSave=true&generateAppId=false + PUT + allowPartialSave + + + + This was identified at: + + https://example-domain.com/cpapi/api/consumer/dynamic/bundle?allowPartialSave=true&generateAppId=false + + User-input was found in the following cookie: + HttpOnly=true + + The user input was: + allowPartialSave=true + + + PUT https://example-domain.com/cpapi/api/consumer/dynamic/bundle?allowPartialSave=true&generateAppId=false HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + content-type: application/json-patch+json + sessionId: "[REDACTED]" + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 78 + authorization: Bearer [REDACTED] + + + [{"operationType":0,"path":"string","op":"string","from":"string","value":{}}] + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:23 GMT + + + + + + 5 + Do not allow user input to control cookie names and values. If some query string parameters must be set in cookie values, be sure to filter out semicolon's that can serve as name/value pair delimiters. + + An attacker may be able to poison cookie values through URL parameters. Try injecting a semicolon to see if you can add cookie values (e.g. name=controlledValue;name=anotherValue;). + + This was identified at: + + https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true + + User-input was found in the following cookie: + HttpOnly=true + + The user input was: + clearCache=true + + + https://en.wikipedia.org/wiki/HTTP_cookie + https://cwe.mitre.org/data/definitions/565.html + + 565 + 20 + 371 + + + CWE-565 + https://cwe.mitre.org/data/definitions/565.html + + + OWASP_2021_A03 + https://owasp.org/Top10/A03_2021-Injection/ + + + POLICY_QA_STD + + + + POLICY_PENTEST + + + + OWASP_2017_A01 + https://owasp.org/www-project-top-ten/2017/A1_2017-Injection.html + + + POLICY_DEV_STD + + + + + + 10024 + 10024 + Information Disclosure - Sensitive Information in URL + Information Disclosure - Sensitive Information in URL + 0 + 2 + Informational (Medium) + Medium + The request appeared to contain sensitive information leaked in the URL. This can violate PCI and most organizational compliance policies. You can configure the list of strings for this check to add or remove values specific to your environment. + + + https://example-domain.com/cpapi/api/oid/validateToken?accessToken=accessToken + GET + accessToken + + accessToken + + The URL contains potentially sensitive information. The following string was found via the pattern: token + accessToken + + + GET https://example-domain.com/cpapi/api/oid/validateToken?accessToken=accessToken HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:24 GMT + + + + + + https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true + GET + otuToken + + otuToken + + The URL contains potentially sensitive information. The following string was found via the pattern: token + otuToken + + + GET https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:24 GMT + + + + + + https://example-domain.com/cpapi/api/consumer/dynamic/bundle?addToSession=true + POST + addToSession + + addToSession + + The URL contains potentially sensitive information. The following string was found via the pattern: session + addToSession + + + POST https://example-domain.com/cpapi/api/consumer/dynamic/bundle?addToSession=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + sessionId: "[REDACTED]" + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:23 GMT + + + + + + 3 + Do not pass sensitive information in URIs. + + The URL contains potentially sensitive information. The following string was found via the pattern: token + accessToken + + + 598 + 13 + 341 + + + CWE-598 + https://cwe.mitre.org/data/definitions/598.html + + + OWASP_2021_A01 + https://owasp.org/Top10/A01_2021-Broken_Access_Control/ + + + POLICY_QA_STD + + + + POLICY_PENTEST + + + + OWASP_2017_A03 + https://owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure.html + + + POLICY_DEV_STD + + + + + + 10015 + 10015 + Re-examine Cache-control Directives + Re-examine Cache-control Directives + 0 + 1 + Informational (Low) + Low + The cache-control header has not been set properly or is missing, allowing the browser and proxies to cache content. For static assets like css, js, or image files this might be intended, however, the resources should be reviewed to ensure that no sensitive content will be cached. + + + https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key?persistence=0 + DELETE + cache-control + + no-store, no-cache + + + DELETE https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key?persistence=0 HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 200 OK + Cache-Control: no-store, no-cache + Content-Type: application/json + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + content-length: 1631 + + + {"data":[{"item1":"[FEATURE_FLAG_1]","item2":true},{"item1":"[FEATURE_FLAG_2]","item2":true},{"item1":"[FEATURE_FLAG_3]","item2":true},{"item1":"[FEATURE_FLAG_4]","item2":true},{"item1":"[FEATURE_FLAG_5]","item2":true},{"item1":"[FEATURE_FLAG_6]","item2":true},{"item1":"[FEATURE_FLAG_7]","item2":true},{"item1":"[FEATURE_FLAG_8]","item2":true},{"item1":"[FEATURE_FLAG_9]","item2":true},{"item1":"[FEATURE_FLAG_10]","item2":true},{"item1":"[FEATURE_FLAG_11]","item2":true},{"item1":"[FEATURE_FLAG_12]","item2":true},{"item1":"[FEATURE_FLAG_13]","item2":false},{"item1":"[FEATURE_FLAG_14]","item2":false},{"item1":"[FEATURE_FLAG_15]","item2":false},{"item1":"[FEATURE_FLAG_16]","item2":true},{"item1":"[FEATURE_FLAG_17]","item2":true},{"item1":"[FEATURE_FLAG_18]","item2":true},{"item1":"[FEATURE_FLAG_19]","item2":true},{"item1":"[FEATURE_FLAG_20]","item2":true},{"item1":"[FEATURE_FLAG_21]","item2":true},{"item1":"[FEATURE_FLAG_22]","item2":true},{"item1":"[FEATURE_FLAG_23]","item2":false},{"item1":"[FEATURE_FLAG_24]","item2":false},{"item1":"[FEATURE_FLAG_25]","item2":false},{"item1":"[FEATURE_FLAG_26]","item2":true},{"item1":"[FEATURE_FLAG_27]","item2":false},{"item1":"[FEATURE_FLAG_28]","item2":true},{"item1":"[FEATURE_FLAG_29]","item2":true},{"item1":"[FEATURE_FLAG_30]","item2":false},{"item1":"[FEATURE_FLAG_31]","item2":true},{"item1":"[FEATURE_FLAG_32]","item2":true}],"isSuccess":true,"message":"Features retrieved successfully","reason":null,"code":"200","validation":null,"applicationId":null} + + + https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key + GET + cache-control + + no-store, no-cache + + + GET https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 200 OK + Cache-Control: no-store, no-cache + Content-Length: 29 + Content-Type: application/json; charset=utf-8 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + + + {"error":"Tenant not found."} + + + https://example-domain.com/cpapi/api/workflow/config?products=products&topics=topics + GET + cache-control + + no-store, no-cache + + + GET https://example-domain.com/cpapi/api/workflow/config?products=products&topics=topics HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + + + + HTTP/1.1 200 OK + Cache-Control: no-store, no-cache + Content-Length: 29 + Content-Type: application/json; charset=utf-8 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + + + {"error":"Tenant not found."} + + + https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key?arrayHandling=0&persistence=0 + PUT + cache-control + + no-store, no-cache + + + PUT https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key?arrayHandling=0&persistence=0 HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + content-type: application/json-patch+json + X-Correlation-Id: "[REDACTED]" + content-length: 10 + authorization: Bearer [REDACTED] + + + "John Doe" + + HTTP/1.1 200 OK + Cache-Control: no-store, no-cache + Content-Length: 29 + Content-Type: application/json; charset=utf-8 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + + + {"error":"Tenant not found."} + + + 4 + For secure content, ensure the cache-control HTTP header is set with "no-cache, no-store, must-revalidate". If an asset should be cached consider setting the directives "public, max-age, immutable". + + + https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html#web-content-caching + https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + https://grayduck.mn/2021/09/13/cache-control-recommendations/ + + 525 + 13 + 440 + + + WSTG-v42-ATHN-06 + https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/04-Authentication_Testing/06-Testing_for_Browser_Cache_Weaknesses + + + CWE-525 + https://cwe.mitre.org/data/definitions/525.html + + + POLICY_PENTEST + + + + + + + + stats.tag.JSON + 9354 + + + stats.code.204 + 79 + + + stats.code.403 + 1260 + + + stats.code.404 + 49450 + + + stats.tag.SetCookie + 681868 + + + stats.code.405 + 1 + + + stats.code.200 + 2173 + + + stats.auth.sessiontoken.ARRAffinitySameSite + 153 + + + stats.code.400 + 640415 + + + stats.code.500 + 287 + + + stats.code.401 + 38 + + + stats.responseTime.2048 + 16 + + + stats.responseTime.128 + 3442 + + + stats.responseTime.2 + 5926 + + + stats.responseTime.64 + 6016 + + + stats.responseTime.4 + 3579 + + + stats.contentType.application/json + 6939 + + + stats.responseTime.8 + 499917 + + + stats.responseTime.16 + 149350 + + + stats.contentType.text/html; charset=us-ascii + 4940 + + + stats.auth.sessiontoken.TiPMix + 153 + + + stats.contentType.application/json; charset=utf-8 + 2415 + + + stats.auth.sessiontoken.ARRAffinity + 153 + + + stats.responseTime.0 + 15 + + + stats.responseTime.32 + 20881 + + + stats.auth.state.unknown + 690442 + + + stats.code.415 + 26 + + + stats.contentType.text/html + 35858 + + + stats.responseTime.256 + 1629 + + + stats.responseTime.1024 + 2178 + + + stats.auth.state.loggedout + 603 + + + stats.responseTime.512 + 780 + + + stats.contentType.application/problem+json; charset=utf-8 + 42 + + + + + + stats.ascan.40016.started + 1 + + + \ No newline at end of file diff --git a/unittests/tools/test_zap_parser.py b/unittests/tools/test_zap_parser.py index 7f6f70db39d..0b980e33fd7 100644 --- a/unittests/tools/test_zap_parser.py +++ b/unittests/tools/test_zap_parser.py @@ -227,3 +227,236 @@ def test_parse_xml_plus_format(self): response = request_pair["resp"] self.assertEqual('HTTP/1.1 403 Forbidden\nServer: Apache-Coyote/1.1\nContent-Type: text/html;charset=utf-8\nContent-Language: en\nContent-Length: 1004\nDate: Fri, 30 Sep 2022 06:40:15 GMT\n\nApache Tomcat/8.0.37 - Error report

HTTP Status 403 -

type Status report

message

description Access to the specified resource has been forbidden.


Apache Tomcat/8.0.37

', response) self.assertEqual('PUT http://localhost:8080/bodgeit/js/qndto7n63d HTTP/1.1\nHost: localhost:8080\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0\nAccept: */*\nAccept-Language: de,en-US;q=0.7,en;q=0.3\nConnection: keep-alive\nReferer: https://localhost:8080/bodgeit/\nCookie: JSESSIONID=9E75E26E50F681208096FFAA0B566901\nSec-Fetch-Dest: script\nSec-Fetch-Mode: no-cors\nSec-Fetch-Site: same-origin\nContent-Length: 35\n\n"J0O0glajHdR0Mgp":"UToh9IpCY5zh3CB"', request) + + def test_parse_xml_2_16_1_with_req_resp(self): + with (get_unit_tests_scans_path("zap") / "zap_2.16.1_with_req_resp.xml").open(encoding="utf-8") as testfile: + parser = ZapParser() + findings = parser.get_findings(testfile, Test()) + for finding in findings: + for endpoint in finding.unsaved_endpoints: + endpoint.clean() + self.assertIsInstance(findings, list) + self.assertEqual(4, len(findings)) + for finding in findings: + self.assertIn(finding.severity, Finding.SEVERITIES) + for endpoint in finding.unsaved_endpoints: + endpoint.clean() + + with self.subTest(i=0): + finding = findings[0] + self.assertEqual("Authentication Request Identified", finding.title) + self.assertEqual("Info", finding.severity) + self.assertEqual("10111", finding.vuln_id_from_tool) + self.assertEqual(1, len(finding.unsaved_endpoints)) + endpoint = finding.unsaved_endpoints[0] + self.assertEqual("https", endpoint.protocol) + self.assertEqual("example-domain.com", endpoint.host) + self.assertEqual(443, endpoint.port) + # Check request and response pair + self.assertEqual(1, len(finding.unsaved_req_resp)) + request_pair = finding.unsaved_req_resp[0] + request = request_pair["req"] + response = request_pair["resp"] + # I can't make sense of the whitespace diff the assertEqual is producing, so I will just check the stripped versions + expected_request = """ + POST https://example-domain.com/cpapi/api/account/verifypasswordless HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + content-type: application/json-patch+json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 89 + authorization: Bearer [REDACTED] + + {"user_identifier":"string","method":0,"client_id":"string","passwordless_code":"string"} + """ + + self.assertEqual(expected_request.strip(), request.strip()) + expected_response = """ + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + """ + self.assertEqual(expected_response.strip(), response.strip()) + + with self.subTest(i=1): + finding = findings[1] + self.assertEqual("Cookie Poisoning", finding.title) + self.assertEqual("Info", finding.severity) + self.assertEqual("10029", finding.vuln_id_from_tool) + self.assertEqual(5, len(finding.unsaved_endpoints)) + endpoint = finding.unsaved_endpoints[0] + self.assertEqual("https", endpoint.protocol) + self.assertEqual("example-domain.com", endpoint.host) + self.assertEqual(443, endpoint.port) + # Check request and response pair + self.assertEqual(5, len(finding.unsaved_req_resp)) + request_pair = finding.unsaved_req_resp[0] + request = request_pair["req"] + response = request_pair["resp"] + # I can't make sense of the whitespace diff the assertEqual is producing, so I will just check the stripped versions + expected_request = """ + GET https://example-domain.com/cpapi/api/redirect/getPrefillOtuTokenData?otuToken=otuToken&clearCache=true HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + """ + + self.assertEqual(expected_request.strip(), request.strip()) + expected_response = """ + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:24 GMT + """ + self.assertEqual(expected_response.strip(), response.strip()) + + with self.subTest(i=2): + finding = findings[2] + self.assertEqual("Information Disclosure - Sensitive Information in URL", finding.title) + self.assertEqual("Info", finding.severity) + self.assertEqual("10024", finding.vuln_id_from_tool) + self.assertEqual(3, len(finding.unsaved_endpoints)) + endpoint = finding.unsaved_endpoints[0] + self.assertEqual("https", endpoint.protocol) + self.assertEqual("example-domain.com", endpoint.host) + self.assertEqual(443, endpoint.port) + # Check request and response pair + self.assertEqual(3, len(finding.unsaved_req_resp)) + request_pair = finding.unsaved_req_resp[0] + request = request_pair["req"] + response = request_pair["resp"] + # I can't make sense of the whitespace diff the assertEqual is producing, so I will just check the stripped versions + expected_request = """ + GET https://example-domain.com/cpapi/api/oid/validateToken?accessToken=accessToken HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: text/plain, application/json, text/json + x-api-version: "[REDACTED]" + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + """ + + self.assertEqual(expected_request.strip(), request.strip()) + expected_response = """ + HTTP/1.1 400 Bad Request + Cache-Control: no-store, no-cache + Content-Length: 0 + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:24 GMT + """ + self.assertEqual(expected_response.strip(), response.strip()) + + with self.subTest(i=3): + finding = findings[3] + self.assertEqual("Re-examine Cache-control Directives", finding.title) + self.assertEqual("Info", finding.severity) + self.assertEqual("10015", finding.vuln_id_from_tool) + self.assertEqual(4, len(finding.unsaved_endpoints)) + endpoint = finding.unsaved_endpoints[0] + self.assertEqual("https", endpoint.protocol) + self.assertEqual("example-domain.com", endpoint.host) + self.assertEqual(443, endpoint.port) + # Check request and response pair + self.assertEqual(4, len(finding.unsaved_req_resp)) + request_pair = finding.unsaved_req_resp[0] + request = request_pair["req"] + response = request_pair["resp"] + # I can't make sense of the whitespace diff the assertEqual is producing, so I will just check the stripped versions + expected_request = """ + DELETE https://example-domain.com/cpapi/api/workflow/config/json/tenant/product/topic/key?persistence=0 HTTP/1.1 + host: example-domain.com + user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 + pragma: no-cache + cache-control: no-cache + accept: */* + X-Correlation-Id: "[REDACTED]" + content-length: 0 + authorization: Bearer [REDACTED] + + """ + + self.assertEqual(expected_request.strip(), request.strip()) + expected_response = """ + HTTP/1.1 200 OK + Cache-Control: no-store, no-cache + Content-Type: application/json + Set-Cookie: TiPMix=[REDACTED]; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: x-ms-routing-name=self; path=/; HttpOnly; Domain=example-internal-domain.net; Max-Age=3600; Secure; SameSite=None + Set-Cookie: HttpOnly=true + Set-Cookie: ARRAffinity=[REDACTED];Path=/;HttpOnly;Secure;Domain=example-internal-domain.net + Set-Cookie: ARRAffinitySameSite=[REDACTED];Path=/;HttpOnly;SameSite=None;Secure;Domain=example-internal-domain.net + Strict-Transport-Security: max-age=31536000; includeSubDomains + Request-Context: appId=cid-v1:[REDACTED] + X-Frame-Options: SAMEORIGIN + Content-Security-Policy: frame-ancestors 'self' + X-Content-Type-Options: nosniff + X-XSS-Protection: 1; mode=block + X-Correlation-Id: [REDACTED] + Access-Control-Allow-Origin: * + Access-Control-Allow-Headers: * + Access-Control-Allow-Methods: * + Date: Sun, 22 Jun 2025 00:17:25 GMT + content-length: 1631 + + {"data":[{"item1":"[FEATURE_FLAG_1]","item2":true},{"item1":"[FEATURE_FLAG_2]","item2":true},{"item1":"[FEATURE_FLAG_3]","item2":true},{"item1":"[FEATURE_FLAG_4]","item2":true},{"item1":"[FEATURE_FLAG_5]","item2":true},{"item1":"[FEATURE_FLAG_6]","item2":true},{"item1":"[FEATURE_FLAG_7]","item2":true},{"item1":"[FEATURE_FLAG_8]","item2":true},{"item1":"[FEATURE_FLAG_9]","item2":true},{"item1":"[FEATURE_FLAG_10]","item2":true},{"item1":"[FEATURE_FLAG_11]","item2":true},{"item1":"[FEATURE_FLAG_12]","item2":true},{"item1":"[FEATURE_FLAG_13]","item2":false},{"item1":"[FEATURE_FLAG_14]","item2":false},{"item1":"[FEATURE_FLAG_15]","item2":false},{"item1":"[FEATURE_FLAG_16]","item2":true},{"item1":"[FEATURE_FLAG_17]","item2":true},{"item1":"[FEATURE_FLAG_18]","item2":true},{"item1":"[FEATURE_FLAG_19]","item2":true},{"item1":"[FEATURE_FLAG_20]","item2":true},{"item1":"[FEATURE_FLAG_21]","item2":true},{"item1":"[FEATURE_FLAG_22]","item2":true},{"item1":"[FEATURE_FLAG_23]","item2":false},{"item1":"[FEATURE_FLAG_24]","item2":false},{"item1":"[FEATURE_FLAG_25]","item2":false},{"item1":"[FEATURE_FLAG_26]","item2":true},{"item1":"[FEATURE_FLAG_27]","item2":false},{"item1":"[FEATURE_FLAG_28]","item2":true},{"item1":"[FEATURE_FLAG_29]","item2":true},{"item1":"[FEATURE_FLAG_30]","item2":false},{"item1":"[FEATURE_FLAG_31]","item2":true},{"item1":"[FEATURE_FLAG_32]","item2":true}],"isSuccess":true,"message":"Features retrieved successfully","reason":null,"code":"200","validation":null,"applicationId":null} + """ + self.assertEqual(expected_response.strip(), response.strip()) From 14cc5f480729edb38ff77beefbc7b9189abf3368 Mon Sep 17 00:00:00 2001 From: valentijnscholten Date: Wed, 9 Jul 2025 21:57:34 +0200 Subject: [PATCH 6/9] allow users with edit user permission to force password resets (#12761) * allow users with edit user permission to force password resets * allow also for auth.add_user --- dojo/forms.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dojo/forms.py b/dojo/forms.py index 19f1fe6962d..6e772931aa3 100644 --- a/dojo/forms.py +++ b/dojo/forms.py @@ -30,6 +30,7 @@ from tagulous.forms import TagField import dojo.jira_link.helper as jira_helper +from dojo.authorization.authorization import user_has_configuration_permission from dojo.authorization.roles_permissions import Permissions from dojo.endpoint.utils import endpoint_filter, endpoint_get_or_create, validate_endpoints_to_add from dojo.engagement.queries import get_authorized_engagements @@ -2311,7 +2312,9 @@ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) current_user = get_current_user() if not current_user.is_superuser: - del self.fields["force_password_reset"] + if not user_has_configuration_permission(current_user, "auth.change_user") and \ + not user_has_configuration_permission(current_user, "auth.add_user"): + del self.fields["force_password_reset"] if not get_system_setting("enable_user_profile_editable"): for field in self.fields: self.fields[field].disabled = True From 2e5de027ae7023af7bb0fa6473a82ee28b9d9666 Mon Sep 17 00:00:00 2001 From: Paul Osinski <42211303+paulOsinski@users.noreply.github.com> Date: Thu, 10 Jul 2025 12:51:23 -0400 Subject: [PATCH 7/9] [docs] Add deduplication hashcode fields to parser descriptions (#12648) * add deduplication hashcodes to docs * add links --------- Co-authored-by: Paul Osinski --- .../connecting_your_tools/parsers/file/acunetix.md | 8 +++++++- .../parsers/file/anchore_engine.md | 9 +++++++++ .../parsers/file/anchore_enterprise.md | 10 +++++++++- .../parsers/file/anchore_grype.md | 10 +++++++++- .../parsers/file/anchorectl_policies.md | 10 +++++++++- .../parsers/file/anchorectl_vulns.md | 11 ++++++++++- .../parsers/file/appcheck_web_application_scanner.md | 8 +++++++- .../connecting_your_tools/parsers/file/appspider.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/aqua.md | 8 ++++++++ .../en/connecting_your_tools/parsers/file/arachni.md | 10 +++++++++- .../en/connecting_your_tools/parsers/file/asff.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/auditjs.md | 11 ++++++++++- .../parsers/file/aws_inspector2.md | 7 +++++++ .../parsers/file/aws_prowler.md | 11 ++++++++++- .../parsers/file/aws_prowler_v3plus.md | 11 ++++++++++- .../parsers/file/awssecurityhub.md | 11 ++++++++++- .../file/azure_security_center_recommendations.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/bandit.md | 9 ++++++++- .../connecting_your_tools/parsers/file/bearer_cli.md | 8 +++++++- .../connecting_your_tools/parsers/file/blackduck.md | 10 +++++++++- .../parsers/file/blackduck_binary_analysis.md | 11 ++++++++++- .../parsers/file/blackduck_component_risk.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/brakeman.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/bugcrowd.md | 11 ++++++++++- .../parsers/file/bundler_audit.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/burp.md | 9 ++++++++- .../connecting_your_tools/parsers/file/burp_api.md | 11 ++++++++++- .../parsers/file/burp_dastardly.md | 11 ++++++++++- .../parsers/file/burp_graphql.md | 11 ++++++++++- .../parsers/file/burp_suite_dast.md | 7 +++++++ .../parsers/file/cargo_audit.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/checkmarx.md | 9 ++++++++- .../parsers/file/checkmarx_cxflow_sast.md | 7 +++++++ .../parsers/file/checkmarx_one.md | 6 ++++++ .../en/connecting_your_tools/parsers/file/checkov.md | 11 ++++++++++- .../parsers/file/chefinspect.md | 9 +++++++++ .../en/connecting_your_tools/parsers/file/clair.md | 10 +++++++++- .../parsers/file/cloudsploit.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/cobalt.md | 11 ++++++++++- .../parsers/file/codechecker.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/codeql.md | 9 +++++++++ .../connecting_your_tools/parsers/file/contrast.md | 11 ++++++++++- .../parsers/file/coverity_api.md | 11 ++++++++++- .../parsers/file/coverity_scan.md | 11 ++++++++++- .../parsers/file/crashtest_security.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/cred_scan.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/crunch42.md | 11 ++++++++++- .../parsers/file/cyberwatch_galeax.md | 9 ++++++++- .../connecting_your_tools/parsers/file/cyclonedx.md | 9 ++++++++- .../parsers/file/dawnscanner.md | 11 ++++++++++- .../parsers/file/deepfence_threatmapper.md | 9 ++++++++- .../parsers/file/dependency_check.md | 9 ++++++++- .../parsers/file/dependency_track.md | 9 ++++++++- .../parsers/file/detect_secrets.md | 11 ++++++++++- .../parsers/file/dockerbench.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/dockle.md | 9 ++++++++- .../connecting_your_tools/parsers/file/drheader.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/dsop.md | 7 ++++++- .../connecting_your_tools/parsers/file/edgescan.md | 9 +++++++++ .../en/connecting_your_tools/parsers/file/eslint.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/fortify.md | 11 ++++++++++- .../parsers/file/gcloud_artifact_scan.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/generic.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/ggshield.md | 11 ++++++++++- .../parsers/file/github_vulnerability.md | 11 ++++++++++- .../parsers/file/gitlab_api_fuzzing.md | 11 ++++++++++- .../parsers/file/gitlab_container_scan.md | 11 ++++++++++- .../parsers/file/gitlab_dast.md | 11 ++++++++++- .../parsers/file/gitlab_dep_scan.md | 11 ++++++++++- .../parsers/file/gitlab_sast.md | 11 ++++++++++- .../parsers/file/gitlab_secret_detection_report.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/gitleaks.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/gosec.md | 11 ++++++++++- .../parsers/file/govulncheck.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/h1.md | 8 +++++++- .../connecting_your_tools/parsers/file/hadolint.md | 11 ++++++++++- .../parsers/file/harbor_vulnerability.md | 11 ++++++++++- .../parsers/file/hcl_appscan.md | 8 +++++++- .../parsers/file/hcl_asoc_sast.md | 8 ++++++++ .../en/connecting_your_tools/parsers/file/horusec.md | 10 +++++++++- .../en/connecting_your_tools/parsers/file/humble.md | 7 ++++++- .../en/connecting_your_tools/parsers/file/huskyci.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/hydra.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/ibm_app.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/immuniweb.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/intsights.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/invicti.md | 7 +++++++ .../parsers/file/jfrog_xray_api_summary_artifact.md | 11 ++++++++++- .../parsers/file/jfrog_xray_on_demand_binary_scan.md | 9 ++++++++- .../parsers/file/jfrog_xray_unified.md | 10 +++++++++- .../connecting_your_tools/parsers/file/jfrogxray.md | 10 +++++++++- .../en/connecting_your_tools/parsers/file/kics.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/kiuwan.md | 9 +++++++++ .../connecting_your_tools/parsers/file/kiuwan_sca.md | 9 +++++++++ .../parsers/file/krakend_audit.md | 9 ++++++++- .../connecting_your_tools/parsers/file/kubeaudit.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/kubebench.md | 9 ++++++++- .../connecting_your_tools/parsers/file/kubehunter.md | 8 +++++++- .../connecting_your_tools/parsers/file/kubescape.md | 8 +++++++- .../connecting_your_tools/parsers/file/legitify.md | 9 ++++++++- .../en/connecting_your_tools/parsers/file/mend.md | 7 +++++++ .../connecting_your_tools/parsers/file/meterian.md | 11 ++++++++++- .../parsers/file/microfocus_webinspect.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/mobsf.md | 9 ++++++++- .../parsers/file/mobsf_scorecard.md | 9 ++++++++- .../connecting_your_tools/parsers/file/mobsfscan.md | 11 ++++++++++- .../parsers/file/mozilla_observatory.md | 11 ++++++++++- .../parsers/file/ms_defender.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/nancy.md | 6 ++++++ .../connecting_your_tools/parsers/file/netsparker.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/neuvector.md | 10 +++++++++- .../parsers/file/neuvector_compliance.md | 9 ++++++++- .../en/connecting_your_tools/parsers/file/nexpose.md | 8 ++++++++ .../en/connecting_your_tools/parsers/file/nikto.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/nmap.md | 11 ++++++++++- .../parsers/file/noseyparker.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/npm_audit.md | 9 +++++++++ .../parsers/file/npm_audit_7_plus.md | 8 ++++++++ .../en/connecting_your_tools/parsers/file/nsp.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/nuclei.md | 10 +++++++++- .../connecting_your_tools/parsers/file/openscap.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/openvas.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/ort.md | 11 ++++++++++- .../parsers/file/ossindex_devaudit.md | 11 ++++++++++- .../parsers/file/osv_scanner.md | 9 ++++++++- .../connecting_your_tools/parsers/file/outpost24.md | 11 ++++++++++- .../parsers/file/php_security_audit_v2.md | 11 ++++++++++- .../parsers/file/php_symfony_security_check.md | 8 +++++++- .../connecting_your_tools/parsers/file/pip_audit.md | 7 +++++++ .../en/connecting_your_tools/parsers/file/pmd.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/popeye.md | 8 +++++++- .../connecting_your_tools/parsers/file/progpilot.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/ptart.md | 8 ++++++++ .../connecting_your_tools/parsers/file/pwn_sast.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/qualys.md | 9 ++++++++- .../parsers/file/qualys_hacker_guardian.md | 9 ++++++++- .../parsers/file/qualys_infrascan_webgui.md | 11 ++++++++++- .../parsers/file/qualys_webapp.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/rapplex.md | 9 ++++++++- .../parsers/file/redhatsatellite.md | 8 +++++++- .../connecting_your_tools/parsers/file/retirejs.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/risk_recon.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/rubocop.md | 9 ++++++++- .../connecting_your_tools/parsers/file/rusty_hog.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/sarif.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/scantist.md | 11 ++++++++++- .../parsers/file/scout_suite.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/semgrep.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/skf.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/snyk.md | 10 +++++++++- .../connecting_your_tools/parsers/file/snyk_code.md | 8 +++++++- .../parsers/file/solar_appscreener.md | 10 +++++++++- .../connecting_your_tools/parsers/file/sonarqube.md | 6 +++++- .../connecting_your_tools/parsers/file/sonatype.md | 12 +++++++++++- .../connecting_your_tools/parsers/file/spotbugs.md | 10 +++++++++- .../connecting_your_tools/parsers/file/ssh_audit.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/ssl_labs.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/sslscan.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/sslyze.md | 8 +++++++- .../connecting_your_tools/parsers/file/stackhawk.md | 9 ++++++++- .../connecting_your_tools/parsers/file/sysdig_cli.md | 11 ++++++++++- .../parsers/file/sysdig_reports.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/talisman.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/tenable.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/terrascan.md | 12 +++++++++++- .../en/connecting_your_tools/parsers/file/testssl.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/tfsec.md | 10 +++++++++- .../connecting_your_tools/parsers/file/threagile.md | 9 ++++++++- .../parsers/file/threat_composer.md | 8 +++++++- .../en/connecting_your_tools/parsers/file/trivy.md | 11 ++++++++++- .../parsers/file/trivy_operator.md | 10 +++++++++- .../connecting_your_tools/parsers/file/trufflehog.md | 9 ++++++++- .../parsers/file/trufflehog3.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/trustwave.md | 9 +++++++++ .../parsers/file/trustwave_fusion_api.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/twistlock.md | 10 +++++++++- .../en/connecting_your_tools/parsers/file/vcg.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/veracode.md | 11 ++++++++++- .../parsers/file/veracode_sca.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/wapiti.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/wazuh.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/wfuzz.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/whispers.md | 9 ++++++++- .../parsers/file/whitehat_sentinel.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/wiz.md | 6 ++++++ .../connecting_your_tools/parsers/file/wizcli_dir.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/wizcli_iac.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/wizcli_img.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/wpscan.md | 9 ++++++++- .../connecting_your_tools/parsers/file/xanitizer.md | 11 ++++++++++- .../connecting_your_tools/parsers/file/yarn_audit.md | 11 ++++++++++- .../en/connecting_your_tools/parsers/file/zap.md | 9 ++++++++- 192 files changed, 1733 insertions(+), 170 deletions(-) diff --git a/docs/content/en/connecting_your_tools/parsers/file/acunetix.md b/docs/content/en/connecting_your_tools/parsers/file/acunetix.md index 97a2124e8ac..bca5abbd815 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/acunetix.md +++ b/docs/content/en/connecting_your_tools/parsers/file/acunetix.md @@ -5,4 +5,10 @@ toc_hide: true This parser imports the Acunetix Scanner with xml output or Acunetix 360 Scanner with JSON output. ### 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 +Sample Acunetix Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/acunetix). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/anchore_engine.md b/docs/content/en/connecting_your_tools/parsers/file/anchore_engine.md index 1d264c0b589..202e5ababb6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/anchore_engine.md +++ b/docs/content/en/connecting_your_tools/parsers/file/anchore_engine.md @@ -41,3 +41,12 @@ All properties are strings and are required by the parser. As the parser evolved ### Sample Scan Data Sample Anchore-Engine scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchore_engine) + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- component version +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/anchore_enterprise.md b/docs/content/en/connecting_your_tools/parsers/file/anchore_enterprise.md index 78d3441eb5c..19266a52fbd 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/anchore_enterprise.md +++ b/docs/content/en/connecting_your_tools/parsers/file/anchore_enterprise.md @@ -5,4 +5,12 @@ 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 +Sample Anchore Enterprise Policy Check scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchore_enterprise). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/anchore_grype.md b/docs/content/en/connecting_your_tools/parsers/file/anchore_grype.md index cdfdbcf73dc..5dde0ca9a1e 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/anchore_grype.md +++ b/docs/content/en/connecting_your_tools/parsers/file/anchore_grype.md @@ -189,4 +189,12 @@ All properties are expected as strings and are required by the parser. ~~~ ### Sample Scan Data -Sample Grype scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchore_grype). \ No newline at end of file +Sample Grype scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchore_grype). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/anchorectl_policies.md b/docs/content/en/connecting_your_tools/parsers/file/anchorectl_policies.md index 18dc798e633..653c291d795 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/anchorectl_policies.md +++ b/docs/content/en/connecting_your_tools/parsers/file/anchorectl_policies.md @@ -14,4 +14,12 @@ anchorectl policy evaluate -o json > policy_report.json ``` ### 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 +Sample AnchoreCTL Policies Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchorectl_policies). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/anchorectl_vulns.md b/docs/content/en/connecting_your_tools/parsers/file/anchorectl_vulns.md index 7f41b0e0a47..bec4cac19fd 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/anchorectl_vulns.md +++ b/docs/content/en/connecting_your_tools/parsers/file/anchorectl_vulns.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample AnchoreCTL Vuln Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/anchorectl_vulns). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- component version +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/appcheck_web_application_scanner.md b/docs/content/en/connecting_your_tools/parsers/file/appcheck_web_application_scanner.md index 5d003c8c4ec..eaa51a765ff 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/appcheck_web_application_scanner.md +++ b/docs/content/en/connecting_your_tools/parsers/file/appcheck_web_application_scanner.md @@ -5,4 +5,10 @@ toc_hide: true Accepts AppCheck Web Application Scanner output in .json format. ### Sample Scan Data -Sample AppCheck Web Application Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/appcheck_web_application_scanner). \ No newline at end of file +Sample AppCheck Web Application Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/appcheck_web_application_scanner). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/appspider.md b/docs/content/en/connecting_your_tools/parsers/file/appspider.md index 0fd952c0f0d..d041baad95c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/appspider.md +++ b/docs/content/en/connecting_your_tools/parsers/file/appspider.md @@ -6,4 +6,13 @@ 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 +Sample AppSpider (Rapid7) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/appspider). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/aqua.md b/docs/content/en/connecting_your_tools/parsers/file/aqua.md index d63b94ca6e4..4408126d07c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/aqua.md +++ b/docs/content/en/connecting_your_tools/parsers/file/aqua.md @@ -36,3 +36,11 @@ Those JSON files will only list vulnerabilities. Thus, DefectDojo parser will no ### Sample Scan Data Sample Aqua scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aqua). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- severity +- vulnerability ids +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/arachni.md b/docs/content/en/connecting_your_tools/parsers/file/arachni.md index 0c48e534d13..0fcb71515ec 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/arachni.md +++ b/docs/content/en/connecting_your_tools/parsers/file/arachni.md @@ -11,4 +11,12 @@ 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 +Sample Arachni Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/arachni). +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/asff.md b/docs/content/en/connecting_your_tools/parsers/file/asff.md index de830908aa2..8f54db8314d 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/asff.md +++ b/docs/content/en/connecting_your_tools/parsers/file/asff.md @@ -10,4 +10,13 @@ Reference: https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub- 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 +Sample AWS Security Finding Format (ASFF) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/asff). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/auditjs.md b/docs/content/en/connecting_your_tools/parsers/file/auditjs.md index 03ed4e4bf8e..5dd7f1dbd18 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/auditjs.md +++ b/docs/content/en/connecting_your_tools/parsers/file/auditjs.md @@ -9,4 +9,13 @@ 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 +Sample AuditJS (OSSIndex) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/auditjs). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/aws_inspector2.md b/docs/content/en/connecting_your_tools/parsers/file/aws_inspector2.md index d7507b61688..648235abb97 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/aws_inspector2.md +++ b/docs/content/en/connecting_your_tools/parsers/file/aws_inspector2.md @@ -22,3 +22,10 @@ Detailed API response format can be obtained [here](https://docs.aws.amazon.com/ ### Sample Scan Data Sample AWS Inspector2 findings can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aws_inspector2). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/aws_prowler.md b/docs/content/en/connecting_your_tools/parsers/file/aws_prowler.md index 628b657ef07..3750f60e1b3 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/aws_prowler.md +++ b/docs/content/en/connecting_your_tools/parsers/file/aws_prowler.md @@ -5,4 +5,13 @@ 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 +Sample AWS Prowler Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aws_prowler). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/aws_prowler_v3plus.md b/docs/content/en/connecting_your_tools/parsers/file/aws_prowler_v3plus.md index 687d9faf586..a5c4d27eb86 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/aws_prowler_v3plus.md +++ b/docs/content/en/connecting_your_tools/parsers/file/aws_prowler_v3plus.md @@ -160,4 +160,13 @@ The parser expects an array of assessments. All properties are strings and are r ~~~ ### Sample Scan Data -Unit tests of AWS Prowler v3 JSON and Prowler v4 JSON-OCSF can be found at https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aws_prowler_v3. \ No newline at end of file +Unit tests of AWS Prowler v3 JSON and Prowler v4 JSON-OCSF can be found at https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/aws_prowler_v3. + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/awssecurityhub.md b/docs/content/en/connecting_your_tools/parsers/file/awssecurityhub.md index d67fe1d9604..0e23b312370 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/awssecurityhub.md +++ b/docs/content/en/connecting_your_tools/parsers/file/awssecurityhub.md @@ -19,4 +19,13 @@ AWS Security Hub integrates with multiple AWS Tools. Thus, you can retrieve find AWS Security Hub Parser does import the affected service ARNs as hosts to DefectDojo. However, as ARNs contain invalid digits for hosts, the ARN is changed slightly. ":", " " & "/" are replaced by "_". ### Sample Scan Data -Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/awssecurityhub). \ No newline at end of file +Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/awssecurityhub). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/azure_security_center_recommendations.md b/docs/content/en/connecting_your_tools/parsers/file/azure_security_center_recommendations.md index c4bffbd7a3a..2651ebc6347 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/azure_security_center_recommendations.md +++ b/docs/content/en/connecting_your_tools/parsers/file/azure_security_center_recommendations.md @@ -5,4 +5,13 @@ 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 +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). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/bandit.md b/docs/content/en/connecting_your_tools/parsers/file/bandit.md index 70fde4b58b0..18643765bb4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/bandit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/bandit.md @@ -64,4 +64,11 @@ All properties are expected as strings, except "metrics" properties, which are e ~~~ ### Sample Scan Data -Sample Bandit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bandit). \ No newline at end of file +Sample Bandit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bandit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- file path +- line +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/bearer_cli.md b/docs/content/en/connecting_your_tools/parsers/file/bearer_cli.md index 8fd8457a403..f57af98f1ec 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/bearer_cli.md +++ b/docs/content/en/connecting_your_tools/parsers/file/bearer_cli.md @@ -10,4 +10,10 @@ To export a .json file from Bearer CLI, pass "-f json" to your Bearer command See Bearer documentation: https://docs.bearer.com/reference/commands/ ### Sample Scan Data -Sample Bearer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bearer) \ No newline at end of file +Sample Bearer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bearer). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/blackduck.md b/docs/content/en/connecting_your_tools/parsers/file/blackduck.md index 7f8226fd1e6..6c5b4406f04 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/blackduck.md +++ b/docs/content/en/connecting_your_tools/parsers/file/blackduck.md @@ -11,4 +11,12 @@ produce findings that bear file locations information. 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 +Sample Blackduck Hub scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/blackduck). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vulnerability ids +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/blackduck_binary_analysis.md b/docs/content/en/connecting_your_tools/parsers/file/blackduck_binary_analysis.md index 4d272b2d5be..516628f8f6a 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/blackduck_binary_analysis.md +++ b/docs/content/en/connecting_your_tools/parsers/file/blackduck_binary_analysis.md @@ -20,4 +20,13 @@ Black Duck Binary Analysis can also detect if sensitive information like email a * 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 +Sample Blackduck Binary Analysis scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/blackduck_binary_analysis). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/blackduck_component_risk.md b/docs/content/en/connecting_your_tools/parsers/file/blackduck_component_risk.md index 0a8ff1e7b1e..6f0322eb920 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/blackduck_component_risk.md +++ b/docs/content/en/connecting_your_tools/parsers/file/blackduck_component_risk.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Blackduck Component Risk scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/blackduck_component_risk). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/brakeman.md b/docs/content/en/connecting_your_tools/parsers/file/brakeman.md index ca708641383..68528bbd9ad 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/brakeman.md +++ b/docs/content/en/connecting_your_tools/parsers/file/brakeman.md @@ -5,4 +5,13 @@ 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 +Sample Brakeman Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/brakeman). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/bugcrowd.md b/docs/content/en/connecting_your_tools/parsers/file/bugcrowd.md index a04076f853e..86fc3f34311 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/bugcrowd.md +++ b/docs/content/en/connecting_your_tools/parsers/file/bugcrowd.md @@ -5,4 +5,13 @@ 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 +Sample Bugcrowd scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bugcrowd). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/bundler_audit.md b/docs/content/en/connecting_your_tools/parsers/file/bundler_audit.md index 04d8bceb423..f854657d2ba 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/bundler_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/bundler_audit.md @@ -5,4 +5,13 @@ 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 +Sample Bundler-Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/bundler_audit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/burp.md b/docs/content/en/connecting_your_tools/parsers/file/burp.md index ba8ccbe0f3a..0a43859a0cd 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/burp.md +++ b/docs/content/en/connecting_your_tools/parsers/file/burp.md @@ -41,4 +41,11 @@ All XML elements are required and will be parsed as strings. ~~~ ### Sample Scan Data -Sample Burp scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp). \ No newline at end of file +Sample Burp scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/burp_api.md b/docs/content/en/connecting_your_tools/parsers/file/burp_api.md index 686e781b043..13882b1f1a8 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/burp_api.md +++ b/docs/content/en/connecting_your_tools/parsers/file/burp_api.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Burp REST API scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_api). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/burp_dastardly.md b/docs/content/en/connecting_your_tools/parsers/file/burp_dastardly.md index 418ad5f7861..bf0c29f0fa0 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/burp_dastardly.md +++ b/docs/content/en/connecting_your_tools/parsers/file/burp_dastardly.md @@ -8,4 +8,13 @@ DefectDojo parser accepts Burp Dastardly Scans as an XML output. Dastardly is a free, lightweight web application security scanner for your CI/CD pipeline. It is designed specifically for web developers, and checks your application for seven security issues that are likely to interest you during software development. Dastardly is based on the same scanner as Burp Suite (Burp Scanner). ### Sample Scan Data -Sample Burp Dastardly scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_dastardly). \ No newline at end of file +Sample Burp Dastardly scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_dastardly). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/burp_graphql.md b/docs/content/en/connecting_your_tools/parsers/file/burp_graphql.md index 0139eaac612..1f97fa64951 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/burp_graphql.md +++ b/docs/content/en/connecting_your_tools/parsers/file/burp_graphql.md @@ -105,4 +105,13 @@ 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 +Sample Burp GraphQL scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/burp_graphql). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/burp_suite_dast.md b/docs/content/en/connecting_your_tools/parsers/file/burp_suite_dast.md index 484f7463a4a..f17f7ef7460 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/burp_suite_dast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/burp_suite_dast.md @@ -105,3 +105,10 @@ Sample Burp Suite DAST Scan scans can be found [here](https://github.com/DefectD ### Link to Tool [Burp Suite DAST](https://portswigger.net/burp/dast) + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- cwe diff --git a/docs/content/en/connecting_your_tools/parsers/file/cargo_audit.md b/docs/content/en/connecting_your_tools/parsers/file/cargo_audit.md index d56b41200c8..c5070fcc508 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/cargo_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/cargo_audit.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample CargoAudit Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cargo_audit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vulnerability ids +- severity +- component name +- component version +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/checkmarx.md b/docs/content/en/connecting_your_tools/parsers/file/checkmarx.md index 679adf935f9..086bfad0265 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/checkmarx.md +++ b/docs/content/en/connecting_your_tools/parsers/file/checkmarx.md @@ -14,4 +14,11 @@ That will generate three files, two of which are needed for defectdojo. Build th 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 +Sample Checkmarx scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkmarx). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- cwe +- severity +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/checkmarx_cxflow_sast.md b/docs/content/en/connecting_your_tools/parsers/file/checkmarx_cxflow_sast.md index b984b7dd694..8d66b385e53 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/checkmarx_cxflow_sast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/checkmarx_cxflow_sast.md @@ -20,3 +20,10 @@ cx-flow: ### Sample Scan Data Sample Checkmarx CxFlow SAST scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkmarx_cxflow_sast). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- file path +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/checkmarx_one.md b/docs/content/en/connecting_your_tools/parsers/file/checkmarx_one.md index 9012eb576f6..7868d5b2c36 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/checkmarx_one.md +++ b/docs/content/en/connecting_your_tools/parsers/file/checkmarx_one.md @@ -148,3 +148,9 @@ Sample Checkmarx One scans can be found [here](https://github.com/DefectDojo/dja ### Link To Tool - [Checkmarx One](https://checkmarx.com/product/application-security-platform/) - [Checkmarx One Documentation](https://checkmarx.com/resource/documents/en/34965-68516-checkmarx-one-documentation-portal.html) + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vulnerability ids +- component name diff --git a/docs/content/en/connecting_your_tools/parsers/file/checkov.md b/docs/content/en/connecting_your_tools/parsers/file/checkov.md index 8c45815da14..b1c08715148 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/checkov.md +++ b/docs/content/en/connecting_your_tools/parsers/file/checkov.md @@ -49,4 +49,13 @@ JSON files can be created from the Checkov CLI: https://www.checkov.io/2.Basics/ ~~~ ### Sample Scan Data -Sample Checkov scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkov). \ No newline at end of file +Sample Checkov scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/checkov). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/chefinspect.md b/docs/content/en/connecting_your_tools/parsers/file/chefinspect.md index 193dbb17817..a9c6f0a11b4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/chefinspect.md +++ b/docs/content/en/connecting_your_tools/parsers/file/chefinspect.md @@ -9,3 +9,12 @@ 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 + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/clair.md b/docs/content/en/connecting_your_tools/parsers/file/clair.md index 7c7ac5baefc..7a3164789a6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/clair.md +++ b/docs/content/en/connecting_your_tools/parsers/file/clair.md @@ -5,4 +5,12 @@ toc_hide: true You can import JSON reports of Docker image vulnerabilities found by a Clair scan or the Clair Klar client. ### 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 +Sample Clair Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/clair). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vulnerability ids +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/cloudsploit.md b/docs/content/en/connecting_your_tools/parsers/file/cloudsploit.md index 8e178efdffa..425330bbb42 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/cloudsploit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/cloudsploit.md @@ -5,4 +5,10 @@ toc_hide: true 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 +Sample Cloudsploit (AquaSecurity) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cloudsploit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/cobalt.md b/docs/content/en/connecting_your_tools/parsers/file/cobalt.md index c17f0f662a5..aefaaff6b57 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/cobalt.md +++ b/docs/content/en/connecting_your_tools/parsers/file/cobalt.md @@ -5,4 +5,13 @@ 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 +Sample Cobalt.io Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cobalt). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/codechecker.md b/docs/content/en/connecting_your_tools/parsers/file/codechecker.md index 912fdcab269..239cd18900b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/codechecker.md +++ b/docs/content/en/connecting_your_tools/parsers/file/codechecker.md @@ -21,4 +21,13 @@ CodeChecker analyze ./codechecker.log -o /path/to/codechecker/analyzer/output/di ``` ### 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 +Sample Codechecker Report native scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/codechecker). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/codeql.md b/docs/content/en/connecting_your_tools/parsers/file/codeql.md index ed26dc1571f..f6844cda3c6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/codeql.md +++ b/docs/content/en/connecting_your_tools/parsers/file/codeql.md @@ -10,3 +10,12 @@ codeql database analyze db python-security-and-quality.qls --sarif-add-snippets The same can be achieved by running the CodeQL GitHub action with the `add-snippet` property set to true. + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/contrast.md b/docs/content/en/connecting_your_tools/parsers/file/contrast.md index bf667bc7bd0..6a6eb8aa708 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/contrast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/contrast.md @@ -5,4 +5,13 @@ 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 +Sample Contrast Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/contrast). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/coverity_api.md b/docs/content/en/connecting_your_tools/parsers/file/coverity_api.md index 8d72942a292..0a10a6b2906 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/coverity_api.md +++ b/docs/content/en/connecting_your_tools/parsers/file/coverity_api.md @@ -13,4 +13,13 @@ Currently these columns are mandatory: 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 +Sample Coverity API scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/coverity_api). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/coverity_scan.md b/docs/content/en/connecting_your_tools/parsers/file/coverity_scan.md index 63cca6964f6..a914075fd57 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/coverity_scan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/coverity_scan.md @@ -11,4 +11,13 @@ Documentation for CLI can be found [here](https://sig-product-docs.synopsys.com/ Run `coverity scan --project-dir --local --local-format json` to create the JSON report. ### Sample Scan Data -Sample Coverity scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/coverity_scan). \ No newline at end of file +Sample Coverity scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/coverity_scan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/crashtest_security.md b/docs/content/en/connecting_your_tools/parsers/file/crashtest_security.md index cce1b524cf6..56d56e3beb1 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/crashtest_security.md +++ b/docs/content/en/connecting_your_tools/parsers/file/crashtest_security.md @@ -5,4 +5,13 @@ 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 +Sample Crashtest Security scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/crashtest_security). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/cred_scan.md b/docs/content/en/connecting_your_tools/parsers/file/cred_scan.md index 7a52a74b141..5ad1e67edbc 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/cred_scan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/cred_scan.md @@ -5,4 +5,13 @@ 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 +Sample CredScan Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cred_scan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/crunch42.md b/docs/content/en/connecting_your_tools/parsers/file/crunch42.md index e8aa1b1e556..9647d3f9f6b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/crunch42.md +++ b/docs/content/en/connecting_your_tools/parsers/file/crunch42.md @@ -5,4 +5,13 @@ toc_hide: true Import JSON findings from Crunch42 vulnerability scan tool. ### Sample Scan Data -Sample Crunch42 Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/crunch42). \ No newline at end of file +Sample Crunch42 Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/crunch42). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/cyberwatch_galeax.md b/docs/content/en/connecting_your_tools/parsers/file/cyberwatch_galeax.md index f664459a4ec..c6e22181a24 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/cyberwatch_galeax.md +++ b/docs/content/en/connecting_your_tools/parsers/file/cyberwatch_galeax.md @@ -11,4 +11,11 @@ The JSON file should include the following keys: For each CVE and security issue found in the JSON input, the parser creates a corresponding finding in DefectDojo. ### Sample Scan Data -Sample Cybwerwatch Galeax Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cyberwatch). \ No newline at end of file +Sample Cybwerwatch Galeax Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cyberwatch). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/cyclonedx.md b/docs/content/en/connecting_your_tools/parsers/file/cyclonedx.md index d0d6a4e61a2..fc36aad7a95 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/cyclonedx.md +++ b/docs/content/en/connecting_your_tools/parsers/file/cyclonedx.md @@ -28,4 +28,11 @@ cyclonedx-py {{< /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 +Sample CycloneDX scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/cyclonedx). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/dawnscanner.md b/docs/content/en/connecting_your_tools/parsers/file/dawnscanner.md index bc3682cf9a8..96b1d8dce82 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/dawnscanner.md +++ b/docs/content/en/connecting_your_tools/parsers/file/dawnscanner.md @@ -5,4 +5,13 @@ 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 +Sample DawnScanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dawnscanner). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/deepfence_threatmapper.md b/docs/content/en/connecting_your_tools/parsers/file/deepfence_threatmapper.md index 84044fb72b4..362c8dc92e5 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/deepfence_threatmapper.md +++ b/docs/content/en/connecting_your_tools/parsers/file/deepfence_threatmapper.md @@ -5,4 +5,11 @@ toc_hide: true Import compliance, malware, secret, vulnerability reports from [Deepfence Threatmapper](https://github.com/deepfence/ThreatMapper) in XLSX file format. ### Sample Scan Data -Sample Threatmapper scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/deepfence_threatmapper). In this link are both .xlsx and .csv listed. They contain the same content, but csv can be read in the Browser, but only xlsx is supported by the parser. \ No newline at end of file +Sample Threatmapper scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/deepfence_threatmapper). In this link are both .xlsx and .csv listed. They contain the same content, but csv can be read in the Browser, but only xlsx is supported by the parser. + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/dependency_check.md b/docs/content/en/connecting_your_tools/parsers/file/dependency_check.md index ddc631a1279..f4f56ce8325 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/dependency_check.md +++ b/docs/content/en/connecting_your_tools/parsers/file/dependency_check.md @@ -10,4 +10,11 @@ OWASP Dependency Check output can be imported in Xml format. This parser ingests * 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 +Sample Dependency Check scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dependency_check). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/dependency_track.md b/docs/content/en/connecting_your_tools/parsers/file/dependency_track.md index 147d0afe4b5..908458899d8 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/dependency_track.md +++ b/docs/content/en/connecting_your_tools/parsers/file/dependency_track.md @@ -11,4 +11,11 @@ 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 +Sample Dependency Track scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dependency_track). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- component name +- component version +- vulnerability ids diff --git a/docs/content/en/connecting_your_tools/parsers/file/detect_secrets.md b/docs/content/en/connecting_your_tools/parsers/file/detect_secrets.md index b9a54199389..871cc02cef5 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/detect_secrets.md +++ b/docs/content/en/connecting_your_tools/parsers/file/detect_secrets.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Detect-secrets scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/detect_secrets). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/dockerbench.md b/docs/content/en/connecting_your_tools/parsers/file/dockerbench.md index f4f2840fa75..c192a179e0c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/dockerbench.md +++ b/docs/content/en/connecting_your_tools/parsers/file/dockerbench.md @@ -6,4 +6,13 @@ Import JSON reports of OWASP [docker-bench-security](https://github.com/docker/d 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 +Sample docker-bench-security Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dockerbench). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/dockle.md b/docs/content/en/connecting_your_tools/parsers/file/dockle.md index b3944b174da..a02f8e4b601 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/dockle.md +++ b/docs/content/en/connecting_your_tools/parsers/file/dockle.md @@ -6,4 +6,11 @@ Import JSON container image linter reports ### 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 +Sample Dockle Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dockle). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/drheader.md b/docs/content/en/connecting_your_tools/parsers/file/drheader.md index 26789703c9f..42a52cc0cea 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/drheader.md +++ b/docs/content/en/connecting_your_tools/parsers/file/drheader.md @@ -6,4 +6,10 @@ 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 +Sample DrHeader scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/drheader). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/dsop.md b/docs/content/en/connecting_your_tools/parsers/file/dsop.md index cbee05be1b1..1e7a0f3e5ac 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/dsop.md +++ b/docs/content/en/connecting_your_tools/parsers/file/dsop.md @@ -5,4 +5,9 @@ toc_hide: true 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 +Sample DSOP Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/dsop). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vulnerability ids diff --git a/docs/content/en/connecting_your_tools/parsers/file/edgescan.md b/docs/content/en/connecting_your_tools/parsers/file/edgescan.md index dccd42fef99..9391dcaa9b1 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/edgescan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/edgescan.md @@ -4,3 +4,12 @@ toc_hide: true --- Import Edgescan vulnerabilities by JSON file or [API - no file required](../../api/edgescan) + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/eslint.md b/docs/content/en/connecting_your_tools/parsers/file/eslint.md index 8bf3dbcafa0..8b6410b3754 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/eslint.md +++ b/docs/content/en/connecting_your_tools/parsers/file/eslint.md @@ -5,4 +5,13 @@ 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 +Sample ESLint scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/eslint). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/fortify.md b/docs/content/en/connecting_your_tools/parsers/file/fortify.md index ec4bd4da241..9fede87689d 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/fortify.md +++ b/docs/content/en/connecting_your_tools/parsers/file/fortify.md @@ -25,4 +25,13 @@ Once this is complete, you can run the following command on your .fpr file to ge required XML: ```bash ./path/to/ReportGenerator -format xml -f /path/to/output.xml -source /path/to/downloaded/artifact.fpr -template DefaultReportDefinitionAllIssues.xml -``` \ No newline at end of file +``` + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gcloud_artifact_scan.md b/docs/content/en/connecting_your_tools/parsers/file/gcloud_artifact_scan.md index cb752af29c5..dc1ead4ef53 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gcloud_artifact_scan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gcloud_artifact_scan.md @@ -9,4 +9,13 @@ Once a scan is completed, results can be pulled via API/gcloud https://cloud.goo 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 +Sample reports can be found at https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gcloud_artifact_scan + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/generic.md b/docs/content/en/connecting_your_tools/parsers/file/generic.md index 6a4de5e1782..8952e83858b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/generic.md +++ b/docs/content/en/connecting_your_tools/parsers/file/generic.md @@ -144,4 +144,13 @@ 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 +Sample Generic Findings Import scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/generic). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ggshield.md b/docs/content/en/connecting_your_tools/parsers/file/ggshield.md index 4f106162e5e..08ff52a323f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ggshield.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ggshield.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Ggshield scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ggshield). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/github_vulnerability.md b/docs/content/en/connecting_your_tools/parsers/file/github_vulnerability.md index 8e4f3a8222e..71350815e95 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/github_vulnerability.md +++ b/docs/content/en/connecting_your_tools/parsers/file/github_vulnerability.md @@ -211,4 +211,13 @@ def get_dependabot_alerts_repository(repo, owner): ``` ### 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 +Sample Github Vulnerability scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/github_vulnerability). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- vulnerability ids +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitlab_api_fuzzing.md b/docs/content/en/connecting_your_tools/parsers/file/gitlab_api_fuzzing.md index 9ef8535dace..7a4803138f8 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitlab_api_fuzzing.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitlab_api_fuzzing.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample GitLab API Fuzzing Report Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_api_fuzzing). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitlab_container_scan.md b/docs/content/en/connecting_your_tools/parsers/file/gitlab_container_scan.md index 5ff26c7573a..df8be563f3c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitlab_container_scan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitlab_container_scan.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample GitLab Container Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_container_scan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitlab_dast.md b/docs/content/en/connecting_your_tools/parsers/file/gitlab_dast.md index b3abcfcc8a4..e28b69abc49 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitlab_dast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitlab_dast.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample GitLab DAST Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_dast). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitlab_dep_scan.md b/docs/content/en/connecting_your_tools/parsers/file/gitlab_dep_scan.md index bb5e9bfe30b..e490565d2f2 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitlab_dep_scan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitlab_dep_scan.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample GitLab Dependency Scanning Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_dep_scan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vulnerability ids +- file path +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitlab_sast.md b/docs/content/en/connecting_your_tools/parsers/file/gitlab_sast.md index e592da480a4..8d618be57b2 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitlab_sast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitlab_sast.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample GitLab SAST Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_sast). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitlab_secret_detection_report.md b/docs/content/en/connecting_your_tools/parsers/file/gitlab_secret_detection_report.md index f3a0d2dc99a..9f0fab9d42c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitlab_secret_detection_report.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitlab_secret_detection_report.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample GitLab Secret Detection Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitlab_secret_detection_report). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gitleaks.md b/docs/content/en/connecting_your_tools/parsers/file/gitleaks.md index 00b067e4677..daf9958b84e 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gitleaks.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gitleaks.md @@ -5,4 +5,13 @@ 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 +Sample Gitleaks scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gitleaks). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/gosec.md b/docs/content/en/connecting_your_tools/parsers/file/gosec.md index fbe5bcbf2e2..2ad6a90cae4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/gosec.md +++ b/docs/content/en/connecting_your_tools/parsers/file/gosec.md @@ -5,4 +5,13 @@ 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 +Sample Gosec Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/gosec). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/govulncheck.md b/docs/content/en/connecting_your_tools/parsers/file/govulncheck.md index 8637fc2a429..b4aeb9b3dff 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/govulncheck.md +++ b/docs/content/en/connecting_your_tools/parsers/file/govulncheck.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Govulncheck scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/govulncheck). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/h1.md b/docs/content/en/connecting_your_tools/parsers/file/h1.md index 1b4628c1658..0e255825acc 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/h1.md +++ b/docs/content/en/connecting_your_tools/parsers/file/h1.md @@ -5,4 +5,10 @@ toc_hide: true Import HackerOne cases findings in JSON format (vulnerability disclosure parser) or Bug Bounties in JSON or CSV format (bug bounty parser) ### 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 +Sample HackerOne Cases scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/h1). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/hadolint.md b/docs/content/en/connecting_your_tools/parsers/file/hadolint.md index ccc60f7b637..9de0f020e8a 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/hadolint.md +++ b/docs/content/en/connecting_your_tools/parsers/file/hadolint.md @@ -5,4 +5,13 @@ 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 +Sample Hadolint scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hadolint). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/harbor_vulnerability.md b/docs/content/en/connecting_your_tools/parsers/file/harbor_vulnerability.md index 33878003bd0..97ed0272b3b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/harbor_vulnerability.md +++ b/docs/content/en/connecting_your_tools/parsers/file/harbor_vulnerability.md @@ -6,4 +6,13 @@ Import findings from Harbor registry container scan: ### 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 +Sample Harbor Vulnerability scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/harbor_vulnerability). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/hcl_appscan.md b/docs/content/en/connecting_your_tools/parsers/file/hcl_appscan.md index 2a837039553..234f0a7ef3a 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/hcl_appscan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/hcl_appscan.md @@ -5,4 +5,10 @@ toc_hide: true The HCL Appscan has the possibility 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 +Sample HCL Appscan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hcl_appscan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/hcl_asoc_sast.md b/docs/content/en/connecting_your_tools/parsers/file/hcl_asoc_sast.md index da86383ee37..795e479feb4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/hcl_asoc_sast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/hcl_asoc_sast.md @@ -6,3 +6,11 @@ HCL Appscan on Cloud can export the results in PDF, XML and CSV formats but this ### Sample Scan Data Sample HCL AppScan on Cloud SAST scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hcl_asoc_sast). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- file path +- line +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/horusec.md b/docs/content/en/connecting_your_tools/parsers/file/horusec.md index b347bef33e0..06a71880b57 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/horusec.md +++ b/docs/content/en/connecting_your_tools/parsers/file/horusec.md @@ -12,4 +12,12 @@ References: * [GitHub repository](https://github.com/ZupIT/horusec) ### 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 +Sample Horusec scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/horusec). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- file path +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/humble.md b/docs/content/en/connecting_your_tools/parsers/file/humble.md index e2e4faaec80..cba72702a2e 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/humble.md +++ b/docs/content/en/connecting_your_tools/parsers/file/humble.md @@ -6,4 +6,9 @@ Import JSON report of the Humble scanner ### 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 +Sample Humble Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/humble). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title diff --git a/docs/content/en/connecting_your_tools/parsers/file/huskyci.md b/docs/content/en/connecting_your_tools/parsers/file/huskyci.md index 660e00505b4..fb774a0ab41 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/huskyci.md +++ b/docs/content/en/connecting_your_tools/parsers/file/huskyci.md @@ -6,4 +6,13 @@ Import JSON reports from [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 +Sample HuskyCI Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/huskyci). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/hydra.md b/docs/content/en/connecting_your_tools/parsers/file/hydra.md index abd5a644d89..26290d300d6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/hydra.md +++ b/docs/content/en/connecting_your_tools/parsers/file/hydra.md @@ -40,4 +40,10 @@ Sample JSON report: ``` ### 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 +Sample Hydra scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/hydra). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ibm_app.md b/docs/content/en/connecting_your_tools/parsers/file/ibm_app.md index 71ffd51815a..853e3770404 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ibm_app.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ibm_app.md @@ -5,4 +5,13 @@ 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 +Sample IBM AppScan DAST scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ibm_app). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/immuniweb.md b/docs/content/en/connecting_your_tools/parsers/file/immuniweb.md index 40f3c893967..9dbfec3b3eb 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/immuniweb.md +++ b/docs/content/en/connecting_your_tools/parsers/file/immuniweb.md @@ -5,4 +5,13 @@ toc_hide: true XML or JSON Scan Result File from [Immuniweb Scan](https://www.immuniweb.com/). ### 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 +Sample Immuniweb Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/immuniweb). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/intsights.md b/docs/content/en/connecting_your_tools/parsers/file/intsights.md index 64b6e58860e..a31ff0ce916 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/intsights.md +++ b/docs/content/en/connecting_your_tools/parsers/file/intsights.md @@ -62,4 +62,13 @@ 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 +Sample IntSights Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/intsights). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/invicti.md b/docs/content/en/connecting_your_tools/parsers/file/invicti.md index c0ffda1a48e..2527847606f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/invicti.md +++ b/docs/content/en/connecting_your_tools/parsers/file/invicti.md @@ -7,3 +7,10 @@ Vulnerabilities List - JSON report ### Sample Scan Data Sample Invicti scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/invicti). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_api_summary_artifact.md b/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_api_summary_artifact.md index e99f5f4da61..75452a0421c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_api_summary_artifact.md +++ b/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_api_summary_artifact.md @@ -10,4 +10,13 @@ Accepts a JSON File, generated from the JFrog Artifact Summary API Call. Sample JFrog Xray API Summary Artifact Scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/jfrog_xray_api_summary_artifact). ### Link To Tool -See JFrog Documentation: https://jfrog.com/help/r/jfrog-rest-apis/summary \ No newline at end of file +See JFrog Documentation: https://jfrog.com/help/r/jfrog-rest-apis/summary + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_on_demand_binary_scan.md b/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_on_demand_binary_scan.md index 438bf065a39..c324e5d4069 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_on_demand_binary_scan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_on_demand_binary_scan.md @@ -9,4 +9,11 @@ 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 +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). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_unified.md b/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_unified.md index b8b55db0e79..f8301db839a 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_unified.md +++ b/docs/content/en/connecting_your_tools/parsers/file/jfrog_xray_unified.md @@ -5,4 +5,12 @@ 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 +Sample JFrog XRay Unified scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/jfrog_xray_unified). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vulnerability ids +- file path +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/jfrogxray.md b/docs/content/en/connecting_your_tools/parsers/file/jfrogxray.md index c3cb126fa20..c97181ac58d 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/jfrogxray.md +++ b/docs/content/en/connecting_your_tools/parsers/file/jfrogxray.md @@ -5,4 +5,12 @@ 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 +Sample JFrogXRay scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/jfrogxray). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/kics.md b/docs/content/en/connecting_your_tools/parsers/file/kics.md index 370421cce84..18f5a5eecad 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kics.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kics.md @@ -5,4 +5,13 @@ 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 +Sample KICS Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kics). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- file path +- line +- severity +- description +- title diff --git a/docs/content/en/connecting_your_tools/parsers/file/kiuwan.md b/docs/content/en/connecting_your_tools/parsers/file/kiuwan.md index af7ade87da2..b45544fc1ad 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kiuwan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kiuwan.md @@ -6,3 +6,12 @@ Import Kiuwan SAST Scan in CSV format. Export as CSV Results on Kiuwan, or via t ### Sample Scan Data Sample Kiuwan Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kiuwan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- description +- severity +- component name +- component version +- cwe diff --git a/docs/content/en/connecting_your_tools/parsers/file/kiuwan_sca.md b/docs/content/en/connecting_your_tools/parsers/file/kiuwan_sca.md index 08709ad134d..1e1d6874718 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kiuwan_sca.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kiuwan_sca.md @@ -24,3 +24,12 @@ saveFile("result.json", json.dumps(data, indent=2)) ### Sample Scan Data Sample Kiuwan Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kiuwan_sca). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/krakend_audit.md b/docs/content/en/connecting_your_tools/parsers/file/krakend_audit.md index 9598ce343b8..130794e84fa 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/krakend_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/krakend_audit.md @@ -8,4 +8,11 @@ krakend audit -c krakend.json -f "{{ marshal . }}" >> recommendations.json ``` ### Sample Scan Data -Sample KrakenD Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/krakend_audit). \ No newline at end of file +Sample KrakenD Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/krakend_audit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- description +- mitigation +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/kubeaudit.md b/docs/content/en/connecting_your_tools/parsers/file/kubeaudit.md index cefffcbc4a9..d0e0f4a0626 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kubeaudit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kubeaudit.md @@ -5,4 +5,13 @@ toc_hide: true Kubeaudit is a command line tool and a Go package to audit Kubernetes clusters for various different security concerns. The output of of Kubeaudit which is supported within this parser is JSON. The tool can be found [here](https://github.com/Shopify/kubeaudit) ### Sample Scan Data -Sample Kubeaudit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubeaudit). \ No newline at end of file +Sample Kubeaudit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubeaudit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/kubebench.md b/docs/content/en/connecting_your_tools/parsers/file/kubebench.md index 89e1e3c3a6b..57054a2850c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kubebench.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kubebench.md @@ -5,4 +5,11 @@ 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 +Sample kube-bench Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubebench). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vuln id from tool +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/kubehunter.md b/docs/content/en/connecting_your_tools/parsers/file/kubehunter.md index 08f932d5f86..926596a27dd 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kubehunter.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kubehunter.md @@ -5,4 +5,10 @@ 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 +Sample kubeHunter Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubehunter). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/kubescape.md b/docs/content/en/connecting_your_tools/parsers/file/kubescape.md index fefb7cd476d..41e44279e34 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/kubescape.md +++ b/docs/content/en/connecting_your_tools/parsers/file/kubescape.md @@ -7,4 +7,10 @@ Kubescape is a K8s open-source tool providing a Kubernetes single pane of glass, The parser supports json output files ### Sample Scan Data -Sample Kubescape scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubescape). \ No newline at end of file +Sample Kubescape scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/kubescape). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- component name diff --git a/docs/content/en/connecting_your_tools/parsers/file/legitify.md b/docs/content/en/connecting_your_tools/parsers/file/legitify.md index bb9b2970aee..e9eaa111c9f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/legitify.md +++ b/docs/content/en/connecting_your_tools/parsers/file/legitify.md @@ -6,4 +6,11 @@ toc_hide: true This DefectDojo parser accepts JSON files (in flattened format) from Legitify. For further details regarding the results, please consult the relevant [documentation](https://github.com/Legit-Labs/legitify?tab=readme-ov-file#output-options). ### Sample Scan Data -Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/legitify). \ No newline at end of file +Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/legitify). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- endpoints +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/mend.md b/docs/content/en/connecting_your_tools/parsers/file/mend.md index 2ec28770586..a2706f7fbd5 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/mend.md +++ b/docs/content/en/connecting_your_tools/parsers/file/mend.md @@ -13,3 +13,10 @@ Unit tests for Mend JSON files can be found at https://github.com/DefectDojo/dja See documentation: https://docs.mend.io/bundle/unified_agent/page/example_of_a_unified_agent_json_report.html *Formerly known as Whitesource.* + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/meterian.md b/docs/content/en/connecting_your_tools/parsers/file/meterian.md index bf2d3bea8bc..852e71a286b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/meterian.md +++ b/docs/content/en/connecting_your_tools/parsers/file/meterian.md @@ -5,4 +5,13 @@ 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 +Sample Meterian Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/meterian). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- cwe +- component name +- component version +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/microfocus_webinspect.md b/docs/content/en/connecting_your_tools/parsers/file/microfocus_webinspect.md index e087e4267e8..faa515c5d84 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/microfocus_webinspect.md +++ b/docs/content/en/connecting_your_tools/parsers/file/microfocus_webinspect.md @@ -5,4 +5,13 @@ 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 +Sample Microfocus Webinspect Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/microfocus_webinspect). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/mobsf.md b/docs/content/en/connecting_your_tools/parsers/file/mobsf.md index 44985929fdb..7bbbf564a0c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/mobsf.md +++ b/docs/content/en/connecting_your_tools/parsers/file/mobsf.md @@ -5,4 +5,11 @@ 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 +Sample MobSF Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mobsf). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/mobsf_scorecard.md b/docs/content/en/connecting_your_tools/parsers/file/mobsf_scorecard.md index 947228d9402..0878c58b7b7 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/mobsf_scorecard.md +++ b/docs/content/en/connecting_your_tools/parsers/file/mobsf_scorecard.md @@ -5,4 +5,11 @@ toc_hide: true Export a JSON file using the API, api/v1/report_json. ### Sample Scan Data -Sample MobSF Scorecard Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mobsf_scorecard). \ No newline at end of file +Sample MobSF Scorecard Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mobsf_scorecard). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/mobsfscan.md b/docs/content/en/connecting_your_tools/parsers/file/mobsfscan.md index 7209f80b403..2c39d114287 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/mobsfscan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/mobsfscan.md @@ -5,4 +5,13 @@ 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 +Sample Mobsfscan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mobsfscan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- cwe +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/mozilla_observatory.md b/docs/content/en/connecting_your_tools/parsers/file/mozilla_observatory.md index 3d1150821d3..f82b43524ad 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/mozilla_observatory.md +++ b/docs/content/en/connecting_your_tools/parsers/file/mozilla_observatory.md @@ -5,4 +5,13 @@ 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 +Sample Mozilla Observatory Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/mozilla_observatory). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ms_defender.md b/docs/content/en/connecting_your_tools/parsers/file/ms_defender.md index 7e9f65373ea..acf087f5245 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ms_defender.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ms_defender.md @@ -8,4 +8,10 @@ This parser helps to parse Microsoft Defender Findings and supports two types of
However, if you have a fast changing environment with a huge number of vulnerabilities and endpoints, it is recommended to leave the folder machines/ empty. Then, for stability reasons the machine info is skipped and only the machineID is added 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 +Sample MS Defender Parser scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ms_defender). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/nancy.md b/docs/content/en/connecting_your_tools/parsers/file/nancy.md index 55376df5392..5a41f75abaf 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/nancy.md +++ b/docs/content/en/connecting_your_tools/parsers/file/nancy.md @@ -17,3 +17,9 @@ Sample Nancy scans can be found [here](https://github.com/DefectDojo/django-Defe ### Link To Tool See Nancy on GitHub: https://github.com/sonatype-nexus-community/nancy + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/netsparker.md b/docs/content/en/connecting_your_tools/parsers/file/netsparker.md index 09aebb72487..2e6a6e4e0d6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/netsparker.md +++ b/docs/content/en/connecting_your_tools/parsers/file/netsparker.md @@ -9,4 +9,13 @@ 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 +Sample Netsparker scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/netsparker). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/neuvector.md b/docs/content/en/connecting_your_tools/parsers/file/neuvector.md index 5acf03267a2..19f874a0c88 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/neuvector.md +++ b/docs/content/en/connecting_your_tools/parsers/file/neuvector.md @@ -5,4 +5,12 @@ toc_hide: true 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 +Sample NeuVector (compliance) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/neuvector). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/neuvector_compliance.md b/docs/content/en/connecting_your_tools/parsers/file/neuvector_compliance.md index cce614b2f90..be04ef31853 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/neuvector_compliance.md +++ b/docs/content/en/connecting_your_tools/parsers/file/neuvector_compliance.md @@ -5,4 +5,11 @@ toc_hide: true 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 +Sample NeuVector (REST) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/neuvector_compliance). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vuln id from tool +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/nexpose.md b/docs/content/en/connecting_your_tools/parsers/file/nexpose.md index db8de53d81b..74fcae1abde 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/nexpose.md +++ b/docs/content/en/connecting_your_tools/parsers/file/nexpose.md @@ -108,3 +108,11 @@ Sample Nexpose XML 2.0 (Rapid7) scans can be found in the [unit test example sca ### Link To Tool - [Rapid7 Nexpose](https://www.rapid7.com/products/nexpose/) - [Nexpose Documentation](https://docs.rapid7.com/nexpose/) + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- vulnerability ids +- cwe diff --git a/docs/content/en/connecting_your_tools/parsers/file/nikto.md b/docs/content/en/connecting_your_tools/parsers/file/nikto.md index 09bcce9c10a..b5cee95475d 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/nikto.md +++ b/docs/content/en/connecting_your_tools/parsers/file/nikto.md @@ -12,4 +12,13 @@ The current parser support 3 sources: 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 +Sample Nikto scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nikto). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/nmap.md b/docs/content/en/connecting_your_tools/parsers/file/nmap.md index cada9ad2d3c..7a14e478fa6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/nmap.md +++ b/docs/content/en/connecting_your_tools/parsers/file/nmap.md @@ -5,4 +5,13 @@ 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 +Sample Nmap scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nmap). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/noseyparker.md b/docs/content/en/connecting_your_tools/parsers/file/noseyparker.md index 69abfb99b00..ac3c9024759 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/noseyparker.md +++ b/docs/content/en/connecting_your_tools/parsers/file/noseyparker.md @@ -28,4 +28,13 @@ The parser only accepts .jsonl reports. Each line of the JSON Lines file from No ### Sample Scan Data -Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/noseyparker). \ No newline at end of file +Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/noseyparker). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/npm_audit.md b/docs/content/en/connecting_your_tools/parsers/file/npm_audit.md index bb157db2833..e14c343a9d0 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/npm_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/npm_audit.md @@ -28,3 +28,12 @@ Sample NPM Audit scans can be found [here](https://github.com/DefectDojo/django- ### Link To Tool See NPM-Audit-Report on GitHub: https://github.com/npm/npm-audit-report/ + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- file path +- vulnerability ids +- cwe diff --git a/docs/content/en/connecting_your_tools/parsers/file/npm_audit_7_plus.md b/docs/content/en/connecting_your_tools/parsers/file/npm_audit_7_plus.md index a4b4a090b08..c1abccfdd01 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/npm_audit_7_plus.md +++ b/docs/content/en/connecting_your_tools/parsers/file/npm_audit_7_plus.md @@ -24,3 +24,11 @@ Sample NPM Audit scans can be found [here](https://github.com/DefectDojo/django- ### Link To Tool See NPM-Audit-Report on GitHub: https://github.com/npm/npm-audit-report/ + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- cwe +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/nsp.md b/docs/content/en/connecting_your_tools/parsers/file/nsp.md index 916495ecdf2..e494d35eadc 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/nsp.md +++ b/docs/content/en/connecting_your_tools/parsers/file/nsp.md @@ -5,4 +5,13 @@ 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 +Sample Node Security Platform scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nsp). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/nuclei.md b/docs/content/en/connecting_your_tools/parsers/file/nuclei.md index 3e63a2b9429..94a0fa4480a 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/nuclei.md +++ b/docs/content/en/connecting_your_tools/parsers/file/nuclei.md @@ -5,4 +5,12 @@ 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 +Sample Nuclei scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/nuclei). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- severity +- component name diff --git a/docs/content/en/connecting_your_tools/parsers/file/openscap.md b/docs/content/en/connecting_your_tools/parsers/file/openscap.md index 220f27d66e0..cf4abf932d6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/openscap.md +++ b/docs/content/en/connecting_your_tools/parsers/file/openscap.md @@ -5,4 +5,13 @@ 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 +Sample Openscap Vulnerability Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/openscap). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/openvas.md b/docs/content/en/connecting_your_tools/parsers/file/openvas.md index 73fcbcebc17..b0153900161 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/openvas.md +++ b/docs/content/en/connecting_your_tools/parsers/file/openvas.md @@ -5,4 +5,13 @@ toc_hide: true You can either upload the exported results of an OpenVAS Scan in a .csv or .xml format. ### Sample Scan Data -Sample OpenVAS scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/openvas). \ No newline at end of file +Sample OpenVAS scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/openvas). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ort.md b/docs/content/en/connecting_your_tools/parsers/file/ort.md index 2aac161efd3..f1ee0ae69c0 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ort.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ort.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample ORT evaluated model Importer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ort). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ossindex_devaudit.md b/docs/content/en/connecting_your_tools/parsers/file/ossindex_devaudit.md index cb007e5a3e3..664a33327b1 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ossindex_devaudit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ossindex_devaudit.md @@ -6,4 +6,13 @@ Import JSON formatted output from \[OSSIndex 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 +Sample OssIndex Devaudit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ossindex_devaudit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/osv_scanner.md b/docs/content/en/connecting_your_tools/parsers/file/osv_scanner.md index d0e90c2b11d..02aaade0bd0 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/osv_scanner.md +++ b/docs/content/en/connecting_your_tools/parsers/file/osv_scanner.md @@ -5,4 +5,11 @@ toc_hide: true Use [OSV-Scanner](https://github.com/google/osv-scanner) to find existing vulnerabilities affecting your project's dependencies. ### Sample Scan Data -Sample OSV Scanner output can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/osv_scanner). \ No newline at end of file +Sample OSV Scanner output can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/osv_scanner). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/outpost24.md b/docs/content/en/connecting_your_tools/parsers/file/outpost24.md index 2c0f974f02e..6f6d6e1bd53 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/outpost24.md +++ b/docs/content/en/connecting_your_tools/parsers/file/outpost24.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Outpost24 Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/outpost24). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/php_security_audit_v2.md b/docs/content/en/connecting_your_tools/parsers/file/php_security_audit_v2.md index 1abcb0e741c..7e395653854 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/php_security_audit_v2.md +++ b/docs/content/en/connecting_your_tools/parsers/file/php_security_audit_v2.md @@ -5,4 +5,13 @@ 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 +Sample PHP Security Audit v2 scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/php_security_audit_v2). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/php_symfony_security_check.md b/docs/content/en/connecting_your_tools/parsers/file/php_symfony_security_check.md index 27552cb8395..0bbfc0875a4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/php_symfony_security_check.md +++ b/docs/content/en/connecting_your_tools/parsers/file/php_symfony_security_check.md @@ -5,4 +5,10 @@ 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 +Sample PHP Symfony Security Checker scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/php_symfony_security_check). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vulnerability ids diff --git a/docs/content/en/connecting_your_tools/parsers/file/pip_audit.md b/docs/content/en/connecting_your_tools/parsers/file/pip_audit.md index 96b9b250d58..0eb3b483237 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/pip_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/pip_audit.md @@ -40,3 +40,10 @@ Sample pip-audit Scan scans can be found [here](https://github.com/DefectDojo/dj ### Link To Tool [pip-audit](https://pypi.org/project/pip-audit/) + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/pmd.md b/docs/content/en/connecting_your_tools/parsers/file/pmd.md index ebb4d951764..366fe1b57b7 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/pmd.md +++ b/docs/content/en/connecting_your_tools/parsers/file/pmd.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample PMD Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/pmd). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/popeye.md b/docs/content/en/connecting_your_tools/parsers/file/popeye.md index 82dbdd89582..5c90937d0f4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/popeye.md +++ b/docs/content/en/connecting_your_tools/parsers/file/popeye.md @@ -65,4 +65,10 @@ To match it to DefectDojo severity formula, Secerity 0 (Ok) findings from Popeye - 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 +Sample Popeye scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/popeye). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/progpilot.md b/docs/content/en/connecting_your_tools/parsers/file/progpilot.md index 2fa297117f0..9dfcad061e6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/progpilot.md +++ b/docs/content/en/connecting_your_tools/parsers/file/progpilot.md @@ -5,4 +5,13 @@ toc_hide: true This parser imports the Progpilot SAST JSON output. The scanner can be found [here](https://github.com/designsecurity/progpilot). ### Sample Scan Data -Sample Progpilot Parser scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/progpilot). \ No newline at end of file +Sample Progpilot Parser scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/progpilot). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ptart.md b/docs/content/en/connecting_your_tools/parsers/file/ptart.md index 5ce56967493..b765562d9ab 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ptart.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ptart.md @@ -12,3 +12,11 @@ Reports can be exported to JSON format from the PTART web UI, and imported into ### Sample Scan Data Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ptart). +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/pwn_sast.md b/docs/content/en/connecting_your_tools/parsers/file/pwn_sast.md index 241f2c0ca6d..b770c5eebb0 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/pwn_sast.md +++ b/docs/content/en/connecting_your_tools/parsers/file/pwn_sast.md @@ -7,4 +7,13 @@ toc_hide: true - 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 +Sample PWN Security Automation Framework scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/pwn_sast). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/qualys.md b/docs/content/en/connecting_your_tools/parsers/file/qualys.md index 7fd532c79a8..1a688a61c62 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/qualys.md +++ b/docs/content/en/connecting_your_tools/parsers/file/qualys.md @@ -18,4 +18,11 @@ A CSV formatted Qualys Scan Report can also be used. Ensure the following values * 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 +Sample Qualys Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- endpoints diff --git a/docs/content/en/connecting_your_tools/parsers/file/qualys_hacker_guardian.md b/docs/content/en/connecting_your_tools/parsers/file/qualys_hacker_guardian.md index e938970a385..cba55097d3b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/qualys_hacker_guardian.md +++ b/docs/content/en/connecting_your_tools/parsers/file/qualys_hacker_guardian.md @@ -6,4 +6,11 @@ Qualys Hacker Guardian CSV export ### Sample Scan Data -Sample Qualys Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys_hacker_guardian). \ No newline at end of file +Sample Qualys Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys_hacker_guardian). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/qualys_infrascan_webgui.md b/docs/content/en/connecting_your_tools/parsers/file/qualys_infrascan_webgui.md index bba44904df1..fa3d09343b0 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/qualys_infrascan_webgui.md +++ b/docs/content/en/connecting_your_tools/parsers/file/qualys_infrascan_webgui.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Qualys Infrastructure Scan (WebGUI XML) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys_infrascan_webgui). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/qualys_webapp.md b/docs/content/en/connecting_your_tools/parsers/file/qualys_webapp.md index b8a4017b113..21ca3eca657 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/qualys_webapp.md +++ b/docs/content/en/connecting_your_tools/parsers/file/qualys_webapp.md @@ -5,4 +5,13 @@ 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 +Sample Qualys Webapp Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/qualys_webapp). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/rapplex.md b/docs/content/en/connecting_your_tools/parsers/file/rapplex.md index b72add501ab..36e74c449e6 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/rapplex.md +++ b/docs/content/en/connecting_your_tools/parsers/file/rapplex.md @@ -6,4 +6,11 @@ Import JSON report of [Rapplex - Web Application Security Scanner](https://rappl ### Sample Scan Data -Sample Rapplex scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/rapplex). \ No newline at end of file +Sample Rapplex scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/rapplex). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- endpoints +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/redhatsatellite.md b/docs/content/en/connecting_your_tools/parsers/file/redhatsatellite.md index af047ef6c67..005d1c33c16 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/redhatsatellite.md +++ b/docs/content/en/connecting_your_tools/parsers/file/redhatsatellite.md @@ -5,4 +5,10 @@ toc_hide: true You can import a JSON report which was retrieved through the REST API of Red Hat Satellite. The scanner can be found [here](https://www.redhat.com/en/technologies/management/satellite). ### Sample Scan Data -Sample Red Hat Satellite scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/redhatsatellite). \ No newline at end of file +Sample Red Hat Satellite scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/redhatsatellite). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/retirejs.md b/docs/content/en/connecting_your_tools/parsers/file/retirejs.md index b975aa7b603..0d925b0226b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/retirejs.md +++ b/docs/content/en/connecting_your_tools/parsers/file/retirejs.md @@ -5,4 +5,13 @@ 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 +Sample Retire.js scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/retirejs). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/risk_recon.md b/docs/content/en/connecting_your_tools/parsers/file/risk_recon.md index 917b7ed3bc5..c35ceac2792 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/risk_recon.md +++ b/docs/content/en/connecting_your_tools/parsers/file/risk_recon.md @@ -57,4 +57,13 @@ Import findings from Risk Recon via the API. Configure your own JSON report as f 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 +Sample Risk Recon API Importer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/risk_recon). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/rubocop.md b/docs/content/en/connecting_your_tools/parsers/file/rubocop.md index 8a90bd8eda4..2a188c3b1ee 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/rubocop.md +++ b/docs/content/en/connecting_your_tools/parsers/file/rubocop.md @@ -5,4 +5,11 @@ 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 +Sample Rubocop Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/rubocop). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- file path +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/rusty_hog.md b/docs/content/en/connecting_your_tools/parsers/file/rusty_hog.md index 77f44ae9e26..7b170ffc325 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/rusty_hog.md +++ b/docs/content/en/connecting_your_tools/parsers/file/rusty_hog.md @@ -17,4 +17,10 @@ RustyHog scans only one target at a time. This is not efficient if you want to s You can either select "Rusty Hog Scan" directly, or specify the sub scanner (e.g. "Duroc Hog Scan"). If you choose "Rusty Hog Scan", we recommend to re-import scans into the same test. For more information look at [this issue](https://github.com/DefectDojo/django-DefectDojo/issues/10584). ### 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 +Sample Rusty Hog parser scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/rusty_hog). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- file path +- payload diff --git a/docs/content/en/connecting_your_tools/parsers/file/sarif.md b/docs/content/en/connecting_your_tools/parsers/file/sarif.md index a6ed9e679ce..b6c1ee62eab 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sarif.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sarif.md @@ -22,4 +22,13 @@ DEDUPLICATION_ALGORITHM_PER_PARSER["SARIF"] = DEDUPE_ALGO_UNIQUE_ID_FROM_TOOL_OR ``` ### 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 +Sample SARIF scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sarif). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/scantist.md b/docs/content/en/connecting_your_tools/parsers/file/scantist.md index a29f1392d58..b8b359671d1 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/scantist.md +++ b/docs/content/en/connecting_your_tools/parsers/file/scantist.md @@ -6,4 +6,13 @@ Scantist is an open source management platform. Scan and remediate open source s 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 +Sample Scantist Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/scantist). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/scout_suite.md b/docs/content/en/connecting_your_tools/parsers/file/scout_suite.md index 7e97dbfd309..7a565b2dd17 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/scout_suite.md +++ b/docs/content/en/connecting_your_tools/parsers/file/scout_suite.md @@ -9,4 +9,10 @@ Multiple scans will create multiple files if they are runing agains 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 +Sample ScoutSuite scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/scout_suite). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- file path +- vuln id from tool diff --git a/docs/content/en/connecting_your_tools/parsers/file/semgrep.md b/docs/content/en/connecting_your_tools/parsers/file/semgrep.md index b88c8ed9d66..9e039fd246e 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/semgrep.md +++ b/docs/content/en/connecting_your_tools/parsers/file/semgrep.md @@ -5,4 +5,13 @@ 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 +Sample Semgrep JSON Report scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/semgrep). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/skf.md b/docs/content/en/connecting_your_tools/parsers/file/skf.md index c2fcfa27411..2ab3ade041e 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/skf.md +++ b/docs/content/en/connecting_your_tools/parsers/file/skf.md @@ -5,4 +5,13 @@ 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 +Sample SKF Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/skf). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/snyk.md b/docs/content/en/connecting_your_tools/parsers/file/snyk.md index f8cc7463789..717cf64323b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/snyk.md +++ b/docs/content/en/connecting_your_tools/parsers/file/snyk.md @@ -6,4 +6,12 @@ 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 +Sample Snyk scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/snyk). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- file path +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/snyk_code.md b/docs/content/en/connecting_your_tools/parsers/file/snyk_code.md index b7a1b194737..3d43b81ac08 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/snyk_code.md +++ b/docs/content/en/connecting_your_tools/parsers/file/snyk_code.md @@ -6,4 +6,10 @@ 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 Code scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/snyk_code). \ No newline at end of file +Sample Snyk Code scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/snyk_code). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/solar_appscreener.md b/docs/content/en/connecting_your_tools/parsers/file/solar_appscreener.md index 80ab6a894d1..98334b25a9b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/solar_appscreener.md +++ b/docs/content/en/connecting_your_tools/parsers/file/solar_appscreener.md @@ -5,4 +5,12 @@ toc_hide: true 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 +Sample Solar Appscreener Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/solar_appscreener). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- file path +- line +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/sonarqube.md b/docs/content/en/connecting_your_tools/parsers/file/sonarqube.md index 4734796dd7d..8ee44e03460 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sonarqube.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sonarqube.md @@ -41,5 +41,9 @@ To generate the report, see Version: \>= 1.1.0. Recommend version for both format \>= 3.1.2 +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): - +- cwe +- severity +- file path diff --git a/docs/content/en/connecting_your_tools/parsers/file/sonatype.md b/docs/content/en/connecting_your_tools/parsers/file/sonatype.md index c993fdd3f15..29f06047948 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sonatype.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sonatype.md @@ -5,4 +5,14 @@ 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 +Sample Sonatype scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sonatype). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- file path +- component name +- component version +- vulnerability ids diff --git a/docs/content/en/connecting_your_tools/parsers/file/spotbugs.md b/docs/content/en/connecting_your_tools/parsers/file/spotbugs.md index 69a288e5b5b..b22e6f8f00f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/spotbugs.md +++ b/docs/content/en/connecting_your_tools/parsers/file/spotbugs.md @@ -5,4 +5,12 @@ 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 +Sample SpotBugs scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/spotbugs). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- cwe +- severity +- file path +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/ssh_audit.md b/docs/content/en/connecting_your_tools/parsers/file/ssh_audit.md index 29f95a82260..185232d0daa 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ssh_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ssh_audit.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample SSH Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ssh_audit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/ssl_labs.md b/docs/content/en/connecting_your_tools/parsers/file/ssl_labs.md index cd5972e126b..cd36e01686b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/ssl_labs.md +++ b/docs/content/en/connecting_your_tools/parsers/file/ssl_labs.md @@ -5,4 +5,13 @@ 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 +Sample SSL Labs scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/ssl_labs). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/sslscan.md b/docs/content/en/connecting_your_tools/parsers/file/sslscan.md index 0255e5858ab..aa0cf1d0670 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sslscan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sslscan.md @@ -5,4 +5,13 @@ 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 +Sample Sslscan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sslscan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/sslyze.md b/docs/content/en/connecting_your_tools/parsers/file/sslyze.md index 8abfd44b8fa..c48189b9ea7 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sslyze.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sslyze.md @@ -9,4 +9,10 @@ XML report of SSLyze version 2 scan JSON report of SSLyze version 3 scan ### 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 +Sample Sslyze Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sslyze). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/stackhawk.md b/docs/content/en/connecting_your_tools/parsers/file/stackhawk.md index 4f66fb5a82c..ab8ac205839 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/stackhawk.md +++ b/docs/content/en/connecting_your_tools/parsers/file/stackhawk.md @@ -6,4 +6,11 @@ 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) ### 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 +Sample StackHawk HawkScan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/stackhawk). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/sysdig_cli.md b/docs/content/en/connecting_your_tools/parsers/file/sysdig_cli.md index f20a568d5a1..edd1e5b87ae 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sysdig_cli.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sysdig_cli.md @@ -5,4 +5,13 @@ toc_hide: true Import CSV report files generated by the [Sysdig CLI Scanner](https://docs.sysdig.com/en/sysdig-secure/install-agent-components/install-vulnerability-cli-scanner/) ### Sample Scan Data -Sample Sysdig Vulnerability Reports scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sysdig_cli). \ No newline at end of file +Sample Sysdig Vulnerability Reports scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sysdig_cli). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/sysdig_reports.md b/docs/content/en/connecting_your_tools/parsers/file/sysdig_reports.md index 398cd87f9d0..293bad589d7 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/sysdig_reports.md +++ b/docs/content/en/connecting_your_tools/parsers/file/sysdig_reports.md @@ -7,4 +7,13 @@ Parser will accept Pipeline, Registry and Runtime reports created from the UI More information available at [sysdig 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 +Sample Sysdig Vulnerability Reports scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/sysdig_reports). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/talisman.md b/docs/content/en/connecting_your_tools/parsers/file/talisman.md index c542a1f0f2d..787df03b812 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/talisman.md +++ b/docs/content/en/connecting_your_tools/parsers/file/talisman.md @@ -41,4 +41,13 @@ fi ``` ### 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 +Sample Talisman scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/talisman). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/tenable.md b/docs/content/en/connecting_your_tools/parsers/file/tenable.md index a4f0ad59030..1f7c6c751f2 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/tenable.md +++ b/docs/content/en/connecting_your_tools/parsers/file/tenable.md @@ -6,4 +6,13 @@ 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 +Sample Tenable scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/tenable). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- vulnerability ids +- cwe +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/terrascan.md b/docs/content/en/connecting_your_tools/parsers/file/terrascan.md index c5d6016c5a0..6cf2bc81ac8 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/terrascan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/terrascan.md @@ -5,4 +5,14 @@ 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 +Sample Terrascan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/terrascan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- title +- severity +- file path +- line +- component name diff --git a/docs/content/en/connecting_your_tools/parsers/file/testssl.md b/docs/content/en/connecting_your_tools/parsers/file/testssl.md index 501cb8b8a7a..ae8f6b706d4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/testssl.md +++ b/docs/content/en/connecting_your_tools/parsers/file/testssl.md @@ -5,4 +5,13 @@ 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 +Sample Testssl Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/testssl). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/tfsec.md b/docs/content/en/connecting_your_tools/parsers/file/tfsec.md index 7a0aca9d57a..4ab35797483 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/tfsec.md +++ b/docs/content/en/connecting_your_tools/parsers/file/tfsec.md @@ -5,4 +5,12 @@ 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 +Sample TFSec scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/tfsec). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- severity +- vuln id from tool +- file path +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/threagile.md b/docs/content/en/connecting_your_tools/parsers/file/threagile.md index 6469fb54752..c4870a5d225 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/threagile.md +++ b/docs/content/en/connecting_your_tools/parsers/file/threagile.md @@ -85,4 +85,11 @@ Parser expects an array of finding. All properties are strings. Required fields ~~~ ### Sample Scan Data -Sample Threagile scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/threagile). \ No newline at end of file +Sample Threagile scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/threagile). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/threat_composer.md b/docs/content/en/connecting_your_tools/parsers/file/threat_composer.md index a5097f90066..433d532034b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/threat_composer.md +++ b/docs/content/en/connecting_your_tools/parsers/file/threat_composer.md @@ -6,4 +6,10 @@ toc_hide: true This DefectDojo parser accepts JSON files from Threat Composer. The tool supports the [export](https://github.com/awslabs/threat-composer/tree/main?#features) of JSON report out of the browser local storage to a local file. ### Sample Scan Data -Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/threat_composer). \ No newline at end of file +Sample scan data for testing purposes can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/threat_composer). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/trivy.md b/docs/content/en/connecting_your_tools/parsers/file/trivy.md index 99ad24e4477..b8add19d8e8 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/trivy.md +++ b/docs/content/en/connecting_your_tools/parsers/file/trivy.md @@ -22,4 +22,13 @@ It is recommended to assess the appropriate action in your Product's context. If you want to exclude certain status from being imported into Defect Dojo, please [filter them in the export from Trivy](https://trivy.dev/latest/docs/configuration/filtering/) ### 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 +Sample Trivy scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trivy). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- vulnerability ids +- cwe +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/trivy_operator.md b/docs/content/en/connecting_your_tools/parsers/file/trivy_operator.md index 1433b8231fe..c305d9010c8 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/trivy_operator.md +++ b/docs/content/en/connecting_your_tools/parsers/file/trivy_operator.md @@ -7,4 +7,12 @@ JSON report of [trivy operator scanner](https://github.com/aquasecurity/trivy-op 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 +Sample Trivy Operator scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trivy_operator). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- vulnerability ids +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/trufflehog.md b/docs/content/en/connecting_your_tools/parsers/file/trufflehog.md index c787e8e8105..6ebc86ca0d7 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/trufflehog.md +++ b/docs/content/en/connecting_your_tools/parsers/file/trufflehog.md @@ -5,4 +5,11 @@ 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 +Sample Trufflehog scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trufflehog). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/trufflehog3.md b/docs/content/en/connecting_your_tools/parsers/file/trufflehog3.md index 44fd436d541..6c75cbd6a5d 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/trufflehog3.md +++ b/docs/content/en/connecting_your_tools/parsers/file/trufflehog3.md @@ -5,4 +5,13 @@ 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 +Sample Trufflehog3 scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trufflehog3). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/trustwave.md b/docs/content/en/connecting_your_tools/parsers/file/trustwave.md index 4e4cbb14c5a..afb7aa60705 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/trustwave.md +++ b/docs/content/en/connecting_your_tools/parsers/file/trustwave.md @@ -39,3 +39,12 @@ Sample Trustwave scans can be found in the [unit tests folder](https://github.co ### Link To Tool [Trustwave](https://www.trustwave.com/en-us/) provides vulnerability scanning services through their SecureConnect platform. + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/trustwave_fusion_api.md b/docs/content/en/connecting_your_tools/parsers/file/trustwave_fusion_api.md index d4f61fd0570..a9a7602f87b 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/trustwave_fusion_api.md +++ b/docs/content/en/connecting_your_tools/parsers/file/trustwave_fusion_api.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample Trustwave Fusion API Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/trustwave_fusion_api). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/twistlock.md b/docs/content/en/connecting_your_tools/parsers/file/twistlock.md index e682da7402b..6dfab0faa4c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/twistlock.md +++ b/docs/content/en/connecting_your_tools/parsers/file/twistlock.md @@ -11,4 +11,12 @@ JSON output of the `twistcli` tool. Example: 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 +Sample Twistlock scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/twistlock). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- component name +- component version diff --git a/docs/content/en/connecting_your_tools/parsers/file/vcg.md b/docs/content/en/connecting_your_tools/parsers/file/vcg.md index f2bdb310057..902730def33 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/vcg.md +++ b/docs/content/en/connecting_your_tools/parsers/file/vcg.md @@ -5,4 +5,13 @@ toc_hide: true VCG output can be imported in CSV or Xml formats. ### Sample Scan Data -Sample Visual Code Grepper (VCG) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/vcg). \ No newline at end of file +Sample Visual Code Grepper (VCG) scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/vcg). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/veracode.md b/docs/content/en/connecting_your_tools/parsers/file/veracode.md index 431a7f54cad..caba004968f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/veracode.md +++ b/docs/content/en/connecting_your_tools/parsers/file/veracode.md @@ -48,4 +48,13 @@ 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 +Sample Veracode scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/veracode). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/veracode_sca.md b/docs/content/en/connecting_your_tools/parsers/file/veracode_sca.md index 59db59d2a31..784c243e7f1 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/veracode_sca.md +++ b/docs/content/en/connecting_your_tools/parsers/file/veracode_sca.md @@ -5,4 +5,13 @@ 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 +Sample Veracode SourceClear scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/veracode_sca). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- vulnerability ids +- component name +- component version +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/wapiti.md b/docs/content/en/connecting_your_tools/parsers/file/wapiti.md index 53a4cd619b0..1ae58ad5f17 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wapiti.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wapiti.md @@ -5,4 +5,13 @@ 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 +Sample Wapiti Scan scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wapiti). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/wazuh.md b/docs/content/en/connecting_your_tools/parsers/file/wazuh.md index 329372ff84d..5bb4ae2e39c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wazuh.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wazuh.md @@ -49,4 +49,13 @@ Parser expects a .json file structured as below. ~~~ ### 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 +Sample Wazuh Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wazuh). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/wfuzz.md b/docs/content/en/connecting_your_tools/parsers/file/wfuzz.md index b76c7b186eb..bb6ed046cd3 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wfuzz.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wfuzz.md @@ -15,4 +15,13 @@ missing | Low >= 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 +Sample Wfuzz JSON importer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wfuzz). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/whispers.md b/docs/content/en/connecting_your_tools/parsers/file/whispers.md index dfa5b104ef7..bedc2037f4f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/whispers.md +++ b/docs/content/en/connecting_your_tools/parsers/file/whispers.md @@ -6,4 +6,11 @@ Import Whispers JSON results. https://github.com/adeptex/whispers ### 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 +Sample Whispers scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/whispers). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- vuln id from tool +- file path +- line diff --git a/docs/content/en/connecting_your_tools/parsers/file/whitehat_sentinel.md b/docs/content/en/connecting_your_tools/parsers/file/whitehat_sentinel.md index 756fac5069a..d267ef493b5 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/whitehat_sentinel.md +++ b/docs/content/en/connecting_your_tools/parsers/file/whitehat_sentinel.md @@ -5,4 +5,13 @@ toc_hide: true 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 +Sample WhiteHat Sentinel scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/whitehat_sentinel). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/wiz.md b/docs/content/en/connecting_your_tools/parsers/file/wiz.md index 23b8025c4d5..64f589a54a2 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wiz.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wiz.md @@ -179,3 +179,9 @@ Sample Wiz Scanner scans can be found in the [sample scan data folder](https://g - [Wiz.io](https://www.wiz.io/) - [Wiz Documentation](https://docs.wiz.io/) +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/wizcli_dir.md b/docs/content/en/connecting_your_tools/parsers/file/wizcli_dir.md index 6caebaecf0c..8aaaefd1383 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wizcli_dir.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wizcli_dir.md @@ -6,4 +6,13 @@ This parser imports scan results from [wizcli](https://www.wiz.io/) IaC scan. Yo `wizcli dir scan --path ./ -o scan_dir.json,json` ### Sample Scan Data -Sample Wizcli Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wizcli_dir). \ No newline at end of file +Sample Wizcli Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wizcli_dir). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/wizcli_iac.md b/docs/content/en/connecting_your_tools/parsers/file/wizcli_iac.md index 5a655666251..01393f820bd 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wizcli_iac.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wizcli_iac.md @@ -6,4 +6,13 @@ This parser imports scan results from [wizcli](https://www.wiz.io/) IaC scan. Yo `wizcli iac scan --path ./ -o scan_iac.json,json` ### Sample Scan Data -Sample Wizcli Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wizcli_iac). \ No newline at end of file +Sample Wizcli Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wizcli_iac). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/wizcli_img.md b/docs/content/en/connecting_your_tools/parsers/file/wizcli_img.md index c372e23e8ef..5b97d7934ce 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wizcli_img.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wizcli_img.md @@ -6,4 +6,13 @@ This parser imports scan results from [wizcli](https://www.wiz.io/) IaC scan. Yo `wizcli docker scan --image wizcli-imagescan -o scan_img.json,json` ### Sample Scan Data -Sample Wizcli Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wizcli_img). \ No newline at end of file +Sample Wizcli Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wizcli_img). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/wpscan.md b/docs/content/en/connecting_your_tools/parsers/file/wpscan.md index 3e47e2bc6f8..64f7538731c 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/wpscan.md +++ b/docs/content/en/connecting_your_tools/parsers/file/wpscan.md @@ -5,4 +5,11 @@ 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 +Sample Wpscan Scanner scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/wpscan). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- description +- severity diff --git a/docs/content/en/connecting_your_tools/parsers/file/xanitizer.md b/docs/content/en/connecting_your_tools/parsers/file/xanitizer.md index 553292b5928..494ffe69ad4 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/xanitizer.md +++ b/docs/content/en/connecting_your_tools/parsers/file/xanitizer.md @@ -6,4 +6,13 @@ Import XML findings list report, preferably with parameter \'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 +Sample Xanitizer scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/xanitizer). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- line +- file path +- description diff --git a/docs/content/en/connecting_your_tools/parsers/file/yarn_audit.md b/docs/content/en/connecting_your_tools/parsers/file/yarn_audit.md index e7de450a756..3778cb91fe2 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/yarn_audit.md +++ b/docs/content/en/connecting_your_tools/parsers/file/yarn_audit.md @@ -5,4 +5,13 @@ 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 +Sample Yarn Audit scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/yarn_audit). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- severity +- file path +- vulnerability ids +- cwe diff --git a/docs/content/en/connecting_your_tools/parsers/file/zap.md b/docs/content/en/connecting_your_tools/parsers/file/zap.md index 43fd58e05c7..05ee41a846f 100644 --- a/docs/content/en/connecting_your_tools/parsers/file/zap.md +++ b/docs/content/en/connecting_your_tools/parsers/file/zap.md @@ -5,4 +5,11 @@ 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 +Sample Zed Attack Proxy scans can be found [here](https://github.com/DefectDojo/django-DefectDojo/tree/master/unittests/scans/zap). + +### Default Deduplication Hashcode Fields +By default, DefectDojo identifies duplicate Findings using these [hashcode fields](https://docs.defectdojo.com/en/working_with_findings/finding_deduplication/about_deduplication/): + +- title +- cwe +- severity From 32bad0b04571cf5ea11577ba2ccc0451f994f08d Mon Sep 17 00:00:00 2001 From: valentijnscholten Date: Fri, 11 Jul 2025 20:01:19 +0200 Subject: [PATCH 8/9] twistlock: parse compliances (#12772) * twistlock: parse compliances * twistlock: finetune --- dojo/tools/twistlock/parser.py | 181 ++++++++++++++++-- .../twistlock/findings_include_packages.json | 26 ++- unittests/scans/twistlock/no_vuln.json | 8 +- unittests/scans/twistlock/one_vuln.json | 11 +- unittests/tools/test_twistlock_parser.py | 105 +++++++++- 5 files changed, 292 insertions(+), 39 deletions(-) diff --git a/dojo/tools/twistlock/parser.py b/dojo/tools/twistlock/parser.py index 334a12f3e16..154e8c1b7c8 100644 --- a/dojo/tools/twistlock/parser.py +++ b/dojo/tools/twistlock/parser.py @@ -4,6 +4,7 @@ import json import logging import textwrap +from datetime import datetime from dojo.models import Finding @@ -24,6 +25,71 @@ def parse_issue(self, row, test): data_cvss = row.get("CVSS", "") data_description = row.get("Description", "") + # Parse timestamp information (Item 4) + published_date = row.get("Published", "") + discovered_date = row.get("Discovered", "") + finding_date = None + + # Use Published date as primary, fallback to Discovered + date_str = published_date or discovered_date + if date_str: + try: + # Handle format like "2020-09-04 00:15:00.000" + finding_date = datetime.strptime(date_str.split(".")[0], "%Y-%m-%d %H:%M:%S").date() + except ValueError: + try: + # Handle alternative formats + finding_date = datetime.strptime(date_str[:10], "%Y-%m-%d").date() + except ValueError: + logger.warning(f"Could not parse date: {date_str}") + + # Build container/image metadata for impact field (Item 3) + impact_parts = [] + + # Registry and repository information which can change between scans, so we add it to the impact field as the description field is sometimes used for hash code calculation + registry = row.get("Registry", "") + repository = row.get("Repository", "") + tag = row.get("Tag", "") + image_id = row.get("Id", "") + distro = row.get("Distro", "") + + if registry: + impact_parts.append(f"Registry: {registry}") + if repository: + impact_parts.append(f"Repository: {repository}") + if tag: + impact_parts.append(f"Tag: {tag}") + if image_id: + impact_parts.append(f"Image ID: {image_id}") + if distro: + impact_parts.append(f"Distribution: {distro}") + + # Host and container information + hosts = row.get("Hosts", "") + containers = row.get("Containers", "") + clusters = row.get("Clusters", "") + binaries = row.get("Binaries", "") + custom_labels = row.get("Custom Labels", "") + + if hosts: + impact_parts.append(f"Hosts: {hosts}") + if containers: + impact_parts.append(f"Containers: {containers}") + if clusters: + impact_parts.append(f"Clusters: {clusters}") + if binaries: + impact_parts.append(f"Binaries: {binaries}") + if custom_labels: + impact_parts.append(f"Custom Labels: {custom_labels}") + + # Add timestamp information to impact + if published_date: + impact_parts.append(f"Published: {published_date}") + if discovered_date: + impact_parts.append(f"Discovered: {discovered_date}") + + impact_text = "\n".join(impact_parts) if impact_parts else data_severity + if data_vulnerability_id and data_package_name: title = ( data_vulnerability_id @@ -40,6 +106,7 @@ def parse_issue(self, row, test): finding = Finding( title=textwrap.shorten(title, width=255, placeholder="..."), test=test, + date=finding_date, severity=convert_severity(data_severity), description=data_description + "

Vulnerable Package: " @@ -52,12 +119,8 @@ def parse_issue(self, row, test): data_package_name, width=200, placeholder="...", ), component_version=data_package_version, - false_p=False, - duplicate=False, - out_of_scope=False, - mitigated=None, severity_justification=f"(CVSS v3 base score: {data_cvss})", - impact=data_severity, + impact=impact_text, ) finding.description = finding.description.strip() if data_vulnerability_id: @@ -116,19 +179,53 @@ def parse_json(self, json_output): def get_items(self, tree, test): items = {} if "results" in tree: - vulnerabilityTree = tree["results"][0].get("vulnerabilities", []) + # Extract image metadata for impact field (Item 3) + result = tree["results"][0] + image_metadata = self.build_image_metadata(result) + + # Parse vulnerabilities + vulnerabilityTree = result.get("vulnerabilities", []) for node in vulnerabilityTree: - item = get_item(node, test) + item = get_item(node, test, image_metadata) unique_key = node["id"] + str( node["packageName"] + str(node["packageVersion"]) + str(node["severity"]), ) items[unique_key] = item + + # Parse compliance findings + complianceTree = result.get("compliances", []) + for node in complianceTree: + item = get_compliance_item(node, test, image_metadata) + # Create unique key for compliance findings - prefer ID if available + if node.get("id"): + unique_key = f"compliance_{node['id']}" + else: + # Fallback to hash of title + description + unique_key = "compliance_" + hashlib.md5( + (node.get("title", "") + node.get("description", "")).encode("utf-8"), + usedforsecurity=False, + ).hexdigest() + items[unique_key] = item return list(items.values()) + def build_image_metadata(self, result): + """Build image metadata string for impact field""" + metadata_parts = [] + + image_id = result.get("id", "") + distro = result.get("distro", "") + + if image_id: + metadata_parts.append(f"Image ID: {image_id}") + if distro: + metadata_parts.append(f"Distribution: {distro}") -def get_item(vulnerability, test): + return "\n".join(metadata_parts) + + +def get_item(vulnerability, test, image_metadata=""): severity = ( convert_severity(vulnerability["severity"]) if "severity" in vulnerability @@ -147,6 +244,12 @@ def get_item(vulnerability, test): vulnerability.get("riskFactors", "No risk factors.") ) + # Build impact field combining severity and image metadata which can change between scans, so we add it to the impact field as the description field is sometimes used for hash code calculation + impact_parts = [severity] + if image_metadata: + impact_parts.append(image_metadata) + impact_text = "\n".join(impact_parts) + # create the finding object finding = Finding( title=vulnerability.get("id", "Unknown Vulnerability") @@ -166,12 +269,9 @@ def get_item(vulnerability, test): references=vulnerability.get("link"), component_name=vulnerability.get("packageName", ""), component_version=vulnerability.get("packageVersion", ""), - false_p=False, - duplicate=False, - out_of_scope=False, - mitigated=None, severity_justification=f"{vector} (CVSS v3 base score: {cvss})\n\n{riskFactors}", - impact=severity, + cvssv3_score=cvss, + impact=impact_text, ) finding.unsaved_vulnerability_ids = [vulnerability["id"]] if "id" in vulnerability else None finding.description = finding.description.strip() @@ -179,6 +279,61 @@ def get_item(vulnerability, test): return finding +def get_compliance_item(compliance, test, image_metadata=""): + """Create a Finding object for compliance issues""" + severity = ( + convert_severity(compliance["severity"]) + if "severity" in compliance + else "Info" + ) + + title = compliance.get("title", "Unknown Compliance Issue") + description = compliance.get("description", "No description specified") + compliance_id = compliance.get("id", "") + category = compliance.get("category", "") + layer_time = compliance.get("layerTime", "") + + # Build comprehensive description + desc_parts = [f"

Compliance Issue: {title}

"] + + if compliance_id: + desc_parts.append(f"

Compliance ID: {compliance_id}

") + + if category: + desc_parts.append(f"

Category: {category}

") + + desc_parts.append(f"

Description: {description}

") + + # Build impact field combining severity and image metadata + impact_parts = [severity] + if image_metadata: + impact_parts.append(image_metadata) + if layer_time: + desc_parts.append(f"Layer Time: {layer_time}") + impact_text = "\n".join(impact_parts) + + # create the finding object for compliance + finding = Finding( + title=f"Compliance: {title}", + test=test, + severity=severity, + description="".join(desc_parts), + mitigation="Review and address the compliance issue as described in the description.", + severity_justification=f"Compliance severity: {severity}", + impact=impact_text, + vuln_id_from_tool=str(compliance_id) if compliance_id else None, + ) + finding.description = finding.description.strip() + + # Add compliance-specific tags + tags = ["compliance"] + if category: + tags.append(category.lower()) + finding.unsaved_tags = tags + + return finding + + def convert_severity(severity): if severity.lower() == "important": return "High" diff --git a/unittests/scans/twistlock/findings_include_packages.json b/unittests/scans/twistlock/findings_include_packages.json index de0d60204ce..2929ddbc9f3 100644 --- a/unittests/scans/twistlock/findings_include_packages.json +++ b/unittests/scans/twistlock/findings_include_packages.json @@ -4,18 +4,30 @@ "id": "sha256:f4c0503d26c8da0a04e6190c9d4f2a30f38958852b9fb80bcd2b819a7571e7f7", "distro": "Debian GNU/Linux 9 (stretch)", "compliances": [ - { - "title": "Sensitive information provided in environment variables", - "severity": "high", - "cause": "The environment variables DD_CELERY_BROKER_PASSWORD,DD_DATABASE_PASSWORD,DD_SECRET_KEY contain sensitive data" - } + { + "id": 912, + "title": "(CIS_Kubernetes_v1.6.0 - 1.1) Ensure API server encryption is enabled", + "severity": "high", + "description": "Encrypting etcd data at rest ensures sensitive information is protected from unauthorized access.", + "layerTime": "2024-07-01T12:00:00Z", + "category": "Kubernetes" + }, + { + "id": 914, + "title": "(CIS_Kubernetes_v1.6.0 - 1.3) Ensure audit logging is enabled", + "severity": "medium", + "cause": "Audit logs are not configured on the API server.", + "description": "Enabling audit logs helps monitor access and detect suspicious activity.", + "layerTime": "2024-07-01T12:00:00Z", + "category": "Kubernetes" + } ], "complianceDistribution": { "critical": 0, "high": 1, - "medium": 0, + "medium": 1, "low": 0, - "total": 1 + "total": 2 }, "vulnerabilities": [ { diff --git a/unittests/scans/twistlock/no_vuln.json b/unittests/scans/twistlock/no_vuln.json index 243ba68611f..5873f60ad26 100644 --- a/unittests/scans/twistlock/no_vuln.json +++ b/unittests/scans/twistlock/no_vuln.json @@ -4,17 +4,13 @@ "id": "sha256:184c9823bc3e7795040025a33d174987897783ee9296545abcb1a1937f12d391", "distro": "", "compliances": [ - { - "title": "(CIS_Docker_CE_v1.1.0 - 4.6) Add HEALTHCHECK instruction to the container image", - "severity": "medium" - } ], "complianceDistribution": { "critical": 0, "high": 0, - "medium": 1, + "medium": 0, "low": 0, - "total": 1 + "total": 0 }, "vulnerabilityDistribution": { "critical": 0, diff --git a/unittests/scans/twistlock/one_vuln.json b/unittests/scans/twistlock/one_vuln.json index d9b061337f8..3550def17ef 100644 --- a/unittests/scans/twistlock/one_vuln.json +++ b/unittests/scans/twistlock/one_vuln.json @@ -5,17 +5,20 @@ "distro": "Debian GNU/Linux 9 (stretch)", "compliances": [ { - "title": "Sensitive information provided in environment variables", + "id": 912, + "title": "(CIS_Kubernetes_v1.6.0 - 1.1) Ensure API server encryption is enabled", "severity": "high", - "cause": "The environment variables DD_CELERY_BROKER_PASSWORD,DD_DATABASE_PASSWORD,DD_SECRET_KEY contain sensitive data" + "description": "Encrypting etcd data at rest ensures sensitive information is protected from unauthorized access.", + "layerTime": "2024-07-01T12:00:00Z", + "category": "Kubernetes" } ], "complianceDistribution": { "critical": 0, "high": 1, - "medium": 0, + "medium": 1, "low": 0, - "total": 1 + "total": 2 }, "vulnerabilities": [ { diff --git a/unittests/tools/test_twistlock_parser.py b/unittests/tools/test_twistlock_parser.py index aa627a346df..debc68cbfcc 100644 --- a/unittests/tools/test_twistlock_parser.py +++ b/unittests/tools/test_twistlock_parser.py @@ -1,3 +1,4 @@ + from dojo.models import Test from dojo.tools.twistlock.parser import TwistlockParser from unittests.dojo_test_case import DojoTestCase, get_unit_tests_scans_path @@ -11,37 +12,123 @@ def test_parse_file_with_no_vuln(self): testfile.close() self.assertEqual(0, len(findings)) - def test_parse_file_with_one_vuln(self): + def test_parse_file_with_one_vuln_and_compliance(self): testfile = (get_unit_tests_scans_path("twistlock") / "one_vuln.json").open(encoding="utf-8") parser = TwistlockParser() findings = parser.get_findings(testfile, Test()) testfile.close() - self.assertEqual(1, len(findings)) - self.assertEqual(1, len(findings[0].unsaved_vulnerability_ids)) - self.assertEqual("CVE-2013-7459", findings[0].unsaved_vulnerability_ids[0]) + # Should have 2 findings: 1 vulnerability + 1 compliance + self.assertEqual(2, len(findings)) + + # Find the vulnerability and compliance findings + for finding in findings: + if finding.title.startswith("Compliance:"): + # Verify compliance finding exists and has correct properties + self.assertIsNotNone(finding) + self.assertEqual("Compliance: (CIS_Kubernetes_v1.6.0 - 1.1) Ensure API server encryption is enabled", finding.title) + self.assertEqual("High", finding.severity) + self.assertIn("Compliance ID", finding.description) + self.assertIn("912", finding.description) + self.assertIn("Category", finding.description) + self.assertIn("Kubernetes", finding.description) + self.assertIn("Encrypting etcd data at rest", finding.description) + self.assertIn("Layer Time", finding.description) + self.assertEqual("912", finding.vuln_id_from_tool) + self.assertIn("compliance", finding.unsaved_tags) + self.assertIn("kubernetes", finding.unsaved_tags) + + # Verify compliance finding has image metadata in impact field + self.assertIn("Image ID:", finding.impact) + self.assertIn("Distribution:", finding.impact) + self.assertTrue("\n" in finding.impact) + else: + # Verify vulnerability finding exists and has correct properties + self.assertIsNotNone(finding) + self.assertEqual(1, len(finding.unsaved_vulnerability_ids)) + self.assertEqual("CVE-2013-7459", finding.unsaved_vulnerability_ids[0]) + + # Verify vulnerability finding has image metadata in impact field + self.assertIn("Image ID:", finding.impact) + self.assertIn("Distribution:", finding.impact) + self.assertIn("Debian GNU/Linux 9", finding.impact) + self.assertTrue("\n" in finding.impact) + + def test_parse_csv_with_timestamps_and_metadata(self): + testfile = ( + get_unit_tests_scans_path("twistlock") / "scan_report_prisma_twistlock_images_four_vulns.csv").open(encoding="utf-8", + ) + parser = TwistlockParser() + findings = parser.get_findings(testfile, Test()) + testfile.close() + self.assertEqual(4, len(findings)) + + # Test first finding for timestamp and metadata + finding = findings[0] + + # Verify timestamp parsing (Item 4) + self.assertIsNotNone(finding.date) + # Should use Published date (2020-09-04) or Discovered date (2020-09-29) + self.assertTrue(finding.date.year == 2020) + self.assertTrue(finding.date.month in {9, 1, 11, 12}) # Various months from the test data + + # Verify metadata in impact field (Item 3) - now separated by newlines + self.assertIn("Registry:", finding.impact) + self.assertIn("111111111111.dkr.ecr.eu-central-1.amazonaws.com", finding.impact) + self.assertIn("Repository:", finding.impact) + self.assertIn("nginx-ingress-controller", finding.impact) + self.assertIn("Tag:", finding.impact) + self.assertIn("0.32.0", finding.impact) + self.assertIn("Image ID:", finding.impact) + self.assertIn("sha256:", finding.impact) + self.assertIn("Distribution:", finding.impact) + self.assertIn("alpine-3.11.5", finding.impact) + self.assertIn("Hosts:", finding.impact) + self.assertIn("76", finding.impact) + self.assertIn("Containers:", finding.impact) + self.assertIn("46", finding.impact) + self.assertIn("Clusters:", finding.impact) + self.assertIn("alpha", finding.impact) + self.assertIn("Published:", finding.impact) + self.assertIn("Discovered:", finding.impact) + + # Verify newline separation format + self.assertTrue("\n" in finding.impact) + + # Verify vulnerability ID + self.assertEqual(1, len(finding.unsaved_vulnerability_ids)) + self.assertEqual("CVE-2020-24977", finding.unsaved_vulnerability_ids[0]) def test_parse_file_with_no_link_no_description(self): testfile = (get_unit_tests_scans_path("twistlock") / "one_vuln_no_link_no_description.json").open(encoding="utf-8") parser = TwistlockParser() findings = parser.get_findings(testfile, Test()) testfile.close() - self.assertEqual(1, len(findings)) - self.assertEqual(1, len(findings[0].unsaved_vulnerability_ids)) - self.assertEqual("PRISMA-2021-0013", findings[0].unsaved_vulnerability_ids[0]) + # Should have 2 findings: 1 vulnerability + 1 compliance + self.assertEqual(2, len(findings)) + + # Find the vulnerability finding (not compliance) + for finding in findings: + if not finding.title.startswith("Compliance:"): + self.assertIsNotNone(finding) + self.assertEqual(1, len(finding.unsaved_vulnerability_ids)) + self.assertEqual("PRISMA-2021-0013", finding.unsaved_vulnerability_ids[0]) + break def test_parse_file_with_many_vulns(self): testfile = (get_unit_tests_scans_path("twistlock") / "many_vulns.json").open(encoding="utf-8") parser = TwistlockParser() findings = parser.get_findings(testfile, Test()) testfile.close() - self.assertEqual(5, len(findings)) + # Should have 6 findings: 5 vulnerabilities + 1 compliance + self.assertEqual(6, len(findings)) def test_parse_file_which_contain_packages_info(self): testfile = (get_unit_tests_scans_path("twistlock") / "findings_include_packages.json").open(encoding="utf-8") parser = TwistlockParser() findings = parser.get_findings(testfile, Test()) testfile.close() - self.assertEqual(4, len(findings)) + # Should have 6 findings: 4 vulnerabilities + 2 compliance + self.assertEqual(6, len(findings)) def test_parse_file_prisma_twistlock_images_no_vuln(self): testfile = ( From 865950206b7db98ba880b535a426bcccddf1236e Mon Sep 17 00:00:00 2001 From: DefectDojo release bot Date: Mon, 14 Jul 2025 14:24:57 +0000 Subject: [PATCH 9/9] Update versions in application files --- components/package.json | 2 +- dojo/__init__.py | 2 +- helm/defectdojo/Chart.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/package.json b/components/package.json index 1b89eba6d67..b00da765da6 100644 --- a/components/package.json +++ b/components/package.json @@ -1,6 +1,6 @@ { "name": "defectdojo", - "version": "2.49.0-dev", + "version": "2.48.1", "license" : "BSD-3-Clause", "private": true, "dependencies": { diff --git a/dojo/__init__.py b/dojo/__init__.py index 3b94f3d5533..b70c8455b1a 100644 --- a/dojo/__init__.py +++ b/dojo/__init__.py @@ -4,6 +4,6 @@ # Django starts so that shared_task will use this app. from .celery import app as celery_app # noqa: F401 -__version__ = "2.48.0" +__version__ = "2.48.1" __url__ = "https://github.com/DefectDojo/django-DefectDojo" __docs__ = "https://documentation.defectdojo.com" diff --git a/helm/defectdojo/Chart.yaml b/helm/defectdojo/Chart.yaml index 78f85b5fbe6..8e36c1d211b 100644 --- a/helm/defectdojo/Chart.yaml +++ b/helm/defectdojo/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v2 -appVersion: "2.49.0-dev" +appVersion: "2.48.1" description: A Helm chart for Kubernetes to install DefectDojo name: defectdojo -version: 1.6.196-dev +version: 1.6.196 icon: https://www.defectdojo.org/img/favicon.ico maintainers: - name: madchap