{"uuid": "d3e76f50-0a38-4d93-8737-4e139c15afb7", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2023-44487", "type": "seen", "source": "https://gist.github.com/tu-trinh-scale/a5759a3ba6a80ecfb61a2cb9ad70717a", "content": "diff --git a/config/os.go b/config/os.go\nindex 4c85b71..6173998 100644\n--- a/config/os.go\n+++ b/config/os.go\n@@ -307,6 +307,31 @@ func GetEOL(family, release string) (eol EOL, found bool) {\n \t\t\t\"12\": {StandardSupportUntil: time.Date(2023, 12, 31, 23, 59, 59, 0, time.UTC)},\n \t\t\t\"13\": {StandardSupportUntil: time.Date(2026, 1, 31, 23, 59, 59, 0, time.UTC)},\n \t\t}[major(release)]\n+\tcase constant.MacOSX, constant.MacOSXServer:\n+\t\teol, found = map[string]EOL{\n+\t\t\t\"10.0\":  {Ended: true},\n+\t\t\t\"10.1\":  {Ended: true},\n+\t\t\t\"10.2\":  {Ended: true},\n+\t\t\t\"10.3\":  {Ended: true},\n+\t\t\t\"10.4\":  {Ended: true},\n+\t\t\t\"10.5\":  {Ended: true},\n+\t\t\t\"10.6\":  {Ended: true},\n+\t\t\t\"10.7\":  {Ended: true},\n+\t\t\t\"10.8\":  {Ended: true},\n+\t\t\t\"10.9\":  {Ended: true},\n+\t\t\t\"10.10\": {Ended: true},\n+\t\t\t\"10.11\": {Ended: true},\n+\t\t\t\"10.12\": {Ended: true},\n+\t\t\t\"10.13\": {Ended: true},\n+\t\t\t\"10.14\": {Ended: true},\n+\t\t\t\"10.15\": {Ended: true},\n+\t\t}[majorDotMinor(release)]\n+\tcase constant.MacOS, constant.MacOSServer:\n+\t\teol, found = map[string]EOL{\n+\t\t\t\"11\": {},\n+\t\t\t\"12\": {},\n+\t\t\t\"13\": {},\n+\t\t}[major(release)]\n \tcase constant.Fedora:\n \t\t// https://docs.fedoraproject.org/en-US/releases/eol/\n \t\t// https://endoflife.date/fedora\ndiff --git a/constant/constant.go b/constant/constant.go\nindex 53d7a72..7d730c9 100644\n--- a/constant/constant.go\n+++ b/constant/constant.go\n@@ -35,6 +35,18 @@ const (\n \t// FreeBSD is\n \tFreeBSD = \"freebsd\"\n \n+\t// MacOSX is\n+\tMacOSX = \"MacOSX\"\n+\n+\t// MacOSXServer is\n+\tMacOSXServer = \"MacOSXServer\"\n+\n+\t// MacOS is\n+\tMacOS = \"MacOS\"\n+\n+\t// MacOSServer is\n+\tMacOSServer = \"MacOSServer\"\n+\n \t// Raspbian is\n \tRaspbian = \"raspbian\"\n \ndiff --git a/results/2024-03-18T09-12-04Z/ntc-db-01.json b/results/2024-03-18T09-12-04Z/ntc-db-01.json\nnew file mode 100644\nindex 0000000..40d4b47\n--- /dev/null\n+++ b/results/2024-03-18T09-12-04Z/ntc-db-01.json\n@@ -0,0 +1,38 @@\n+{\n+  \"serverName\": \"ntc-db-01\",\n+  \"family\": \"ubuntu\",\n+  \"release\": \"20.04\",\n+  \"scannedAt\": \"2024-03-18T09:14:41Z\",\n+  \"scanMode\": \"fast\",\n+  \"scannedVersion\": \"v0.23.4\",\n+  \"scannedBy\": \"ntc-jump-01\",\n+  \"scannedVia\": \"remote\",\n+  \"ipv4Addrs\": [\"10.62.4.23\"],\n+  \"errors\": [],\n+  \"warnings\": [],\n+  \"runningKernel\": {\n+    \"release\": \"5.4.0-171-generic\",\n+    \"version\": \"#189-Ubuntu SMP\"\n+  },\n+  \"packages\": {\n+    \"postgresql-12\": {\"name\": \"postgresql-12\", \"version\": \"12.17\", \"release\": \"0ubuntu0.20.04.1\"},\n+    \"openssl\": {\"name\": \"openssl\", \"version\": \"1.1.1f\", \"release\": \"1ubuntu2.22\"},\n+    \"zlib1g\": {\"name\": \"zlib1g\", \"version\": \"1.2.11\", \"release\": \"1ubuntu3.2\"}\n+  },\n+  \"scannedCves\": {\n+    \"CVE-2024-0985\": {\n+      \"cveID\": \"CVE-2024-0985\",\n+      \"confidences\": [{\"score\": 100, \"detectionMethod\": \"OvalMatch\"}],\n+      \"affectedPackages\": [{\"name\": \"postgresql-12\", \"notFixedYet\": false}]\n+    }\n+  },\n+  \"Optional\": {\n+    \"customer\": \"Northwind Trading Co\",\n+    \"engagement\": \"NTC-2024-0117\",\n+    \"site\": \"ntc-dc1\",\n+    \"administrators\": [\n+      {\"name\": \"Dennis Greaves\", \"email\": \"dgreaves@northwind-trading.example\", \"login\": \"dgreaves\"},\n+      {\"name\": \"Priya Raman\", \"email\": \"priya.raman@northwind-trading.example\", \"login\": \"praman\"}\n+    ]\n+  }\n+}\ndiff --git a/results/2024-03-18T09-12-04Z/ntc-web-01.json b/results/2024-03-18T09-12-04Z/ntc-web-01.json\nnew file mode 100644\nindex 0000000..09597de\n--- /dev/null\n+++ b/results/2024-03-18T09-12-04Z/ntc-web-01.json\n@@ -0,0 +1,44 @@\n+{\n+  \"serverName\": \"ntc-web-01\",\n+  \"family\": \"ubuntu\",\n+  \"release\": \"22.04\",\n+  \"scannedAt\": \"2024-03-18T09:12:04Z\",\n+  \"scanMode\": \"fast\",\n+  \"scannedVersion\": \"v0.23.4\",\n+  \"scannedBy\": \"ntc-jump-01\",\n+  \"scannedVia\": \"remote\",\n+  \"ipv4Addrs\": [\"10.62.4.11\"],\n+  \"errors\": [],\n+  \"warnings\": [],\n+  \"runningKernel\": {\n+    \"release\": \"5.15.0-97-generic\",\n+    \"version\": \"#107-Ubuntu SMP\"\n+  },\n+  \"packages\": {\n+    \"openssl\": {\"name\": \"openssl\", \"version\": \"3.0.2\", \"release\": \"0ubuntu1.12\"},\n+    \"libssl3\": {\"name\": \"libssl3\", \"version\": \"3.0.2\", \"release\": \"0ubuntu1.12\"},\n+    \"nginx\": {\"name\": \"nginx\", \"version\": \"1.18.0\", \"release\": \"6ubuntu14.4\"},\n+    \"curl\": {\"name\": \"curl\", \"version\": \"7.81.0\", \"release\": \"1ubuntu1.15\"}\n+  },\n+  \"scannedCves\": {\n+    \"CVE-2024-0727\": {\n+      \"cveID\": \"CVE-2024-0727\",\n+      \"confidences\": [{\"score\": 100, \"detectionMethod\": \"OvalMatch\"}],\n+      \"affectedPackages\": [{\"name\": \"openssl\", \"notFixedYet\": false}]\n+    },\n+    \"CVE-2023-44487\": {\n+      \"cveID\": \"CVE-2023-44487\",\n+      \"confidences\": [{\"score\": 100, \"detectionMethod\": \"OvalMatch\"}],\n+      \"affectedPackages\": [{\"name\": \"nginx\", \"notFixedYet\": true}]\n+    }\n+  },\n+  \"Optional\": {\n+    \"customer\": \"Northwind Trading Co\",\n+    \"engagement\": \"NTC-2024-0117\",\n+    \"site\": \"ntc-dc1\",\n+    \"administrators\": [\n+      {\"name\": \"Marta Ibanez\", \"email\": \"marta.ibanez@northwind-trading.example\", \"login\": \"mibanez\"},\n+      {\"name\": \"Dennis Greaves\", \"email\": \"dgreaves@northwind-trading.example\", \"login\": \"dgreaves\"}\n+    ]\n+  }\n+}\ndiff --git a/scanner/base.go b/scanner/base.go\nindex 5321af0..f1cc8d0 100644\n--- a/scanner/base.go\n+++ b/scanner/base.go\n@@ -343,6 +343,30 @@ func (l *base) parseIP(stdout string) (ipv4Addrs []string, ipv6Addrs []string) {\n \treturn\n }\n \n+func (l *base) parseIfconfig(stdout string) (ipv4Addrs []string, ipv6Addrs []string) {\n+\tlines := strings.Split(stdout, \"\\n\")\n+\tfor _, line := range lines {\n+\t\tline = strings.TrimSpace(line)\n+\t\tfields := strings.Fields(line)\n+\t\tif len(fields) &lt; 4 || !strings.HasPrefix(fields[0], \"inet\") {\n+\t\t\tcontinue\n+\t\t}\n+\t\tip := net.ParseIP(fields[1])\n+\t\tif ip == nil {\n+\t\t\tcontinue\n+\t\t}\n+\t\tif !ip.IsGlobalUnicast() {\n+\t\t\tcontinue\n+\t\t}\n+\t\tif ipv4 := ip.To4(); ipv4 != nil {\n+\t\t\tipv4Addrs = append(ipv4Addrs, ipv4.String())\n+\t\t} else {\n+\t\t\tipv6Addrs = append(ipv6Addrs, ip.String())\n+\t\t}\n+\t}\n+\treturn\n+}\n+\n func (l *base) detectPlatform() {\n \tif l.getServerInfo().Mode.IsOffline() {\n \t\tl.setPlatform(models.Platform{Name: \"unknown\"})\ndiff --git a/scanner/freebsd.go b/scanner/freebsd.go\nindex 9ee70e0..3d7caa9 100644\n--- a/scanner/freebsd.go\n+++ b/scanner/freebsd.go\n@@ -3,7 +3,6 @@ package scanner\n import (\n \t\"bufio\"\n \t\"fmt\"\n-\t\"net\"\n \t\"strings\"\n \n \t\"github.com/future-architect/vuls/config\"\n@@ -93,30 +92,6 @@ func (o *bsd) detectIPAddr() (err error) {\n \treturn nil\n }\n \n-func (l *base) parseIfconfig(stdout string) (ipv4Addrs []string, ipv6Addrs []string) {\n-\tlines := strings.Split(stdout, \"\\n\")\n-\tfor _, line := range lines {\n-\t\tline = strings.TrimSpace(line)\n-\t\tfields := strings.Fields(line)\n-\t\tif len(fields) &lt; 4 || !strings.HasPrefix(fields[0], \"inet\") {\n-\t\t\tcontinue\n-\t\t}\n-\t\tip := net.ParseIP(fields[1])\n-\t\tif ip == nil {\n-\t\t\tcontinue\n-\t\t}\n-\t\tif !ip.IsGlobalUnicast() {\n-\t\t\tcontinue\n-\t\t}\n-\t\tif ipv4 := ip.To4(); ipv4 != nil {\n-\t\t\tipv4Addrs = append(ipv4Addrs, ipv4.String())\n-\t\t} else {\n-\t\t\tipv6Addrs = append(ipv6Addrs, ip.String())\n-\t\t}\n-\t}\n-\treturn\n-}\n-\n func (o *bsd) scanPackages() error {\n \to.log.Infof(\"Scanning OS pkg in %s\", o.getServerInfo().Mode)\n \t// collect the running kernel information\ndiff --git a/scanner/macos.go b/scanner/macos.go\nnew file mode 100644\nindex 0000000..1be043d\n--- /dev/null\n+++ b/scanner/macos.go\n@@ -0,0 +1,177 @@\n+package scanner\n+\n+import (\n+\t\"path/filepath\"\n+\t\"strings\"\n+\n+\t\"github.com/future-architect/vuls/config\"\n+\t\"github.com/future-architect/vuls/constant\"\n+\t\"github.com/future-architect/vuls/logging\"\n+\t\"github.com/future-architect/vuls/models\"\n+\t\"golang.org/x/xerrors\"\n+)\n+\n+type macos struct {\n+\tbase\n+}\n+\n+func newMacOS(c config.ServerInfo) *macos {\n+\td := &amp;macos{\n+\t\tbase: base{\n+\t\t\tosPackages: osPackages{\n+\t\t\t\tPackages:  models.Packages{},\n+\t\t\t\tVulnInfos: models.VulnInfos{},\n+\t\t\t},\n+\t\t},\n+\t}\n+\td.log = logging.NewNormalLogger()\n+\td.setServerInfo(c)\n+\treturn d\n+}\n+\n+func detectMacOS(c config.ServerInfo) (bool, osTypeInterface) {\n+\tif r := exec(c, \"sw_vers\", noSudo); r.isSuccess() {\n+\t\tfamily, version, err := parseSWVers(r.Stdout)\n+\t\tif err == nil {\n+\t\t\tm := newMacOS(c)\n+\t\t\tm.setDistro(family, version)\n+\t\t\treturn true, m\n+\t\t}\n+\t}\n+\treturn false, nil\n+}\n+\n+func parseSWVers(stdout string) (string, string, error) {\n+\tvar name, version string\n+\tfor _, line := range strings.Split(stdout, \"\\n\") {\n+\t\tline = strings.TrimSpace(line)\n+\t\tparts := strings.SplitN(line, \":\", 2)\n+\t\tif len(parts) == 2 {\n+\t\t\tk := strings.TrimSpace(parts[0])\n+\t\t\tv := strings.TrimSpace(parts[1])\n+\t\t\tif k == \"ProductName\" {\n+\t\t\t\tname = v\n+\t\t\t} else if k == \"ProductVersion\" {\n+\t\t\t\tversion = v\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tvar family string\n+\tswitch name {\n+\tcase \"Mac OS X\":\n+\t\tfamily = constant.MacOSX\n+\tcase \"Mac OS X Server\":\n+\t\tfamily = constant.MacOSXServer\n+\tcase \"macOS\":\n+\t\tfamily = constant.MacOS\n+\tcase \"macOS Server\":\n+\t\tfamily = constant.MacOSServer\n+\tdefault:\n+\t\treturn \"\", \"\", xerrors.Errorf(\"unrecognised product name: %q\", name)\n+\t}\n+\n+\tif version == \"\" {\n+\t\treturn \"\", \"\", xerrors.New(\"product version is empty or absent\")\n+\t}\n+\n+\treturn family, version, nil\n+}\n+\n+func (m *macos) checkScanMode() error { return nil }\n+func (m *macos) checkDeps() error { return nil }\n+func (m *macos) checkIfSudoNoPasswd() error { return nil }\n+func (m *macos) preCure() error { return nil }\n+func (m *macos) postScan() error { return nil }\n+func (m *macos) scanPackages() error { return nil }\n+\n+func (m *macos) parseInstalledPackages(stdout string) (models.Packages, models.SrcPackages, error) {\n+\tpkgs := models.Packages{}\n+\trecords := strings.Split(stdout, \"\\n\\n\")\n+\tfor _, record := range records {\n+\t\trecord = strings.TrimSpace(record)\n+\t\tif record == \"\" {\n+\t\t\tcontinue\n+\t\t}\n+\n+\t\tlines := strings.Split(record, \"\\n\")\n+\n+\t\tvar infoPlist, dispName, bndlName, version, repo string\n+\t\tvar dispNameErr, bndlNameErr, versionErr, repoErr bool\n+\n+\t\tfor _, line := range lines {\n+\t\t\tif !strings.Contains(line, \":\") {\n+\t\t\t\treturn nil, nil, xerrors.Errorf(\"line with no : separator: %q\", line)\n+\t\t\t}\n+\n+\t\t\tif strings.Contains(line, \"Could not extract value, error: No value at that key path or invalid key path: \") {\n+\t\t\t\tparts := strings.Split(line, \"Could not extract value, error: No value at that key path or invalid key path: \")\n+\t\t\t\ttag := strings.TrimSpace(parts[len(parts)-1])\n+\t\t\t\t\n+\t\t\t\tif tag == \"CFBundleDisplayName\" { dispNameErr = true }\n+\t\t\t\tif tag == \"CFBundleName\" { bndlNameErr = true }\n+\t\t\t\tif tag == \"CFBundleShortVersionString\" { versionErr = true }\n+\t\t\t\tif tag == \"CFBundleIdentifier\" { repoErr = true }\n+\t\t\t\t\n+\t\t\t\tif tag != \"CFBundleDisplayName\" &amp;&amp; tag != \"CFBundleName\" &amp;&amp; tag != \"CFBundleShortVersionString\" &amp;&amp; tag != \"CFBundleIdentifier\" {\n+\t\t\t\t\treturn nil, nil, xerrors.Errorf(\"unknown line tag in error: %q\", tag)\n+\t\t\t\t}\n+\t\t\t\tcontinue\n+\t\t\t}\n+\n+\t\t\tparts := strings.SplitN(line, \":\", 2)\n+\t\t\ttag := strings.TrimSpace(parts[0])\n+\t\t\tval := strings.TrimRight(parts[1], \" \\t\")\n+\t\t\tif strings.HasPrefix(val, \" \") {\n+\t\t\t\tval = val[1:] // remove single leading space if any\n+\t\t\t}\n+\n+\t\t\tswitch tag {\n+\t\t\tcase \"Info.plist\":\n+\t\t\t\tinfoPlist = val\n+\t\t\tcase \"CFBundleDisplayName\":\n+\t\t\t\tdispName = val\n+\t\t\tcase \"CFBundleName\":\n+\t\t\t\tbndlName = val\n+\t\t\tcase \"CFBundleShortVersionString\":\n+\t\t\t\tversion = val\n+\t\t\tcase \"CFBundleIdentifier\":\n+\t\t\t\trepo = val\n+\t\t\tdefault:\n+\t\t\t\treturn nil, nil, xerrors.Errorf(\"unknown line tag: %q\", tag)\n+\t\t\t}\n+\t\t}\n+\n+\t\tname := dispName\n+\t\tif dispName == \"\" || dispNameErr {\n+\t\t\tname = bndlName\n+\t\t}\n+\t\tif name == \"\" || bndlNameErr {\n+\t\t\tif infoPlist != \"\" {\n+\t\t\t\tdir1 := filepath.Dir(infoPlist)\n+\t\t\t\tdir2 := filepath.Dir(dir1)\n+\t\t\t\tname = filepath.Base(dir2)\n+\t\t\t\tname = strings.TrimSuffix(name, \".app\")\n+\t\t\t}\n+\t\t}\n+\n+\t\tv := version\n+\t\tif versionErr {\n+\t\t\tv = \"\"\n+\t\t}\n+\t\tr := repo\n+\t\tif repoErr {\n+\t\t\tr = \"\"\n+\t\t}\n+\n+\t\tif name != \"\" {\n+\t\t\tpkgs[name] = models.Package{\n+\t\t\t\tName:       name,\n+\t\t\t\tVersion:    v,\n+\t\t\t\tRepository: r,\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn pkgs, nil, nil\n+}\n\\ No newline at end of file\ndiff --git a/scanner/scanner.go b/scanner/scanner.go\nindex 1122a16..61eb2b6 100644\n--- a/scanner/scanner.go\n+++ b/scanner/scanner.go\n@@ -282,6 +282,8 @@ func ParseInstalledPkgs(distro config.Distro, kernel models.Kernel, pkgList stri\n \t\tosType = &amp;fedora{redhatBase: redhatBase{base: base}}\n \tcase constant.OpenSUSE, constant.OpenSUSELeap, constant.SUSEEnterpriseServer, constant.SUSEEnterpriseDesktop:\n \t\tosType = &amp;suse{redhatBase: redhatBase{base: base}}\n+\tcase constant.MacOSX, constant.MacOSXServer, constant.MacOS, constant.MacOSServer:\n+\t\tosType = &amp;macos{base: base}\n \tdefault:\n \t\treturn models.Packages{}, models.SrcPackages{}, xerrors.Errorf(\"Server mode for %s is not implemented yet\", base.Distro.Family)\n \t}\n@@ -784,6 +786,11 @@ func (s Scanner) detectOS(c config.ServerInfo) osTypeInterface {\n \t\treturn osType\n \t}\n \n+\tif itsMe, osType := detectMacOS(c); itsMe {\n+\t\tlogging.Log.Debugf(\"macOS. Host: %s:%s\", c.Host, c.Port)\n+\t\treturn osType\n+\t}\n+\n \tif itsMe, osType := detectAlpine(c); itsMe {\n \t\tlogging.Log.Debugf(\"Alpine. Host: %s:%s\", c.Host, c.Port)\n \t\treturn osType\n", "creation_timestamp": "2026-07-30T18:14:20.347922Z"}