mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-23 07:29:00 -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"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -33,7 +32,6 @@ func (a debianPkgAnalyzer) Analyze(fileMap extractor.FileMap) (pkgs []analyzer.P
|
|||||||
detected := false
|
detected := false
|
||||||
for _, filename := range a.RequiredFiles() {
|
for _, filename := range a.RequiredFiles() {
|
||||||
file, ok := fileMap[filename]
|
file, ok := fileMap[filename]
|
||||||
fmt.Println(filename)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -96,8 +94,6 @@ func (a debianPkgAnalyzer) parseDpkgPkg(scanner *bufio.Scanner) (binPkg *analyze
|
|||||||
if line == "" {
|
if line == "" {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
fmt.Println(line)
|
|
||||||
|
|
||||||
if strings.HasPrefix(line, "Package: ") {
|
if strings.HasPrefix(line, "Package: ") {
|
||||||
name = strings.TrimSpace(strings.TrimPrefix(line, "Package: "))
|
name = strings.TrimSpace(strings.TrimPrefix(line, "Package: "))
|
||||||
} else if strings.HasPrefix(line, "Source: ") {
|
} else if strings.HasPrefix(line, "Source: ") {
|
||||||
|
|||||||
@@ -8,7 +8,14 @@ import (
|
|||||||
|
|
||||||
"github.com/knqyf263/fanal/analyzer"
|
"github.com/knqyf263/fanal/analyzer"
|
||||||
_ "github.com/knqyf263/fanal/analyzer/os/alpine"
|
_ "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/apk"
|
||||||
|
_ "github.com/knqyf263/fanal/analyzer/pkg/dpkg"
|
||||||
|
_ "github.com/knqyf263/fanal/analyzer/pkg/rpm"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/crypto/ssh/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user