mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-22 23:26:39 -08:00
check OS
This commit is contained in:
51
analyzer/os/amazonlinux/amazonlinux.go
Normal file
51
analyzer/os/amazonlinux/amazonlinux.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package amazonlinux
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer/os"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
)
|
||||
|
||||
func init() {
|
||||
analyzer.RegisterOSAnalyzer(&amazonlinuxOSAnalyzer{})
|
||||
}
|
||||
|
||||
type amazonlinuxOSAnalyzer struct{}
|
||||
|
||||
func (a amazonlinuxOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
|
||||
for _, filename := range a.RequiredFiles() {
|
||||
file, ok := fileMap[filename]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
fields := strings.Fields(line)
|
||||
// Amazon Linuxという名称が確認できたときのみ
|
||||
if strings.HasPrefix(line, "Amazon Linux release 2") {
|
||||
return analyzer.OS{
|
||||
Family: os.Amazon,
|
||||
Name: fmt.Sprintf("%s %s", fields[3], fields[4]),
|
||||
}, nil
|
||||
} else if strings.HasPrefix(line, "Amazon Linux") {
|
||||
return analyzer.OS{
|
||||
Family: os.Amazon,
|
||||
Name: strings.Join(fields[2:], " "),
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return analyzer.OS{}, errors.New("amzn: Not match")
|
||||
}
|
||||
|
||||
func (a amazonlinuxOSAnalyzer) RequiredFiles() []string {
|
||||
return []string{"etc/system-release"}
|
||||
}
|
||||
43
analyzer/os/const.go
Normal file
43
analyzer/os/const.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package os
|
||||
|
||||
const (
|
||||
// RedHat is done
|
||||
RedHat = "redhat"
|
||||
|
||||
// Debian is done
|
||||
Debian = "debian"
|
||||
|
||||
// Ubuntu is done
|
||||
Ubuntu = "ubuntu"
|
||||
|
||||
// CentOS is done
|
||||
CentOS = "centos"
|
||||
|
||||
// Fedora is done
|
||||
Fedora = "fedora"
|
||||
|
||||
// Amazon is done
|
||||
Amazon = "amazon"
|
||||
|
||||
// Oracle is done
|
||||
Oracle = "oracle"
|
||||
|
||||
// FreeBSD currently doesn't support docker
|
||||
// FreeBSD = "freebsd"
|
||||
|
||||
// Windows only run windows os
|
||||
// TODO : support windows
|
||||
Windows = "windows"
|
||||
|
||||
// OpenSUSE is done
|
||||
OpenSUSE = "opensuse"
|
||||
|
||||
// OpenSUSELeap is
|
||||
OpenSUSELeap = "opensuse.leap"
|
||||
|
||||
// OpenSUSETumbleweed is done
|
||||
OpenSUSETumbleweed = "opensuse.tumbleweed"
|
||||
|
||||
// Alpine is done
|
||||
Alpine = "alpine"
|
||||
)
|
||||
44
analyzer/os/debian/debian.go
Normal file
44
analyzer/os/debian/debian.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package debian
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer/os"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
)
|
||||
|
||||
func init() {
|
||||
analyzer.RegisterOSAnalyzer(&debianOSAnalyzer{})
|
||||
}
|
||||
|
||||
type debianOSAnalyzer struct{}
|
||||
|
||||
func (a debianOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
|
||||
for _, filename := range a.RequiredFiles() {
|
||||
file, ok := fileMap[filename]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
// Ubuntu also exist debian_version, but format is not number
|
||||
re := regexp.MustCompile(`(\d+).(\d+)`)
|
||||
if re.MatchString(strings.TrimSpace(line)) {
|
||||
return analyzer.OS{Family: os.Debian, Name: line}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return analyzer.OS{}, errors.New("debian: Not match")
|
||||
}
|
||||
|
||||
func (a debianOSAnalyzer) RequiredFiles() []string {
|
||||
return []string{"etc/debian_version"}
|
||||
}
|
||||
57
analyzer/os/opensuse/opensuse.go
Normal file
57
analyzer/os/opensuse/opensuse.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package opensuse
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer/os"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
)
|
||||
|
||||
func init() {
|
||||
analyzer.RegisterOSAnalyzer(&opensuseOSAnalyzer{})
|
||||
}
|
||||
|
||||
type opensuseOSAnalyzer struct{}
|
||||
|
||||
// TODO : opensuse/tumbleweed, opensuse/leap のimageのときうまくいかないので調査
|
||||
// そもそも os-release のファイル自体が認識されていない
|
||||
func (a opensuseOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
|
||||
for _, filename := range a.RequiredFiles() {
|
||||
file, ok := fileMap[filename]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
suseName := ""
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if strings.HasPrefix(line, "NAME=\"openSUSE") {
|
||||
if strings.Contains(line, "Leap") {
|
||||
suseName = os.OpenSUSELeap
|
||||
} else if strings.Contains(line, "Tumbleweed") {
|
||||
suseName = os.OpenSUSETumbleweed
|
||||
} else {
|
||||
suseName = os.OpenSUSE
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if suseName != "" && strings.HasPrefix(line, "VERSION_ID=") {
|
||||
return analyzer.OS{
|
||||
Family: suseName,
|
||||
Name: strings.TrimSpace(line[12 : len(line)-1]),
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return analyzer.OS{}, errors.New("opensuse: Not match")
|
||||
}
|
||||
|
||||
func (a opensuseOSAnalyzer) RequiredFiles() []string {
|
||||
return []string{"etc/os-release"}
|
||||
}
|
||||
101
analyzer/os/redhatbase/redhatbase.go
Normal file
101
analyzer/os/redhatbase/redhatbase.go
Normal file
@@ -0,0 +1,101 @@
|
||||
package redhatbase
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer/os"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
)
|
||||
|
||||
func init() {
|
||||
analyzer.RegisterOSAnalyzer(&redhatOSAnalyzer{})
|
||||
}
|
||||
|
||||
type redhatOSAnalyzer struct{}
|
||||
|
||||
var redhatRe = regexp.MustCompile(`(.*) release (\d[\d\.]*)`)
|
||||
|
||||
func (a redhatOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
|
||||
if file, ok := fileMap["etc/centos-release"]; ok {
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
|
||||
if len(result) != 3 {
|
||||
return analyzer.OS{}, errors.New("cent: Invalid centos-release")
|
||||
}
|
||||
|
||||
switch strings.ToLower(result[1]) {
|
||||
case "centos", "centos linux":
|
||||
return analyzer.OS{Family: os.CentOS, Name: result[2]}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if file, ok := fileMap["etc/oracle-release"]; ok {
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
|
||||
if len(result) != 3 {
|
||||
return analyzer.OS{}, errors.New("oracle: Invalid oracle-release")
|
||||
}
|
||||
return analyzer.OS{Family: os.Oracle, Name: result[2]}, nil
|
||||
}
|
||||
}
|
||||
|
||||
if file, ok := fileMap["etc/fedora-release"]; ok {
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
|
||||
if len(result) != 3 {
|
||||
return analyzer.OS{}, errors.New("cent: Invalid fedora-release")
|
||||
}
|
||||
|
||||
switch strings.ToLower(result[1]) {
|
||||
case "fedora", "fedora linux":
|
||||
return analyzer.OS{Family: os.Fedora, Name: result[2]}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if file, ok := fileMap["etc/redhat-release"]; ok {
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
|
||||
if len(result) != 3 {
|
||||
return analyzer.OS{}, errors.New("redhat: Invalid redhat-release")
|
||||
}
|
||||
|
||||
switch strings.ToLower(result[1]) {
|
||||
case "centos", "centos linux":
|
||||
return analyzer.OS{Family: os.CentOS, Name: result[2]}, nil
|
||||
case "oracle", "oracle linux", "oracle linux server":
|
||||
return analyzer.OS{Family: os.Oracle, Name: result[2]}, nil
|
||||
case "fedora", "fedora linux":
|
||||
return analyzer.OS{Family: os.Fedora, Name: result[2]}, nil
|
||||
default:
|
||||
return analyzer.OS{Family: os.RedHat, Name: result[2]}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return analyzer.OS{}, errors.New("redhatbase : Not match")
|
||||
}
|
||||
|
||||
func (a redhatOSAnalyzer) RequiredFiles() []string {
|
||||
return []string{
|
||||
"etc/redhat-release",
|
||||
"etc/oracle-release",
|
||||
"etc/fedora-release",
|
||||
"etc/centos-release",
|
||||
}
|
||||
}
|
||||
49
analyzer/os/ubuntu/ubuntu.go
Normal file
49
analyzer/os/ubuntu/ubuntu.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package ubuntu
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer/os"
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
"github.com/knqyf263/fanal/extractor"
|
||||
)
|
||||
|
||||
func init() {
|
||||
analyzer.RegisterOSAnalyzer(&ubuntuOSAnalyzer{})
|
||||
}
|
||||
|
||||
type ubuntuOSAnalyzer struct{}
|
||||
|
||||
func (a ubuntuOSAnalyzer) Analyze(fileMap extractor.FileMap) (analyzer.OS, error) {
|
||||
for _, filename := range a.RequiredFiles() {
|
||||
file, ok := fileMap[filename]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
isUbuntu := false
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(file))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if line == "DISTRIB_ID=Ubuntu" {
|
||||
isUbuntu = true
|
||||
continue
|
||||
}
|
||||
|
||||
if isUbuntu && strings.HasPrefix(line, "DISTRIB_RELEASE=") {
|
||||
return analyzer.OS{
|
||||
Family: os.Ubuntu,
|
||||
Name: strings.TrimSpace(line[16:]),
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
return analyzer.OS{}, errors.New("ubuntu: Not match")
|
||||
}
|
||||
|
||||
func (a ubuntuOSAnalyzer) RequiredFiles() []string {
|
||||
return []string{"etc/lsb-release"}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"regexp"
|
||||
"strings"
|
||||
@@ -33,7 +32,6 @@ func (a debianPkgAnalyzer) Analyze(fileMap extractor.FileMap) (pkgs []analyzer.P
|
||||
detected := false
|
||||
for _, filename := range a.RequiredFiles() {
|
||||
file, ok := fileMap[filename]
|
||||
fmt.Println(filename)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
@@ -96,8 +94,6 @@ func (a debianPkgAnalyzer) parseDpkgPkg(scanner *bufio.Scanner) (binPkg *analyze
|
||||
if line == "" {
|
||||
break
|
||||
}
|
||||
fmt.Println(line)
|
||||
|
||||
if strings.HasPrefix(line, "Package: ") {
|
||||
name = strings.TrimSpace(strings.TrimPrefix(line, "Package: "))
|
||||
} else if strings.HasPrefix(line, "Source: ") {
|
||||
|
||||
@@ -8,7 +8,14 @@ import (
|
||||
|
||||
"github.com/knqyf263/fanal/analyzer"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/alpine"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/amazonlinux"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/debian"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/opensuse"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/redhatbase"
|
||||
_ "github.com/knqyf263/fanal/analyzer/os/ubuntu"
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/apk"
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/dpkg"
|
||||
_ "github.com/knqyf263/fanal/analyzer/pkg/rpm"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user