@mitre/hdf-converters 2.12.2 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/README.md +25 -24
  2. package/lib/data/converters/csv2json.d.ts +1 -0
  3. package/lib/data/converters/csv2json.d.ts.map +1 -0
  4. package/lib/data/converters/csv2json.js +1 -1
  5. package/lib/data/converters/csv2json.js.map +1 -1
  6. package/lib/data/converters/xml2json.d.ts +1 -0
  7. package/lib/data/converters/xml2json.d.ts.map +1 -0
  8. package/lib/data/converters/xml2json.js +6 -25
  9. package/lib/data/converters/xml2json.js.map +1 -1
  10. package/lib/data/reverse-html-mapper/convert-to-embedded-strings.d.ts +2 -0
  11. package/lib/data/reverse-html-mapper/convert-to-embedded-strings.d.ts.map +1 -0
  12. package/lib/data/reverse-html-mapper/convert-to-embedded-strings.js +13 -0
  13. package/lib/data/reverse-html-mapper/convert-to-embedded-strings.js.map +1 -0
  14. package/lib/index.d.ts +6 -0
  15. package/lib/index.d.ts.map +1 -0
  16. package/lib/index.js +23 -8
  17. package/lib/index.js.map +1 -1
  18. package/lib/package.json +28 -45
  19. package/lib/src/anchore-grype-mapper.d.ts +1 -0
  20. package/lib/src/anchore-grype-mapper.d.ts.map +1 -0
  21. package/lib/src/anchore-grype-mapper.js +7 -1
  22. package/lib/src/anchore-grype-mapper.js.map +1 -1
  23. package/lib/src/asff-mapper/asff-mapper.d.ts +1 -0
  24. package/lib/src/asff-mapper/asff-mapper.d.ts.map +1 -0
  25. package/lib/src/asff-mapper/asff-mapper.js +276 -242
  26. package/lib/src/asff-mapper/asff-mapper.js.map +1 -1
  27. package/lib/src/asff-mapper/case-cms-inspec.d.ts +1 -0
  28. package/lib/src/asff-mapper/case-cms-inspec.d.ts.map +1 -0
  29. package/lib/src/asff-mapper/case-cms-inspec.js +18 -9
  30. package/lib/src/asff-mapper/case-cms-inspec.js.map +1 -1
  31. package/lib/src/asff-mapper/case-firewall-manager.d.ts +1 -0
  32. package/lib/src/asff-mapper/case-firewall-manager.d.ts.map +1 -0
  33. package/lib/src/asff-mapper/case-firewall-manager.js +18 -9
  34. package/lib/src/asff-mapper/case-firewall-manager.js.map +1 -1
  35. package/lib/src/asff-mapper/case-guardduty.d.ts +1 -0
  36. package/lib/src/asff-mapper/case-guardduty.d.ts.map +1 -0
  37. package/lib/src/asff-mapper/case-guardduty.js +18 -9
  38. package/lib/src/asff-mapper/case-guardduty.js.map +1 -1
  39. package/lib/src/asff-mapper/case-inspector.d.ts +1 -0
  40. package/lib/src/asff-mapper/case-inspector.d.ts.map +1 -0
  41. package/lib/src/asff-mapper/case-inspector.js +18 -9
  42. package/lib/src/asff-mapper/case-inspector.js.map +1 -1
  43. package/lib/src/asff-mapper/case-previously-hdf.d.ts +1 -0
  44. package/lib/src/asff-mapper/case-previously-hdf.d.ts.map +1 -0
  45. package/lib/src/asff-mapper/case-previously-hdf.js +28 -15
  46. package/lib/src/asff-mapper/case-previously-hdf.js.map +1 -1
  47. package/lib/src/asff-mapper/case-prowler.d.ts +1 -0
  48. package/lib/src/asff-mapper/case-prowler.d.ts.map +1 -0
  49. package/lib/src/asff-mapper/case-prowler.js +19 -9
  50. package/lib/src/asff-mapper/case-prowler.js.map +1 -1
  51. package/lib/src/asff-mapper/case-security-hub.d.ts +1 -0
  52. package/lib/src/asff-mapper/case-security-hub.d.ts.map +1 -0
  53. package/lib/src/asff-mapper/case-security-hub.js +24 -9
  54. package/lib/src/asff-mapper/case-security-hub.js.map +1 -1
  55. package/lib/src/asff-mapper/case-trivy.d.ts +1 -0
  56. package/lib/src/asff-mapper/case-trivy.d.ts.map +1 -0
  57. package/lib/src/asff-mapper/case-trivy.js +18 -9
  58. package/lib/src/asff-mapper/case-trivy.js.map +1 -1
  59. package/lib/src/aws-config-mapper.d.ts +1 -0
  60. package/lib/src/aws-config-mapper.d.ts.map +1 -0
  61. package/lib/src/aws-config-mapper.js +38 -22
  62. package/lib/src/aws-config-mapper.js.map +1 -1
  63. package/lib/src/base-converter.d.ts +2 -1
  64. package/lib/src/base-converter.d.ts.map +1 -0
  65. package/lib/src/base-converter.js +51 -33
  66. package/lib/src/base-converter.js.map +1 -1
  67. package/lib/src/burpsuite-mapper.d.ts +7 -0
  68. package/lib/src/burpsuite-mapper.d.ts.map +1 -0
  69. package/lib/src/burpsuite-mapper.js +115 -88
  70. package/lib/src/burpsuite-mapper.js.map +1 -1
  71. package/lib/src/checkov-mapper.d.ts +67 -0
  72. package/lib/src/checkov-mapper.d.ts.map +1 -0
  73. package/lib/src/checkov-mapper.js +240 -0
  74. package/lib/src/checkov-mapper.js.map +1 -0
  75. package/lib/src/ckl-mapper/checklist-jsonix-converter.d.ts +17 -0
  76. package/lib/src/ckl-mapper/checklist-jsonix-converter.d.ts.map +1 -0
  77. package/lib/src/ckl-mapper/checklist-jsonix-converter.js +59 -25
  78. package/lib/src/ckl-mapper/checklist-jsonix-converter.js.map +1 -1
  79. package/lib/src/ckl-mapper/checklist-mapper.d.ts +35 -0
  80. package/lib/src/ckl-mapper/checklist-mapper.d.ts.map +1 -0
  81. package/lib/src/ckl-mapper/checklist-mapper.js +264 -155
  82. package/lib/src/ckl-mapper/checklist-mapper.js.map +1 -1
  83. package/lib/src/ckl-mapper/checklist-metadata-utils.d.ts +1 -0
  84. package/lib/src/ckl-mapper/checklist-metadata-utils.d.ts.map +1 -0
  85. package/lib/src/ckl-mapper/checklist-metadata-utils.js +38 -16
  86. package/lib/src/ckl-mapper/checklist-metadata-utils.js.map +1 -1
  87. package/lib/src/ckl-mapper/checklistJsonix.d.ts +6 -0
  88. package/lib/src/ckl-mapper/checklistJsonix.d.ts.map +1 -0
  89. package/lib/src/ckl-mapper/checklistJsonix.js +8 -8
  90. package/lib/src/ckl-mapper/checklistJsonix.js.map +1 -1
  91. package/lib/src/ckl-mapper/jsonixMapping.d.ts +5 -0
  92. package/lib/src/ckl-mapper/jsonixMapping.d.ts.map +1 -0
  93. package/lib/src/ckl-mapper/jsonixMapping.js +4 -0
  94. package/lib/src/ckl-mapper/jsonixMapping.js.map +1 -1
  95. package/lib/src/converters-from-hdf/asff/asff-types.d.ts +1 -0
  96. package/lib/src/converters-from-hdf/asff/asff-types.d.ts.map +1 -0
  97. package/lib/src/converters-from-hdf/asff/asff-types.js +1 -0
  98. package/lib/src/converters-from-hdf/asff/asff-types.js.map +1 -1
  99. package/lib/src/converters-from-hdf/asff/reverse-asff-mapper.d.ts +1 -0
  100. package/lib/src/converters-from-hdf/asff/reverse-asff-mapper.d.ts.map +1 -0
  101. package/lib/src/converters-from-hdf/asff/reverse-asff-mapper.js +110 -84
  102. package/lib/src/converters-from-hdf/asff/reverse-asff-mapper.js.map +1 -1
  103. package/lib/src/converters-from-hdf/asff/transformers.d.ts +1 -0
  104. package/lib/src/converters-from-hdf/asff/transformers.d.ts.map +1 -0
  105. package/lib/src/converters-from-hdf/asff/transformers.js +82 -55
  106. package/lib/src/converters-from-hdf/asff/transformers.js.map +1 -1
  107. package/lib/src/converters-from-hdf/caat/reverse-caat-mapper.d.ts +1 -0
  108. package/lib/src/converters-from-hdf/caat/reverse-caat-mapper.d.ts.map +1 -0
  109. package/lib/src/converters-from-hdf/caat/reverse-caat-mapper.js +65 -38
  110. package/lib/src/converters-from-hdf/caat/reverse-caat-mapper.js.map +1 -1
  111. package/lib/src/converters-from-hdf/html/embedded-assets.d.ts +4 -0
  112. package/lib/src/converters-from-hdf/html/embedded-assets.d.ts.map +1 -0
  113. package/lib/src/converters-from-hdf/html/embedded-assets.js +8 -0
  114. package/lib/src/converters-from-hdf/html/embedded-assets.js.map +1 -0
  115. package/lib/src/converters-from-hdf/html/html-types.d.ts +1 -0
  116. package/lib/src/converters-from-hdf/html/html-types.d.ts.map +1 -0
  117. package/lib/src/converters-from-hdf/html/html-types.js +1 -0
  118. package/lib/src/converters-from-hdf/html/html-types.js.map +1 -1
  119. package/lib/src/converters-from-hdf/html/reverse-html-mapper.d.ts +3 -2
  120. package/lib/src/converters-from-hdf/html/reverse-html-mapper.d.ts.map +1 -0
  121. package/lib/src/converters-from-hdf/html/reverse-html-mapper.js +151 -107
  122. package/lib/src/converters-from-hdf/html/reverse-html-mapper.js.map +1 -1
  123. package/lib/src/converters-from-hdf/reverse-any-base-converter.d.ts +1 -0
  124. package/lib/src/converters-from-hdf/reverse-any-base-converter.d.ts.map +1 -0
  125. package/lib/src/converters-from-hdf/reverse-any-base-converter.js +3 -0
  126. package/lib/src/converters-from-hdf/reverse-any-base-converter.js.map +1 -1
  127. package/lib/src/converters-from-hdf/reverse-base-converter.d.ts +1 -0
  128. package/lib/src/converters-from-hdf/reverse-base-converter.d.ts.map +1 -0
  129. package/lib/src/converters-from-hdf/reverse-base-converter.js +29 -9
  130. package/lib/src/converters-from-hdf/reverse-base-converter.js.map +1 -1
  131. package/lib/src/converters-from-hdf/splunk/reverse-splunk-mapper.d.ts +1 -0
  132. package/lib/src/converters-from-hdf/splunk/reverse-splunk-mapper.d.ts.map +1 -0
  133. package/lib/src/converters-from-hdf/splunk/reverse-splunk-mapper.js +40 -16
  134. package/lib/src/converters-from-hdf/splunk/reverse-splunk-mapper.js.map +1 -1
  135. package/lib/src/converters-from-hdf/xccdf/reverse-xccdf-mapper.d.ts +1 -0
  136. package/lib/src/converters-from-hdf/xccdf/reverse-xccdf-mapper.d.ts.map +1 -0
  137. package/lib/src/converters-from-hdf/xccdf/reverse-xccdf-mapper.js +33 -12
  138. package/lib/src/converters-from-hdf/xccdf/reverse-xccdf-mapper.js.map +1 -1
  139. package/lib/src/conveyor-mapper.d.ts +1 -0
  140. package/lib/src/conveyor-mapper.d.ts.map +1 -0
  141. package/lib/src/conveyor-mapper.js +85 -40
  142. package/lib/src/conveyor-mapper.js.map +1 -1
  143. package/lib/src/cyclonedx-sbom-mapper.d.ts +1 -0
  144. package/lib/src/cyclonedx-sbom-mapper.d.ts.map +1 -0
  145. package/lib/src/cyclonedx-sbom-mapper.js +377 -309
  146. package/lib/src/cyclonedx-sbom-mapper.js.map +1 -1
  147. package/lib/src/dbprotect-mapper.d.ts +1 -0
  148. package/lib/src/dbprotect-mapper.d.ts.map +1 -0
  149. package/lib/src/dbprotect-mapper.js +74 -63
  150. package/lib/src/dbprotect-mapper.js.map +1 -1
  151. package/lib/src/dependency-track-mapper.d.ts +1 -0
  152. package/lib/src/dependency-track-mapper.d.ts.map +1 -0
  153. package/lib/src/dependency-track-mapper.js +144 -130
  154. package/lib/src/dependency-track-mapper.js.map +1 -1
  155. package/lib/src/fortify-mapper.d.ts +7 -0
  156. package/lib/src/fortify-mapper.d.ts.map +1 -0
  157. package/lib/src/fortify-mapper.js +118 -92
  158. package/lib/src/fortify-mapper.js.map +1 -1
  159. package/lib/src/gosec-mapper.d.ts +1 -0
  160. package/lib/src/gosec-mapper.d.ts.map +1 -0
  161. package/lib/src/gosec-mapper.js +90 -72
  162. package/lib/src/gosec-mapper.js.map +1 -1
  163. package/lib/src/ionchannel-mapper.d.ts +1 -0
  164. package/lib/src/ionchannel-mapper.d.ts.map +1 -0
  165. package/lib/src/ionchannel-mapper.js +130 -110
  166. package/lib/src/ionchannel-mapper.js.map +1 -1
  167. package/lib/src/jfrog-xray-mapper.d.ts +1 -0
  168. package/lib/src/jfrog-xray-mapper.d.ts.map +1 -0
  169. package/lib/src/jfrog-xray-mapper.js +92 -78
  170. package/lib/src/jfrog-xray-mapper.js.map +1 -1
  171. package/lib/src/jsonix-converter.d.ts +1 -0
  172. package/lib/src/jsonix-converter.d.ts.map +1 -0
  173. package/lib/src/jsonix-converter.js +1 -0
  174. package/lib/src/jsonix-converter.js.map +1 -1
  175. package/lib/src/jsonix-intermediate-converter.d.ts +1 -0
  176. package/lib/src/jsonix-intermediate-converter.d.ts.map +1 -0
  177. package/lib/src/jsonix-intermediate-converter.js.map +1 -1
  178. package/lib/src/mappings/AwsConfigMapping.d.ts +1 -0
  179. package/lib/src/mappings/AwsConfigMapping.d.ts.map +1 -0
  180. package/lib/src/mappings/AwsConfigMapping.js +19 -9
  181. package/lib/src/mappings/AwsConfigMapping.js.map +1 -1
  182. package/lib/src/mappings/AwsConfigMappingData.d.ts +1 -0
  183. package/lib/src/mappings/AwsConfigMappingData.d.ts.map +1 -0
  184. package/lib/src/mappings/AwsConfigMappingData.js.map +1 -1
  185. package/lib/src/mappings/CciNistMapping.d.ts +1 -0
  186. package/lib/src/mappings/CciNistMapping.d.ts.map +1 -0
  187. package/lib/src/mappings/CciNistMapping.js +6 -2
  188. package/lib/src/mappings/CciNistMapping.js.map +1 -1
  189. package/lib/src/mappings/CciNistMappingData.d.ts +1 -0
  190. package/lib/src/mappings/CciNistMappingData.d.ts.map +1 -0
  191. package/lib/src/mappings/CciNistMappingData.js.map +1 -1
  192. package/lib/src/mappings/CciNistMappingItem.d.ts +1 -0
  193. package/lib/src/mappings/CciNistMappingItem.d.ts.map +1 -0
  194. package/lib/src/mappings/CciNistMappingItem.js +2 -0
  195. package/lib/src/mappings/CciNistMappingItem.js.map +1 -1
  196. package/lib/src/mappings/CheckovToCciAndNistMappingData.d.ts +5 -0
  197. package/lib/src/mappings/CheckovToCciAndNistMappingData.d.ts.map +1 -0
  198. package/lib/src/mappings/CheckovToCciAndNistMappingData.js +2695 -0
  199. package/lib/src/mappings/CheckovToCciAndNistMappingData.js.map +1 -0
  200. package/lib/src/mappings/CweNistMapping.d.ts +1 -0
  201. package/lib/src/mappings/CweNistMapping.d.ts.map +1 -0
  202. package/lib/src/mappings/CweNistMapping.js +1 -0
  203. package/lib/src/mappings/CweNistMapping.js.map +1 -1
  204. package/lib/src/mappings/CweNistMappingData.d.ts +1 -0
  205. package/lib/src/mappings/CweNistMappingData.d.ts.map +1 -0
  206. package/lib/src/mappings/CweNistMappingData.js.map +1 -1
  207. package/lib/src/mappings/CweNistMappingItem.d.ts +1 -0
  208. package/lib/src/mappings/CweNistMappingItem.d.ts.map +1 -0
  209. package/lib/src/mappings/CweNistMappingItem.js +5 -0
  210. package/lib/src/mappings/CweNistMappingItem.js.map +1 -1
  211. package/lib/src/mappings/NessusPluginNistMappingData.d.ts +1 -0
  212. package/lib/src/mappings/NessusPluginNistMappingData.d.ts.map +1 -0
  213. package/lib/src/mappings/NessusPluginNistMappingData.js.map +1 -1
  214. package/lib/src/mappings/NessusPluginsNistMapping.d.ts +1 -0
  215. package/lib/src/mappings/NessusPluginsNistMapping.d.ts.map +1 -0
  216. package/lib/src/mappings/NessusPluginsNistMapping.js +1 -0
  217. package/lib/src/mappings/NessusPluginsNistMapping.js.map +1 -1
  218. package/lib/src/mappings/NessusPluginsNistMappingItem.d.ts +1 -0
  219. package/lib/src/mappings/NessusPluginsNistMappingItem.d.ts.map +1 -0
  220. package/lib/src/mappings/NessusPluginsNistMappingItem.js +4 -0
  221. package/lib/src/mappings/NessusPluginsNistMappingItem.js.map +1 -1
  222. package/lib/src/mappings/NiktoNistMapping.d.ts +1 -0
  223. package/lib/src/mappings/NiktoNistMapping.d.ts.map +1 -0
  224. package/lib/src/mappings/NiktoNistMapping.js.map +1 -1
  225. package/lib/src/mappings/NiktoNistMappingData.d.ts +1 -0
  226. package/lib/src/mappings/NiktoNistMappingData.d.ts.map +1 -0
  227. package/lib/src/mappings/NiktoNistMappingData.js.map +1 -1
  228. package/lib/src/mappings/NiktoNistMappingItem.d.ts +1 -0
  229. package/lib/src/mappings/NiktoNistMappingItem.d.ts.map +1 -0
  230. package/lib/src/mappings/NiktoNistMappingItem.js +4 -0
  231. package/lib/src/mappings/NiktoNistMappingItem.js.map +1 -1
  232. package/lib/src/mappings/NistCciMappingData.d.ts +1 -0
  233. package/lib/src/mappings/NistCciMappingData.d.ts.map +1 -0
  234. package/lib/src/mappings/NistCciMappingData.js.map +1 -1
  235. package/lib/src/mappings/OwaspNistMapping.d.ts +1 -0
  236. package/lib/src/mappings/OwaspNistMapping.d.ts.map +1 -0
  237. package/lib/src/mappings/OwaspNistMapping.js +19 -8
  238. package/lib/src/mappings/OwaspNistMapping.js.map +1 -1
  239. package/lib/src/mappings/OwaspNistMappingData.d.ts +1 -0
  240. package/lib/src/mappings/OwaspNistMappingData.d.ts.map +1 -0
  241. package/lib/src/mappings/OwaspNistMappingData.js.map +1 -1
  242. package/lib/src/mappings/OwaspNistMappingItem.d.ts +1 -0
  243. package/lib/src/mappings/OwaspNistMappingItem.d.ts.map +1 -0
  244. package/lib/src/mappings/OwaspNistMappingItem.js +5 -0
  245. package/lib/src/mappings/OwaspNistMappingItem.js.map +1 -1
  246. package/lib/src/mappings/ScoutsuiteNistMapping.d.ts +1 -0
  247. package/lib/src/mappings/ScoutsuiteNistMapping.d.ts.map +1 -0
  248. package/lib/src/mappings/ScoutsuiteNistMapping.js +1 -0
  249. package/lib/src/mappings/ScoutsuiteNistMapping.js.map +1 -1
  250. package/lib/src/mappings/ScoutsuiteNistMappingData.d.ts +1 -0
  251. package/lib/src/mappings/ScoutsuiteNistMappingData.d.ts.map +1 -0
  252. package/lib/src/mappings/ScoutsuiteNistMappingData.js.map +1 -1
  253. package/lib/src/mappings/ScoutsuiteNistMappingItem.d.ts +1 -0
  254. package/lib/src/mappings/ScoutsuiteNistMappingItem.d.ts.map +1 -0
  255. package/lib/src/mappings/ScoutsuiteNistMappingItem.js +2 -0
  256. package/lib/src/mappings/ScoutsuiteNistMappingItem.js.map +1 -1
  257. package/lib/src/msft-secure-score-mapper.d.ts +1 -0
  258. package/lib/src/msft-secure-score-mapper.d.ts.map +1 -0
  259. package/lib/src/msft-secure-score-mapper.js +202 -185
  260. package/lib/src/msft-secure-score-mapper.js.map +1 -1
  261. package/lib/src/nessus-mapper.d.ts +2 -1
  262. package/lib/src/nessus-mapper.d.ts.map +1 -0
  263. package/lib/src/nessus-mapper.js +122 -105
  264. package/lib/src/nessus-mapper.js.map +1 -1
  265. package/lib/src/netsparker-mapper.d.ts +7 -0
  266. package/lib/src/netsparker-mapper.d.ts.map +1 -0
  267. package/lib/src/netsparker-mapper.js +34 -9
  268. package/lib/src/netsparker-mapper.js.map +1 -1
  269. package/lib/src/neuvector-mapper.d.ts +1 -0
  270. package/lib/src/neuvector-mapper.d.ts.map +1 -0
  271. package/lib/src/neuvector-mapper.js +123 -124
  272. package/lib/src/neuvector-mapper.js.map +1 -1
  273. package/lib/src/nikto-mapper.d.ts +1 -0
  274. package/lib/src/nikto-mapper.d.ts.map +1 -0
  275. package/lib/src/nikto-mapper.js +85 -74
  276. package/lib/src/nikto-mapper.js.map +1 -1
  277. package/lib/src/prisma-mapper.d.ts +1 -0
  278. package/lib/src/prisma-mapper.d.ts.map +1 -0
  279. package/lib/src/prisma-mapper.js +138 -128
  280. package/lib/src/prisma-mapper.js.map +1 -1
  281. package/lib/src/sarif-mapper.d.ts +1 -0
  282. package/lib/src/sarif-mapper.d.ts.map +1 -0
  283. package/lib/src/sarif-mapper.js +116 -105
  284. package/lib/src/sarif-mapper.js.map +1 -1
  285. package/lib/src/scoutsuite-mapper.d.ts +1 -0
  286. package/lib/src/scoutsuite-mapper.d.ts.map +1 -0
  287. package/lib/src/scoutsuite-mapper.js +174 -163
  288. package/lib/src/scoutsuite-mapper.js.map +1 -1
  289. package/lib/src/snyk-mapper.d.ts +1 -0
  290. package/lib/src/snyk-mapper.d.ts.map +1 -0
  291. package/lib/src/snyk-mapper.js +112 -100
  292. package/lib/src/snyk-mapper.js.map +1 -1
  293. package/lib/src/sonarqube-mapper.d.ts +18 -5
  294. package/lib/src/sonarqube-mapper.d.ts.map +1 -0
  295. package/lib/src/sonarqube-mapper.js +526 -278
  296. package/lib/src/sonarqube-mapper.js.map +1 -1
  297. package/lib/src/splunk-mapper.d.ts +3 -2
  298. package/lib/src/splunk-mapper.d.ts.map +1 -0
  299. package/lib/src/splunk-mapper.js +72 -16
  300. package/lib/src/splunk-mapper.js.map +1 -1
  301. package/lib/src/trufflehog-mapper.d.ts +1 -0
  302. package/lib/src/trufflehog-mapper.d.ts.map +1 -0
  303. package/lib/src/trufflehog-mapper.js +72 -69
  304. package/lib/src/trufflehog-mapper.js.map +1 -1
  305. package/lib/src/twistlock-mapper.d.ts +1 -0
  306. package/lib/src/twistlock-mapper.d.ts.map +1 -0
  307. package/lib/src/twistlock-mapper.js +140 -126
  308. package/lib/src/twistlock-mapper.js.map +1 -1
  309. package/lib/src/utils/CCI_List.d.ts +1 -0
  310. package/lib/src/utils/CCI_List.d.ts.map +1 -0
  311. package/lib/src/utils/CCI_List.js.map +1 -1
  312. package/lib/src/utils/attestations.d.ts +1 -0
  313. package/lib/src/utils/attestations.d.ts.map +1 -0
  314. package/lib/src/utils/attestations.js +28 -13
  315. package/lib/src/utils/attestations.js.map +1 -1
  316. package/lib/src/utils/compliance.d.ts +1 -0
  317. package/lib/src/utils/compliance.d.ts.map +1 -0
  318. package/lib/src/utils/compliance.js +11 -3
  319. package/lib/src/utils/compliance.js.map +1 -1
  320. package/lib/src/utils/fingerprinting.d.ts +2 -0
  321. package/lib/src/utils/fingerprinting.d.ts.map +1 -0
  322. package/lib/src/utils/fingerprinting.js +28 -11
  323. package/lib/src/utils/fingerprinting.js.map +1 -1
  324. package/lib/src/utils/global.d.ts +3 -1
  325. package/lib/src/utils/global.d.ts.map +1 -0
  326. package/lib/src/utils/global.js +35 -17
  327. package/lib/src/utils/global.js.map +1 -1
  328. package/lib/src/utils/parseJson.d.ts +1 -0
  329. package/lib/src/utils/parseJson.d.ts.map +1 -0
  330. package/lib/src/utils/parseJson.js +7 -3
  331. package/lib/src/utils/parseJson.js.map +1 -1
  332. package/lib/src/utils/result.d.ts +1 -0
  333. package/lib/src/utils/result.d.ts.map +1 -0
  334. package/lib/src/utils/result.js.map +1 -1
  335. package/lib/src/utils/splunk-tools.d.ts +2 -1
  336. package/lib/src/utils/splunk-tools.d.ts.map +1 -0
  337. package/lib/src/utils/splunk-tools.js +52 -32
  338. package/lib/src/utils/splunk-tools.js.map +1 -1
  339. package/lib/src/veracode-mapper.d.ts +1 -0
  340. package/lib/src/veracode-mapper.d.ts.map +1 -0
  341. package/lib/src/veracode-mapper.js +50 -7
  342. package/lib/src/veracode-mapper.js.map +1 -1
  343. package/lib/src/xccdf-results-mapper.d.ts +7 -0
  344. package/lib/src/xccdf-results-mapper.d.ts.map +1 -0
  345. package/lib/src/xccdf-results-mapper.js +336 -301
  346. package/lib/src/xccdf-results-mapper.js.map +1 -1
  347. package/lib/src/zap-mapper.d.ts +8 -0
  348. package/lib/src/zap-mapper.d.ts.map +1 -0
  349. package/lib/src/zap-mapper.js +119 -90
  350. package/lib/src/zap-mapper.js.map +1 -1
  351. package/lib/tsconfig.build.tsbuildinfo +1 -0
  352. package/lib/types/neuvector-types.d.ts +1 -0
  353. package/lib/types/neuvector-types.d.ts.map +1 -0
  354. package/lib/types/neuvector-types.js +80 -0
  355. package/lib/types/neuvector-types.js.map +1 -1
  356. package/lib/types/splunk-config-types.d.ts +1 -0
  357. package/lib/types/splunk-config-types.d.ts.map +1 -0
  358. package/lib/types/splunk-config-types.js.map +1 -1
  359. package/lib/types/splunk-control-types.d.ts +1 -0
  360. package/lib/types/splunk-control-types.d.ts.map +1 -0
  361. package/lib/types/splunk-control-types.js.map +1 -1
  362. package/lib/types/splunk-profile-types.d.ts +1 -0
  363. package/lib/types/splunk-profile-types.d.ts.map +1 -0
  364. package/lib/types/splunk-profile-types.js.map +1 -1
  365. package/lib/types/splunk-report-types.d.ts +1 -0
  366. package/lib/types/splunk-report-types.d.ts.map +1 -0
  367. package/lib/types/splunk-report-types.js.map +1 -1
  368. package/package.json +29 -46
  369. package/lib/data/converters/csv2json.ts +0 -36
  370. package/lib/data/converters/xml2json.ts +0 -57
@@ -1,4 +1,6 @@
1
1
  "use strict";
2
+ // ASFF (AWS Security Finding Format) is intended as being another data exchange format to be used in displaying data within AWS SecurityHub - in this regard, it is analogous to HDF and Heimdall.
3
+ // Like in every scenario where there is an open specification, people interpret the intent of each of the attributes in slightly different ways. Consequently, while many products provide 'ASFF' output, providing a mapper back to HDF can be complicated.
2
4
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
5
  if (k2 === undefined) k2 = k;
4
6
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -15,15 +17,26 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
17
  }) : function(o, v) {
16
18
  o["default"] = v;
17
19
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
25
37
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ASFFResults = exports.ASFFMapper = exports.consolidate = exports.SpecialCasing = void 0;
38
+ exports.ASFFResults = exports.ASFFMapper = exports.SpecialCasing = void 0;
39
+ exports.consolidate = consolidate;
27
40
  const compare_versions_1 = require("compare-versions");
28
41
  const html_entities_1 = require("html-entities");
29
42
  const inspecjs_1 = require("inspecjs");
@@ -48,6 +61,7 @@ const IMPACT_MAPPING = new Map([
48
61
  ]);
49
62
  const SEVERITY_LABEL = 'Severity.Label';
50
63
  const COMPLIANCE_STATUS = 'Compliance.Status';
64
+ // Sometimes certain ASFF file types require massaging in order to generate good HDF files. These are the supported special cases and a catchall 'Default'. 'Default' files and non-special cased methods for otherwise special cased files do the pre-defined default behaviors when generating the HDF file.
51
65
  var SpecialCasing;
52
66
  (function (SpecialCasing) {
53
67
  SpecialCasing["CMSInSpec"] = "CMS Chef InSpec";
@@ -59,7 +73,8 @@ var SpecialCasing;
59
73
  SpecialCasing["Trivy"] = "Aqua Trivy";
60
74
  SpecialCasing["PreviouslyHDF"] = "MITRE SAF HDF2ASFF";
61
75
  SpecialCasing["Default"] = "Default";
62
- })(SpecialCasing = exports.SpecialCasing || (exports.SpecialCasing = {}));
76
+ })(SpecialCasing || (exports.SpecialCasing = SpecialCasing = {}));
77
+ // typically you can just look at the ProductArn field to get information on the product type but we also support some custom formats/products that require alternative means of identification
63
78
  function whichSpecialCase(finding) {
64
79
  const productArn = _.get(finding, 'ProductArn');
65
80
  if (_.get(finding, 'ProductName') === 'Default' &&
@@ -73,12 +88,12 @@ function whichSpecialCase(finding) {
73
88
  return SpecialCasing.GuardDuty;
74
89
  }
75
90
  else if (_.some(_.get(finding, 'FindingProviderFields.Types'), (type) => {
76
- var _a, _b;
91
+ // 'type' should look like "MITRE/SAF/2.6.29-hdf2asff"
77
92
  if (!_.startsWith(type, 'MITRE/SAF/')) {
78
93
  return false;
79
94
  }
80
- const version = (_b = (_a = type.split('/').pop()) === null || _a === void 0 ? void 0 : _a.split('-')[0]) !== null && _b !== void 0 ? _b : '';
81
- return (0, compare_versions_1.validate)(version) && (0, compare_versions_1.compare)(version, '2.6.20', '>');
95
+ const version = type.split('/').pop()?.split('-')[0] ?? '';
96
+ return (0, compare_versions_1.validate)(version) && (0, compare_versions_1.compare)(version, '2.6.20', '>'); // older versions aren't supported by the 'PreviouslyHDF' specialcasing and instead use the default casing
82
97
  })) {
83
98
  return SpecialCasing.PreviouslyHDF;
84
99
  }
@@ -108,15 +123,15 @@ const SPECIAL_CASE_MAPPING = new Map([
108
123
  [SpecialCasing.SecurityHub, (0, case_security_hub_1.getSecurityHub)()],
109
124
  [SpecialCasing.Trivy, (0, case_trivy_1.getTrivy)()]
110
125
  ]);
126
+ // If a special casing has a function override, then do the override, otherwise return the default value. This is how the 'massaging' described above is implemented.
111
127
  function externalProductHandler(context, product, data, func, defaultVal) {
112
- var _a;
113
128
  if (product !== SpecialCasing.Default &&
114
129
  _.has(SPECIAL_CASE_MAPPING.get(product), func)) {
115
130
  let keywords = {};
116
131
  if (context.supportingDocs.has(product)) {
117
132
  keywords = { ...context.supportingDocs.get(product) };
118
133
  }
119
- return (_a = _.get(SPECIAL_CASE_MAPPING.get(product), func)) === null || _a === void 0 ? void 0 : _a.apply(context, [
134
+ return _.get(SPECIAL_CASE_MAPPING.get(product), func)?.apply(context, [
120
135
  data,
121
136
  keywords
122
137
  ]);
@@ -130,6 +145,7 @@ function externalProductHandler(context, product, data, func, defaultVal) {
130
145
  }
131
146
  }
132
147
  }
148
+ // helper function to take all the controls that have the same id and turn them into results/subtests within an overarching control
133
149
  function handleIdGroup(context, idGroup) {
134
150
  const [id, data] = idGroup;
135
151
  const group = data.map((d) => d[0]);
@@ -162,7 +178,8 @@ function handleIdGroup(context, idGroup) {
162
178
  .filter((element, index, arr) => element &&
163
179
  element.data !== '' &&
164
180
  index ===
165
- arr.findIndex((e) => e !== null && e !== undefined && e.data === element.data)),
181
+ arr.findIndex((e) => e !== null && e !== undefined && e.data === element.data) // https://stackoverflow.com/a/36744732/645647
182
+ ),
166
183
  refs: group
167
184
  .map((d) => d.refs)
168
185
  .flat()
@@ -186,7 +203,10 @@ function handleIdGroup(context, idGroup) {
186
203
  results: group.map((d) => d.results).flat()
187
204
  };
188
205
  }
206
+ // consolidate the array of controls which were generated 1:1 with findings in order to have subfindings/results
207
+ // the way it does this is to group by HDF id which by default is the ASFF GeneratorId field
189
208
  function consolidate(context, input, file) {
209
+ // Group Sub-findings by HDF ID
190
210
  const allFindings = _.get(file, 'Findings');
191
211
  if (input.length !== allFindings.length) {
192
212
  throw new Error('The number of generated controls should be the same as the number of findings while consolidating.');
@@ -197,7 +217,7 @@ function consolidate(context, input, file) {
197
217
  });
198
218
  return Object.entries(idGroups || {}).map((idGroup) => handleIdGroup(context, idGroup));
199
219
  }
200
- exports.consolidate = consolidate;
220
+ // the schema specifies that the file should be `{ "Findings": [... findings array ...] }` but sometimes only the array or even a single finding is provided so this function corrects for those cases
201
221
  function wrapWithFindingsObject(output) {
202
222
  if (!_.has(output, 'Findings')) {
203
223
  if (Array.isArray(output)) {
@@ -209,6 +229,7 @@ function wrapWithFindingsObject(output) {
209
229
  }
210
230
  return output;
211
231
  }
232
+ // some applications (like Prowler) give us new line seperated JSON objects (see JSON Lines or ndjson) but we need regular JSON
212
233
  function fixFileInput(asffJson) {
213
234
  let output = {};
214
235
  try {
@@ -224,276 +245,289 @@ function fixFileInput(asffJson) {
224
245
  return wrapWithFindingsObject(output);
225
246
  }
226
247
  class ASFFMapper extends base_converter_1.BaseConverter {
227
- statusReason(finding) {
228
- const statusReasons = _.get(finding, 'Compliance.StatusReasons');
229
- if (statusReasons !== undefined &&
230
- statusReasons !== null &&
231
- _.isArray(statusReasons)) {
232
- return statusReasons
233
- .map((reason) => Object.entries(reason || {}).map(([key, value]) => {
234
- return `${(0, html_entities_1.encode)(key)}: ${(0, html_entities_1.encode)(value)}`;
235
- }))
236
- .flat()
237
- .join('\n');
238
- }
239
- else {
240
- return undefined;
241
- }
242
- }
243
- setMappings() {
244
- this.mappings = externalProductHandler(this, whichSpecialCase(_.get(this.data, 'Findings[0]')), this, 'mapping', this.defaultMappings);
245
- }
246
- constructor(asff, supportingDocs, meta = undefined) {
247
- super(asff);
248
- this.defaultMappings = {
249
- platform: {
250
- name: 'Heimdall Tools',
251
- release: package_json_1.version,
252
- target_id: {
253
- transformer: (record) => {
254
- const productInfo = _.get(record, 'Findings[0].ProductArn')
255
- .split(':')
256
- .slice(-1)[0]
257
- .split('/');
258
- const defaultTargetId = `${productInfo[1]} - ${productInfo[2]}`;
259
- return externalProductHandler(this, whichSpecialCase(_.get(record, 'Findings[0]')), [_.get(record, 'Findings[0]'), record.Findings], 'productName', (0, html_entities_1.encode)(defaultTargetId));
260
- }
248
+ meta;
249
+ supportingDocs;
250
+ defaultMappings = {
251
+ platform: {
252
+ name: 'Heimdall Tools',
253
+ release: package_json_1.version,
254
+ target_id: {
255
+ transformer: (record) => {
256
+ const productInfo = _.get(record, 'Findings[0].ProductArn')
257
+ .split(':')
258
+ .slice(-1)[0]
259
+ .split('/');
260
+ const defaultTargetId = `${productInfo[1]} - ${productInfo[2]}`;
261
+ return externalProductHandler(this, whichSpecialCase(_.get(record, 'Findings[0]')), [_.get(record, 'Findings[0]'), record.Findings], 'productName', (0, html_entities_1.encode)(defaultTargetId));
261
262
  }
262
- },
263
- version: package_json_1.version,
264
- statistics: {
265
- duration: null
266
- },
267
- profiles: [
268
- {
269
- name: {
270
- transformer: () => {
271
- var _a;
272
- return ((_a = this.meta) === null || _a === void 0 ? void 0 : _a.name) || 'AWS Security Finding Format';
273
- }
274
- },
275
- version: '',
276
- title: {
277
- transformer: () => {
278
- return _.get(this.meta, 'title') || 'ASFF Findings';
279
- }
280
- },
281
- maintainer: null,
282
- summary: '',
283
- license: null,
284
- copyright: null,
285
- copyright_email: null,
286
- supports: [],
287
- attributes: [],
288
- depends: [],
289
- groups: [],
290
- status: 'loaded',
291
- controls: [
292
- {
293
- path: 'Findings',
294
- key: 'id',
295
- arrayTransformer: consolidate.bind(this, this),
296
- id: {
297
- transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingId', (0, html_entities_1.encode)(_.get(finding, 'GeneratorId')))
298
- },
299
- title: {
300
- transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingTitle', (0, html_entities_1.encode)(_.get(finding, 'Title')))
301
- },
302
- desc: {
303
- transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingDescription', (0, html_entities_1.encode)(_.get(finding, 'Description')))
304
- },
305
- impact: {
263
+ }
264
+ },
265
+ version: package_json_1.version,
266
+ statistics: {
267
+ duration: null
268
+ },
269
+ profiles: [
270
+ {
271
+ name: {
272
+ transformer: () => {
273
+ return this.meta?.name || 'AWS Security Finding Format';
274
+ }
275
+ },
276
+ version: '',
277
+ title: {
278
+ transformer: () => {
279
+ return _.get(this.meta, 'title') || 'ASFF Findings';
280
+ }
281
+ },
282
+ maintainer: null,
283
+ summary: '',
284
+ license: null,
285
+ copyright: null,
286
+ copyright_email: null,
287
+ supports: [],
288
+ attributes: [],
289
+ depends: [],
290
+ groups: [],
291
+ status: 'loaded',
292
+ controls: [
293
+ {
294
+ path: 'Findings',
295
+ key: 'id',
296
+ arrayTransformer: consolidate.bind(this, this),
297
+ id: {
298
+ transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingId', (0, html_entities_1.encode)(_.get(finding, 'GeneratorId')))
299
+ },
300
+ title: {
301
+ transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingTitle', (0, html_entities_1.encode)(_.get(finding, 'Title')))
302
+ },
303
+ desc: {
304
+ transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingDescription', (0, html_entities_1.encode)(_.get(finding, 'Description')))
305
+ },
306
+ impact: {
307
+ transformer: (finding) => {
308
+ // There can be findings listed that are intentionally ignored due to the underlying control being superseded by a control from a different standard
309
+ let impact;
310
+ if (_.get(finding, 'Workflow.Status') === 'SUPPRESSED') {
311
+ impact = 'INFORMATIONAL';
312
+ }
313
+ else {
314
+ // Severity is required, but can be either 'label' or 'normalized' internally with 'label' being preferred. other values can be in here too such as the original severity rating.
315
+ const defaultFunc = () => _.get(finding, SEVERITY_LABEL)
316
+ ? _.get(finding, SEVERITY_LABEL)
317
+ : _.get(finding, 'Severity.Normalized') /
318
+ 100.0;
319
+ impact = externalProductHandler(this, whichSpecialCase(finding), finding, 'findingImpact', defaultFunc);
320
+ }
321
+ return typeof impact === 'string'
322
+ ? IMPACT_MAPPING.get(impact) || 0
323
+ : impact;
324
+ }
325
+ },
326
+ tags: {
327
+ transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingTags', {}),
328
+ cci: {
306
329
  transformer: (finding) => {
307
- let impact;
308
- if (_.get(finding, 'Workflow.Status') === 'SUPPRESSED') {
309
- impact = 'INFORMATIONAL';
330
+ const tags = externalProductHandler(this, whichSpecialCase(finding), finding, 'findingNistTag', []);
331
+ if (tags.length === 0) {
332
+ return (0, global_1.getCCIsForNISTTags)(global_1.DEFAULT_STATIC_CODE_ANALYSIS_NIST_TAGS);
310
333
  }
311
334
  else {
312
- const defaultFunc = () => _.get(finding, SEVERITY_LABEL)
313
- ? _.get(finding, SEVERITY_LABEL)
314
- : _.get(finding, 'Severity.Normalized') /
315
- 100.0;
316
- impact = externalProductHandler(this, whichSpecialCase(finding), finding, 'findingImpact', defaultFunc);
335
+ return (0, global_1.getCCIsForNISTTags)(tags);
317
336
  }
318
- return typeof impact === 'string'
319
- ? IMPACT_MAPPING.get(impact) || 0
320
- : impact;
321
337
  }
322
338
  },
323
- tags: {
324
- transformer: (finding) => externalProductHandler(this, whichSpecialCase(finding), finding, 'findingTags', {}),
325
- cci: {
326
- transformer: (finding) => {
327
- const tags = externalProductHandler(this, whichSpecialCase(finding), finding, 'findingNistTag', []);
328
- if (tags.length === 0) {
329
- return (0, global_1.getCCIsForNISTTags)(global_1.DEFAULT_STATIC_CODE_ANALYSIS_NIST_TAGS);
330
- }
331
- else {
332
- return (0, global_1.getCCIsForNISTTags)(tags);
333
- }
339
+ nist: {
340
+ transformer: (finding) => {
341
+ const tags = externalProductHandler(this, whichSpecialCase(finding), finding, 'findingNistTag', []);
342
+ if (tags.length === 0) {
343
+ return global_1.DEFAULT_STATIC_CODE_ANALYSIS_NIST_TAGS;
334
344
  }
335
- },
336
- nist: {
337
- transformer: (finding) => {
338
- const tags = externalProductHandler(this, whichSpecialCase(finding), finding, 'findingNistTag', []);
339
- if (tags.length === 0) {
340
- return global_1.DEFAULT_STATIC_CODE_ANALYSIS_NIST_TAGS;
341
- }
342
- else {
343
- return tags;
344
- }
345
+ else {
346
+ return tags;
345
347
  }
346
348
  }
347
- },
348
- descriptions: [
349
- {
350
- data: {
351
- path: 'Remediation.Recommendation',
352
- transformer: (input) => {
353
- const data = [];
354
- if (_.has(input, 'Text')) {
355
- data.push(_.get(input, 'Text'));
356
- }
357
- if (_.has(input, 'Url')) {
358
- data.push(_.get(input, 'Url'));
359
- }
360
- return data.join('\n');
349
+ }
350
+ },
351
+ descriptions: [
352
+ {
353
+ data: {
354
+ path: 'Remediation.Recommendation',
355
+ transformer: (input) => {
356
+ const data = [];
357
+ if (_.has(input, 'Text')) {
358
+ data.push(_.get(input, 'Text'));
361
359
  }
362
- },
363
- label: 'fix'
364
- }
365
- ],
366
- refs: [
367
- {
368
- transformer: (finding) => {
369
- return {
370
- ...(_.has(finding, 'SourceUrl') && {
371
- url: _.get(finding, 'SourceUrl')
372
- })
373
- };
360
+ if (_.has(input, 'Url')) {
361
+ data.push(_.get(input, 'Url'));
362
+ }
363
+ return data.join('\n');
374
364
  }
365
+ },
366
+ label: 'fix'
367
+ }
368
+ ],
369
+ refs: [
370
+ {
371
+ transformer: (finding) => {
372
+ return {
373
+ ...(_.has(finding, 'SourceUrl') && {
374
+ url: _.get(finding, 'SourceUrl')
375
+ })
376
+ };
375
377
  }
376
- ],
377
- source_location: {},
378
- code: '',
379
- results: [
380
- {
381
- status: {
382
- transformer: (finding) => {
383
- const defaultFunc = () => {
384
- if (_.has(finding, COMPLIANCE_STATUS)) {
385
- switch (_.get(finding, COMPLIANCE_STATUS)) {
386
- case 'PASSED':
387
- return inspecjs_1.ExecJSON.ControlResultStatus.Passed;
388
- case 'WARNING':
389
- return inspecjs_1.ExecJSON.ControlResultStatus.Skipped;
390
- case 'FAILED':
391
- return inspecjs_1.ExecJSON.ControlResultStatus.Failed;
392
- case 'NOT_AVAILABLE':
393
- return inspecjs_1.ExecJSON.ControlResultStatus.Skipped;
394
- default:
395
- return inspecjs_1.ExecJSON.ControlResultStatus.Error;
396
- }
397
- }
398
- else {
399
- return inspecjs_1.ExecJSON.ControlResultStatus.Failed;
400
- }
401
- };
402
- return externalProductHandler(this, whichSpecialCase(finding), finding, 'subfindingsStatus', defaultFunc);
403
- }
404
- },
405
- code_desc: {
406
- transformer: (finding) => {
407
- let output = externalProductHandler(this, whichSpecialCase(finding), finding, 'subfindingsCodeDesc', '');
408
- if (output) {
409
- output += '; ';
410
- }
411
- const resources = _.get(finding, 'Resources')
412
- .map((resource) => {
413
- let hash = `Type: ${(0, html_entities_1.encode)(_.get(resource, 'Type'))}, Id: ${(0, html_entities_1.encode)(_.get(resource, 'Id'))}`;
414
- if (_.has(resource, 'Partition')) {
415
- hash += `, Partition: ${(0, html_entities_1.encode)(_.get(resource, 'Partition'))}`;
416
- }
417
- if (_.has(resource, 'Region')) {
418
- hash += `, Region: ${(0, html_entities_1.encode)(_.get(resource, 'Region'))}`;
419
- }
420
- return hash;
421
- })
422
- .join(', ');
423
- output += `Resources: [${resources}]`;
424
- return output;
425
- }
426
- },
378
+ }
379
+ ],
380
+ source_location: {},
381
+ code: '',
382
+ results: [
383
+ {
384
+ status: {
427
385
  transformer: (finding) => {
428
- const message = (() => {
429
- const defaultFunc = () => {
430
- const statusReason = this.statusReason(finding);
386
+ const defaultFunc = () => {
387
+ if (_.has(finding, COMPLIANCE_STATUS)) {
431
388
  switch (_.get(finding, COMPLIANCE_STATUS)) {
432
- case undefined:
433
- return undefined;
434
389
  case 'PASSED':
435
- return statusReason;
390
+ return inspecjs_1.ExecJSON.ControlResultStatus.Passed;
436
391
  case 'WARNING':
437
- return undefined;
392
+ return inspecjs_1.ExecJSON.ControlResultStatus.Skipped;
438
393
  case 'FAILED':
439
- return statusReason;
394
+ return inspecjs_1.ExecJSON.ControlResultStatus.Failed;
440
395
  case 'NOT_AVAILABLE':
441
- return undefined;
396
+ // primary meaning is that the check could not be performed due to a service outage or API error, but it's also overloaded to mean NOT_APPLICABLE so technically 'skipped' or 'error' could be applicable, but AWS seems to do the equivalent of skipped
397
+ return inspecjs_1.ExecJSON.ControlResultStatus.Skipped;
442
398
  default:
443
- return statusReason;
399
+ // not a valid value for the status enum
400
+ return inspecjs_1.ExecJSON.ControlResultStatus.Error;
444
401
  }
445
- };
446
- return externalProductHandler(this, whichSpecialCase(finding), finding, 'subfindingsMessage', defaultFunc);
447
- })();
448
- const skipMessage = (() => {
402
+ }
403
+ else {
404
+ // if no compliance status is provided which is a weird but possible case, then fail
405
+ return inspecjs_1.ExecJSON.ControlResultStatus.Failed;
406
+ }
407
+ };
408
+ return externalProductHandler(this, whichSpecialCase(finding), finding, 'subfindingsStatus', defaultFunc);
409
+ }
410
+ },
411
+ code_desc: {
412
+ transformer: (finding) => {
413
+ let output = externalProductHandler(this, whichSpecialCase(finding), finding, 'subfindingsCodeDesc', '');
414
+ if (output) {
415
+ output += '; ';
416
+ }
417
+ const resources = _.get(finding, 'Resources')
418
+ .map((resource) => {
419
+ let hash = `Type: ${(0, html_entities_1.encode)(_.get(resource, 'Type'))}, Id: ${(0, html_entities_1.encode)(_.get(resource, 'Id'))}`;
420
+ if (_.has(resource, 'Partition')) {
421
+ hash += `, Partition: ${(0, html_entities_1.encode)(_.get(resource, 'Partition'))}`;
422
+ }
423
+ if (_.has(resource, 'Region')) {
424
+ hash += `, Region: ${(0, html_entities_1.encode)(_.get(resource, 'Region'))}`;
425
+ }
426
+ return hash;
427
+ })
428
+ .join(', ');
429
+ output += `Resources: [${resources}]`;
430
+ return output;
431
+ }
432
+ },
433
+ transformer: (finding) => {
434
+ const message = (() => {
435
+ const defaultFunc = () => {
449
436
  const statusReason = this.statusReason(finding);
450
437
  switch (_.get(finding, COMPLIANCE_STATUS)) {
451
- case undefined:
452
- return statusReason;
453
- case 'PASSED':
438
+ case undefined: // Possible for Compliance.Status to not be there, in which case it's a skip_message
454
439
  return undefined;
455
- case 'WARNING':
440
+ case 'PASSED':
456
441
  return statusReason;
457
- case 'FAILED':
442
+ case 'WARNING':
458
443
  return undefined;
459
- case 'NOT_AVAILABLE':
444
+ case 'FAILED':
460
445
  return statusReason;
461
- default:
446
+ case 'NOT_AVAILABLE':
462
447
  return undefined;
448
+ default:
449
+ return statusReason;
463
450
  }
464
- })();
465
- return {
466
- ...(message !== undefined && { message }),
467
- ...(skipMessage !== undefined && {
468
- skip_message: skipMessage
469
- })
470
451
  };
471
- },
472
- start_time: {
473
- transformer: (finding) => _.get(finding, 'LastObservedAt') ||
474
- _.get(finding, 'UpdatedAt')
475
- }
452
+ return externalProductHandler(this, whichSpecialCase(finding), finding, 'subfindingsMessage', defaultFunc);
453
+ })();
454
+ const skipMessage = (() => {
455
+ const statusReason = this.statusReason(finding);
456
+ switch (_.get(finding, COMPLIANCE_STATUS)) {
457
+ case undefined: // Possible for Compliance.Status to not be there, in which case it's a skip_message
458
+ return statusReason;
459
+ case 'PASSED':
460
+ return undefined;
461
+ case 'WARNING':
462
+ return statusReason;
463
+ case 'FAILED':
464
+ return undefined;
465
+ case 'NOT_AVAILABLE':
466
+ // primary meaning is that the check could not be performed due to a service outage or API error, but it's also overloaded to mean NOT_APPLICABLE so technically 'skipped' or 'error' could be applicable, but AWS seems to do the equivalent of skipped
467
+ return statusReason;
468
+ default:
469
+ return undefined;
470
+ }
471
+ })();
472
+ return {
473
+ ...(message !== undefined && { message }),
474
+ ...(skipMessage !== undefined && {
475
+ skip_message: skipMessage
476
+ })
477
+ };
478
+ },
479
+ start_time: {
480
+ transformer: (finding) => _.get(finding, 'LastObservedAt') ||
481
+ _.get(finding, 'UpdatedAt')
476
482
  }
477
- ]
478
- }
479
- ],
480
- sha256: ''
481
- }
482
- ]
483
- };
483
+ }
484
+ ]
485
+ }
486
+ ],
487
+ sha256: ''
488
+ }
489
+ ]
490
+ };
491
+ statusReason(finding) {
492
+ const statusReasons = _.get(finding, 'Compliance.StatusReasons');
493
+ if (statusReasons !== undefined &&
494
+ statusReasons !== null &&
495
+ _.isArray(statusReasons)) {
496
+ return statusReasons
497
+ .map((reason) => Object.entries(reason || {}).map(([key, value]) => {
498
+ return `${(0, html_entities_1.encode)(key)}: ${(0, html_entities_1.encode)(value)}`;
499
+ }))
500
+ .flat()
501
+ .join('\n');
502
+ }
503
+ else {
504
+ return undefined;
505
+ }
506
+ }
507
+ setMappings() {
508
+ this.mappings = externalProductHandler(this, whichSpecialCase(_.get(this.data, 'Findings[0]')), this, 'mapping', this.defaultMappings);
509
+ }
510
+ constructor(asff, supportingDocs, meta = undefined) {
511
+ super(asff);
484
512
  this.meta = meta;
485
513
  this.supportingDocs = supportingDocs;
486
514
  this.setMappings();
487
515
  }
488
516
  }
489
517
  exports.ASFFMapper = ASFFMapper;
518
+ // sometimes there is a need to change certain meta level information such as the profile name to make it clearer that the original ASFF file came from an external tool instead of SecHub
519
+ // some special cases can take in additional files aside from findings, ex. the guidelines which contain correct severity information
490
520
  class ASFFResults {
521
+ data;
522
+ meta;
523
+ supportingDocs;
491
524
  constructor(asffJson, securityhubStandardsJsonArray = undefined, meta = undefined) {
492
525
  this.meta = meta;
493
526
  this.supportingDocs = new Map();
494
527
  this.supportingDocs.set(SpecialCasing.SecurityHub, _.get(SPECIAL_CASE_MAPPING.get(SpecialCasing.SecurityHub), 'securityhubSupportingDocs', (standards) => {
495
528
  throw new Error(`supportingDocs function should've been defined: ${standards}`);
496
529
  })(securityhubStandardsJsonArray));
530
+ // split input findings via product, each of which will get their own resultant HDF file
497
531
  const findings = _.get(fixFileInput(asffJson), 'Findings');
498
532
  this.data = _.groupBy(findings, (finding) => {
499
533
  const productInfo = _.get(finding, 'ProductArn')