{"id":78840,"date":"2026-10-03T05:40:15","date_gmt":"2026-10-03T05:40:15","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=78840"},"modified":"2026-10-03T05:40:21","modified_gmt":"2026-10-03T05:40:21","slug":"owasp-dependency-check-hands-on-lab-manual","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/owasp-dependency-check-hands-on-lab-manual\/","title":{"rendered":"OWASP Dependency-Check\u00a0&#8211; Hands-On Lab Manual"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">OWASP Dependency-Check 13.0.0<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Basic-to-Essentials Hands-On Lab Manual<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Audience:<\/strong>&nbsp;Beginners and engineers with basic DevOps\/DevSecOps knowledge<br><strong>Tutorial verified\/researched on:<\/strong>&nbsp;2026-10-03<br><strong>OWASP Dependency-Check version:<\/strong>&nbsp;13.0.0<br><strong>Minimum Java supported by Dependency-Check:<\/strong>&nbsp;Java 11<br><strong>Recommended lab Java runtime:<\/strong>&nbsp;Java 17 LTS or newer supported LTS<br><strong>Recommended lab OS:<\/strong>&nbsp;Ubuntu 24.04 LTS (macOS notes included)<br><strong>Sample repository:<\/strong>&nbsp;OWASP\/NodeGoat<br><strong>Repository commit:<\/strong>&nbsp;<code>9336e34<\/code>&nbsp;(<code>fix: sync lockfile<\/code>)<br><strong>Sample application:<\/strong>&nbsp;Node.js \/ npm<br><strong>Recommended Node runtime for the lab host:<\/strong>&nbsp;Node.js 24 LTS with npm available<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Version note:<\/strong>&nbsp;This manual is deliberately pinned to Dependency-Check 13.0.0 and an immutable NodeGoat commit. Vulnerability databases continue to change, so the&nbsp;<em>number<\/em>&nbsp;of findings and exact severity metadata can change even when the code does not.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Tutorial Overview<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OWASP Dependency-Check is a Software Composition Analysis (SCA) tool that attempts to identify publicly disclosed vulnerabilities in third-party dependencies. It analyzes dependency evidence, identifies software components, maps them to identifiers such as CPEs, and associates known CVEs with the identified component.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This lab takes you from installation to a practical scan of a real OWASP training application. You will generate reports, investigate a finding, work with suppression safely, test a CVSS-based gate, and see basic Maven, Gradle, and GitHub Actions integrations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What this lab is &#8211; and is not<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This lab covers&nbsp;<strong>basic to essential operational use<\/strong>. It does not try to teach enterprise database mirroring, centralized Dependency-Check services, custom analyzers, advanced hints, air-gapped architecture, or large-scale scanner administration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Current-version facts that matter<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Latest stable Dependency-Check release at the research cut-off:\u00a0<strong>13.0.0<\/strong>, released 2026-08-03.<\/li>\n\n\n\n<li>Java\u00a0<strong>11 or newer<\/strong>\u00a0is required for Dependency-Check 11.0.0+.<\/li>\n\n\n\n<li>Dependency-Check moved from the NVD legacy data-feed model to the\u00a0<strong>NVD API<\/strong>\u00a0in 9.0.0+.<\/li>\n\n\n\n<li>Dependency-Check\u00a0<strong>12.1.0+ is mandatory<\/strong>\u00a0because of NVD API compatibility changes; this lab uses 13.0.0.<\/li>\n\n\n\n<li>An NVD API key is\u00a0<strong>strongly recommended<\/strong>. Without one, initial\/update operations are much slower and rate limits are easier to hit.<\/li>\n\n\n\n<li>Current CLI report formats are:\u00a0<strong>HTML, XML, CSV, JSON, JUNIT, SARIF, JENKINS, GITLAB, ALL<\/strong>.<\/li>\n\n\n\n<li>The active source repository is\u00a0<code>dependency-check\/DependencyCheck<\/code>; the old\u00a0<code>jeremylong\/DependencyCheck<\/code>\u00a0repository is archived\/moved.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Learning Objectives<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">By the end of the lab, you should be able to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Explain what OWASP Dependency-Check is and where it fits in SCA.<\/li>\n\n\n\n<li>Explain why dependency vulnerability analysis is part of DevSecOps.<\/li>\n\n\n\n<li>Install Dependency-Check CLI 13.0.0.<\/li>\n\n\n\n<li>Verify Java and Dependency-Check versions.<\/li>\n\n\n\n<li>Explain the basic evidence -> component -> CPE\/CVE workflow.<\/li>\n\n\n\n<li>Configure the minimum settings needed for a useful scan.<\/li>\n\n\n\n<li>Use an NVD API key without committing it to source control.<\/li>\n\n\n\n<li>Clone and pin a real GitHub application for a reproducible lab.<\/li>\n\n\n\n<li>Identify direct dependencies in\u00a0<code>package.json<\/code>\u00a0and resolved dependencies in\u00a0<code>package-lock.json<\/code>.<\/li>\n\n\n\n<li>Run Dependency-Check against the codebase.<\/li>\n\n\n\n<li>Locate and open the generated HTML report.<\/li>\n\n\n\n<li>Interpret dependency, component, CPE, evidence, CVE, CVSS, severity, references, and affected-version information.<\/li>\n\n\n\n<li>Explain why a detected vulnerability is not automatically proof of exploitability.<\/li>\n\n\n\n<li>Generate multiple report formats.<\/li>\n\n\n\n<li>Use important CLI options without memorizing the full CLI.<\/li>\n\n\n\n<li>Create and validate a suppression in a controlled exercise.<\/li>\n\n\n\n<li>Configure a CVSS threshold that returns a failing exit code.<\/li>\n\n\n\n<li>Understand the basics of Maven and Gradle integration.<\/li>\n\n\n\n<li>Understand a current GitHub Actions integration pattern.<\/li>\n\n\n\n<li>Troubleshoot common update, Java, network, path, and report problems.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Prerequisites<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Prerequisites\n\u251c\u2500\u2500 <span class=\"hljs-number\">64<\/span>-bit Ubuntu Linux or macOS\n\u251c\u2500\u2500 Java <span class=\"hljs-number\">11<\/span>+ (Java <span class=\"hljs-number\">17<\/span> LTS recommended <span class=\"hljs-keyword\">for<\/span> <span class=\"hljs-keyword\">this<\/span> lab)\n\u251c\u2500\u2500 Git\n\u251c\u2500\u2500 curl\n\u251c\u2500\u2500 unzip\n\u251c\u2500\u2500 Internet access\n\u251c\u2500\u2500 Node.js <span class=\"hljs-number\">24<\/span> LTS + npm <span class=\"hljs-keyword\">for<\/span> the NodeGoat\/npm analyzers\n\u251c\u2500\u2500 NVD API key (strongly recommended)\n\u2514\u2500\u2500 About <span class=\"hljs-number\">4<\/span> GB free disk space recommended <span class=\"hljs-keyword\">for<\/span> tools, cache, repo and reports\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Prerequisite verification<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">java -version\ngit --version\ncurl --version | head -n 1\nunzip -v | head -n 2\nnode --version\nnpm --version\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You should see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Java 11 or newer.<\/li>\n\n\n\n<li>A valid Git version.<\/li>\n\n\n\n<li><code>curl<\/code>\u00a0and\u00a0<code>unzip<\/code>\u00a0available.<\/li>\n\n\n\n<li>Node.js\/npm commands available.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Exact patch versions are not important to this lab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Important Node.js note<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check&#8217;s current documentation states that npm\/pnpm\/yarn analysis requires the corresponding package-manager command to be installed because the respective audit capability is used. Node.js 24 is an LTS line as of the research date. You do&nbsp;<strong>not<\/strong>&nbsp;need to run the intentionally vulnerable NodeGoat application for this lab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">NVD API key<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Request an NVD API key from the official NVD developer page:<\/p>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/nvd.nist.gov\/developers\/request-an-api-key\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Do not put the key in Git, screenshots, lab handouts, shell scripts checked into repositories, or CI workflow source.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For an interactive Bash\/Zsh lab session:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">read -rsp <span class=\"hljs-string\">\"NVD API key: \"<\/span> NVD_API_KEY; echo\n<span class=\"hljs-keyword\">export<\/span> NVD_API_KEY\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verification without printing the secret:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">test -n <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> &amp;&amp; <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"NVD_API_KEY is set\"<\/span> || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"NVD_API_KEY is NOT set\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Lab Environment<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended configuration<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Component<\/th><th class=\"has-text-align-left\" data-align=\"left\">Lab recommendation<\/th><th class=\"has-text-align-left\" data-align=\"left\">Requirement \/ reason<\/th><\/tr><\/thead><tbody><tr><td>OS<\/td><td>Ubuntu 24.04 LTS<\/td><td>Stable, common training host<\/td><\/tr><tr><td>macOS<\/td><td>Supported<\/td><td>Homebrew alternative included<\/td><\/tr><tr><td>Java<\/td><td>17 LTS<\/td><td>Dependency-Check requires Java 11+<\/td><\/tr><tr><td>Git<\/td><td>Current supported version<\/td><td>Clone\/pin NodeGoat<\/td><\/tr><tr><td>Node.js<\/td><td>24 LTS<\/td><td>Current LTS at research cut-off; provides npm<\/td><\/tr><tr><td>npm<\/td><td>Bundled\/current with Node LTS<\/td><td>Required for npm analysis capability<\/td><\/tr><tr><td>RAM<\/td><td>4 GB minimum; 8 GB comfortable<\/td><td>Database + Java + project tooling<\/td><\/tr><tr><td>Disk<\/td><td>4 GB free recommended<\/td><td>Distribution, NVD data, project, reports<\/td><\/tr><tr><td>Internet<\/td><td>Required<\/td><td>GitHub releases, NVD API and analyzer data<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Environment variables used in this lab<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DC_VERSION=<span class=\"hljs-string\">\"13.0.0\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DC_ROOT=<span class=\"hljs-string\">\"$HOME\/tools\/owasp-dc-$DC_VERSION\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DC_HOME=<span class=\"hljs-string\">\"$DC_ROOT\/dependency-check\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>NVD_API_KEY<\/code>&nbsp;is set interactively as shown earlier.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. What Is OWASP Dependency-Check?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check is an SCA utility. Its main job is to help answer:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;Do any of the third-party components used by this application correspond to software for which publicly disclosed vulnerabilities are known?&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">It is&nbsp;<strong>not<\/strong>&nbsp;a proof-of-exploitability engine. It is also not a replacement for patch management, threat modeling, SAST, DAST, runtime testing, or human triage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why SCA matters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modern applications depend on large dependency trees. A developer may add one package while the build resolves dozens or hundreds of transitive components. SCA creates visibility into that supply chain and helps teams prioritize dependency upgrades and investigation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where Dependency-Check fits<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Source code \/ dependency manifests\n              |\n              v\n         Build \/ CI\n              |\n              v\n     Dependency-Check (SCA)\n              |\n     +--------+---------+\n     |                  |\n     v                  v\nHuman report       Machine report\nHTML               <span class=\"hljs-built_in\">JSON<\/span>\/XML\/SARIF\/etc.\n     |                  |\n     +--------+---------+\n              v\n          Triage \/ Gate\n              |\n              v\n     Upgrade \/ mitigate \/ suppress\n              |\n              v\n            Deploy\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. How Dependency-Check Works<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">At a beginner level, think of the scan as this pipeline:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Application\n    |\n    v\nDependencies \/ manifests \/ package metadata\n    |\n    v\nAnalyzers collect evidence\n(vendor, product, version and ecosystem metadata)\n    |\n    v\nComponent identification\n    |\n    v\nCPE \/ package identifiers where applicable\n    |\n    v\nVulnerability matching\n    |\n    v\nCVE + CVSS + references + evidence\n    |\n    v\nHTML \/ <span class=\"hljs-built_in\">JSON<\/span> \/ XML \/ CSV \/ SARIF \/ ... reports\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check uses analyzers to collect evidence. Evidence is categorized around vendor, product, and version. Evidence is assigned confidence levels. The tool then attempts to identify the component; for CPE-based matching, associated CVEs can be attached to the dependency.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why false positives can happen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Names are not always globally unique. Two unrelated projects can have similar names or versions, and ecosystem metadata can be incomplete. Therefore, the first report-triage question is:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Is the identified component\/CPE actually the dependency I use?<\/strong><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Why false negatives can happen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A dependency may lack enough identifying evidence, a product can be named differently in NVD data, or an ecosystem may not map cleanly to CPE. A clean report therefore does not prove that the application has no vulnerable dependencies.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Installation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The main lab uses the&nbsp;<strong>official CLI distribution<\/strong>. This makes the CLI behavior visible and keeps the lab independent of a particular build system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 &#8211; Create a user-owned tools directory<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Command<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> DC_VERSION=<span class=\"hljs-string\">\"13.0.0\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DC_ROOT=<span class=\"hljs-string\">\"$HOME\/tools\/owasp-dc-$DC_VERSION\"<\/span>\nmkdir -p <span class=\"hljs-string\">\"$DC_ROOT\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No output is expected if the command succeeds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">test -d <span class=\"hljs-string\">\"$DC_ROOT\"<\/span> &amp;&amp; <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Tool directory ready: $DC_ROOT\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem:<\/strong>&nbsp;Permission denied.<br><strong>Cause:<\/strong>&nbsp;You selected a directory your user cannot write to.<br><strong>Solution:<\/strong>&nbsp;Use a user-owned path such as&nbsp;<code>$HOME\/tools<\/code>.<br><strong>Verification:<\/strong>&nbsp;<code>test -w \"$DC_ROOT\" &amp;&amp; echo writable<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 &#8211; Download Dependency-Check 13.0.0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Command<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -fL \\\n  <span class=\"hljs-string\">\"https:\/\/github.com\/dependency-check\/DependencyCheck\/releases\/download\/v${DC_VERSION}\/dependency-check-${DC_VERSION}-release.zip\"<\/span> \\\n  -o <span class=\"hljs-string\">\"\/tmp\/dependency-check-${DC_VERSION}-release.zip\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>curl<\/code>&nbsp;displays transfer progress and exits with status 0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls -lh <span class=\"hljs-string\">\"\/tmp\/dependency-check-${DC_VERSION}-release.zip\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem:<\/strong>&nbsp;HTTP\/DNS\/connection error.<br><strong>Cause:<\/strong>&nbsp;Internet access, proxy, DNS or GitHub access is blocked.<br><strong>Solution:<\/strong>&nbsp;Confirm HTTPS access to GitHub or configure the required corporate proxy.<br><strong>Verification:<\/strong>&nbsp;Repeat the download and confirm exit code 0.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Integrity option:<\/strong>&nbsp;OWASP publishes a signature file and documents GPG verification. For production distribution workflows, verify the release signature rather than treating an HTTPS download alone as supply-chain validation.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 &#8211; Extract the release<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Command<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">unzip -q <span class=\"hljs-string\">\"\/tmp\/dependency-check-${DC_VERSION}-release.zip\"<\/span> -d <span class=\"hljs-string\">\"$DC_ROOT\"<\/span>\n<span class=\"hljs-keyword\">export<\/span> DC_HOME=<span class=\"hljs-string\">\"$DC_ROOT\/dependency-check\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No output is expected from&nbsp;<code>unzip -q<\/code>&nbsp;on success.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls <span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span>\nls <span class=\"hljs-string\">\"$DC_HOME\/lib\"<\/span> | head\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem:<\/strong>&nbsp;<code>cannot find or open<\/code>&nbsp;archive.<br><strong>Cause:<\/strong>&nbsp;Download failed or filename differs.<br><strong>Solution:<\/strong>&nbsp;Verify the exact file under&nbsp;<code>\/tmp<\/code>.<br><strong>Verification:<\/strong>&nbsp;<code>ls -l \/tmp\/dependency-check-13.0.0-release.zip<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 &#8211; Verify the CLI<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Command<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Output should identify Dependency-Check&nbsp;<strong>13.0.0<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --help | head -n <span class=\"hljs-number\">20<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem:<\/strong>&nbsp;Java error or unsupported runtime.<br><strong>Cause:<\/strong>&nbsp;Java is missing, too old, or&nbsp;<code>JAVA_HOME<\/code>\/<code>PATH<\/code>&nbsp;points to the wrong runtime.<br><strong>Solution:<\/strong>&nbsp;Install\/select Java 11+; Java 17 LTS is recommended for this lab.<br><strong>Verification:<\/strong>&nbsp;<code>java -version<\/code>, then rerun&nbsp;<code>--version<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">macOS alternative &#8211; Homebrew<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Official Dependency-Check documentation also supports Homebrew:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">brew update\nbrew install dependency-check\ndependency-check --version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For the rest of the lab, macOS Homebrew users can replace:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dependency-check\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Windows note<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use the official ZIP distribution and run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">.\\<span class=\"hljs-selector-tag\">bin<\/span>\\<span class=\"hljs-selector-tag\">dependency-check<\/span><span class=\"hljs-selector-class\">.bat<\/span> <span class=\"hljs-selector-tag\">--version<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The CLI options taught in this manual are the same; path quoting and shell syntax differ.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Alternative delivery methods<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Method<\/th><th class=\"has-text-align-left\" data-align=\"left\">Good for<\/th><th class=\"has-text-align-left\" data-align=\"left\">Lab status<\/th><\/tr><\/thead><tbody><tr><td>CLI ZIP<\/td><td>Learning the scanner directly<\/td><td><strong>Main lab<\/strong><\/td><\/tr><tr><td>Homebrew<\/td><td>macOS convenience<\/td><td>Supported alternative<\/td><\/tr><tr><td>Docker<\/td><td>Isolated execution \/ CI<\/td><td>Briefly introduced<\/td><\/tr><tr><td>Maven plugin<\/td><td>Maven builds<\/td><td>Integration section<\/td><\/tr><tr><td>Gradle plugin<\/td><td>Gradle builds<\/td><td>Integration section<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Installation Verification<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run all of the following:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">java -version\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --help | head -n <span class=\"hljs-number\">30<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validation criteria:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Java<\/span> <span class=\"hljs-selector-tag\">command<\/span> <span class=\"hljs-selector-tag\">works<\/span>\n<span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Java<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">version<\/span> 11 <span class=\"hljs-selector-tag\">or<\/span> <span class=\"hljs-selector-tag\">newer<\/span>\n<span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Dependency-Check<\/span> <span class=\"hljs-selector-tag\">reports<\/span> 13<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">--help<\/span> <span class=\"hljs-selector-tag\">displays<\/span> <span class=\"hljs-selector-tag\">CLI<\/span> <span class=\"hljs-selector-tag\">usage<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Exercise 1 &#8211; Install and verify<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Install Dependency-Check and prove the installed version.<br><strong>Success criteria:<\/strong>&nbsp;A terminal capture or lab note showing Dependency-Check 13.0.0 and Java 11+.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. NVD \/ Data Update Configuration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check maintains local vulnerability data so it does not need to download the full vulnerability corpus for every scan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What changed from older tutorials?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Older material often refers to downloading NVD JSON feeds or NVD API 1.0. That is no longer the standard current path:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dependency-Check has used the\u00a0<strong>NVD API<\/strong>\u00a0since 9.0.0+.<\/li>\n\n\n\n<li>NVD 1.0 APIs are retired.<\/li>\n\n\n\n<li>NVD 2.0 APIs are the preferred\/current NVD interface.<\/li>\n\n\n\n<li>Dependency-Check 12.1.0+ is mandatory because of NVD API compatibility changes.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">NVD API key &#8211; required or recommended?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For Dependency-Check itself, the key is not strictly required for every local invocation, but the project&nbsp;<strong>highly recommends<\/strong>&nbsp;it. Without a key, update calls use a longer default delay and initial population becomes extremely slow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Current CLI defaults include:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Setting<\/th><th class=\"has-text-align-left\" data-align=\"left\">Current CLI behavior<\/th><\/tr><\/thead><tbody><tr><td><code>--nvdApiKey<\/code><\/td><td>Supplies NVD API key<\/td><\/tr><tr><td><code>--nvdApiDelay<\/code><\/td><td>3500 ms with key; 8000 ms without key<\/td><\/tr><tr><td><code>--nvdApiResultsPerPage<\/code><\/td><td>2000<\/td><\/tr><tr><td><code>--nvdValidForHours<\/code><\/td><td>4 hours<\/td><\/tr><tr><td><code>--updateonly<\/code><\/td><td>Update phase only; no scan\/report<\/td><\/tr><tr><td><code>--noupdate<\/code><\/td><td>Disable automatic NVD\/hosted-suppression\/RetireJS updates<\/td><\/tr><tr><td><code>--data<\/code><\/td><td>Override persistent data directory<\/td><\/tr><tr><td><code>--purge<\/code><\/td><td>Delete local NVD copy to force refresh<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 &#8211; Perform an explicit data update<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Command<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --updateonly \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Expect informational messages indicating that vulnerability data is being retrieved\/processed. The first population is substantially heavier than incremental updates. Exact line counts and timestamps change over time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>--updateonly<\/code>&nbsp;does&nbsp;<strong>not<\/strong>&nbsp;generate a vulnerability report.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">find <span class=\"hljs-string\">\"$DC_HOME\/data\"<\/span> -maxdepth <span class=\"hljs-number\">2<\/span> -type f | head\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see local Dependency-Check data files.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem:<\/strong>&nbsp;403 or NVD request failures.<br><strong>Cause:<\/strong>&nbsp;Invalid\/rate-limited key, too many concurrent jobs sharing a key, network filtering, or NVD service issues.<br><strong>Solution:<\/strong>&nbsp;Verify the key, avoid many concurrent jobs using one key, persist\/reuse the data cache, and check NVD availability.<br><strong>Verification:<\/strong>&nbsp;Run&nbsp;<code>--updateonly<\/code>&nbsp;again after correcting the cause and confirm it completes successfully.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CI warning: do not re-download the NVD corpus in every ephemeral job<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Dependency-Check project explicitly warns that one API key used across many simultaneous CI builds can hit NVD rate limits. Operational CI should use a cache or mirrored data strategy. Enterprise mirroring is outside this beginner lab.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Sample GitHub Project<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Selected project: OWASP NodeGoat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Repository:<\/p>\n\n\n\n<figure class=\"wp-block-embed\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/github.com\/OWASP\/NodeGoat\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Pinned commit:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">9336e34  fix: sync lockfile\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Why this repository was selected<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It is an OWASP public training project.<\/li>\n\n\n\n<li>It is intentionally designed for security learning.<\/li>\n\n\n\n<li>It uses a real npm dependency tree.<\/li>\n\n\n\n<li>The pinned commit contains both\u00a0<code>package.json<\/code>\u00a0and\u00a0<code>package-lock.json<\/code>.<\/li>\n\n\n\n<li>It intentionally pins\u00a0<code>marked<\/code>\u00a0version\u00a0<code>0.3.5<\/code>, a historically vulnerable version used by the project&#8217;s insecure-components lesson.<\/li>\n\n\n\n<li>The immutable commit makes the lab reproducible even if\u00a0<code>master<\/code>\u00a0changes later.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Safety note:<\/strong>&nbsp;NodeGoat is intentionally vulnerable. This lab scans its dependency metadata. Do not expose the application to untrusted networks and do not use it as a production service.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 &#8211; Clone NodeGoat<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">mkdir -p <span class=\"hljs-string\">\"$HOME\/labs\"<\/span>\ncd <span class=\"hljs-string\">\"$HOME\/labs\"<\/span>\ngit <span class=\"hljs-keyword\">clone<\/span> https:<span class=\"hljs-comment\">\/\/github.com\/OWASP\/NodeGoat.git<\/span>\ncd NodeGoat\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Git reports cloning objects into&nbsp;<code>NodeGoat<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git remote -v\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 &#8211; Pin the lab commit<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout 9336e34\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected Git behavior: detached HEAD at the requested historical commit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git rev-parse --short HEAD\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">9336e34\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 &#8211; Inspect the dependency manifests<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ls -l package.json package-lock.json\ngrep <span class=\"hljs-string\">'\"marked\"'<\/span> package.json\ngrep -m <span class=\"hljs-number\">1<\/span> -A <span class=\"hljs-number\">3<\/span> <span class=\"hljs-string\">'\"marked\"'<\/span> package-lock.json\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected&nbsp;<code>package.json<\/code>&nbsp;line:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"marked\"<\/span>: <span class=\"hljs-string\">\"0.3.5\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Important dependency concepts<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>package.json<\/code>\u00a0expresses the application&#8217;s direct dependency declarations.<\/li>\n\n\n\n<li><code>package-lock.json<\/code>\u00a0records the resolved npm dependency graph.<\/li>\n\n\n\n<li>The lock file contains many more components than the direct dependency list because transitive dependencies are included.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise 2 &#8211; Identify dependencies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Identify five direct dependencies and one exact pinned dependency.<br><strong>Validation:<\/strong>&nbsp;Student records&nbsp;<code>marked 0.3.5<\/code>&nbsp;and four other entries from&nbsp;<code>package.json<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. First Dependency-Check Scan<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 &#8211; Go to the project<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cd <span class=\"hljs-string\">\"$HOME\/labs\/NodeGoat\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pwd\ngit rev-parse --short HEAD\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 &#8211; Create the report directory<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mkdir -p reports\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 &#8211; Run the scan<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --project <span class=\"hljs-string\">\"OWASP NodeGoat - Training Lab\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\"<\/span> \\\n  --format <span class=\"hljs-string\">\"HTML\"<\/span> \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> \\\n  --log <span class=\"hljs-string\">\".\/reports\/dependency-check.log\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">What Dependency-Check is doing<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Ensuring vulnerability\/supporting data is current enough.<\/li>\n\n\n\n<li>Walking the requested scan path.<\/li>\n\n\n\n<li>Running applicable analyzers.<\/li>\n\n\n\n<li>Reading npm package metadata\/lock information.<\/li>\n\n\n\n<li>Collecting identifiers\/evidence.<\/li>\n\n\n\n<li>Correlating identified components with vulnerability data.<\/li>\n\n\n\n<li>Creating the requested report.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Expected output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The console should show normal update\/analysis\/report-generation messages. Exact analyzer messages and vulnerability counts are intentionally&nbsp;<strong>not<\/strong>&nbsp;fixed in this manual because online vulnerability\/advisory data evolves.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verification<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">find reports -maxdepth <span class=\"hljs-number\">1<\/span> -type f -<span class=\"hljs-keyword\">print<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should find an HTML report, normally:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">reports\/dependency-check-report.html\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 &#8211; Open the report<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Linux desktop:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">xdg-open reports\/dependency-check-report.html\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">macOS:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">open reports\/dependency-check-report.html\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If you are on a headless training VM, copy the report to your workstation or use a browser-accessible lab artifact location.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise 3 &#8211; First scan<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Run the scan and locate the HTML report.<br><strong>Validation:<\/strong>&nbsp;<code>reports\/dependency-check-report.html<\/code>&nbsp;exists and opens.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Understanding the Output<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The HTML report summarizes dependencies and vulnerable components, then provides per-dependency details.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The current OWASP report-reading documentation highlights these top-level fields:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Field<\/th><th class=\"has-text-align-left\" data-align=\"left\">Meaning<\/th><\/tr><\/thead><tbody><tr><td>Dependency<\/td><td>File\/component being analyzed<\/td><\/tr><tr><td>CPE<\/td><td>Common Platform Enumeration identifier if identified<\/td><\/tr><tr><td>GAV<\/td><td>Maven Group:Artifact:Version where relevant<\/td><\/tr><tr><td>Highest Severity<\/td><td>Highest associated vulnerability severity<\/td><\/tr><tr><td>CVE Count<\/td><td>Number of associated CVEs<\/td><\/tr><tr><td>CPE Confidence<\/td><td>Confidence in the CPE identification<\/td><\/tr><tr><td>Evidence Count<\/td><td>Amount of evidence used for identification<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For npm components, you may also see package ecosystem identifiers rather than Java-oriented GAV information.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The most important triage sequence<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Finding appears\n     |\n     v\nIs the dependency\/component identified correctly?\n     |\n     +-- No --&gt; <span class=\"hljs-literal\">false<\/span>-positive investigation \/ suppression candidate\n     |\n     v Yes\nDoes the vulnerability version range include our version?\n     |\n     +-- No --&gt; investigate data\/matching discrepancy\n     |\n     v Yes\nIs the vulnerable code\/configuration reachable or applicable here?\n     |\n     +-- Unknown --&gt; investigate\n     |\n     +-- No --&gt; <span class=\"hljs-built_in\">document<\/span> compensating facts; suppression only <span class=\"hljs-keyword\">if<\/span> justified\n     |\n     v Yes\nRemediate \/ upgrade \/ mitigate\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Understanding the HTML Report<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Field-by-field workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For one finding, work downward through:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Dependency\n    |\n    v\nDetected version \/ package identity\n    |\n    v\nCPE \/ package identifier + confidence\n    |\n    v\nCVE \/ advisory\n    |\n    v\nSeverity + CVSS version\/score\n    |\n    v\nDescription \/ CWE where present\n    |\n    v\nAffected version range\n    |\n    v\nReferences\n    |\n    v\nFixed version \/ remediation source where available\n    |\n    v\nYour application's real usage and exposure\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example candidate in this lab:&nbsp;<code>marked 0.3.5<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The pinned NodeGoat manifest explicitly contains:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">marked<\/span> 0<span class=\"hljs-selector-class\">.3<\/span><span class=\"hljs-selector-class\">.5<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">One historical advisory associated with that version is&nbsp;<strong>CVE-2016-10531<\/strong>, a sanitization-bypass\/XSS issue affecting&nbsp;<code>marked<\/code>&nbsp;0.3.5 and earlier. A current OSV record lists a CVSS v3 score of 6.1 (Medium) and a fixed version of 0.3.6.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do not hard-code your lab grading to this one CVE.<\/strong>&nbsp;Dependency-Check data sources and matching evolve. If the exact CVE is not in your current report, select another actual finding from the generated report and perform the same analysis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Finding worksheet<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Question<\/th><th class=\"has-text-align-left\" data-align=\"left\">Student answer<\/th><\/tr><\/thead><tbody><tr><td>Dependency<\/td><td><\/td><\/tr><tr><td>Installed\/resolved version<\/td><td><\/td><\/tr><tr><td>Identifier\/CPE\/PURL<\/td><td><\/td><\/tr><tr><td>CPE confidence, if present<\/td><td><\/td><\/tr><tr><td>CVE<\/td><td><\/td><\/tr><tr><td>CVSS version<\/td><td><\/td><\/tr><tr><td>CVSS score<\/td><td><\/td><\/tr><tr><td>Severity<\/td><td><\/td><\/tr><tr><td>CWE, if present<\/td><td><\/td><\/tr><tr><td>Affected range<\/td><td><\/td><\/tr><tr><td>Fixed version, if authoritative data provides one<\/td><td><\/td><\/tr><tr><td>Reference used for verification<\/td><td><\/td><\/tr><tr><td>Is the component identification correct?<\/td><td><\/td><\/tr><tr><td>Is the vulnerable version actually present?<\/td><td><\/td><\/tr><tr><td>Is exploitability\/applicability confirmed?<\/td><td><\/td><\/tr><tr><td>Recommended next action<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise 4 &#8211; Read one finding<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Complete the worksheet for a real finding in your report.<br><strong>Validation:<\/strong>&nbsp;Student can explain component identity, CVE, CVSS and why further investigation may still be required.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Understanding CVE, CVSS, Severity and Evidence<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">CVE<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A CVE is an identifier for a publicly disclosed vulnerability record. A CVE identifier does not by itself tell you whether the issue is exploitable in your specific application.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CVSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CVSS is a standardized severity-scoring system. Dependency-Check may display scores supplied by vulnerability sources. Always note the&nbsp;<strong>CVSS version and source<\/strong>&nbsp;shown in the report; do not compare numbers from different contexts as though they were identical measurements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical qualitative bands on the 0-10 scale are:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-right\" data-align=\"right\">Score<\/th><th class=\"has-text-align-left\" data-align=\"left\">Qualitative severity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-right\" data-align=\"right\">0.0<\/td><td>None<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">0.1-3.9<\/td><td>Low<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">4.0-6.9<\/td><td>Medium<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">7.0-8.9<\/td><td>High<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">9.0-10.0<\/td><td>Critical<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Severity is not business risk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A high CVSS score does not automatically mean &#8220;fix this first&#8221; in every environment. Real risk also depends on reachability, exposure, privileges, data sensitivity, compensating controls, known exploitation, asset importance and patch feasibility.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Evidence and CPE confidence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check evidence supports its identification decision. Confidence indicates how strongly the collected evidence supported a CPE match. A&nbsp;<strong>high-confidence match can still require human validation<\/strong>; confidence is about identity matching, not exploitability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Five useful finding states<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">State<\/th><th class=\"has-text-align-left\" data-align=\"left\">Meaning<\/th><\/tr><\/thead><tbody><tr><td>Vulnerability detected<\/td><td>Tool associated a vulnerability with a dependency<\/td><\/tr><tr><td>Vulnerability confirmed<\/td><td>Team validated identity, affected version and applicability<\/td><\/tr><tr><td>False positive<\/td><td>Tool associated a vulnerability with the wrong\/non-applicable component<\/td><\/tr><tr><td>False negative<\/td><td>A real vulnerable component is present but scanner did not report it<\/td><\/tr><tr><td>Needs investigation<\/td><td>Evidence is not yet sufficient to decide<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Different Report Formats<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check 13.0.0 supports:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">HTML, XML, CSV, <span class=\"hljs-built_in\">JSON<\/span>, JUNIT, SARIF, JENKINS, GITLAB, ALL\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Practical report table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Format<\/th><th class=\"has-text-align-left\" data-align=\"left\">Purpose<\/th><th class=\"has-text-align-left\" data-align=\"left\">Typical consumer<\/th><\/tr><\/thead><tbody><tr><td>HTML<\/td><td>Rich human-readable review<\/td><td>Developer \/ security engineer<\/td><\/tr><tr><td>JSON<\/td><td>Structured automation<\/td><td>Scripts \/ data pipelines<\/td><\/tr><tr><td>XML<\/td><td>Structured tool integration<\/td><td>CI\/security tooling<\/td><\/tr><tr><td>CSV<\/td><td>Spreadsheet\/simple tabular analysis<\/td><td>Analyst \/ reporting<\/td><\/tr><tr><td>JUNIT<\/td><td>Represent findings in test-style CI output<\/td><td>CI systems<\/td><\/tr><tr><td>SARIF<\/td><td>Static-analysis interchange format<\/td><td>Code\/security platforms<\/td><\/tr><tr><td>JENKINS<\/td><td>Jenkins-oriented report<\/td><td>Jenkins workflows<\/td><\/tr><tr><td>GITLAB<\/td><td>GitLab-oriented report<\/td><td>GitLab workflows<\/td><\/tr><tr><td>ALL<\/td><td>Generate all supported formats<\/td><td>Lab\/testing; usually excessive in routine CI<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Generate multiple formats<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">rm -rf reports\/multi\nmkdir -p reports\/multi\n\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --project <span class=\"hljs-string\">\"OWASP NodeGoat - Multi-format\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\/multi\"<\/span> \\\n  --format <span class=\"hljs-string\">\"HTML\"<\/span> \\\n  --format <span class=\"hljs-string\">\"JSON\"<\/span> \\\n  --format <span class=\"hljs-string\">\"XML\"<\/span> \\\n  --format <span class=\"hljs-string\">\"CSV\"<\/span> \\\n  --format <span class=\"hljs-string\">\"SARIF\"<\/span> \\\n  --prettyPrint \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">find reports\/multi -maxdepth <span class=\"hljs-number\">1<\/span> -type f -<span class=\"hljs-keyword\">print<\/span> | sort\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Exercise 5 &#8211; Machine-readable output<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Generate JSON and SARIF in addition to HTML.<br><strong>Validation:<\/strong>&nbsp;Corresponding files are present and non-empty.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">test -s reports\/multi\/dependency-check-report.json &amp;&amp; <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"JSON OK\"<\/span>\ntest -s reports\/multi\/dependency-check-report.sarif &amp;&amp; <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"SARIF OK\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Important CLI Options<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This table intentionally covers commonly useful options rather than dumping every advanced switch.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Option<\/th><th class=\"has-text-align-left\" data-align=\"left\">Purpose<\/th><th class=\"has-text-align-left\" data-align=\"left\">Example<\/th><\/tr><\/thead><tbody><tr><td><code>--project<\/code><\/td><td>Name displayed in report<\/td><td><code>--project \"My Service\"<\/code><\/td><\/tr><tr><td><code>--scan<\/code><\/td><td>Path\/pattern to scan; repeatable<\/td><td><code>--scan \".\"<\/code><\/td><\/tr><tr><td><code>--exclude<\/code><\/td><td>Exclude Ant-style path pattern<\/td><td><code>--exclude \"**\/test-fixtures\/**\"<\/code><\/td><\/tr><tr><td><code>--out<\/code><\/td><td>Output directory\/file<\/td><td><code>--out .\/reports<\/code><\/td><\/tr><tr><td><code>--format<\/code><\/td><td>Report format; repeatable<\/td><td><code>--format HTML --format SARIF<\/code><\/td><\/tr><tr><td><code>--prettyPrint<\/code><\/td><td>Pretty-print JSON\/XML<\/td><td><code>--prettyPrint<\/code><\/td><\/tr><tr><td><code>--log<\/code><\/td><td>Write verbose log file<\/td><td><code>--log .\/reports\/dc.log<\/code><\/td><\/tr><tr><td><code>--suppression<\/code><\/td><td>Apply suppression XML; repeatable<\/td><td><code>--suppression .\/dependency-check-suppressions.xml<\/code><\/td><\/tr><tr><td><code>--failOnCVSS<\/code><\/td><td>Non-zero exit if score &gt;= threshold<\/td><td><code>--failOnCVSS 8.0<\/code><\/td><\/tr><tr><td><code>--nvdApiKey<\/code><\/td><td>NVD API key<\/td><td><code>--nvdApiKey \"$NVD_API_KEY\"<\/code><\/td><\/tr><tr><td><code>--updateonly<\/code><\/td><td>Update data without scanning<\/td><td><code>--updateonly<\/code><\/td><\/tr><tr><td><code>--noupdate<\/code><\/td><td>Do not update data<\/td><td><code>--noupdate<\/code><\/td><\/tr><tr><td><code>--data<\/code>&nbsp;\/&nbsp;<code>-d<\/code><\/td><td>Override persistent data directory<\/td><td><code>--data \"$HOME\/.cache\/dependency-check\"<\/code><\/td><\/tr><tr><td><code>--purge<\/code><\/td><td>Delete local NVD copy to force refresh<\/td><td><code>--purge<\/code><\/td><\/tr><tr><td><code>--propertyfile<\/code>&nbsp;\/&nbsp;<code>-P<\/code><\/td><td>Load Dependency-Check properties<\/td><td><code>-P .\/dependencycheck.properties<\/code><\/td><\/tr><tr><td><code>--help<\/code><\/td><td>Basic help<\/td><td><code>--help<\/code><\/td><\/tr><tr><td><code>--advancedHelp<\/code><\/td><td>Advanced help<\/td><td><code>--advancedHelp<\/code><\/td><\/tr><tr><td><code>--version<\/code><\/td><td>Print version<\/td><td><code>--version<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Ant-style path caution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The official CLI documentation recommends quoting Ant-style paths so your shell does not expand them before Dependency-Check receives the pattern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --scan <span class=\"hljs-string\">'.\/lib\/**\/*.jar'<\/span> \\\n  --out .\/reports\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Exercise 6 &#8211; Exclusion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Run a scan with an exclusion that targets a known non-production test-fixture directory if your own project has one.<br><strong>Validation:<\/strong>&nbsp;Report\/log shows the excluded path was not analyzed.<br><strong>Rule:<\/strong>&nbsp;Do not exclude a path merely because it contains inconvenient vulnerabilities.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Configuration<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Required \/ strongly recommended for this lab<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Setting<\/th><th class=\"has-text-align-left\" data-align=\"left\">Status<\/th><th class=\"has-text-align-left\" data-align=\"left\">Reason<\/th><\/tr><\/thead><tbody><tr><td>Java 11+<\/td><td>Required<\/td><td>Tool runtime requirement<\/td><\/tr><tr><td><code>--scan<\/code><\/td><td>Required for scanning<\/td><td>Defines target<\/td><\/tr><tr><td>Internet access<\/td><td>Required for normal update\/analyzer operation<\/td><td>External vulnerability\/supporting data<\/td><\/tr><tr><td>npm on PATH<\/td><td>Required for current npm audit analysis<\/td><td>Node\/npm project<\/td><\/tr><tr><td>NVD API key<\/td><td>Strongly recommended<\/td><td>Faster\/more reliable NVD update behavior<\/td><\/tr><tr><td>Persistent data directory<\/td><td>Recommended<\/td><td>Avoid full repopulation per execution<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Optional, commonly useful<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>--project<\/code><\/li>\n\n\n\n<li><code>--out<\/code><\/li>\n\n\n\n<li>multiple\u00a0<code>--format<\/code><\/li>\n\n\n\n<li><code>--log<\/code><\/li>\n\n\n\n<li><code>--exclude<\/code><\/li>\n\n\n\n<li><code>--suppression<\/code><\/li>\n\n\n\n<li><code>--failOnCVSS<\/code><\/li>\n\n\n\n<li>proxy options<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Advanced &#8211; know these exist, but do not start here<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NVD mirrors\/data feeds<\/li>\n\n\n\n<li>centralized database configuration<\/li>\n\n\n\n<li>analyzer enable\/disable matrix<\/li>\n\n\n\n<li>custom hints<\/li>\n\n\n\n<li>OSS Index\/Sonatype credentials<\/li>\n\n\n\n<li>hosted suppression mirrors<\/li>\n\n\n\n<li>custom plugins<\/li>\n\n\n\n<li>database server integration<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Proxy configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Current CLI options include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">--proxyserver <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">server<\/span>&gt;<\/span>\n--proxyport <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">port<\/span>&gt;<\/span>\n--proxyuser <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">user<\/span>&gt;<\/span>\n--proxypass <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pass<\/span>&gt;<\/span>\n--nonProxyHosts <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">list<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example for a proxy that does not require authentication:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --updateonly \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> \\\n  --proxyserver proxy.example.com \\\n  --proxyport <span class=\"hljs-number\">8080<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Avoid putting proxy passwords directly in persistent shell history when a safer organizational secret mechanism is available.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Suppression and False Positives<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppression is a&nbsp;<strong>triage mechanism<\/strong>, not a way to make a dashboard green.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When suppression is appropriate<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Consider suppression when you have evidence that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the component\/CPE identification is wrong;<\/li>\n\n\n\n<li>a CVE does not apply to the identified artifact\/version;<\/li>\n\n\n\n<li>a documented exception has been approved and the suppression captures the scope\/rationale.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Do&nbsp;<strong>not<\/strong>&nbsp;suppress simply because:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a vulnerability is hard to fix;<\/li>\n\n\n\n<li>the score breaks the build;<\/li>\n\n\n\n<li>the team is short on time;<\/li>\n\n\n\n<li>you have not investigated the finding.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best beginner workflow: generate from the HTML report<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the HTML report.<\/li>\n\n\n\n<li>Select the relevant dependency\/CPE\/CVE.<\/li>\n\n\n\n<li>Use the report&#8217;s\u00a0<strong>Suppress<\/strong>\u00a0function.<\/li>\n\n\n\n<li>Copy the generated XML.<\/li>\n\n\n\n<li>Add a meaningful note\/rationale.<\/li>\n\n\n\n<li>Save it as\u00a0<code>dependency-check-suppressions.xml<\/code>.<\/li>\n\n\n\n<li>Re-run with\u00a0<code>--suppression<\/code>.<\/li>\n\n\n\n<li>Confirm only the intended finding changed.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The current suppression schema is&nbsp;<code>dependency-suppression.1.4.xsd<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lab-only example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; dependency-check-suppressions.xml &lt;&lt;<span class=\"hljs-string\">'XML'<\/span>\n&lt;?xml version=<span class=\"hljs-string\">\"1.0\"<\/span> encoding=<span class=\"hljs-string\">\"UTF-8\"<\/span>?&gt;\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">suppressions<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"https:\/\/jeremylong.github.io\/DependencyCheck\/dependency-suppression.1.4.xsd\"<\/span>&gt;<\/span>\n    <span class=\"hljs-comment\">&lt;!-- Prefer the XML generated from your own HTML report. --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">suppressions<\/span>&gt;<\/span><\/span>\nXML\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then replace the empty body with the suppression snippet produced by the report for a selected training finding.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">mkdir -p reports\/suppressed\n\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --project <span class=\"hljs-string\">\"OWASP NodeGoat - Suppression Exercise\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\/suppressed\"<\/span> \\\n  --format <span class=\"hljs-string\">\"HTML\"<\/span> \\\n  --suppression <span class=\"hljs-string\">\".\/dependency-check-suppressions.xml\"<\/span> \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">How to verify the suppression<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Compare the original and suppressed reports. Confirm:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Intended<\/span> <span class=\"hljs-selector-tag\">finding<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">suppressed<\/span>\n<span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Other<\/span> <span class=\"hljs-selector-tag\">findings<\/span> <span class=\"hljs-selector-tag\">remain<\/span> <span class=\"hljs-selector-tag\">visible<\/span>\n<span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Suppression<\/span> <span class=\"hljs-selector-tag\">note<\/span> <span class=\"hljs-selector-tag\">explains<\/span> <span class=\"hljs-selector-tag\">why<\/span> <span class=\"hljs-selector-tag\">it<\/span> <span class=\"hljs-selector-tag\">exists<\/span>\n<span class=\"hljs-selector-attr\">&#91; ]<\/span> <span class=\"hljs-selector-tag\">Matching<\/span> <span class=\"hljs-selector-tag\">scope<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">as<\/span> <span class=\"hljs-selector-tag\">narrow<\/span> <span class=\"hljs-selector-tag\">as<\/span> <span class=\"hljs-selector-tag\">practical<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Training rule:<\/strong>&nbsp;If you suppress a&nbsp;<em>real<\/em>&nbsp;NodeGoat vulnerability only to learn the mechanism, label it&nbsp;<code>LAB ONLY<\/code>, demonstrate the behavior, then remove that rule. The vulnerable component did not become safe because the report stopped showing it.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise 7 &#8211; Suppression<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Use the HTML report to generate one lab-only suppression, rerun, validate it, and then remove the lab suppression.<br><strong>Success criteria:<\/strong>&nbsp;Student can show before\/after reports and explain why suppression is not remediation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Build Failure \/ Security Threshold<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A scan and a security gate are different concepts:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Scan\n  |\n  v\nReport findings\n  |\n  v\nCompare findings <span class=\"hljs-keyword\">with<\/span> threshold\/policy\n  |\n  +---- below threshold ----&gt; exit <span class=\"hljs-number\">0<\/span> \/ pass\n  |\n  +---- at\/above threshold -&gt; non-zero \/ fail\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check CLI supports:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">--failOnCVSS <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">score<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A value between 0 and 10 causes the exit status to indicate failure when a vulnerability with CVSS equal to or greater than the threshold is identified.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Controlled gate exercise<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First identify the highest CVSS score in your actual report. Choose a threshold at or below one reported score, for example 7.0 if a High finding exists.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">set +e\n\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --project <span class=\"hljs-string\">\"OWASP NodeGoat - Gate Exercise\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\/gate\"<\/span> \\\n  --format <span class=\"hljs-string\">\"HTML\"<\/span> \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> \\\n  --failOnCVSS <span class=\"hljs-number\">7.0<\/span>\n\nDC_EXIT=$?\nset -e\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Dependency-Check exit code: $DC_EXIT\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If at least one unsuppressed finding has CVSS &gt;= 7.0, the command should return a non-zero exit status.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your current report has no finding at or above 7.0, set the exercise threshold equal to or below an observed score rather than pretending the gate failed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Report generation vs gate vs build failure<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Concept<\/th><th class=\"has-text-align-left\" data-align=\"left\">Meaning<\/th><\/tr><\/thead><tbody><tr><td>Report generation<\/td><td>Produce evidence for review<\/td><\/tr><tr><td>Security gate<\/td><td>Compare findings with policy criteria<\/td><\/tr><tr><td>Build failure<\/td><td>CI\/build process turns that policy result into a non-zero job\/build result<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A mature policy usually considers more than CVSS alone. This lab uses CVSS only because it is the scanner&#8217;s simple built-in gate mechanism.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exercise 8 &#8211; Test the threshold<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Task:<\/strong>&nbsp;Demonstrate one passing and one failing threshold using the same scan target.<br><strong>Validation:<\/strong>&nbsp;Record both exit codes and explain why the report itself is still valuable even when the process exits non-zero.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Maven Integration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This section is an integration example for a&nbsp;<strong>Maven project<\/strong>; NodeGoat itself is not Maven-based.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Current requirements<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency-Check Maven plugin 13.0.0 requires:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Maven 3.8.1+<\/li>\n\n\n\n<li>JDK 11+<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">One-off scan<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">mvn<\/span> <span class=\"hljs-selector-tag\">org<\/span><span class=\"hljs-selector-class\">.owasp<\/span><span class=\"hljs-selector-pseudo\">:dependency-check-maven<\/span><span class=\"hljs-selector-pseudo\">:13.0.0<\/span><span class=\"hljs-selector-pseudo\">:check<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For real CI, do not pass the NVD key in a way that may be exposed by Maven debug logging. Current plugin documentation specifically recommends&nbsp;<code>nvdApiKeyEnvironmentVariable<\/code>&nbsp;(or Maven server settings) rather than directly logging a key.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recommended POM pattern<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">build<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.owasp<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>dependency-check-maven<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>13.0.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nvdApiKeyEnvironmentVariable<\/span>&gt;<\/span>NVD_API_KEY<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">nvdApiKeyEnvironmentVariable<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">failBuildOnCVSS<\/span>&gt;<\/span>8.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">failBuildOnCVSS<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">formats<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">format<\/span>&gt;<\/span>HTML<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">format<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">format<\/span>&gt;<\/span>SARIF<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">format<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">formats<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">executions<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">execution<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">goals<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">goal<\/span>&gt;<\/span>check<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">goal<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">goals<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">execution<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">executions<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugins<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">build<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> NVD_API_KEY=<span class=\"hljs-string\">\"...set securely...\"<\/span>\nmvn verify\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The&nbsp;<code>check<\/code>&nbsp;goal binds by default to Maven&#8217;s&nbsp;<code>verify<\/code>&nbsp;lifecycle phase when configured as a build plugin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Maven build-failure default<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The plugin&#8217;s&nbsp;<code>failBuildOnCVSS<\/code>&nbsp;default is&nbsp;<strong>11<\/strong>, which means CVSS 0-10 findings do not fail the build unless you configure a threshold.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Gradle Integration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This section is for a&nbsp;<strong>Gradle project<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Current Dependency-Check Gradle plugin compatibility documentation states:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gradle 7.6.4 through 9.x<\/li>\n\n\n\n<li>Gradle running on Java 11+<\/li>\n\n\n\n<li>Plugin version 13.0.0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Apply the plugin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Groovy DSL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">plugins {\n    id <span class=\"hljs-string\">'org.owasp.dependencycheck'<\/span> version <span class=\"hljs-string\">'13.0.0'<\/span>\n}\n\ndependencyCheck {\n    failBuildOnCVSS = <span class=\"hljs-number\">8.0<\/span>\n    formats = &#91;<span class=\"hljs-string\">'HTML'<\/span>, <span class=\"hljs-string\">'SARIF'<\/span>]\n    nvd {\n        apiKey = System.getenv(<span class=\"hljs-string\">'NVD_API_KEY'<\/span>)\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/gradlew dependencyCheckAnalyze\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Current Gradle plugin documentation places reports under the build reporting directory; the current plugin README describes the default as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">build\/reports\/dependency-check\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The older documentation wording&nbsp;<code>${buildDir}\/reports<\/code>&nbsp;is less specific; when teaching 13.0.0, follow the current plugin README\/build reporting configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gradle build-failure default<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Like Maven,&nbsp;<code>failBuildOnCVSS<\/code>&nbsp;defaults to&nbsp;<strong>11<\/strong>, so you must configure a 0-10 threshold if you want vulnerability severity to fail the build.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Basic CI\/CD Integration<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Conceptual flow<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Developer\n   |\n   v\nGit push \/ pull request\n   |\n   v\nCI runner\n   |\n   v\nCheckout\n   |\n   v\n<span class=\"hljs-built_in\">Set<\/span> up Java\n   |\n   v\nInstall Dependency-Check <span class=\"hljs-number\">13.0<\/span><span class=\"hljs-number\">.0<\/span>\n   |\n   v\nScan\n   |\n   +----&gt; HTML\/SARIF artifacts\n   |\n   v\nCVSS gate\n   |\n   v\nBuild pass\/fail -&gt; next pipeline stage\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Why this lab does not rely on an old wrapper example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Many Dependency-Check GitHub Action examples found online use old major versions of&nbsp;<code>actions\/checkout<\/code>&nbsp;and&nbsp;<code>actions\/upload-artifact<\/code>. This lab deliberately uses the official OWASP CLI release plus&nbsp;<strong>current first-party GitHub actions<\/strong>&nbsp;instead of copying stale workflow snippets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As of the research date:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>actions\/checkout@v7<\/code>\u00a0is current.<\/li>\n\n\n\n<li><code>actions\/setup-java@v6<\/code>\u00a0is current; its documentation marks v1-v4 deprecated.<\/li>\n\n\n\n<li><code>actions\/upload-artifact@v7<\/code>\u00a0is current.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Current GitHub Actions example<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">name: dependency-check\n\n<span class=\"hljs-attr\">on<\/span>:\n  push:\n  pull_request:\n\njobs:\n  sca:\n    runs-on: ubuntu-latest\n\n    <span class=\"hljs-attr\">steps<\/span>:\n      - name: Checkout\n        <span class=\"hljs-attr\">uses<\/span>: actions\/checkout@v7\n\n      - name: <span class=\"hljs-built_in\">Set<\/span> up Java\n        <span class=\"hljs-attr\">uses<\/span>: actions\/setup-java@v6\n        <span class=\"hljs-attr\">with<\/span>:\n          distribution: temurin\n          java-version: <span class=\"hljs-string\">'17'<\/span>\n\n      - name: Install OWASP Dependency-Check <span class=\"hljs-number\">13.0<\/span><span class=\"hljs-number\">.0<\/span>\n        <span class=\"hljs-attr\">shell<\/span>: bash\n        <span class=\"hljs-attr\">run<\/span>: |\n          curl -fL \\\n            <span class=\"hljs-string\">\"https:\/\/github.com\/dependency-check\/DependencyCheck\/releases\/download\/v13.0.0\/dependency-check-13.0.0-release.zip\"<\/span> \\\n            -o <span class=\"hljs-string\">\"$RUNNER_TEMP\/dependency-check.zip\"<\/span>\n          unzip -q <span class=\"hljs-string\">\"$RUNNER_TEMP\/dependency-check.zip\"<\/span> -d <span class=\"hljs-string\">\"$RUNNER_TEMP\"<\/span>\n          chmod +x <span class=\"hljs-string\">\"$RUNNER_TEMP\/dependency-check\/bin\/dependency-check.sh\"<\/span>\n          echo <span class=\"hljs-string\">\"DC_HOME=$RUNNER_TEMP\/dependency-check\"<\/span> &gt;&gt; <span class=\"hljs-string\">\"$GITHUB_ENV\"<\/span>\n\n      - name: Run Dependency-Check\n        <span class=\"hljs-attr\">env<\/span>:\n          NVD_API_KEY: ${{ secrets.NVD_API_KEY }}\n        <span class=\"hljs-attr\">shell<\/span>: bash\n        <span class=\"hljs-attr\">run<\/span>: |\n          <span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n            --project <span class=\"hljs-string\">\"${{ github.repository }}\"<\/span> \\\n            --scan <span class=\"hljs-string\">\".\"<\/span> \\\n            --out <span class=\"hljs-string\">\"dependency-check-reports\"<\/span> \\\n            --format <span class=\"hljs-string\">\"HTML\"<\/span> \\\n            --format <span class=\"hljs-string\">\"SARIF\"<\/span> \\\n            --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> \\\n            --failOnCVSS <span class=\"hljs-number\">8.0<\/span>\n\n      - name: Upload reports\n        <span class=\"hljs-attr\">if<\/span>: always()\n        <span class=\"hljs-attr\">uses<\/span>: actions\/upload-artifact@v7\n        <span class=\"hljs-attr\">with<\/span>:\n          name: dependency-check-reports\n          <span class=\"hljs-attr\">path<\/span>: dependency-check-reports\/\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Action\/tool ownership<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Item<\/th><th class=\"has-text-align-left\" data-align=\"left\">Ownership<\/th><\/tr><\/thead><tbody><tr><td><code>dependency-check<\/code>&nbsp;CLI<\/td><td>OWASP Dependency-Check project<\/td><\/tr><tr><td><code>actions\/checkout<\/code><\/td><td>GitHub first-party action<\/td><\/tr><tr><td><code>actions\/setup-java<\/code><\/td><td>GitHub first-party action<\/td><\/tr><tr><td><code>actions\/upload-artifact<\/code><\/td><td>GitHub first-party action<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">CI production note<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This minimal workflow is for teaching. For repeated CI usage,&nbsp;<strong>cache or centrally mirror Dependency-Check data<\/strong>&nbsp;instead of having every ephemeral job repopulate\/update independently. Also separate report publishing from gate behavior so reports are retained even when the security step fails.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Hands-On Exercises<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 1 &#8211; Install and verify<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Install 13.0.0 and run&nbsp;<code>--version<\/code>.<br><strong>Pass:<\/strong>&nbsp;Version is 13.0.0; Java is 11+.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 2 &#8211; Clone and pin NodeGoat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Clone OWASP\/NodeGoat and checkout&nbsp;<code>9336e34<\/code>.<br><strong>Pass:<\/strong>&nbsp;<code>git rev-parse --short HEAD<\/code>&nbsp;prints&nbsp;<code>9336e34<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 3 &#8211; Identify dependencies<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Inspect&nbsp;<code>package.json<\/code>&nbsp;and&nbsp;<code>package-lock.json<\/code>.<br><strong>Pass:<\/strong>&nbsp;Student identifies&nbsp;<code>marked 0.3.5<\/code>&nbsp;plus at least four other direct dependencies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 4 &#8211; First scan<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Generate an HTML report.<br><strong>Pass:<\/strong>&nbsp;HTML file exists and opens.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 5 &#8211; Highest-severity finding<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Locate the highest-severity finding in the current report.<br><strong>Pass:<\/strong>&nbsp;Record dependency, version, CVE, CVSS version, score and severity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 6 &#8211; Validate component identity<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Check the reported identifier\/CPE\/PURL and evidence for the selected finding.<br><strong>Pass:<\/strong>&nbsp;Student can state whether the component match appears correct and why.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 7 &#8211; Generate JSON and SARIF<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Generate HTML + JSON + SARIF.<br><strong>Pass:<\/strong>&nbsp;All requested output files are non-empty.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 8 &#8211; Suppression<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Generate one lab-only suppression from the HTML report, rerun and compare.<br><strong>Pass:<\/strong>&nbsp;Only the intended finding is suppressed; student then removes the lab rule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 9 &#8211; Security threshold<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Choose a threshold based on an observed finding and run with&nbsp;<code>--failOnCVSS<\/code>.<br><strong>Pass:<\/strong>&nbsp;Student records a non-zero exit when a finding meets\/exceeds the threshold.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 10 &#8211; Build integration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;On a separate Maven or Gradle sample project, add Dependency-Check 13.0.0 and generate an HTML report.<br><strong>Pass:<\/strong>&nbsp;Scan runs from the build tool and the report is generated.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exercise 11 &#8211; Explain the result<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Do:<\/strong>&nbsp;Give a 2-minute explanation of one finding.<br><strong>Pass:<\/strong>&nbsp;Explanation separates detection, identity validation, affected-version validation and exploitability\/applicability.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">24.1 Java version problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Dependency-Check fails at startup with Java\/runtime errors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Java is missing or older than 11, or the shell uses a different Java than expected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">java -version\ncommand -v java\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Install\/select Java 11+; Java 17 LTS is recommended for this lab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.2 Command not found<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br><code>dependency-check<\/code>&nbsp;is not found.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>CLI&nbsp;<code>bin<\/code>&nbsp;directory is not on PATH, or you are using the ZIP install without calling its full path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Version prints successfully.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.3 Permission denied<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Shell script cannot execute.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Execute permission was not preserved.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">chmod +x <span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.4 NVD update failure \/ HTTP 403<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>NVD update fails, especially in CI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Invalid key, rate limiting, many concurrent builds sharing a key, blocked egress, or service disruption.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm the API key is valid.<\/li>\n\n\n\n<li>Use a persistent Dependency-Check data cache.<\/li>\n\n\n\n<li>Avoid many simultaneous full updates using one key.<\/li>\n\n\n\n<li>Check corporate proxy\/firewall policy.<\/li>\n\n\n\n<li>For operational environments, consider the project&#8217;s recommended NVD mirroring\/caching approach.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --updateonly --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.5 Network \/ proxy issue<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Timeouts or connection failures downloading data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Proxy\/firewall\/DNS configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><br>Use the documented proxy parameters, for example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --updateonly \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> \\\n  --proxyserver proxy.example.com \\\n  --proxyport <span class=\"hljs-number\">8080<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Update completes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.6 API key appears unset<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>The command runs as if no key is supplied.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Environment variable was not exported in the current shell\/CI step.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">test -n <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> &amp;&amp; <span class=\"hljs-keyword\">echo<\/span> set || <span class=\"hljs-keyword\">echo<\/span> missing\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Set it securely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Run update again and inspect normal execution logs without printing the key.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.7 First scan is slow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>The initial run is much slower than later runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>The local vulnerability database must be populated\/processed. Official Maven documentation notes that the first run can take 20 minutes or more; actual duration depends on network, API key use and machine resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><br>Use an NVD API key and persist the data directory between runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>A later run reuses local data and performs only needed updates.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.8 Local database\/cache issue after an upgrade<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Dependency-Check data is incompatible or errors after a major upgrade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Dependency-Check 11 introduced an incompatible H2 database change; other data problems can also require a clean repopulation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><br>Use purge when documentation\/release notes indicate it is required:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --purge\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --updateonly --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Update completes and a fresh scan succeeds.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Do not make&nbsp;<code>--purge<\/code>&nbsp;your first response to every error; it forces re-download\/reprocessing.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.9 No vulnerabilities detected<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Report is unexpectedly empty\/clean.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Wrong scan path, missing manifests\/artifacts, stale\/no data, analyzer prerequisite missing, or genuinely no current matches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">pwd\nls package.json package-lock.json\nnpm --version\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Confirm you are scanning the pinned NodeGoat directory and have current data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Re-run and inspect the HTML dependency list, not only the vulnerability summary.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.10 Too many findings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Report contains many findings and appears noisy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>The target is intentionally old\/vulnerable, transitive dependencies expand the surface, or some CPE matches may be false positives.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><br>Triage by component identity, CPE confidence\/evidence, version range, severity and application applicability. Suppress only validated false positives\/approved exceptions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Each suppression has a narrow match and written rationale.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.11 Report not generated<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>No report appears in the expected directory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Wrong&nbsp;<code>--out<\/code>&nbsp;path, permission issue, invalid option, or scanner error.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">mkdir -p reports\ntest -w reports &amp;&amp; <span class=\"hljs-keyword\">echo<\/span> writable\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run with a log:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\"<\/span> \\\n  --format HTML \\\n  --log <span class=\"hljs-string\">\".\/reports\/dc.log\"<\/span> \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">find reports -maxdepth <span class=\"hljs-number\">1<\/span> -type f -<span class=\"hljs-keyword\">print<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.12 Incorrect project path<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>Dependency-Check completes but analyzed the wrong content.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Relative path was resolved from a different working directory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pwd\nrealpath .\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Prefer an explicit path when automation is ambiguous.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>HTML dependency list contains the expected NodeGoat\/npm components.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">24.13 False positive<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Problem<\/strong><br>A CVE is associated with the wrong component\/CPE.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cause<\/strong><br>Evidence-based identification is imperfect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solution<\/strong><br>Validate the component\/CPE first. If it is incorrect, generate a narrow suppression from the HTML report and document the reason.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verification<\/strong><br>Rerun with the suppression file and confirm only the intended match is removed\/suppressed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Lab Validation Checklist<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&#91; ] Java <span class=\"hljs-number\">11<\/span>+ installed\n&#91; ] Git installed\n&#91; ] Node.js\/npm available <span class=\"hljs-keyword\">for<\/span> npm analysis\n&#91; ] Dependency-Check <span class=\"hljs-number\">13.0<\/span><span class=\"hljs-number\">.0<\/span> installed\n&#91; ] Dependency-Check version verified\n&#91; ] NVD API key obtained and stored securely\n&#91; ] NVD\/Dependency-Check data updated\n&#91; ] OWASP NodeGoat cloned\n&#91; ] NodeGoat pinned to commit <span class=\"hljs-number\">9336e34<\/span>\n&#91; ] package.json and package-lock.json inspected\n&#91; ] First scan completed\n&#91; ] HTML report generated\n&#91; ] At least one finding investigated\n&#91; ] Component\/CPE identity checked\n&#91; ] CVE understood\n&#91; ] CVSS version\/score understood\n&#91; ] Severity vs risk distinction understood\n&#91; ] <span class=\"hljs-built_in\">JSON<\/span> report generated\n&#91; ] XML or CSV report generated\n&#91; ] SARIF report generated\n&#91; ] Lab suppression tested and removed\/documented\n&#91; ] CVSS threshold tested\n&#91; ] Maven or Gradle integration understood\n&#91; ] CI\/CD integration understood\n&#91; ] Student can explain <span class=\"hljs-literal\">false<\/span> positive vs <span class=\"hljs-literal\">false<\/span> negative\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Knowledge Check<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Multiple choice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">What is Dependency-Check primarily designed to detect?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A. SQL injection in custom source code<br>B. Publicly disclosed vulnerabilities associated with application dependencies<br>C. Weak passwords in production databases<br>D. Runtime memory leaks<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. True\/False<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A Dependency-Check CVE finding proves that the vulnerable code path is exploitable in your application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Short answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">What is the first thing the official report-reading guidance recommends checking when reviewing a potential false positive?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Multiple choice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">What is the minimum Java version for Dependency-Check 13.0.0?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A. 8<br>B. 11<br>C. 17 only<br>D. 21 only<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Short answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Why is an NVD API key strongly recommended?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Multiple choice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Which option can make the CLI return a failing\/non-zero exit status based on vulnerability severity?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A.&nbsp;<code>--format<\/code><br>B.&nbsp;<code>--log<\/code><br>C.&nbsp;<code>--failOnCVSS<\/code><br>D.&nbsp;<code>--prettyPrint<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. True\/False<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Suppressing a finding is equivalent to fixing the vulnerable dependency.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8. Practical<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your CI job receives repeated NVD 403 errors while 40 parallel jobs use the same key and each starts with an empty cache. Name two corrective design actions.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9. Multiple choice<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Which set contains only currently documented CLI report formats?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A. HTML, XML, JSON, SARIF<br>B. HTML, DOCX, PPTX, SARIF<br>C. PDF, XML, JSON, YAML<br>D. HTML, SQLite, PARQUET, SARIF<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">10. Practical<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A report associates your library with a CPE for a similarly named but different product. What should you do before suppressing it?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">11. Short answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">What does&nbsp;<code>--updateonly<\/code>&nbsp;do?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">12. Short answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Why does this lab pin NodeGoat to commit&nbsp;<code>9336e34<\/code>&nbsp;instead of using&nbsp;<code>master<\/code>?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">13. True\/False<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The default Maven\/Gradle&nbsp;<code>failBuildOnCVSS<\/code>&nbsp;value of 11 means a normal CVSS 0-10 vulnerability will fail the build by default.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">14. Practical<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A student ran&nbsp;<code>--scan .<\/code>&nbsp;from their home directory rather than the NodeGoat directory and received an unexpected report. What should they verify?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">15. Short answer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Give one reason a false negative can occur in Dependency-Check.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer key<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>B.<\/strong>\u00a0Dependency-Check is SCA focused on publicly disclosed vulnerabilities associated with dependencies.<\/li>\n\n\n\n<li><strong>False.<\/strong>\u00a0The match requires triage for identity, affected version and real applicability\/reachability.<\/li>\n\n\n\n<li><strong>Validate the identified component\/CPE.<\/strong>\u00a0Wrong identity is a common source of false positives.<\/li>\n\n\n\n<li><strong>B &#8211; Java 11.<\/strong>\u00a0Java 11 became mandatory in Dependency-Check 11.0.0+.<\/li>\n\n\n\n<li>It improves practical NVD update performance and reduces problems caused by anonymous rate limits\/default delays.<\/li>\n\n\n\n<li><strong>C &#8211;\u00a0<code>--failOnCVSS<\/code>.<\/strong>\u00a0It changes the CLI exit status when an unsuppressed finding meets\/exceeds the threshold.<\/li>\n\n\n\n<li><strong>False.<\/strong>\u00a0Suppression changes reporting; it does not patch code or remove the vulnerable dependency.<\/li>\n\n\n\n<li>Reuse\/persist the Dependency-Check data cache and reduce\/consolidate update concurrency; for larger environments use the project&#8217;s recommended mirror\/cache strategy.<\/li>\n\n\n\n<li><strong>A.<\/strong>\u00a0All four are current supported formats. The full list also includes CSV, JUNIT, JENKINS, GITLAB and ALL.<\/li>\n\n\n\n<li>Validate the dependency, CPE\/PURL and evidence against the real component\/version, then document why the match is wrong before making a narrow suppression.<\/li>\n\n\n\n<li>It runs the update phase only; no scan and no vulnerability report are produced.<\/li>\n\n\n\n<li>Reproducibility: the immutable commit fixes the exact dependency manifests\/lock file used by the exercise.<\/li>\n\n\n\n<li><strong>False.<\/strong>\u00a0CVSS tops out at 10, so default 11 effectively means &#8220;do not fail on CVSS findings&#8221; until configured.<\/li>\n\n\n\n<li>Verify\u00a0<code>pwd<\/code>, the actual scan path, and that expected manifests\/artifacts are present in the target directory.<\/li>\n\n\n\n<li>Examples: insufficient identifying evidence, naming mismatch, incomplete ecosystem mapping, or a vulnerability not yet represented\/matched in the data source.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Key Takeaways<\/h1>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Dependency-Check is an\u00a0<strong>SCA signal generator<\/strong>, not an automatic exploitability verdict.<\/li>\n\n\n\n<li>Use a\u00a0<strong>current release<\/strong>. For this manual that is 13.0.0.<\/li>\n\n\n\n<li>Java 11+ is required; Java 17 LTS is a sensible lab runtime.<\/li>\n\n\n\n<li>The modern NVD path is the\u00a0<strong>NVD API<\/strong>, and an API key is strongly recommended.<\/li>\n\n\n\n<li>Persist the data cache; do not make every CI job perform a cold NVD population.<\/li>\n\n\n\n<li>Read the HTML report by validating\u00a0<strong>component identity first<\/strong>.<\/li>\n\n\n\n<li>CVSS measures severity; it is not a complete business-risk score.<\/li>\n\n\n\n<li>Suppress only validated false positives\/approved exceptions, with narrow scope and rationale.<\/li>\n\n\n\n<li>Use\u00a0<code>--failOnCVSS<\/code>\u00a0when you need a simple severity gate, but design real policy with more context.<\/li>\n\n\n\n<li>Pin training code and tool versions so the lab remains reproducible.<\/li>\n\n\n\n<li>Keep GitHub Actions examples current; do not copy old workflows blindly.<\/li>\n\n\n\n<li>Revisit this lab when Dependency-Check, NVD APIs, Java requirements, action majors or plugin versions change.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Sources &amp; References<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Official OWASP Dependency-Check \/ project sources<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Dependency-Check active repository \/ README<\/strong><br><a href=\"https:\/\/github.com\/dependency-check\/DependencyCheck\">https:\/\/github.com\/dependency-check\/DependencyCheck<\/a><br>Used for: SCA definition, active repository, Java 11 requirement, NVD API migration, 12.1.0+ mandatory upgrade, API-key guidance, npm tool requirement.<\/li>\n\n\n\n<li><strong>Dependency-Check 13.0.0 release<\/strong><br><a href=\"https:\/\/github.com\/dependency-check\/DependencyCheck\/releases\/tag\/v13.0.0\">https:\/\/github.com\/dependency-check\/DependencyCheck\/releases\/tag\/v13.0.0<\/a><br>Used for: stable version and release date.<\/li>\n\n\n\n<li><strong>CLI installation \/ usage<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-cli\/\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-cli\/<\/a><br>Used for: official ZIP\/Homebrew installation and CLI usage.<\/li>\n\n\n\n<li><strong>CLI arguments &#8211; 13.0.0 documentation<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-cli\/arguments.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-cli\/arguments.html<\/a><br>Used for: scan\/output\/report\/update\/proxy\/data\/suppression\/failure options and current defaults.<\/li>\n\n\n\n<li><strong>How Dependency-Check works<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/general\/internals.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/general\/internals.html<\/a><br>Used for: analyzers, evidence, confidence, CPE\/CVE matching, false-positive\/false-negative concepts.<\/li>\n\n\n\n<li><strong>How to read reports<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/general\/thereport.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/general\/thereport.html<\/a><br>Used for: report fields and recommended triage order.<\/li>\n\n\n\n<li><strong>Suppressing false positives<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/general\/suppression.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/general\/suppression.html<\/a><br>Used for: suppression workflow and current 1.4 suppression schema.<\/li>\n\n\n\n<li><strong>Maven plugin usage<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-maven\/\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-maven\/<\/a><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-maven\/check-mojo.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-maven\/check-mojo.html<\/a><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-maven\/plugin-info.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-maven\/plugin-info.html<\/a><br>Used for: plugin 13.0.0, Maven\/JDK requirements,\u00a0<code>verify<\/code>, report formats, NVD key handling and\u00a0<code>failBuildOnCVSS<\/code>.<\/li>\n\n\n\n<li><strong>Gradle plugin usage\/configuration<\/strong><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-gradle\/\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-gradle\/<\/a><br><a href=\"https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-gradle\/configuration.html\">https:\/\/dependency-check.github.io\/DependencyCheck\/dependency-check-gradle\/configuration.html<\/a><br><a href=\"https:\/\/github.com\/dependency-check\/dependency-check-gradle\">https:\/\/github.com\/dependency-check\/dependency-check-gradle<\/a><br>Used for: plugin 13.0.0, task name, Gradle compatibility, report directory and gate configuration.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Official NVD \/ NIST sources<\/h2>\n\n\n\n<ol start=\"10\" class=\"wp-block-list\">\n<li><strong>NVD data feeds \/ API guidance<\/strong><br><a href=\"https:\/\/nvd.nist.gov\/vuln\/data-feeds\">https:\/\/nvd.nist.gov\/vuln\/data-feeds<\/a><br>Used for: NVD 2.0 APIs as preferred current interface.<\/li>\n\n\n\n<li><strong>NVD change timeline<\/strong><br><a href=\"https:\/\/nvd.nist.gov\/general\/news\/change-timeline\">https:\/\/nvd.nist.gov\/general\/news\/change-timeline<\/a><br>Used for: 2.0 transition and 1.0 deprecation\/retirement context.<\/li>\n\n\n\n<li><strong>NVD API key request<\/strong><br><a href=\"https:\/\/nvd.nist.gov\/developers\/request-an-api-key\">https:\/\/nvd.nist.gov\/developers\/request-an-api-key<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Sample application<\/h2>\n\n\n\n<ol start=\"13\" class=\"wp-block-list\">\n<li><strong>OWASP NodeGoat repository<\/strong><br><a href=\"https:\/\/github.com\/OWASP\/NodeGoat\">https:\/\/github.com\/OWASP\/NodeGoat<\/a><\/li>\n\n\n\n<li><strong>Pinned lab commit<\/strong><br><a href=\"https:\/\/github.com\/OWASP\/NodeGoat\/commit\/9336e34\">https:\/\/github.com\/OWASP\/NodeGoat\/commit\/9336e34<\/a><\/li>\n\n\n\n<li><strong>Pinned\u00a0<code>package.json<\/code><\/strong><br><a href=\"https:\/\/raw.githubusercontent.com\/OWASP\/NodeGoat\/9336e34\/package.json\">https:\/\/raw.githubusercontent.com\/OWASP\/NodeGoat\/9336e34\/package.json<\/a><\/li>\n\n\n\n<li><strong>Pinned\u00a0<code>package-lock.json<\/code><\/strong><br><a href=\"https:\/\/raw.githubusercontent.com\/OWASP\/NodeGoat\/9336e34\/package-lock.json\">https:\/\/raw.githubusercontent.com\/OWASP\/NodeGoat\/9336e34\/package-lock.json<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub Actions &#8211; first-party<\/h2>\n\n\n\n<ol start=\"17\" class=\"wp-block-list\">\n<li><strong>actions\/checkout<\/strong><br><a href=\"https:\/\/github.com\/actions\/checkout\">https:\/\/github.com\/actions\/checkout<\/a><\/li>\n\n\n\n<li><strong>actions\/setup-java<\/strong><br><a href=\"https:\/\/github.com\/actions\/setup-java\">https:\/\/github.com\/actions\/setup-java<\/a><\/li>\n\n\n\n<li><strong>actions\/upload-artifact<\/strong><br><a href=\"https:\/\/github.com\/actions\/upload-artifact\">https:\/\/github.com\/actions\/upload-artifact<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Node.js<\/h2>\n\n\n\n<ol start=\"20\" class=\"wp-block-list\">\n<li><strong>Node.js release status<\/strong><br><a href=\"https:\/\/nodejs.org\/en\/about\/previous-releases\">https:\/\/nodejs.org\/en\/about\/previous-releases<\/a><\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Vulnerability example \/ secondary verification<\/h2>\n\n\n\n<ol start=\"21\" class=\"wp-block-list\">\n<li><strong>OSV record for CVE-2016-10531<\/strong><br><a href=\"https:\/\/osv.dev\/vulnerability\/CVE-2016-10531\">https:\/\/osv.dev\/vulnerability\/CVE-2016-10531<\/a><br>Used only for the lab&#8217;s illustrative\u00a0<code>marked 0.3.5<\/code>\u00a0example and fixed-version\/severity context. Students should use the actual current Dependency-Check report plus primary advisory\/NVD\/CVE references during real triage.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Appendix A &#8211; Quick Lab Command Sheet<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;em&gt;<span class=\"hljs-comment\"># 1) Variables&lt;\/em&gt;<\/span>\nexport DC_VERSION=<span class=\"hljs-string\">\"13.0.0\"<\/span>\nexport DC_ROOT=<span class=\"hljs-string\">\"$HOME\/tools\/owasp-dc-$DC_VERSION\"<\/span>\nexport DC_HOME=<span class=\"hljs-string\">\"$DC_ROOT\/dependency-check\"<\/span>\n\n&lt;em&gt;<span class=\"hljs-comment\"># 2) Download\/install&lt;\/em&gt;<\/span>\nmkdir -p <span class=\"hljs-string\">\"$DC_ROOT\"<\/span>\ncurl -fL \\\n  <span class=\"hljs-string\">\"https:\/\/github.com\/dependency-check\/DependencyCheck\/releases\/download\/v${DC_VERSION}\/dependency-check-${DC_VERSION}-release.zip\"<\/span> \\\n  -o <span class=\"hljs-string\">\"\/tmp\/dependency-check-${DC_VERSION}-release.zip\"<\/span>\nunzip -q <span class=\"hljs-string\">\"\/tmp\/dependency-check-${DC_VERSION}-release.zip\"<\/span> -d <span class=\"hljs-string\">\"$DC_ROOT\"<\/span>\n\n&lt;em&gt;<span class=\"hljs-comment\"># 3) Verify&lt;\/em&gt;<\/span>\njava -version\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n\n&lt;em&gt;<span class=\"hljs-comment\"># 4) NVD key&lt;\/em&gt;<\/span>\nread -rsp <span class=\"hljs-string\">\"NVD API key: \"<\/span> NVD_API_KEY; <span class=\"hljs-keyword\">echo<\/span>\nexport NVD_API_KEY\n\n&lt;em&gt;<span class=\"hljs-comment\"># 5) Update&lt;\/em&gt;<\/span>\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --updateonly --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n\n&lt;em&gt;<span class=\"hljs-comment\"># 6) Clone\/pin lab app&lt;\/em&gt;<\/span>\nmkdir -p <span class=\"hljs-string\">\"$HOME\/labs\"<\/span>\ncd <span class=\"hljs-string\">\"$HOME\/labs\"<\/span>\ngit <span class=\"hljs-keyword\">clone<\/span> https:<span class=\"hljs-comment\">\/\/github.com\/OWASP\/NodeGoat.git<\/span>\ncd NodeGoat\ngit checkout <span class=\"hljs-number\">9336e34<\/span>\n\n&lt;em&gt;<span class=\"hljs-comment\"># 7) Scan&lt;\/em&gt;<\/span>\nmkdir -p reports\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --project <span class=\"hljs-string\">\"OWASP NodeGoat - Training Lab\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\"<\/span> \\\n  --format <span class=\"hljs-string\">\"HTML\"<\/span> \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span> \\\n  --log <span class=\"hljs-string\">\".\/reports\/dependency-check.log\"<\/span>\n\n&lt;em&gt;<span class=\"hljs-comment\"># 8) Multiple formats&lt;\/em&gt;<\/span>\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> \\\n  --project <span class=\"hljs-string\">\"OWASP NodeGoat - Multi-format\"<\/span> \\\n  --scan <span class=\"hljs-string\">\".\"<\/span> \\\n  --out <span class=\"hljs-string\">\".\/reports\/multi\"<\/span> \\\n  --format HTML \\\n  --format JSON \\\n  --format XML \\\n  --format CSV \\\n  --format SARIF \\\n  --prettyPrint \\\n  --nvdApiKey <span class=\"hljs-string\">\"$NVD_API_KEY\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Appendix B &#8211; Instructor Notes<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Expected learning behavior<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do not grade students on an exact vulnerability count. Grade them on whether they can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>reproduce the pinned repository state;<\/li>\n\n\n\n<li>complete a scan;<\/li>\n\n\n\n<li>find the generated report;<\/li>\n\n\n\n<li>validate a component identity;<\/li>\n\n\n\n<li>interpret one real finding;<\/li>\n\n\n\n<li>distinguish severity from application-specific risk;<\/li>\n\n\n\n<li>explain false positives\/negatives;<\/li>\n\n\n\n<li>demonstrate suppression safely;<\/li>\n\n\n\n<li>demonstrate a threshold gate;<\/li>\n\n\n\n<li>explain how the same capability moves into CI.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pre-class validation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before each delivery, the instructor should run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --version\n<span class=\"hljs-string\">\"$DC_HOME\/bin\/dependency-check.sh\"<\/span> --advancedHelp | head -n <span class=\"hljs-number\">20<\/span>\ngit -C <span class=\"hljs-string\">\"$HOME\/labs\/NodeGoat\"<\/span> rev-parse --short HEAD\nnpm --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then perform one clean scan and confirm the report renders. Because NVD\/advisory data is live, update screenshots and example finding screenshots only after confirming they still match the current report.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Maintenance trigger<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Re-verify this manual if any of the following changes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dependency-Check stable major\/minor version;<\/li>\n\n\n\n<li>Java minimum version;<\/li>\n\n\n\n<li>NVD API compatibility guidance;<\/li>\n\n\n\n<li>suppression XSD version;<\/li>\n\n\n\n<li>report-format list;<\/li>\n\n\n\n<li>Maven\/Gradle plugin version or minimum build-tool version;<\/li>\n\n\n\n<li>GitHub Actions major versions;<\/li>\n\n\n\n<li>NodeGoat training dependency manifests;<\/li>\n\n\n\n<li>NVD\/advisory behavior for the sample finding.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>OWASP Dependency-Check 13.0.0 Basic-to-Essentials Hands-On Lab Manual Audience:&nbsp;Beginners and engineers with basic DevOps\/DevSecOps knowledgeTutorial verified\/researched on:&nbsp;2026-10-03OWASP Dependency-Check version:&nbsp;13.0.0Minimum Java supported by Dependency-Check:&nbsp;Java 11Recommended lab Java runtime:&nbsp;Java 17&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-78840","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=78840"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78840\/revisions"}],"predecessor-version":[{"id":78841,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78840\/revisions\/78841"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=78840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=78840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=78840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}