{"vulnerability": "CVE-2024-0727", "sightings": [{"uuid": "cc72f498-93cb-4c0f-b188-354c7f433f73", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://www.cisa.gov/news-events/ics-advisories/icsa-24-319-08", "content": "", "creation_timestamp": "2024-11-14T12:00:00.000000Z"}, {"uuid": "37b68f4f-d093-4b89-a4c6-e4f24ad9f557", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://www.cisa.gov/news-events/ics-advisories/icsa-24-319-04", "content": "", "creation_timestamp": "2024-11-14T12:00:00.000000Z"}, {"uuid": "fd48cf30-0cd5-4410-9b76-c1bd717348be", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://www.cisa.gov/news-events/ics-advisories/icsa-25-044-09", "content": "", "creation_timestamp": "2025-02-13T11:00:00.000000Z"}, {"uuid": "8936b58b-8053-414e-8bd7-61d1ef1cb3a4", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://www.cisa.gov/news-events/ics-advisories/icsa-25-100-02", "content": "", "creation_timestamp": "2025-04-10T10:00:00.000000Z"}, {"uuid": "d7c1cbf1-c3de-40c2-b356-ee32d2e57f65", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "86ecb4e1-bb32-44d5-9f39-8a4673af8385", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://www.cert.ssi.gouv.fr/avis/CERTFR-2026-AVI-0316/", "content": "", "creation_timestamp": "2026-03-19T00:00:00.000000Z"}, {"uuid": "5dd3de4c-0ec5-427e-bd3b-343e7c2215f5", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://t.me/arpsyndicate/3287", "content": "#ExploitObserverAlert\n\nCVE-2024-0727\n\nDESCRIPTION: Exploit Observer has 5 entries in 3 file formats related to CVE-2024-0727. Issue summary: Processing a maliciously formatted PKCS12 file may lead OpenSSL to crash leading to a potential Denial of Service attack  Impact summary: Applications loading files in the PKCS12 format from untrusted sources might terminate abruptly.  A file in PKCS12 format can contain certificates and keys and may come from an untrusted source. The PKCS12 specification allows certain fields to be NULL, but OpenSSL does not correctly check for this case. This can lead to a NULL pointer dereference that results in OpenSSL crashing. If an application processes PKCS12 files from an untrusted source using the OpenSSL APIs then that application will be vulnerable to this issue.  OpenSSL APIs that are vulnerable to this are: PKCS12_parse(), PKCS12_unpack_p7data(), PKCS12_unpack_p7encdata(), PKCS12_unpack_authsafes() and PKCS12_newpass().  We have also fixed a similar issue in SMIME_write_PKCS7(). However since this function is related to writing data we do not consider it security significant.  The FIPS modules in 3.2, 3.1 and 3.0 are not affected by this issue.", "creation_timestamp": "2024-01-28T12:21:18.000000Z"}, {"uuid": "de01fc32-4085-4788-b7ed-90e6e3fdd72f", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://t.me/ctinow/187248", "content": "https://ift.tt/n4tqiKz\nCVE-2024-0727 | OpenSSL 3.0/3.1 ContentInfo null pointer dereference", "creation_timestamp": "2024-02-18T13:41:46.000000Z"}, {"uuid": "7b1c9b61-c052-4f56-85b1-0b103938fb67", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://t.me/ctinow/181323", "content": "https://ift.tt/lwGab5W\nCVE-2024-0727 OpenSSL Vulnerability in NetApp Products", "creation_timestamp": "2024-02-08T12:26:34.000000Z"}, {"uuid": "1c09e025-8d20-4b4f-ab27-148cc6dd1f0f", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://t.me/ctinow/173672", "content": "https://ift.tt/CBHauMO\nCVE-2024-0727", "creation_timestamp": "2024-01-25T18:46:31.000000Z"}, {"uuid": "d6e616a8-7a44-45be-b73b-bdbc755bb274", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "type": "seen", "source": "https://t.me/ctinow/174108", "content": "https://ift.tt/UrFDk2e\nCVE-2024-0727", "creation_timestamp": "2024-01-26T10:31:21.000000Z"}, {"uuid": "04090bff-5f36-4bf9-a5a1-0332edb7fb81", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "CVE-2024-0727", "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.396434Z"}]}