|
15 | 15 | package analyze
|
16 | 16 |
|
17 | 17 | import (
|
| 18 | + "archive/zip" |
18 | 19 | "github.com/blang/semver/v4"
|
19 | 20 | "github.com/lunasec-io/lunasec/tools/log4shell/constants"
|
20 | 21 | "github.com/lunasec-io/lunasec/tools/log4shell/types"
|
@@ -96,7 +97,35 @@ func fileNameToSemver(fileNameNoExt string) string {
|
96 | 97 | return semverVersion
|
97 | 98 | }
|
98 | 99 |
|
99 |
| -func ProcessArchiveFile(reader io.Reader, filePath, fileName string) (finding *types.Finding) { |
| 100 | +func GetJndiLookupHash(zipReader *zip.Reader, filePath string) (fileHash string) { |
| 101 | + reader, err := zipReader.Open(constants.JndiLookupClasspath) |
| 102 | + if err != nil { |
| 103 | + log.Debug(). |
| 104 | + Str("fieName", constants.JndiLookupClasspath). |
| 105 | + Str("path", filePath). |
| 106 | + Err(err). |
| 107 | + Msg("cannot find file in zip") |
| 108 | + return |
| 109 | + } |
| 110 | + defer reader.Close() |
| 111 | + |
| 112 | + fileHash, err = util.HexEncodedSha256FromReader(reader) |
| 113 | + if err != nil { |
| 114 | + log.Debug(). |
| 115 | + Str("fieName", constants.JndiLookupClasspath). |
| 116 | + Str("path", filePath). |
| 117 | + Err(err). |
| 118 | + Msg("unable to hash JndiLookup.class file") |
| 119 | + return |
| 120 | + } |
| 121 | + return |
| 122 | +} |
| 123 | + |
| 124 | +func ProcessArchiveFile(zipReader *zip.Reader, reader io.Reader, filePath, fileName string) (finding *types.Finding) { |
| 125 | + var ( |
| 126 | + jndiLookupFileHash string |
| 127 | + ) |
| 128 | + |
100 | 129 | _, file := path.Split(filePath)
|
101 | 130 | fileNameNoExt := strings.TrimSuffix(file, path.Ext(file))
|
102 | 131 |
|
@@ -128,26 +157,35 @@ func ProcessArchiveFile(reader io.Reader, filePath, fileName string) (finding *t
|
128 | 157 | return
|
129 | 158 | }
|
130 | 159 |
|
131 |
| - log.Log(). |
132 |
| - Str("path", filePath). |
133 |
| - Str("fileName", fileName). |
134 |
| - Str("fileHash", fileHash). |
135 |
| - Msg("identified library version") |
136 |
| - |
137 | 160 | if versionCve == "" {
|
138 | 161 | log.Debug().
|
139 | 162 | Str("hash", fileHash).
|
140 | 163 | Str("version", semverVersion).
|
141 | 164 | Msg("Skipping version as it is not vulnerable to any known CVE")
|
142 |
| - return nil |
| 165 | + return |
143 | 166 | }
|
144 | 167 |
|
| 168 | + if versionIsInRange(fileNameNoExt, semverVersion, constants.JndiLookupPatchFileVersions) { |
| 169 | + jndiLookupFileHash = GetJndiLookupHash(zipReader, filePath) |
| 170 | + } |
| 171 | + |
| 172 | + log.Log(). |
| 173 | + Str("path", filePath). |
| 174 | + Str("fileName", fileName). |
| 175 | + Str("fileHash", fileHash). |
| 176 | + Str("jndiLookupFileName", constants.JndiLookupClasspath). |
| 177 | + Str("jndiLookupFileHash", jndiLookupFileHash). |
| 178 | + Msg("identified library version") |
| 179 | + |
145 | 180 | finding = &types.Finding{
|
146 | 181 | Path: filePath,
|
147 | 182 | FileName: fileName,
|
148 | 183 | Hash: fileHash,
|
| 184 | + JndiLookupFileName: constants.JndiLookupClasspath, |
| 185 | + JndiLookupHash: jndiLookupFileHash, |
149 | 186 | Version: semverVersion,
|
150 | 187 | CVE: versionCve,
|
| 188 | + Severity: constants.CveSeverityLookup[versionCve], |
151 | 189 | }
|
152 | 190 | return
|
153 | 191 | }
|
0 commit comments