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