1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.owasp.dependencycheck.taskdefs;
19
20 import org.apache.tools.ant.BuildException;
21 import org.apache.tools.ant.Project;
22 import org.apache.tools.ant.types.EnumeratedAttribute;
23 import org.apache.tools.ant.types.Reference;
24 import org.apache.tools.ant.types.Resource;
25 import org.apache.tools.ant.types.ResourceCollection;
26 import org.apache.tools.ant.types.resources.FileProvider;
27 import org.apache.tools.ant.types.resources.Resources;
28 import org.owasp.dependencycheck.Engine;
29 import org.owasp.dependencycheck.agent.DependencyCheckScanAgent;
30 import org.owasp.dependencycheck.ant.logging.AntTaskHolder;
31 import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
32 import org.owasp.dependencycheck.dependency.Dependency;
33 import org.owasp.dependencycheck.dependency.Vulnerability;
34 import org.owasp.dependencycheck.dependency.naming.Identifier;
35 import org.owasp.dependencycheck.exception.ExceptionCollection;
36 import org.owasp.dependencycheck.exception.ReportException;
37 import org.owasp.dependencycheck.reporting.ReportGenerator.Format;
38 import org.owasp.dependencycheck.utils.Downloader;
39 import org.owasp.dependencycheck.utils.InvalidSettingException;
40 import org.owasp.dependencycheck.utils.Settings;
41 import org.owasp.dependencycheck.utils.SeverityUtil;
42 import org.owasp.dependencycheck.utils.scarf.TelemetryCollector;
43
44 import javax.annotation.concurrent.NotThreadSafe;
45 import java.io.File;
46 import java.util.ArrayList;
47 import java.util.List;
48 import java.util.stream.Collectors;
49 import java.util.stream.Stream;
50
51
52
53
54
55
56
57 @NotThreadSafe
58 public class Check extends Update {
59
60
61
62
63 private static final String NEW_LINE = System.getProperty("line.separator", "\n").intern();
64
65
66
67
68 private Boolean rubygemsAnalyzerEnabled;
69
70
71
72 private Boolean nodeAnalyzerEnabled;
73
74
75
76 private Boolean nodeAuditAnalyzerEnabled;
77
78
79
80 private Boolean yarnAuditAnalyzerEnabled;
81
82
83
84 private Boolean pnpmAuditAnalyzerEnabled;
85
86
87
88 private Boolean nodeAuditAnalyzerUseCache;
89
90
91
92
93 private Boolean nodePackageSkipDevDependencies;
94
95
96
97 private Boolean nodeAuditSkipDevDependencies;
98
99
100
101
102 @SuppressWarnings("CanBeFinal")
103 private final List<String> retireJsFilters = new ArrayList<>();
104
105
106
107
108 private Boolean retireJsFilterNonVulnerable;
109
110
111
112 private Boolean bundleAuditAnalyzerEnabled;
113
114
115
116 private Boolean cmakeAnalyzerEnabled;
117
118
119
120 private Boolean opensslAnalyzerEnabled;
121
122
123
124 private Boolean pyPackageAnalyzerEnabled;
125
126
127
128 private Boolean pyDistributionAnalyzerEnabled;
129
130
131
132 private Boolean mixAuditAnalyzerEnabled;
133
134
135
136 private Boolean centralAnalyzerEnabled;
137
138
139
140 private Boolean centralAnalyzerUseCache;
141
142
143
144 private Boolean nexusAnalyzerEnabled;
145
146
147
148 private String nexusUrl;
149
150
151
152 private String nexusUser;
153
154
155
156 private String nexusPassword;
157
158
159
160 private Boolean nexusUsesProxy;
161
162
163
164
165 private Boolean golangDepEnabled;
166
167
168
169
170 private Boolean golangModEnabled;
171
172
173
174 private String pathToGo;
175
176
177
178 private Boolean dartAnalyzerEnabled;
179
180
181
182 private String pathToYarn;
183
184
185
186 private String pathToPnpm;
187
188
189
190
191 private String zipExtensions;
192
193
194
195 private String pathToCore;
196
197
198
199 private String projectName = "dependency-check";
200
201
202
203
204 private String reportOutputDirectory;
205
206
207
208
209 private float junitFailOnCVSS = 0;
210
211
212
213
214
215
216
217 private float failBuildOnCVSS = 11;
218
219
220
221
222 private Boolean autoUpdate;
223
224
225
226
227 private String reportFormat = "HTML";
228
229
230
231
232 private final List<String> reportFormats = new ArrayList<>();
233
234
235
236
237 private Boolean prettyPrint = null;
238
239
240
241
242 @SuppressWarnings("CanBeFinal")
243 private final List<String> suppressionFiles = new ArrayList<>();
244
245
246
247
248 private String hintsFile;
249
250
251
252 private boolean showSummary = true;
253
254
255
256 private Boolean enableExperimental;
257
258
259
260 private Boolean enableRetired;
261
262
263
264 private Boolean jarAnalyzerEnabled;
265
266
267
268 private Boolean archiveAnalyzerEnabled;
269
270
271
272 private Boolean nuspecAnalyzerEnabled;
273
274
275
276 private Boolean nugetconfAnalyzerEnabled;
277
278
279
280 private Boolean libmanAnalyzerEnabled;
281
282
283
284 private Boolean composerAnalyzerEnabled;
285
286
287
288 private Boolean composerAnalyzerSkipDev;
289
290
291
292 private Boolean cpanfileAnalyzerEnabled;
293
294
295
296
297 private Boolean assemblyAnalyzerEnabled;
298
299
300
301 private Boolean msbuildAnalyzerEnabled;
302
303
304
305 private Boolean autoconfAnalyzerEnabled;
306
307
308
309 private Boolean pipAnalyzerEnabled;
310
311
312
313 private Boolean mavenInstallAnalyzerEnabled;
314
315
316
317 private Boolean pipfileAnalyzerEnabled;
318
319
320
321 private Boolean poetryAnalyzerEnabled;
322
323
324
325 private String mixAuditPath;
326
327
328
329 private String bundleAuditPath;
330
331
332
333
334 private String bundleAuditWorkingDirectory;
335
336
337
338 private Boolean cocoapodsAnalyzerEnabled;
339
340
341
342 private Boolean carthageAnalyzerEnabled;
343
344
345
346
347 private Boolean swiftPackageManagerAnalyzerEnabled;
348
349
350
351 private Boolean swiftPackageResolvedAnalyzerEnabled;
352
353
354
355
356 private Boolean ossIndexAnalyzerEnabled;
357
358
359
360 private Boolean ossIndexAnalyzerUseCache;
361
362
363
364 private Integer ossIndexAnalyzerCacheValidForHours;
365
366
367
368 private String ossIndexAnalyzerUrl;
369
370
371
372 private String ossIndexAnalyzerUsername;
373
374
375
376 private String ossIndexAnalyzerPassword;
377
378
379
380
381 private Boolean ossIndexAnalyzerWarnOnlyOnRemoteErrors;
382
383
384
385
386 private Boolean artifactoryAnalyzerEnabled;
387
388
389
390 private String artifactoryAnalyzerUrl;
391
392
393
394 private Boolean artifactoryAnalyzerUseProxy;
395
396
397
398 private Boolean artifactoryAnalyzerParallelAnalysis;
399
400
401
402 private String artifactoryAnalyzerUsername;
403
404
405
406 private String artifactoryAnalyzerApiToken;
407
408
409
410 private String artifactoryAnalyzerBearerToken;
411
412
413
414 private Boolean versionCheckEnabled;
415
416
417
418
419 private boolean failBuildOnUnusedSuppressionRule = false;
420
421
422
423
424 private String suppressionFileUser;
425
426
427
428 private String suppressionFilePassword;
429
430
431
432 private String suppressionFileBearerToken;
433
434
435
436
437
438
439 private Resources path = null;
440
441
442
443 private Reference refId = null;
444
445
446
447
448
449
450
451 public void add(ResourceCollection rc) {
452 if (isReference()) {
453 throw new BuildException("Nested elements are not allowed when using the refId attribute.");
454 }
455 getPath().add(rc);
456 }
457
458
459
460
461
462
463
464 private synchronized Resources getPath() {
465 if (path == null) {
466 path = new Resources(getProject());
467 path.setCache(true);
468 }
469 return path;
470 }
471
472
473
474
475
476
477 public boolean isReference() {
478 return refId != null;
479 }
480
481
482
483
484
485
486
487 public synchronized void setRefId(Reference r) {
488 if (path != null) {
489 throw new BuildException("Nested elements are not allowed when using the refId attribute.");
490 }
491 refId = r;
492 }
493
494
495
496
497
498
499
500
501
502
503 @SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
504 private void dealWithReferences() throws BuildException {
505 if (isReference()) {
506 final Object o = refId.getReferencedObject(getProject());
507 if (!(o instanceof ResourceCollection)) {
508 throw new BuildException("refId '" + refId.getRefId()
509 + "' does not refer to a resource collection.");
510 }
511 getPath().add((ResourceCollection) o);
512 }
513 }
514
515
516
517
518
519 public Check() {
520 super();
521
522
523 AntTaskHolder.setTask(this);
524 }
525
526
527
528
529
530
531
532
533 public void addConfiguredSuppressionFile(final SuppressionFile suppressionFile) {
534 suppressionFiles.add(resolveRelative(suppressionFile.getPath()));
535 }
536
537
538
539
540
541
542
543
544 public void addConfiguredReportFormat(final ReportFormat reportFormat) {
545 reportFormats.add(reportFormat.getFormat());
546 }
547
548
549
550
551
552
553
554 public void setVersionCheckEnabled(Boolean versionCheckEnabled) {
555 this.versionCheckEnabled = versionCheckEnabled;
556 }
557
558
559
560
561
562
563 public String getProjectName() {
564 if (projectName == null) {
565 projectName = "";
566 }
567 return projectName;
568 }
569
570
571
572
573
574
575 public void setProjectName(String projectName) {
576 this.projectName = projectName;
577 }
578
579 private String resolveRelative(String path) {
580 if (path == null) {
581 return null;
582 }
583
584 File file = new File(path);
585 if (file.isAbsolute()) {
586 return path;
587 }
588
589 return new File(getProject().getBaseDir(), path).getPath();
590 }
591
592
593
594
595
596
597 public void setReportOutputDirectory(String reportOutputDirectory) {
598 this.reportOutputDirectory = resolveRelative(reportOutputDirectory);
599 }
600
601
602
603
604
605
606 public void setFailBuildOnCVSS(float failBuildOnCVSS) {
607 this.failBuildOnCVSS = failBuildOnCVSS;
608 }
609
610
611
612
613
614
615 public void setJunitFailOnCVSS(float junitFailOnCVSS) {
616 this.junitFailOnCVSS = junitFailOnCVSS;
617 }
618
619
620
621
622
623
624 public void setAutoUpdate(Boolean autoUpdate) {
625 this.autoUpdate = autoUpdate;
626 }
627
628
629
630
631
632
633 public void setPrettyPrint(boolean prettyPrint) {
634 this.prettyPrint = prettyPrint;
635 }
636
637
638
639
640
641
642 public void setReportFormat(ReportFormats reportFormat) {
643 this.reportFormat = reportFormat.getValue();
644 this.reportFormats.add(this.reportFormat);
645 }
646
647
648
649
650
651
652 public List<String> getReportFormats() {
653 if (reportFormats.isEmpty()) {
654 this.reportFormats.add(this.reportFormat);
655 }
656 return this.reportFormats;
657 }
658
659
660
661
662
663
664 public void setSuppressionFile(String suppressionFile) {
665 suppressionFiles.add(resolveRelative(suppressionFile));
666 }
667
668
669
670
671
672
673 public void setSuppressionFileUser(String suppressionFileUser) {
674 this.suppressionFileUser = suppressionFileUser;
675 }
676
677
678
679
680
681
682 public void setSuppressionFilePassword(String suppressionFilePassword) {
683 this.suppressionFilePassword = suppressionFilePassword;
684 }
685
686
687
688
689
690
691 public void setSuppressionFileBearerToken(String suppressionFileBearerToken) {
692 this.suppressionFileBearerToken = suppressionFileBearerToken;
693 }
694
695
696
697
698
699
700 public void setHintsFile(String hintsFile) {
701 this.hintsFile = hintsFile;
702 }
703
704
705
706
707
708
709 public void setShowSummary(boolean showSummary) {
710 this.showSummary = showSummary;
711 }
712
713
714
715
716
717
718 public void setEnableExperimental(Boolean enableExperimental) {
719 this.enableExperimental = enableExperimental;
720 }
721
722
723
724
725
726
727 public void setEnableRetired(Boolean enableRetired) {
728 this.enableRetired = enableRetired;
729 }
730
731
732
733
734
735
736 public void setJarAnalyzerEnabled(Boolean jarAnalyzerEnabled) {
737 this.jarAnalyzerEnabled = jarAnalyzerEnabled;
738 }
739
740
741
742
743
744
745 public void setArchiveAnalyzerEnabled(Boolean archiveAnalyzerEnabled) {
746 this.archiveAnalyzerEnabled = archiveAnalyzerEnabled;
747 }
748
749
750
751
752
753
754 public void setAssemblyAnalyzerEnabled(Boolean assemblyAnalyzerEnabled) {
755 this.assemblyAnalyzerEnabled = assemblyAnalyzerEnabled;
756 }
757
758
759
760
761
762
763 public void setMSBuildAnalyzerEnabled(Boolean msbuildAnalyzerEnabled) {
764 this.msbuildAnalyzerEnabled = msbuildAnalyzerEnabled;
765 }
766
767
768
769
770
771
772 public void setNuspecAnalyzerEnabled(Boolean nuspecAnalyzerEnabled) {
773 this.nuspecAnalyzerEnabled = nuspecAnalyzerEnabled;
774 }
775
776
777
778
779
780
781 public void setNugetconfAnalyzerEnabled(Boolean nugetconfAnalyzerEnabled) {
782 this.nugetconfAnalyzerEnabled = nugetconfAnalyzerEnabled;
783 }
784
785
786
787
788
789
790 public void setLibmanAnalyzerEnabled(Boolean libmanAnalyzerEnabled) {
791 this.libmanAnalyzerEnabled = libmanAnalyzerEnabled;
792 }
793
794
795
796
797
798
799 public void setComposerAnalyzerEnabled(Boolean composerAnalyzerEnabled) {
800 this.composerAnalyzerEnabled = composerAnalyzerEnabled;
801 }
802
803
804
805
806
807
808 public void setComposerAnalyzerSkipDev(Boolean composerAnalyzerSkipDev) {
809 this.composerAnalyzerSkipDev = composerAnalyzerSkipDev;
810 }
811
812
813
814
815
816
817 public void setCpanfileAnalyzerEnabled(Boolean cpanfileAnalyzerEnabled) {
818 this.cpanfileAnalyzerEnabled = cpanfileAnalyzerEnabled;
819 }
820
821
822
823
824
825
826 public void setAutoconfAnalyzerEnabled(Boolean autoconfAnalyzerEnabled) {
827 this.autoconfAnalyzerEnabled = autoconfAnalyzerEnabled;
828 }
829
830
831
832
833
834
835 public void setPipAnalyzerEnabled(Boolean pipAnalyzerEnabled) {
836 this.pipAnalyzerEnabled = pipAnalyzerEnabled;
837 }
838
839
840
841
842
843
844 public void setPipfileAnalyzerEnabled(Boolean pipfileAnalyzerEnabled) {
845 this.pipfileAnalyzerEnabled = pipfileAnalyzerEnabled;
846 }
847
848
849
850
851
852
853 public void setPoetryAnalyzerEnabled(Boolean poetryAnalyzerEnabled) {
854 this.poetryAnalyzerEnabled = poetryAnalyzerEnabled;
855 }
856
857
858
859
860
861
862
863 public void setBundleAuditAnalyzerEnabled(Boolean bundleAuditAnalyzerEnabled) {
864 this.bundleAuditAnalyzerEnabled = bundleAuditAnalyzerEnabled;
865 }
866
867
868
869
870
871
872 public void setBundleAuditPath(String bundleAuditPath) {
873 this.bundleAuditPath = bundleAuditPath;
874 }
875
876
877
878
879
880
881
882
883 public void setBundleAuditWorkingDirectory(String bundleAuditWorkingDirectory) {
884 this.bundleAuditWorkingDirectory = bundleAuditWorkingDirectory;
885 }
886
887
888
889
890
891
892 public void setCocoapodsAnalyzerEnabled(Boolean cocoapodsAnalyzerEnabled) {
893 this.cocoapodsAnalyzerEnabled = cocoapodsAnalyzerEnabled;
894 }
895
896
897
898
899
900
901 public void setCarthageAnalyzerEnabled(Boolean carthageAnalyzerEnabled) {
902 this.carthageAnalyzerEnabled = carthageAnalyzerEnabled;
903 }
904
905
906
907
908
909
910
911 public void setSwiftPackageManagerAnalyzerEnabled(Boolean swiftPackageManagerAnalyzerEnabled) {
912 this.swiftPackageManagerAnalyzerEnabled = swiftPackageManagerAnalyzerEnabled;
913 }
914
915
916
917
918
919
920
921 public void setSwiftPackageResolvedAnalyzerEnabled(Boolean swiftPackageResolvedAnalyzerEnabled) {
922 this.swiftPackageResolvedAnalyzerEnabled = swiftPackageResolvedAnalyzerEnabled;
923 }
924
925
926
927
928
929
930 public void setOpensslAnalyzerEnabled(Boolean opensslAnalyzerEnabled) {
931 this.opensslAnalyzerEnabled = opensslAnalyzerEnabled;
932 }
933
934
935
936
937
938
939 public void setNodeAnalyzerEnabled(Boolean nodeAnalyzerEnabled) {
940 this.nodeAnalyzerEnabled = nodeAnalyzerEnabled;
941 }
942
943
944
945
946
947
948 public void setNodeAuditAnalyzerEnabled(Boolean nodeAuditAnalyzerEnabled) {
949 this.nodeAuditAnalyzerEnabled = nodeAuditAnalyzerEnabled;
950 }
951
952
953
954
955
956
957 public void setYarnAuditAnalyzerEnabled(Boolean yarnAuditAnalyzerEnabled) {
958 this.yarnAuditAnalyzerEnabled = yarnAuditAnalyzerEnabled;
959 }
960
961
962
963
964
965
966 public void setPnpmAuditAnalyzerEnabled(Boolean pnpmAuditAnalyzerEnabled) {
967 this.pnpmAuditAnalyzerEnabled = pnpmAuditAnalyzerEnabled;
968 }
969
970
971
972
973
974
975 public void setNodeAuditAnalyzerUseCache(Boolean nodeAuditAnalyzerUseCache) {
976 this.nodeAuditAnalyzerUseCache = nodeAuditAnalyzerUseCache;
977 }
978
979
980
981
982
983
984
985 public void setNodePackageSkipDevDependencies(Boolean nodePackageSkipDevDependencies) {
986 this.nodePackageSkipDevDependencies = nodePackageSkipDevDependencies;
987 }
988
989
990
991
992
993
994
995 public void setNodeAuditSkipDevDependencies(Boolean nodeAuditSkipDevDependencies) {
996 this.nodeAuditSkipDevDependencies = nodeAuditSkipDevDependencies;
997 }
998
999
1000
1001
1002
1003
1004
1005 public void setRetireJsFilterNonVulnerable(Boolean retireJsFilterNonVulnerable) {
1006 this.retireJsFilterNonVulnerable = retireJsFilterNonVulnerable;
1007 }
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018 public void addConfiguredRetireJsFilter(final RetirejsFilter retireJsFilter) {
1019 retireJsFilters.add(retireJsFilter.getRegex());
1020 }
1021
1022
1023
1024
1025
1026
1027 public void setRubygemsAnalyzerEnabled(Boolean rubygemsAnalyzerEnabled) {
1028 this.rubygemsAnalyzerEnabled = rubygemsAnalyzerEnabled;
1029 }
1030
1031
1032
1033
1034
1035
1036 public void setPyPackageAnalyzerEnabled(Boolean pyPackageAnalyzerEnabled) {
1037 this.pyPackageAnalyzerEnabled = pyPackageAnalyzerEnabled;
1038 }
1039
1040
1041
1042
1043
1044
1045
1046 public void setPyDistributionAnalyzerEnabled(Boolean pyDistributionAnalyzerEnabled) {
1047 this.pyDistributionAnalyzerEnabled = pyDistributionAnalyzerEnabled;
1048 }
1049
1050
1051
1052
1053
1054
1055 public void setMixAuditAnalyzerEnabled(Boolean mixAuditAnalyzerEnabled) {
1056 this.mixAuditAnalyzerEnabled = mixAuditAnalyzerEnabled;
1057 }
1058
1059
1060
1061
1062
1063
1064 public void setMixAuditPath(String mixAuditPath) {
1065 this.mixAuditPath = mixAuditPath;
1066 }
1067
1068
1069
1070
1071
1072 public void setCentralAnalyzerEnabled(Boolean centralAnalyzerEnabled) {
1073 this.centralAnalyzerEnabled = centralAnalyzerEnabled;
1074 }
1075
1076
1077
1078
1079
1080
1081 public void setCentralAnalyzerUseCache(Boolean centralAnalyzerUseCache) {
1082 this.centralAnalyzerUseCache = centralAnalyzerUseCache;
1083 }
1084
1085
1086
1087
1088
1089
1090 public void setNexusAnalyzerEnabled(Boolean nexusAnalyzerEnabled) {
1091 this.nexusAnalyzerEnabled = nexusAnalyzerEnabled;
1092 }
1093
1094
1095
1096
1097
1098
1099 public void setGolangDepEnabled(Boolean golangDepEnabled) {
1100 this.golangDepEnabled = golangDepEnabled;
1101 }
1102
1103
1104
1105
1106
1107
1108 public void setGolangModEnabled(Boolean golangModEnabled) {
1109 this.golangModEnabled = golangModEnabled;
1110 }
1111
1112
1113
1114
1115
1116
1117 public void setDartAnalyzerEnabled(Boolean dartAnalyzerEnabled) {
1118 this.dartAnalyzerEnabled = dartAnalyzerEnabled;
1119 }
1120
1121
1122
1123
1124
1125
1126 public void setPathToYarn(String pathToYarn) {
1127 this.pathToYarn = pathToYarn;
1128 }
1129
1130
1131
1132
1133
1134
1135 public void setPathToPnpm(String pathToPnpm) {
1136 this.pathToPnpm = pathToPnpm;
1137 }
1138
1139
1140
1141
1142
1143
1144 public void setPathToGo(String pathToGo) {
1145 this.pathToGo = pathToGo;
1146 }
1147
1148
1149
1150
1151
1152
1153 public void setNexusUrl(String nexusUrl) {
1154 this.nexusUrl = nexusUrl;
1155 }
1156
1157
1158
1159
1160
1161
1162 public void setNexusUser(String nexusUser) {
1163 this.nexusUser = nexusUser;
1164 }
1165
1166
1167
1168
1169
1170
1171 public void setNexusPassword(String nexusPassword) {
1172 this.nexusPassword = nexusPassword;
1173 }
1174
1175
1176
1177
1178
1179
1180 public void setNexusUsesProxy(Boolean nexusUsesProxy) {
1181 this.nexusUsesProxy = nexusUsesProxy;
1182 }
1183
1184
1185
1186
1187
1188
1189 public void setZipExtensions(String zipExtensions) {
1190 this.zipExtensions = zipExtensions;
1191 }
1192
1193
1194
1195
1196
1197
1198 public void setPathToDotnetCore(String pathToCore) {
1199 this.pathToCore = pathToCore;
1200 }
1201
1202
1203
1204
1205
1206
1207 public void setOssIndexAnalyzerEnabled(Boolean ossIndexAnalyzerEnabled) {
1208 this.ossIndexAnalyzerEnabled = ossIndexAnalyzerEnabled;
1209 }
1210
1211
1212
1213
1214
1215
1216 public void setOssIndexAnalyzerUseCache(Boolean ossIndexAnalyzerUseCache) {
1217 this.ossIndexAnalyzerUseCache = ossIndexAnalyzerUseCache;
1218 }
1219
1220
1221
1222
1223
1224
1225 public void setOssIndexAnalyzerCacheValidForHours(Integer ossIndexAnalyzerCacheValidForHours) {
1226 this.ossIndexAnalyzerCacheValidForHours = ossIndexAnalyzerCacheValidForHours;
1227 }
1228
1229
1230
1231
1232
1233
1234 public void setOssIndexAnalyzerUrl(String ossIndexAnalyzerUrl) {
1235 this.ossIndexAnalyzerUrl = ossIndexAnalyzerUrl;
1236 }
1237
1238
1239
1240
1241
1242
1243 public void setOssIndexAnalyzerUsername(String ossIndexAnalyzerUsername) {
1244 this.ossIndexAnalyzerUsername = ossIndexAnalyzerUsername;
1245 }
1246
1247
1248
1249
1250
1251
1252 public void setOssIndexAnalyzerPassword(String ossIndexAnalyzerPassword) {
1253 this.ossIndexAnalyzerPassword = ossIndexAnalyzerPassword;
1254 }
1255
1256
1257
1258
1259
1260
1261
1262 public void setOssIndexWarnOnlyOnRemoteErrors(Boolean ossIndexWarnOnlyOnRemoteErrors) {
1263 this.ossIndexAnalyzerWarnOnlyOnRemoteErrors = ossIndexWarnOnlyOnRemoteErrors;
1264 }
1265
1266
1267
1268
1269
1270
1271 public void setCmakeAnalyzerEnabled(Boolean cmakeAnalyzerEnabled) {
1272 this.cmakeAnalyzerEnabled = cmakeAnalyzerEnabled;
1273 }
1274
1275
1276
1277
1278
1279
1280 public void setArtifactoryAnalyzerEnabled(Boolean artifactoryAnalyzerEnabled) {
1281 this.artifactoryAnalyzerEnabled = artifactoryAnalyzerEnabled;
1282 }
1283
1284
1285
1286
1287
1288
1289 public void setArtifactoryAnalyzerUrl(String artifactoryAnalyzerUrl) {
1290 this.artifactoryAnalyzerUrl = artifactoryAnalyzerUrl;
1291 }
1292
1293
1294
1295
1296
1297
1298
1299 public void setArtifactoryAnalyzerUseProxy(Boolean artifactoryAnalyzerUseProxy) {
1300 this.artifactoryAnalyzerUseProxy = artifactoryAnalyzerUseProxy;
1301 }
1302
1303
1304
1305
1306
1307
1308
1309 public void setArtifactoryAnalyzerParallelAnalysis(Boolean artifactoryAnalyzerParallelAnalysis) {
1310 this.artifactoryAnalyzerParallelAnalysis = artifactoryAnalyzerParallelAnalysis;
1311 }
1312
1313
1314
1315
1316
1317
1318
1319 public void setArtifactoryAnalyzerUsername(String artifactoryAnalyzerUsername) {
1320 this.artifactoryAnalyzerUsername = artifactoryAnalyzerUsername;
1321 }
1322
1323
1324
1325
1326
1327
1328
1329 public void setArtifactoryAnalyzerApiToken(String artifactoryAnalyzerApiToken) {
1330 this.artifactoryAnalyzerApiToken = artifactoryAnalyzerApiToken;
1331 }
1332
1333
1334
1335
1336
1337
1338
1339 public void setArtifactoryAnalyzerBearerToken(String artifactoryAnalyzerBearerToken) {
1340 this.artifactoryAnalyzerBearerToken = artifactoryAnalyzerBearerToken;
1341 }
1342
1343
1344
1345
1346
1347
1348
1349 public void setFailBuildOnUnusedSuppressionRule(boolean failBuildOnUnusedSuppressionRule) {
1350 this.failBuildOnUnusedSuppressionRule = failBuildOnUnusedSuppressionRule;
1351 }
1352
1353
1354 @SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
1355 @Override
1356 protected void executeWithContextClassloader() throws BuildException {
1357 dealWithReferences();
1358 validateConfiguration();
1359 populateSettings();
1360 try {
1361 Downloader.getInstance().configure(getSettings());
1362 } catch (InvalidSettingException e) {
1363 throw new BuildException(e);
1364 }
1365 TelemetryCollector.send(getSettings());
1366 try (Engine engine = new Engine(Check.class.getClassLoader(), getSettings())) {
1367 for (Resource resource : getPath()) {
1368 final FileProvider provider = resource.as(FileProvider.class);
1369 if (provider != null) {
1370 final File file = provider.getFile();
1371 if (file != null && file.exists()) {
1372 engine.scan(file);
1373 }
1374 }
1375 }
1376 final ExceptionCollection exceptions = callExecuteAnalysis(engine);
1377 if (exceptions == null || !exceptions.isFatal()) {
1378 for (String format : getReportFormats()) {
1379 engine.writeReports(getProjectName(), new File(reportOutputDirectory), format, exceptions);
1380 }
1381 if (this.failBuildOnCVSS <= 10) {
1382 checkForFailure(engine.getDependencies());
1383 }
1384 if (this.showSummary) {
1385 DependencyCheckScanAgent.showSummary(engine.getDependencies());
1386 }
1387 }
1388 } catch (DatabaseException ex) {
1389 final String msg = "Unable to connect to the dependency-check database; analysis has stopped";
1390 if (this.isFailOnError()) {
1391 throw new BuildException(msg, ex);
1392 }
1393 log(msg, ex, Project.MSG_ERR);
1394 } catch (ReportException ex) {
1395 final String msg = "Unable to generate the dependency-check report";
1396 if (this.isFailOnError()) {
1397 throw new BuildException(msg, ex);
1398 }
1399 log(msg, ex, Project.MSG_ERR);
1400 } finally {
1401 getSettings().cleanup();
1402 }
1403 }
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415 @SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
1416 private ExceptionCollection callExecuteAnalysis(final Engine engine) throws BuildException {
1417 ExceptionCollection exceptions = null;
1418 try {
1419 engine.analyzeDependencies();
1420 } catch (ExceptionCollection ex) {
1421 if (this.isFailOnError()) {
1422 throw new BuildException(ex);
1423 }
1424 exceptions = ex;
1425 }
1426 return exceptions;
1427 }
1428
1429
1430
1431
1432
1433
1434
1435
1436 @SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
1437 private synchronized void validateConfiguration() throws BuildException {
1438 if (path == null) {
1439 throw new BuildException("No project dependencies have been defined to analyze.");
1440 }
1441 if (failBuildOnCVSS < 0 || failBuildOnCVSS > 11) {
1442 throw new BuildException("Invalid configuration, failBuildOnCVSS must be between 0 and 11.");
1443 }
1444 }
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454 @SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
1455 @Override
1456 protected void populateSettings() throws BuildException {
1457 super.populateSettings();
1458 getSettings().setBooleanIfNotNull(Settings.KEYS.AUTO_UPDATE, autoUpdate);
1459 getSettings().setArrayIfNotEmpty(Settings.KEYS.SUPPRESSION_FILE, suppressionFiles);
1460 getSettings().setStringIfNotEmpty(Settings.KEYS.SUPPRESSION_FILE_USER, suppressionFileUser);
1461 getSettings().setStringIfNotEmpty(Settings.KEYS.SUPPRESSION_FILE_PASSWORD, suppressionFilePassword);
1462 getSettings().setStringIfNotEmpty(Settings.KEYS.SUPPRESSION_FILE_BEARER_TOKEN, suppressionFileBearerToken);
1463 getSettings().setBooleanIfNotNull(Settings.KEYS.UPDATE_VERSION_CHECK_ENABLED, versionCheckEnabled);
1464 getSettings().setStringIfNotEmpty(Settings.KEYS.HINTS_FILE, hintsFile);
1465 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_EXPERIMENTAL_ENABLED, enableExperimental);
1466 getSettings().setBooleanIfNotNull(Settings.KEYS.PRETTY_PRINT, prettyPrint);
1467 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_RETIRED_ENABLED, enableRetired);
1468 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_JAR_ENABLED, jarAnalyzerEnabled);
1469 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, pyDistributionAnalyzerEnabled);
1470 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, pyPackageAnalyzerEnabled);
1471 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED, rubygemsAnalyzerEnabled);
1472 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, opensslAnalyzerEnabled);
1473 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_CMAKE_ENABLED, cmakeAnalyzerEnabled);
1474
1475 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_ARTIFACTORY_ENABLED, artifactoryAnalyzerEnabled);
1476 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_ARTIFACTORY_URL, artifactoryAnalyzerUrl);
1477 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_ARTIFACTORY_USES_PROXY, artifactoryAnalyzerUseProxy);
1478 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_ARTIFACTORY_PARALLEL_ANALYSIS, artifactoryAnalyzerParallelAnalysis);
1479 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_ARTIFACTORY_API_USERNAME, artifactoryAnalyzerUsername);
1480 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_ARTIFACTORY_API_TOKEN, artifactoryAnalyzerApiToken);
1481 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_ARTIFACTORY_BEARER_TOKEN, artifactoryAnalyzerBearerToken);
1482
1483 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_SWIFT_PACKAGE_MANAGER_ENABLED, swiftPackageManagerAnalyzerEnabled);
1484 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_SWIFT_PACKAGE_RESOLVED_ENABLED, swiftPackageResolvedAnalyzerEnabled);
1485 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_COCOAPODS_ENABLED, cocoapodsAnalyzerEnabled);
1486 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_CARTHAGE_ENABLED, carthageAnalyzerEnabled);
1487 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_BUNDLE_AUDIT_ENABLED, bundleAuditAnalyzerEnabled);
1488 getSettings().setStringIfNotNull(Settings.KEYS.ANALYZER_BUNDLE_AUDIT_PATH, bundleAuditPath);
1489 getSettings().setStringIfNotNull(Settings.KEYS.ANALYZER_BUNDLE_AUDIT_WORKING_DIRECTORY, bundleAuditWorkingDirectory);
1490 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, autoconfAnalyzerEnabled);
1491 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_MAVEN_INSTALL_ENABLED, mavenInstallAnalyzerEnabled);
1492 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_PIP_ENABLED, pipAnalyzerEnabled);
1493 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_PIPFILE_ENABLED, pipfileAnalyzerEnabled);
1494 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_POETRY_ENABLED, poetryAnalyzerEnabled);
1495 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED, composerAnalyzerEnabled);
1496 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_COMPOSER_LOCK_SKIP_DEV, composerAnalyzerSkipDev);
1497 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_CPANFILE_ENABLED, cpanfileAnalyzerEnabled);
1498 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED, nodeAnalyzerEnabled);
1499 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NODE_PACKAGE_SKIPDEV, nodePackageSkipDevDependencies);
1500 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NODE_AUDIT_ENABLED, nodeAuditAnalyzerEnabled);
1501 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_YARN_AUDIT_ENABLED, yarnAuditAnalyzerEnabled);
1502 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_PNPM_AUDIT_ENABLED, pnpmAuditAnalyzerEnabled);
1503 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NODE_AUDIT_USE_CACHE, nodeAuditAnalyzerUseCache);
1504 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NODE_AUDIT_SKIPDEV, nodeAuditSkipDevDependencies);
1505 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_RETIREJS_FILTER_NON_VULNERABLE, retireJsFilterNonVulnerable);
1506 getSettings().setArrayIfNotEmpty(Settings.KEYS.ANALYZER_RETIREJS_FILTERS, retireJsFilters);
1507 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_GOLANG_DEP_ENABLED, golangDepEnabled);
1508 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_GOLANG_MOD_ENABLED, golangModEnabled);
1509 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_DART_ENABLED, dartAnalyzerEnabled);
1510 getSettings().setStringIfNotNull(Settings.KEYS.ANALYZER_GOLANG_PATH, pathToGo);
1511 getSettings().setStringIfNotNull(Settings.KEYS.ANALYZER_YARN_PATH, pathToYarn);
1512 getSettings().setStringIfNotNull(Settings.KEYS.ANALYZER_PNPM_PATH, pathToPnpm);
1513 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_MIX_AUDIT_ENABLED, mixAuditAnalyzerEnabled);
1514 getSettings().setStringIfNotNull(Settings.KEYS.ANALYZER_MIX_AUDIT_PATH, mixAuditPath);
1515 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, nuspecAnalyzerEnabled);
1516 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NUGETCONF_ENABLED, nugetconfAnalyzerEnabled);
1517 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_LIBMAN_ENABLED, libmanAnalyzerEnabled);
1518 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, centralAnalyzerEnabled);
1519 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_CENTRAL_USE_CACHE, centralAnalyzerUseCache);
1520 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
1521 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, archiveAnalyzerEnabled);
1522 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, assemblyAnalyzerEnabled);
1523 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_MSBUILD_PROJECT_ENABLED, msbuildAnalyzerEnabled);
1524 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
1525 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_NEXUS_USER, nexusUser);
1526 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_NEXUS_PASSWORD, nexusPassword);
1527 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_NEXUS_USES_PROXY, nexusUsesProxy);
1528 getSettings().setStringIfNotEmpty(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, zipExtensions);
1529 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_ASSEMBLY_DOTNET_PATH, pathToCore);
1530 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_OSSINDEX_ENABLED, ossIndexAnalyzerEnabled);
1531 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_OSSINDEX_URL, ossIndexAnalyzerUrl);
1532 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_OSSINDEX_USER, ossIndexAnalyzerUsername);
1533 getSettings().setStringIfNotEmpty(Settings.KEYS.ANALYZER_OSSINDEX_PASSWORD, ossIndexAnalyzerPassword);
1534 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_OSSINDEX_USE_CACHE, ossIndexAnalyzerUseCache);
1535 getSettings().setIntIfNotNull(Settings.KEYS.ANALYZER_OSSINDEX_CACHE_VALID_FOR_HOURS, ossIndexAnalyzerCacheValidForHours);
1536 getSettings().setBooleanIfNotNull(Settings.KEYS.ANALYZER_OSSINDEX_WARN_ONLY_ON_REMOTE_ERRORS, ossIndexAnalyzerWarnOnlyOnRemoteErrors);
1537 getSettings().setFloat(Settings.KEYS.JUNIT_FAIL_ON_CVSS, junitFailOnCVSS);
1538 getSettings().setBooleanIfNotNull(Settings.KEYS.FAIL_ON_UNUSED_SUPPRESSION_RULE, failBuildOnUnusedSuppressionRule);
1539 }
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550 @SuppressWarnings("squid:RedundantThrowsDeclarationCheck")
1551 private void checkForFailure(Dependency[] dependencies) throws BuildException {
1552 final StringBuilder ids = new StringBuilder();
1553 for (Dependency d : dependencies) {
1554 boolean addName = true;
1555 for (Vulnerability v : d.getVulnerabilities()) {
1556 final double cvssV2 = v.getCvssV2() != null && v.getCvssV2().getCvssData() != null
1557 && v.getCvssV2().getCvssData().getBaseScore() != null ? v.getCvssV2().getCvssData().getBaseScore() : -1;
1558 final double cvssV3 = v.getCvssV3() != null && v.getCvssV3().getCvssData() != null
1559 && v.getCvssV3().getCvssData().getBaseScore() != null ? v.getCvssV3().getCvssData().getBaseScore() : -1;
1560 final double cvssV4 = v.getCvssV4() != null && v.getCvssV4().getCvssData() != null
1561 && v.getCvssV4().getCvssData().getBaseScore() != null ? v.getCvssV4().getCvssData().getBaseScore() : -1;
1562 final boolean useUnscored = cvssV2 == -1 && cvssV3 == -1 && cvssV4 == -1;
1563 final double unscoredCvss =
1564 useUnscored && v.getUnscoredSeverity() != null ? SeverityUtil.estimateCvssV2(v.getUnscoredSeverity()) : -1;
1565
1566 if (cvssV2 >= failBuildOnCVSS
1567 || cvssV3 >= failBuildOnCVSS
1568 || cvssV4 >= failBuildOnCVSS
1569 || unscoredCvss >= failBuildOnCVSS
1570
1571 || failBuildOnCVSS <= 0.0f
1572 ) {
1573 if (addName) {
1574 addName = false;
1575 ids.append(NEW_LINE).append(d.getFileName()).append(" (")
1576 .append(Stream.concat(d.getSoftwareIdentifiers().stream(), d.getVulnerableSoftwareIdentifiers().stream())
1577 .map(Identifier::getValue)
1578 .collect(Collectors.joining(", ")))
1579 .append("): ")
1580 .append(v.getName());
1581 } else {
1582 ids.append(", ").append(v.getName());
1583 }
1584 }
1585 }
1586 }
1587 if (ids.length() > 0) {
1588 final String msg;
1589 if (showSummary) {
1590 msg = String.format("%n%nDependency-Check Failure:%n"
1591 + "One or more dependencies were identified with vulnerabilities that have a CVSS score greater than or equal to '%.1f': %s%n"
1592 + "See the dependency-check report for more details.%n%n", failBuildOnCVSS, ids);
1593 } else {
1594 msg = String.format("%n%nDependency-Check Failure:%n"
1595 + "One or more dependencies were identified with vulnerabilities.%n%n"
1596 + "See the dependency-check report for more details.%n%n");
1597 }
1598 throw new BuildException(msg);
1599 }
1600 }
1601
1602
1603
1604
1605
1606 public static class ReportFormats extends EnumeratedAttribute {
1607
1608
1609
1610
1611
1612
1613 @Override
1614 public String[] getValues() {
1615 int i = 0;
1616 final Format[] formats = Format.values();
1617 final String[] values = new String[formats.length];
1618 for (Format format : formats) {
1619 values[i++] = format.name();
1620 }
1621 return values;
1622 }
1623 }
1624
1625
1626
1627
1628
1629
1630 public static class ReportFormat {
1631
1632
1633
1634
1635 private ReportFormats format;
1636
1637
1638
1639
1640
1641
1642 public String getFormat() {
1643 return this.format.getValue();
1644 }
1645
1646
1647
1648
1649
1650
1651
1652
1653 public void setFormat(final String format) {
1654 this.format = (ReportFormats) EnumeratedAttribute.getInstance(ReportFormats.class, format);
1655 }
1656 }
1657 }
1658