Skip to content

Commit 6403029

Browse files
committed
feat(vul): show number of fixable vulnerabilities
This commit is addint a column to the vulnerabilities count where we count the number of fixable vulnerabilities, example: ``` $ lacework vulnerability report sha256:1234e0a882a0f3faa26d8d5c42f9800b4797ef13d9418037b986a7a41c9df51d CONTAINER IMAGE DETAILS | VULNERABILITIES ------------------------------------------------------------------------------------------+--------------------------------- ID sha256:1234e0a882a0f3faa26d8d5c42f9800b4797ef13d9418037b986a7a41c9df51d | SEVERITY COUNT FIXABLE Digest sha256:1234836d144092bc9cc2b6d6ce98d9ebf1d81342cd6e0141a860c6339266e27f | -----------+-------+---------- Registry index.docker.io | Critical 12 12 Repository example/repo | High 21 15 Size 104.3 MB | Medium 59 44 Created At 2018-02-12T00:00:00+0000 | Low 61 28 Tags latest, v1.2.32 | Info 87 18 | ``` Signed-off-by: Salim Afiune Maya <[email protected]>
1 parent 494d8d8 commit 6403029

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

api/vulnerabilities.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,16 +164,40 @@ type VulContainerReport struct {
164164

165165
func (report *VulContainerReport) VulCountsTable() [][]string {
166166
return [][]string{
167-
[]string{"Critical", fmt.Sprint(report.CriticalVulnerabilities)},
168-
[]string{"Fixable", fmt.Sprint(report.FixableVulnerabilities)},
169-
[]string{"High", fmt.Sprint(report.HighVulnerabilities)},
170-
[]string{"Medium", fmt.Sprint(report.MediumVulnerabilities)},
171-
[]string{"Low", fmt.Sprint(report.LowVulnerabilities)},
172-
[]string{"Info", fmt.Sprint(report.InfoVulnerabilities)},
173-
[]string{"Total", fmt.Sprint(report.TotalVulnerabilities)},
167+
[]string{"Critical", fmt.Sprint(report.CriticalVulnerabilities),
168+
fmt.Sprint(report.VulFixableCount("critical"))},
169+
[]string{"High", fmt.Sprint(report.HighVulnerabilities),
170+
fmt.Sprint(report.VulFixableCount("high"))},
171+
[]string{"Medium", fmt.Sprint(report.MediumVulnerabilities),
172+
fmt.Sprint(report.VulFixableCount("medium"))},
173+
[]string{"Low", fmt.Sprint(report.LowVulnerabilities),
174+
fmt.Sprint(report.VulFixableCount("low"))},
175+
[]string{"Info", fmt.Sprint(report.InfoVulnerabilities),
176+
fmt.Sprint(report.VulFixableCount("info"))},
174177
}
175178
}
176179

180+
func (report *VulContainerReport) VulFixableCount(severity string) int32 {
181+
// @afiune check valid severity
182+
severity = strings.ToLower(severity)
183+
184+
if len(report.Image.ImageLayers) == 0 {
185+
return 0
186+
}
187+
188+
var fixable int32 = 0
189+
for _, layer := range report.Image.ImageLayers {
190+
for _, pkg := range layer.Packages {
191+
for _, vul := range pkg.Vulnerabilities {
192+
if vul.Severity == severity && vul.FixVersion != "" {
193+
fixable++
194+
}
195+
}
196+
}
197+
}
198+
return fixable
199+
}
200+
177201
type vulContainerImage struct {
178202
ImageInfo vulContainerImageInfo `json:"image_info"`
179203
ImageLayers []vulContainerImageLayer `json:"image_layers"`

cli/cmd/vulnerability.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,10 @@ func buildVulnerabilityReport(report *api.VulContainerReport) string {
317317

318318
t = tablewriter.NewWriter(vulCountsTable)
319319
t.SetBorder(false)
320-
t.SetColumnSeparator("")
320+
t.SetColumnSeparator(" ")
321+
t.SetHeader([]string{
322+
"Severity", "Count", "Fixable",
323+
})
321324
t.AppendBulk(report.VulCountsTable())
322325
t.Render()
323326

@@ -326,7 +329,7 @@ func buildVulnerabilityReport(report *api.VulContainerReport) string {
326329
t.SetAutoWrapText(false)
327330
t.SetHeader([]string{
328331
"Container Image Details",
329-
"Vulnerabilities Counts",
332+
"Vulnerabilities",
330333
})
331334
t.Append([]string{
332335
imageDetailsTable.String(),

0 commit comments

Comments
 (0)