...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package sysfs
18
19 import (
20 "os"
21 "path/filepath"
22 "strings"
23 )
24
25 const (
26 notAffected = "not affected"
27 vulnerable = "vulnerable"
28 mitigation = "mitigation"
29 unknown = "unknown"
30 )
31
32 const (
33 VulnerabilityStateNotAffected = iota
34 VulnerabilityStateVulnerable
35 VulnerabilityStateMitigation
36 VulnerabilityStateUnknown
37 )
38
39 var (
40
41
42 VulnerabilityHumanEncoding = map[int]string{
43 VulnerabilityStateNotAffected: notAffected,
44 VulnerabilityStateVulnerable: vulnerable,
45 VulnerabilityStateMitigation: mitigation,
46 VulnerabilityStateUnknown: unknown,
47 }
48 )
49
50
51 func (fs FS) CPUVulnerabilities() (map[string]*Vulnerability, error) {
52 matchingFilepaths, err := filepath.Glob(fs.sys.Path("devices/system/cpu/vulnerabilities/*"))
53 if err != nil {
54 return nil, err
55 }
56
57 vulnerabilities := make(map[string]*Vulnerability, len(matchingFilepaths))
58 for _, path := range matchingFilepaths {
59 filename := filepath.Base(path)
60
61 rawContent, err := os.ReadFile(path)
62 if err != nil {
63 return nil, err
64 }
65
66 v, err := parseVulnerability(filename, string(rawContent))
67 if err != nil {
68 return nil, err
69 }
70
71 vulnerabilities[filename] = v
72 }
73
74 return vulnerabilities, nil
75 }
76
77
78 type Vulnerability struct {
79 CodeName string
80 State int
81 Mitigation string
82 }
83
84 func parseVulnerability(name, rawContent string) (*Vulnerability, error) {
85 v := &Vulnerability{CodeName: name}
86 rawContent = strings.TrimSpace(rawContent)
87 rawContentLower := strings.ToLower(rawContent)
88 switch {
89 case strings.HasPrefix(rawContentLower, notAffected):
90 v.State = VulnerabilityStateNotAffected
91 case strings.HasPrefix(rawContentLower, vulnerable):
92 v.State = VulnerabilityStateVulnerable
93 m := strings.Fields(rawContent)
94 if len(m) > 1 {
95 v.Mitigation = strings.Join(m[1:], " ")
96 }
97 case strings.HasPrefix(rawContentLower, mitigation):
98 v.State = VulnerabilityStateMitigation
99 m := strings.Fields(rawContent)
100 if len(m) > 1 {
101 v.Mitigation = strings.Join(m[1:], " ")
102 }
103 case strings.HasPrefix(rawContentLower, unknown):
104 v.State = VulnerabilityStateUnknown
105 m := strings.Fields(rawContent)
106 if len(m) > 1 {
107 v.Mitigation = strings.Join(m[1:], " ")
108 }
109 default:
110
111
112 v.State = VulnerabilityStateUnknown
113 v.Mitigation = rawContent
114 }
115 return v, nil
116 }
117
View as plain text