{"metadata": {"vulnerability": "CVE-2026-27601", "count": 256, "kinds": {"milestone": 38, "sighting": 2, "kev": 0, "other": 216}}, "data": [{"timestamp": "2025-08-04T16:30:00Z", "date_only": false, "value": "2025-08-04T16:30:00Z", "kind": "other", "label": "Document generated", "source": "csaf_ncscnl \u00b7 NCSC-2026-0325", "record": "NCSC-2026-0325", "field": "document.tracking.generator.date"}, {"timestamp": "2026-01-14T19:07:13.745Z", "date_only": false, "value": "2026-01-14T19:07:13.745000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.2.release_date"}, {"timestamp": "2026-01-14T20:01:00.899Z", "date_only": false, "value": "2026-01-14T20:01:00.899462+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.2.discovery_date"}, {"timestamp": "2026-02-11T00:00:00Z", "date_only": false, "value": "2026-02-11T00:00:00+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.2.release_date"}, {"timestamp": "2026-02-11T19:01:32.953Z", "date_only": false, "value": "2026-02-11T19:01:32.953264+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.2.discovery_date"}, {"timestamp": "2026-02-20T03:05:21.105Z", "date_only": false, "value": "2026-02-20T03:05:21.105000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.11.release_date"}, {"timestamp": "2026-02-20T04:01:11.896Z", "date_only": false, "value": "2026-02-20T04:01:11.896063+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.11.discovery_date"}, {"timestamp": "2026-02-20T19:43:14.602Z", "date_only": false, "value": "2026-02-20T19:43:14.602Z", "kind": "milestone", "label": "Reserved", "source": "cvelistv5", "record": "CVE-2026-27601", "field": "cveMetadata.dateReserved"}, {"timestamp": "2026-02-24T00:00:00Z", "date_only": false, "value": "2026-02-24T00:00:00+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.6.release_date"}, {"timestamp": "2026-02-24T00:00:00Z", "date_only": false, "value": "2026-02-24T00:00:00+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.7.release_date"}, {"timestamp": "2026-02-24T12:08:42.955Z", "date_only": false, "value": "2026-02-24T12:08:42.955000+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.6.discovery_date"}, {"timestamp": "2026-02-24T12:08:42.955Z", "date_only": false, "value": "2026-02-24T12:08:42.955000+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.7.discovery_date"}, {"timestamp": "2026-02-26T01:07:42.693Z", "date_only": false, "value": "2026-02-26T01:07:42.693000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.10.release_date"}, {"timestamp": "2026-02-26T01:07:42.693Z", "date_only": false, "value": "2026-02-26T01:07:42.693000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.13.release_date"}, {"timestamp": "2026-02-26T02:01:23.004Z", "date_only": false, "value": "2026-02-26T02:01:23.004531+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.10.discovery_date"}, {"timestamp": "2026-02-26T02:01:23.004Z", "date_only": false, "value": "2026-02-26T02:01:23.004531+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.13.discovery_date"}, {"timestamp": "2026-03-02T00:00:00Z", "date_only": false, "value": "2026-03-02T00:00:00.000Z", "kind": "milestone", "label": "Published", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T17:46:06Z", "date_only": false, "value": "2026-03-03T17:46:06Z", "kind": "milestone", "label": "Published", "source": "github \u00b7 GHSA-QPX9-HPMF-5GMW", "record": "GHSA-QPX9-HPMF-5GMW", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T22:38:38.955Z", "date_only": false, "value": "2026-03-03T22:38:38.955Z", "kind": "milestone", "label": "Published", "source": "cvelistv5", "record": "CVE-2026-27601", "field": "cveMetadata.datePublished", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T22:38:38.955Z", "date_only": false, "value": "2026-03-03T22:38:38.955000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T22:38:38.955Z", "date_only": false, "value": "2026-03-03T22:38:38.955000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.3.release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T22:38:38.955Z", "date_only": false, "value": "2026-03-03T22:38:38.955000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T22:38:38.955Z", "date_only": false, "value": "2026-03-03T22:38:38.955Z", "kind": "other", "label": "Updated", "source": "cvelistv5 / GitHub_M", "record": "CVE-2026-27601", "field": "containers.cna.providerMetadata.dateUpdated"}, {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.3.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T23:15:00Z", "date_only": false, "value": "2026-03-03T23:15:00Z", "kind": "milestone", "label": "Published", "source": "osv_ubuntu \u00b7 UBUNTU-CVE-2026-27601", "record": "UBUNTU-CVE-2026-27601", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T23:15:55Z", "date_only": false, "value": "2026-03-03T23:15:55Z", "kind": "other", "label": "Nvd published at", "source": "github \u00b7 GHSA-QPX9-HPMF-5GMW", "record": "GHSA-QPX9-HPMF-5GMW", "field": "database_specific.nvd_published_at"}, {"timestamp": "2026-03-03T23:15:55.560Z", "date_only": false, "value": "2026-03-03T23:15:55.560", "kind": "milestone", "label": "Published", "source": "fkie_nvd \u00b7 FKIE_CVE-2026-27601", "record": "FKIE_CVE-2026-27601", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-03T23:59:26.608Z", "date_only": false, "value": "2026-03-03T23:59:26.608019Z", "kind": "sighting", "label": "Seen", "source": "https://bsky.app/profile/cve.skyfleet.blue/post/3mg6xz656gz2z", "record": "CVE-2026-27601", "field": "creation_timestamp", "uuid": "74df827a-af05-4f2f-8685-447c03111a62", "url": "https://bsky.app/profile/cve.skyfleet.blue/post/3mg6xz656gz2z"}, {"timestamp": "2026-03-04T16:44:25.481Z", "date_only": false, "value": "2026-03-04T16:44:25.481747Z", "kind": "other", "label": "Recorded", "source": "cvelistv5 / CISA-ADP", "record": "CVE-2026-27601", "field": "containers.adp.0.metrics.0.other.content.timestamp"}, {"timestamp": "2026-03-04T16:44:25.481Z", "date_only": false, "value": "2026-03-04T16:44:25.481747Z", "kind": "other", "label": "Recorded", "source": "fkie_nvd \u00b7 FKIE_CVE-2026-27601", "record": "FKIE_CVE-2026-27601", "field": "metrics.ssvcV203.0.ssvcData.timestamp"}, {"timestamp": "2026-03-04T16:44:40.856Z", "date_only": false, "value": "2026-03-04T16:44:40.856Z", "kind": "other", "label": "Updated", "source": "cvelistv5", "record": "CVE-2026-27601", "field": "cveMetadata.dateUpdated"}, {"timestamp": "2026-03-04T16:44:40.856Z", "date_only": false, "value": "2026-03-04T16:44:40.856Z", "kind": "other", "label": "Updated", "source": "cvelistv5 / CISA-ADP", "record": "CVE-2026-27601", "field": "containers.adp.0.providerMetadata.dateUpdated"}, {"timestamp": "2026-03-05T00:00:00Z", "date_only": false, "value": "2026-03-05T00:00:00+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.1.release_date"}, {"timestamp": "2026-03-05T00:00:00Z", "date_only": false, "value": "2026-03-05T00:00:00+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.1.release_date"}, {"timestamp": "2026-03-05T16:01:10.432Z", "date_only": false, "value": "2026-03-05T16:01:10.432461+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.1.discovery_date"}, {"timestamp": "2026-03-05T16:01:10.432Z", "date_only": false, "value": "2026-03-05T16:01:10.432461+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.1.discovery_date"}, {"timestamp": "2026-03-06T00:00:00Z", "date_only": false, "value": "2026-03-06T00:00:00+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.12.discovery_date"}, {"timestamp": "2026-03-06T00:00:00Z", "date_only": false, "value": "2026-03-06T00:00:00+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.15.discovery_date"}, {"timestamp": "2026-03-06T07:23:05.716Z", "date_only": false, "value": "2026-03-06T07:23:05.716000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.12.release_date"}, {"timestamp": "2026-03-06T07:23:05.716Z", "date_only": false, "value": "2026-03-06T07:23:05.716000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.15.release_date"}, {"timestamp": "2026-03-06T18:25:22.438Z", "date_only": false, "value": "2026-03-06T18:25:22.438000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.11.release_date"}, {"timestamp": "2026-03-06T18:25:22.438Z", "date_only": false, "value": "2026-03-06T18:25:22.438000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.14.release_date"}, {"timestamp": "2026-03-06T19:00:57.982Z", "date_only": false, "value": "2026-03-06T19:00:57.982727+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.11.discovery_date"}, {"timestamp": "2026-03-06T19:00:57.982Z", "date_only": false, "value": "2026-03-06T19:00:57.982727+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.14.discovery_date"}, {"timestamp": "2026-03-06T21:28:14.211Z", "date_only": false, "value": "2026-03-06T21:28:14.211000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.10.release_date"}, {"timestamp": "2026-03-06T22:02:11.567Z", "date_only": false, "value": "2026-03-06T22:02:11.567841+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.10.discovery_date"}, {"timestamp": "2026-03-07T01:04:18Z", "date_only": false, "value": "2026-03-07T01:04:18.000Z", "kind": "other", "label": "Advisory revision", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-03-07T15:03:51.422Z", "date_only": false, "value": "2026-03-07T15:03:51.422000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.13.release_date"}, {"timestamp": "2026-03-07T15:03:51.422Z", "date_only": false, "value": "2026-03-07T15:03:51.422000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.16.release_date"}, {"timestamp": "2026-03-07T16:01:40.949Z", "date_only": false, "value": "2026-03-07T16:01:40.949207+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.13.discovery_date"}, {"timestamp": "2026-03-07T16:01:40.949Z", "date_only": false, "value": "2026-03-07T16:01:40.949207+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.16.discovery_date"}, {"timestamp": "2026-03-11T22:58:48.863Z", "date_only": false, "value": "2026-03-11T22:58:48.863000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.4.release_date"}, {"timestamp": "2026-03-12T00:01:15.619Z", "date_only": false, "value": "2026-03-12T00:01:15.619385+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.4.discovery_date"}, {"timestamp": "2026-03-12T18:08:09.634Z", "date_only": false, "value": "2026-03-12T18:08:09.634000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.14.release_date"}, {"timestamp": "2026-03-12T18:08:09.634Z", "date_only": false, "value": "2026-03-12T18:08:09.634000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.17.release_date"}, {"timestamp": "2026-03-12T18:35:06.325Z", "date_only": false, "value": "2026-03-12T18:35:06.325000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.5.release_date"}, {"timestamp": "2026-03-12T19:01:05.406Z", "date_only": false, "value": "2026-03-12T19:01:05.406839+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.5.discovery_date"}, {"timestamp": "2026-03-12T19:01:30.987Z", "date_only": false, "value": "2026-03-12T19:01:30.987208+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.14.discovery_date"}, {"timestamp": "2026-03-12T19:01:30.987Z", "date_only": false, "value": "2026-03-12T19:01:30.987208+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.17.discovery_date"}, {"timestamp": "2026-03-12T19:56:55.092Z", "date_only": false, "value": "2026-03-12T19:56:55.092000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.2.release_date"}, {"timestamp": "2026-03-12T19:56:55.092Z", "date_only": false, "value": "2026-03-12T19:56:55.092000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.3.release_date"}, {"timestamp": "2026-03-12T20:08:05.950Z", "date_only": false, "value": "2026-03-12T20:08:05.950000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.3.release_date"}, {"timestamp": "2026-03-12T20:08:05.950Z", "date_only": false, "value": "2026-03-12T20:08:05.950000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.4.release_date"}, {"timestamp": "2026-03-12T20:21:57.775Z", "date_only": false, "value": "2026-03-12T20:21:57.775000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.4.release_date"}, {"timestamp": "2026-03-12T20:21:57.775Z", "date_only": false, "value": "2026-03-12T20:21:57.775000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.5.release_date"}, {"timestamp": "2026-03-12T20:27:05.600Z", "date_only": false, "value": "2026-03-12T20:27:05.600000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.5.release_date"}, {"timestamp": "2026-03-12T20:27:05.600Z", "date_only": false, "value": "2026-03-12T20:27:05.600000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.6.release_date"}, {"timestamp": "2026-03-12T21:01:25.538Z", "date_only": false, "value": "2026-03-12T21:01:25.538271+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.3.discovery_date"}, {"timestamp": "2026-03-12T21:01:25.538Z", "date_only": false, "value": "2026-03-12T21:01:25.538271+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.4.discovery_date"}, {"timestamp": "2026-03-12T21:01:29.187Z", "date_only": false, "value": "2026-03-12T21:01:29.187989+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.5.discovery_date"}, {"timestamp": "2026-03-12T21:01:29.187Z", "date_only": false, "value": "2026-03-12T21:01:29.187989+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.6.discovery_date"}, {"timestamp": "2026-03-12T21:01:33.639Z", "date_only": false, "value": "2026-03-12T21:01:33.639277+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.2.discovery_date"}, {"timestamp": "2026-03-12T21:01:33.639Z", "date_only": false, "value": "2026-03-12T21:01:33.639277+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.3.discovery_date"}, {"timestamp": "2026-03-12T21:01:36.954Z", "date_only": false, "value": "2026-03-12T21:01:36.954017+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.4.discovery_date"}, {"timestamp": "2026-03-12T21:01:36.954Z", "date_only": false, "value": "2026-03-12T21:01:36.954017+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.5.discovery_date"}, {"timestamp": "2026-03-15T11:10:35Z", "date_only": false, "value": "2026-03-15T11:10:35Z", "kind": "milestone", "label": "Published", "source": "osv_openeuler \u00b7 OESA-2026-1578", "record": "OESA-2026-1578", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-15T11:10:35Z", "date_only": false, "value": "2026-03-15T11:10:35Z", "kind": "milestone", "label": "Published", "source": "osv_openeuler \u00b7 OESA-2026-1579", "record": "OESA-2026-1579", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-15T11:10:35Z", "date_only": false, "value": "2026-03-15T11:10:35Z", "kind": "milestone", "label": "Published", "source": "osv_openeuler \u00b7 OESA-2026-1580", "record": "OESA-2026-1580", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-15T11:10:35Z", "date_only": false, "value": "2026-03-15T11:10:35Z", "kind": "milestone", "label": "Published", "source": "osv_openeuler \u00b7 OESA-2026-1581", "record": "OESA-2026-1581", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-17T14:38:08Z", "date_only": false, "value": "2026-03-17T14:38:08.000Z", "kind": "other", "label": "Advisory revision", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-03-17T14:38:08Z", "date_only": false, "value": "2026-03-17T14:38:08.000Z", "kind": "other", "label": "Updated", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-03-18T07:02:55.512Z", "date_only": false, "value": "2026-03-18T07:02:55.512Z", "kind": "other", "label": "Document generated", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.generator.date"}, {"timestamp": "2026-03-20T05:17:03.290Z", "date_only": false, "value": "2026-03-20T05:17:03.290000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.18.release_date"}, {"timestamp": "2026-03-20T06:02:18.306Z", "date_only": false, "value": "2026-03-20T06:02:18.306021+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.18.discovery_date"}, {"timestamp": "2026-03-20T23:06:48.485Z", "date_only": false, "value": "2026-03-20T23:06:48.485000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.17.release_date"}, {"timestamp": "2026-03-20T23:06:48.485Z", "date_only": false, "value": "2026-03-20T23:06:48.485000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.19.release_date"}, {"timestamp": "2026-03-21T00:01:43.424Z", "date_only": false, "value": "2026-03-21T00:01:43.424803+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.17.discovery_date"}, {"timestamp": "2026-03-21T00:01:43.424Z", "date_only": false, "value": "2026-03-21T00:01:43.424803+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.19.discovery_date"}, {"timestamp": "2026-03-24T19:35:47.908Z", "date_only": false, "value": "2026-03-24T19:35:47.908000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.6.release_date"}, {"timestamp": "2026-03-24T20:02:32.870Z", "date_only": false, "value": "2026-03-24T20:02:32.870828+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.6.discovery_date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "other", "label": "Document generated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.generator.date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "other", "label": "Document generated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.generator.date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "other", "label": "Impact", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "vulnerabilities.0.threats.0.date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "other", "label": "Impact", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "vulnerabilities.0.threats.0.date"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "milestone", "label": "Published", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-25T00:00:00Z", "date_only": false, "value": "2026-03-25T00:00:00Z", "kind": "milestone", "label": "Published", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-26T00:00:00Z", "date_only": false, "value": "2026-03-26T00:00:00Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-03-26T00:00:00Z", "date_only": false, "value": "2026-03-26T00:00:00Z", "kind": "other", "label": "Document generated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.generator.date"}, {"timestamp": "2026-03-26T00:00:00Z", "date_only": false, "value": "2026-03-26T00:00:00Z", "kind": "other", "label": "Impact", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "vulnerabilities.0.threats.0.date"}, {"timestamp": "2026-03-26T00:00:00Z", "date_only": false, "value": "2026-03-26T00:00:00Z", "kind": "milestone", "label": "Published", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-03-26T18:59:38Z", "date_only": false, "value": "2026-03-26T18:59:38+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.8.release_date"}, {"timestamp": "2026-03-26T18:59:38Z", "date_only": false, "value": "2026-03-26T18:59:38+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.9.release_date"}, {"timestamp": "2026-03-26T19:02:00.729Z", "date_only": false, "value": "2026-03-26T19:02:00.729000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.1.release_date"}, {"timestamp": "2026-03-26T20:02:52.199Z", "date_only": false, "value": "2026-03-26T20:02:52.199458+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.1.discovery_date"}, {"timestamp": "2026-03-26T20:03:28.427Z", "date_only": false, "value": "2026-03-26T20:03:28.427630+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.8.discovery_date"}, {"timestamp": "2026-03-26T20:03:28.427Z", "date_only": false, "value": "2026-03-26T20:03:28.427630+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.9.discovery_date"}, {"timestamp": "2026-03-27T20:43:37.725Z", "date_only": false, "value": "2026-03-27T20:43:37.725000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.18.release_date"}, {"timestamp": "2026-03-27T20:43:37.725Z", "date_only": false, "value": "2026-03-27T20:43:37.725000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.20.release_date"}, {"timestamp": "2026-03-27T20:45:49.583Z", "date_only": false, "value": "2026-03-27T20:45:49.583000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.19.release_date"}, {"timestamp": "2026-03-27T20:45:49.583Z", "date_only": false, "value": "2026-03-27T20:45:49.583000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.21.release_date"}, {"timestamp": "2026-03-27T20:47:54.492Z", "date_only": false, "value": "2026-03-27T20:47:54.492000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.20.release_date"}, {"timestamp": "2026-03-27T20:47:54.492Z", "date_only": false, "value": "2026-03-27T20:47:54.492000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.22.release_date"}, {"timestamp": "2026-03-27T20:50:03.418Z", "date_only": false, "value": "2026-03-27T20:50:03.418000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.21.release_date"}, {"timestamp": "2026-03-27T20:50:03.418Z", "date_only": false, "value": "2026-03-27T20:50:03.418000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.23.release_date"}, {"timestamp": "2026-03-27T21:01:34.410Z", "date_only": false, "value": "2026-03-27T21:01:34.410210+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.18.discovery_date"}, {"timestamp": "2026-03-27T21:01:34.410Z", "date_only": false, "value": "2026-03-27T21:01:34.410210+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.20.discovery_date"}, {"timestamp": "2026-03-27T21:02:18.484Z", "date_only": false, "value": "2026-03-27T21:02:18.484291+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.20.discovery_date"}, {"timestamp": "2026-03-27T21:02:18.484Z", "date_only": false, "value": "2026-03-27T21:02:18.484291+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.22.discovery_date"}, {"timestamp": "2026-03-27T21:02:22.762Z", "date_only": false, "value": "2026-03-27T21:02:22.762233+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.21.discovery_date"}, {"timestamp": "2026-03-27T21:02:22.762Z", "date_only": false, "value": "2026-03-27T21:02:22.762233+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.23.discovery_date"}, {"timestamp": "2026-03-27T21:02:52.462Z", "date_only": false, "value": "2026-03-27T21:02:52.462999+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.19.discovery_date"}, {"timestamp": "2026-03-27T21:02:52.462Z", "date_only": false, "value": "2026-03-27T21:02:52.462999+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.21.discovery_date"}, {"timestamp": "2026-03-31T19:18:35.796Z", "date_only": false, "value": "2026-03-31T19:18:35.796000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.0.release_date"}, {"timestamp": "2026-03-31T19:25:55.987Z", "date_only": false, "value": "2026-03-31T19:25:55.987000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.7.release_date"}, {"timestamp": "2026-03-31T19:25:55.987Z", "date_only": false, "value": "2026-03-31T19:25:55.987000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.8.release_date"}, {"timestamp": "2026-03-31T20:01:21.918Z", "date_only": false, "value": "2026-03-31T20:01:21.918257+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.7.discovery_date"}, {"timestamp": "2026-03-31T20:01:21.918Z", "date_only": false, "value": "2026-03-31T20:01:21.918257+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.8.discovery_date"}, {"timestamp": "2026-03-31T20:01:38.424Z", "date_only": false, "value": "2026-03-31T20:01:38.424064+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.0.discovery_date"}, {"timestamp": "2026-04-01T09:31:16.419Z", "date_only": false, "value": "2026-04-01T09:31:16.419730Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-DV49099", "record": "CLEANSTART-2026-DV49099", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-01T09:43:24.793Z", "date_only": false, "value": "2026-04-01T09:43:24.793409Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-GS57401", "record": "CLEANSTART-2026-GS57401", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-01T09:43:38.907Z", "date_only": false, "value": "2026-04-01T09:43:38.907490Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-SW34937", "record": "CLEANSTART-2026-SW34937", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-08T01:06:55.953Z", "date_only": false, "value": "2026-04-08T01:06:55.953000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.16.release_date"}, {"timestamp": "2026-04-08T01:06:58.595Z", "date_only": false, "value": "2026-04-08T01:06:58.595000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.15.release_date"}, {"timestamp": "2026-04-08T02:01:12.683Z", "date_only": false, "value": "2026-04-08T02:01:12.683211+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.16.discovery_date"}, {"timestamp": "2026-04-08T02:01:19.572Z", "date_only": false, "value": "2026-04-08T02:01:19.572351+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.15.discovery_date"}, {"timestamp": "2026-04-09T14:31:46.067Z", "date_only": false, "value": "2026-04-09T14:31:46.067000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.0.release_date"}, {"timestamp": "2026-04-09T14:31:46.067Z", "date_only": false, "value": "2026-04-09T14:31:46.067000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.0.release_date"}, {"timestamp": "2026-04-09T15:01:48.111Z", "date_only": false, "value": "2026-04-09T15:01:48.111177+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.0.discovery_date"}, {"timestamp": "2026-04-09T15:01:48.111Z", "date_only": false, "value": "2026-04-09T15:01:48.111177+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.0.discovery_date"}, {"timestamp": "2026-04-09T17:05:46.228Z", "date_only": false, "value": "2026-04-09T17:05:46.228000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.22.release_date"}, {"timestamp": "2026-04-09T17:05:46.228Z", "date_only": false, "value": "2026-04-09T17:05:46.228000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.24.release_date"}, {"timestamp": "2026-04-09T18:02:16.209Z", "date_only": false, "value": "2026-04-09T18:02:16.209487+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.22.discovery_date"}, {"timestamp": "2026-04-09T18:02:16.209Z", "date_only": false, "value": "2026-04-09T18:02:16.209487+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.24.discovery_date"}, {"timestamp": "2026-04-10T19:23:52.285Z", "date_only": false, "value": "2026-04-10T19:23:52.285000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.23.release_date"}, {"timestamp": "2026-04-10T19:23:52.285Z", "date_only": false, "value": "2026-04-10T19:23:52.285000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.25.release_date"}, {"timestamp": "2026-04-10T20:02:10.296Z", "date_only": false, "value": "2026-04-10T20:02:10.296601+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.23.discovery_date"}, {"timestamp": "2026-04-10T20:02:10.296Z", "date_only": false, "value": "2026-04-10T20:02:10.296601+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.25.discovery_date"}, {"timestamp": "2026-04-21T19:59:59.759Z", "date_only": false, "value": "2026-04-21T19:59:59.759000+00:00", "kind": "other", "label": "Release date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.24.release_date"}, {"timestamp": "2026-04-21T21:02:33.280Z", "date_only": false, "value": "2026-04-21T21:02:33.280553+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.24.discovery_date"}, {"timestamp": "2026-04-21T22:00:00Z", "date_only": false, "value": "2026-04-21T22:00:00.000+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-04-21T22:00:00Z", "date_only": false, "value": "2026-04-21T22:00:00.000+00:00", "kind": "milestone", "label": "Published", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-21T22:00:00Z", "date_only": false, "value": "2026-04-21T22:00:00.000+00:00", "kind": "other", "label": "Release date", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "vulnerabilities.1.release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "milestone", "label": "Published", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-24T00:00:00Z", "date_only": true, "value": "2026-04-24", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-0523", "record": "CERTFR-2026-AVI-0523", "field": "vendor_advisories.7.published_at"}, {"timestamp": "2026-04-27T00:00:00Z", "date_only": true, "value": "2026-04-27", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-0523", "record": "CERTFR-2026-AVI-0523", "field": "vendor_advisories.0.published_at"}, {"timestamp": "2026-04-30T00:00:00Z", "date_only": false, "value": "2026-04-30T00:00:00", "kind": "other", "label": "Last revision date", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-0523", "record": "CERTFR-2026-AVI-0523", "field": "last_revision_date"}, {"timestamp": "2026-04-30T00:00:00Z", "date_only": false, "value": "2026-04-30T00:00:00", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-0523", "record": "CERTFR-2026-AVI-0523", "field": "initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-04-30T00:00:00Z", "date_only": false, "value": "2026-04-30T00:00:00.000000", "kind": "other", "label": "Revision date", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-0523", "record": "CERTFR-2026-AVI-0523", "field": "revisions.0.revision_date"}, {"timestamp": "2026-05-05T16:10:46Z", "date_only": false, "value": "2026-05-05T16:10:46+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-05-05T16:10:46Z", "date_only": false, "value": "2026-05-05T16:10:46+00:00", "kind": "milestone", "label": "Published", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-05-05T16:10:46Z", "date_only": false, "value": "2026-05-05T16:10:46+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}, {"timestamp": "2026-05-05T22:01:45Z", "date_only": false, "value": "2026-05-05T22:01:45Z", "kind": "other", "label": "Updated", "source": "github \u00b7 GHSA-QPX9-HPMF-5GMW", "record": "GHSA-QPX9-HPMF-5GMW", "field": "modified"}, {"timestamp": "2026-05-06T22:00:00Z", "date_only": false, "value": "2026-05-06T22:00:00.000+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-05-18T13:17:47.972Z", "date_only": false, "value": "2026-05-18T13:17:47.972643Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-NB51079", "record": "CLEANSTART-2026-NB51079", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-05-18T13:17:48.128Z", "date_only": false, "value": "2026-05-18T13:17:48.128214Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-CE10526", "record": "CLEANSTART-2026-CE10526", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-05-18T13:33:43.873Z", "date_only": false, "value": "2026-05-18T13:33:43.873182Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-OW14933", "record": "CLEANSTART-2026-OW14933", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-05-21T22:00:00Z", "date_only": false, "value": "2026-05-21T22:00:00.000+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-05-31T22:00:00Z", "date_only": false, "value": "2026-05-31T22:00:00.000+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.revision_history.3.date"}, {"timestamp": "2026-06-07T22:00:00Z", "date_only": false, "value": "2026-06-07T22:00:00.000+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.revision_history.4.date"}, {"timestamp": "2026-06-07T22:00:00Z", "date_only": false, "value": "2026-06-07T22:00:00.000+00:00", "kind": "other", "label": "Updated", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-06-08T09:28:31.500Z", "date_only": false, "value": "2026-06-08T09:28:31.500+00:00", "kind": "other", "label": "Document generated", "source": "csaf_certbund \u00b7 WID-SEC-W-2026-1220", "record": "WID-SEC-W-2026-1220", "field": "document.tracking.generator.date"}, {"timestamp": "2026-06-09T14:38:34Z", "date_only": false, "value": "2026-06-09T14:38:34+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-06-09T14:38:34Z", "date_only": false, "value": "2026-06-09T14:38:34+00:00", "kind": "milestone", "label": "Published", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-06-09T14:38:34Z", "date_only": false, "value": "2026-06-09T14:38:34+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "vulnerabilities.3.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}, {"timestamp": "2026-06-17T10:27:22.407Z", "date_only": false, "value": "2026-06-17T10:27:22.407", "kind": "other", "label": "Updated", "source": "fkie_nvd \u00b7 FKIE_CVE-2026-27601", "record": "FKIE_CVE-2026-27601", "field": "lastModified"}, {"timestamp": "2026-07-27T15:55:38Z", "date_only": false, "value": "2026-07-27T15:55:38Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-07-27T15:55:38Z", "date_only": false, "value": "2026-07-27T15:55:38Z", "kind": "other", "label": "Document generated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.generator.date"}, {"timestamp": "2026-07-27T15:55:38Z", "date_only": false, "value": "2026-07-27T15:55:38Z", "kind": "other", "label": "Impact", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "vulnerabilities.0.threats.0.date"}, {"timestamp": "2026-07-27T15:55:38Z", "date_only": false, "value": "2026-07-27T15:55:38Z", "kind": "milestone", "label": "Published", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-07-30T07:10:53Z", "date_only": false, "value": "2026-07-30T07:10:53Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-IA01903", "record": "CLEANSTART-2026-IA01903", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-08-06T11:10:35Z", "date_only": false, "value": "2026-08-06T11:10:35Z", "kind": "other", "label": "Updated", "source": "osv_openeuler \u00b7 OESA-2026-1578", "record": "OESA-2026-1578", "field": "modified"}, {"timestamp": "2026-08-06T11:10:35Z", "date_only": false, "value": "2026-08-06T11:10:35Z", "kind": "other", "label": "Updated", "source": "osv_openeuler \u00b7 OESA-2026-1579", "record": "OESA-2026-1579", "field": "modified"}, {"timestamp": "2026-08-06T11:10:35Z", "date_only": false, "value": "2026-08-06T11:10:35Z", "kind": "other", "label": "Updated", "source": "osv_openeuler \u00b7 OESA-2026-1580", "record": "OESA-2026-1580", "field": "modified"}, {"timestamp": "2026-08-06T11:10:35Z", "date_only": false, "value": "2026-08-06T11:10:35Z", "kind": "other", "label": "Updated", "source": "osv_openeuler \u00b7 OESA-2026-1581", "record": "OESA-2026-1581", "field": "modified"}, {"timestamp": "2026-08-13T00:00:00Z", "date_only": true, "value": "2026-08-13", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1023", "record": "CERTFR-2026-AVI-1023", "field": "vendor_advisories.0.published_at"}, {"timestamp": "2026-08-14T00:00:00Z", "date_only": false, "value": "2026-08-14T00:00:00", "kind": "other", "label": "Last revision date", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1023", "record": "CERTFR-2026-AVI-1023", "field": "last_revision_date"}, {"timestamp": "2026-08-14T00:00:00Z", "date_only": false, "value": "2026-08-14T00:00:00", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1023", "record": "CERTFR-2026-AVI-1023", "field": "initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-08-14T00:00:00Z", "date_only": false, "value": "2026-08-14T00:00:00.000000", "kind": "other", "label": "Revision date", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1023", "record": "CERTFR-2026-AVI-1023", "field": "revisions.0.revision_date"}, {"timestamp": "2026-08-21T00:00:00Z", "date_only": true, "value": "2026-08-21", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "vendor_advisories.9.published_at"}, {"timestamp": "2026-08-24T00:00:00Z", "date_only": true, "value": "2026-08-24", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "vendor_advisories.1.published_at"}, {"timestamp": "2026-08-24T09:52:27.784Z", "date_only": false, "value": "2026-08-24T09:52:27.784044Z", "kind": "other", "label": "Advisory revision", "source": "csaf_ncscnl \u00b7 NCSC-2026-0325", "record": "NCSC-2026-0325", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-08-24T09:52:27.784Z", "date_only": false, "value": "2026-08-24T09:52:27.784044Z", "kind": "milestone", "label": "Published", "source": "csaf_ncscnl \u00b7 NCSC-2026-0325", "record": "NCSC-2026-0325", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-08-24T09:52:27.784Z", "date_only": false, "value": "2026-08-24T09:52:27.784044Z", "kind": "other", "label": "Updated", "source": "csaf_ncscnl \u00b7 NCSC-2026-0325", "record": "NCSC-2026-0325", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-08-26T00:00:00Z", "date_only": true, "value": "2026-08-26", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "vendor_advisories.3.published_at"}, {"timestamp": "2026-08-27T00:00:00Z", "date_only": true, "value": "2026-08-27", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "vendor_advisories.0.published_at"}, {"timestamp": "2026-08-28T00:00:00Z", "date_only": false, "value": "2026-08-28T00:00:00", "kind": "other", "label": "Last revision date", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "last_revision_date"}, {"timestamp": "2026-08-28T00:00:00Z", "date_only": true, "value": "2026-08-28", "kind": "milestone", "label": "Published", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-08-28T00:00:00Z", "date_only": false, "value": "2026-08-28T00:00:00.000000", "kind": "other", "label": "Revision date", "source": "certfr_avis \u00b7 CERTFR-2026-AVI-1094", "record": "CERTFR-2026-AVI-1094", "field": "revisions.0.revision_date"}, {"timestamp": "2026-09-04T00:36:24Z", "date_only": false, "value": "2026-09-04T00:36:24+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-04T00:36:24Z", "date_only": false, "value": "2026-09-04T00:36:24+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-04T00:36:24Z", "date_only": false, "value": "2026-09-04T00:36:24+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-09T10:55:12Z", "date_only": false, "value": "2026-09-09T10:55:12Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-CE10526", "record": "CLEANSTART-2026-CE10526", "field": "modified"}, {"timestamp": "2026-09-09T10:55:12Z", "date_only": false, "value": "2026-09-09T10:55:12Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-OW14933", "record": "CLEANSTART-2026-OW14933", "field": "modified"}, {"timestamp": "2026-09-09T10:55:12Z", "date_only": false, "value": "2026-09-09T10:55:12Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-SW34937", "record": "CLEANSTART-2026-SW34937", "field": "modified"}, {"timestamp": "2026-09-09T10:55:12Z", "date_only": false, "value": "2026-09-09T10:55:12Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-CE10526", "record": "CLEANSTART-2026-CE10526", "field": "withdrawn"}, {"timestamp": "2026-09-09T10:55:12Z", "date_only": false, "value": "2026-09-09T10:55:12Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-OW14933", "record": "CLEANSTART-2026-OW14933", "field": "withdrawn"}, {"timestamp": "2026-09-09T10:55:12Z", "date_only": false, "value": "2026-09-09T10:55:12Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-SW34937", "record": "CLEANSTART-2026-SW34937", "field": "withdrawn"}, {"timestamp": "2026-09-16T20:03:59Z", "date_only": false, "value": "2026-09-16T20:03:59Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-16T20:04:03Z", "date_only": false, "value": "2026-09-16T20:04:03Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-16T20:04:17Z", "date_only": false, "value": "2026-09-16T20:04:17Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-16T20:43:25Z", "date_only": false, "value": "2026-09-16T20:43:25Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-09-16T21:05:29Z", "date_only": false, "value": "2026-09-16T21:05:29Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-09-16T21:05:32Z", "date_only": false, "value": "2026-09-16T21:05:32Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-09-16T21:05:44Z", "date_only": false, "value": "2026-09-16T21:05:44Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-09-16T21:45:08Z", "date_only": false, "value": "2026-09-16T21:45:08Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-09-17T16:58:46Z", "date_only": false, "value": "2026-09-17T16:58:46Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.revision_history.3.date"}, {"timestamp": "2026-09-17T16:58:46Z", "date_only": false, "value": "2026-09-17T16:58:46Z", "kind": "other", "label": "Updated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10424-1", "record": "OPENSUSE-SU-2026:10424-1", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-09-17T16:58:49Z", "date_only": false, "value": "2026-09-17T16:58:49Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.revision_history.3.date"}, {"timestamp": "2026-09-17T16:58:49Z", "date_only": false, "value": "2026-09-17T16:58:49Z", "kind": "other", "label": "Updated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10427-1", "record": "OPENSUSE-SU-2026:10427-1", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-09-17T16:59:04Z", "date_only": false, "value": "2026-09-17T16:59:04Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.revision_history.3.date"}, {"timestamp": "2026-09-17T16:59:04Z", "date_only": false, "value": "2026-09-17T16:59:04Z", "kind": "other", "label": "Updated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:10440-1", "record": "OPENSUSE-SU-2026:10440-1", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-09-17T17:40:19Z", "date_only": false, "value": "2026-09-17T17:40:19Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.revision_history.3.date"}, {"timestamp": "2026-09-17T17:40:19Z", "date_only": false, "value": "2026-09-17T17:40:19Z", "kind": "other", "label": "Updated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:21448-1", "record": "OPENSUSE-SU-2026:21448-1", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-09-18T10:26:56.437Z", "date_only": false, "value": "2026-09-18T10:26:56.437109Z", "kind": "milestone", "label": "Published", "source": "cleanstart \u00b7 CLEANSTART-2026-ZP55768", "record": "CLEANSTART-2026-ZP55768", "field": "published", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-DV49099", "record": "CLEANSTART-2026-DV49099", "field": "modified"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-GS57401", "record": "CLEANSTART-2026-GS57401", "field": "modified"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-IA01903", "record": "CLEANSTART-2026-IA01903", "field": "modified"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-NB51079", "record": "CLEANSTART-2026-NB51079", "field": "modified"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-DV49099", "record": "CLEANSTART-2026-DV49099", "field": "withdrawn"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-GS57401", "record": "CLEANSTART-2026-GS57401", "field": "withdrawn"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-IA01903", "record": "CLEANSTART-2026-IA01903", "field": "withdrawn"}, {"timestamp": "2026-09-18T11:59:01.768Z", "date_only": false, "value": "2026-09-18T11:59:01.768079Z", "kind": "other", "label": "Withdrawn", "source": "cleanstart \u00b7 CLEANSTART-2026-NB51079", "record": "CLEANSTART-2026-NB51079", "field": "withdrawn"}, {"timestamp": "2026-10-06T00:00:00Z", "date_only": false, "value": "2026-10-06T00:00:00Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:12070-1", "record": "OPENSUSE-SU-2026:12070-1", "field": "document.tracking.revision_history.0.date"}, {"timestamp": "2026-10-06T00:00:00Z", "date_only": false, "value": "2026-10-06T00:00:00Z", "kind": "other", "label": "Document generated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:12070-1", "record": "OPENSUSE-SU-2026:12070-1", "field": "document.tracking.generator.date"}, {"timestamp": "2026-10-06T00:00:00Z", "date_only": false, "value": "2026-10-06T00:00:00Z", "kind": "other", "label": "Impact", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:12070-1", "record": "OPENSUSE-SU-2026:12070-1", "field": "vulnerabilities.0.threats.0.date"}, {"timestamp": "2026-10-06T00:00:00Z", "date_only": false, "value": "2026-10-06T00:00:00Z", "kind": "milestone", "label": "Published", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:12070-1", "record": "OPENSUSE-SU-2026:12070-1", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, {"timestamp": "2026-10-07T08:42:32Z", "date_only": false, "value": "2026-10-07T08:42:32Z", "kind": "other", "label": "Advisory revision", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:12070-1", "record": "OPENSUSE-SU-2026:12070-1", "field": "document.tracking.revision_history.1.date"}, {"timestamp": "2026-10-07T08:42:32Z", "date_only": false, "value": "2026-10-07T08:42:32Z", "kind": "other", "label": "Updated", "source": "csaf_opensuse \u00b7 OPENSUSE-SU-2026:12070-1", "record": "OPENSUSE-SU-2026:12070-1", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-10-09T07:15:39Z", "date_only": false, "value": "2026-10-09T07:15:39Z", "kind": "other", "label": "Updated", "source": "cleanstart \u00b7 CLEANSTART-2026-ZP55768", "record": "CLEANSTART-2026-ZP55768", "field": "modified"}, {"timestamp": "2026-10-13T14:22:13Z", "date_only": false, "value": "2026-10-13T14:22:13.000000Z", "kind": "sighting", "label": "Seen", "source": "https://gist.github.com/nthurston/3103c06743f877b5b38c7d8a2f71c31e", "record": "CVE-2026-27601", "field": "creation_timestamp", "uuid": "65a3f733-0682-4403-8517-57da8711904f", "content": "diff --git a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php\nindex e50a4e1b10076..c9916a4383d10 100644\n--- a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php\n+++ b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFiles.php\n@@ -14,5 +14,12 @@\n class DeleteFiles extends \\Magento\\Cms\\Controller\\Adminhtml\\Wysiwyg\\Images implements HttpPostActionInterface\n {\n+    /**\n+     * Authorization for deleting files\n+     *\n+     * @see _isAllowed()\n+     */\n+    public const ADMIN_RESOURCE = 'Magento_MediaGalleryUiApi::delete_assets';\n+\n     /**\n      * @var \\Magento\\Framework\\Controller\\Result\\JsonFactory\n      */\ndiff --git a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php\nindex f5f44eb4ed48a..bbcd71392b7a7 100644\n--- a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php\n+++ b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/DeleteFolder.php\n@@ -17,5 +17,12 @@\n class DeleteFolder extends \\Magento\\Cms\\Controller\\Adminhtml\\Wysiwyg\\Images implements HttpPostActionInterface\n {\n+    /**\n+     * Authorization for deleting folder\n+     *\n+     * @see _isAllowed()\n+     */\n+    public const ADMIN_RESOURCE = 'Magento_MediaGalleryUiApi::delete_folder';\n+\n     /**\n      * @var \\Magento\\Framework\\Controller\\Result\\JsonFactory\n      */\ndiff --git a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php\nindex 1ef6231611124..5c8ac2a9a8351 100644\n--- a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php\n+++ b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/NewFolder.php\n@@ -15,5 +15,12 @@\n class NewFolder extends \\Magento\\Cms\\Controller\\Adminhtml\\Wysiwyg\\Images implements HttpPostActionInterface\n {\n+    /**\n+     * Authorization for creating folder\n+     *\n+     * @see _isAllowed()\n+     */\n+    public const ADMIN_RESOURCE = 'Magento_MediaGalleryUiApi::create_folder';\n+\n     /**\n      * @var \\Magento\\Framework\\Controller\\Result\\JsonFactory\n      */\ndiff --git a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php\nindex c7b0752e52181..5ab5c5e22f8fe 100644\n--- a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php\n+++ b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/OnInsert.php\n@@ -15,6 +15,13 @@\n \n class OnInsert extends Images implements HttpPostActionInterface\n {\n+    /**\n+     * Authorization for inserting files\n+     *\n+     * @see _isAllowed()\n+     */\n+    public const ADMIN_RESOURCE = 'Magento_MediaGalleryUiApi::insert_assets';\n+\n     /**\n      * @var RawFactory\n      */\ndiff --git a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php\nindex aa1964152e0c3..c28a2248dae42 100644\n--- a/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php\n+++ b/vendor/magento/module-cms/Controller/Adminhtml/Wysiwyg/Images/Upload.php\n@@ -18,5 +18,12 @@\n class Upload extends \\Magento\\Cms\\Controller\\Adminhtml\\Wysiwyg\\Images implements HttpPostActionInterface\n {\n+    /**\n+     * Authorization for uploading files\n+     *\n+     * @see _isAllowed()\n+     */\n+    public const ADMIN_RESOURCE = 'Magento_MediaGalleryUiApi::upload_assets';\n+\n     /**\n      * @var \\Magento\\Framework\\Controller\\Result\\JsonFactory\n      */\ndiff --git a/vendor/magento/module-cms/etc/module.xml b/vendor/magento/module-cms/etc/module.xml\nindex d3fc2846217d9..50953d37fe93e 100644\n--- a/vendor/magento/module-cms/etc/module.xml\n+++ b/vendor/magento/module-cms/etc/module.xml\n@@ -11,6 +11,7 @@\n             \n             \n             \n+            \n         \n     \n \ndiff --git a/vendor/magento/module-review/Controller/Adminhtml/Product/Save.php b/vendor/magento/module-review/Controller/Adminhtml/Product/Save.php\nindex a7a0c96b7e48f..8c36f33eac47d 100644\n--- a/vendor/magento/module-review/Controller/Adminhtml/Product/Save.php\n+++ b/vendor/magento/module-review/Controller/Adminhtml/Product/Save.php\n@@ -37,6 +37,7 @@ public function execute()\n                 $this-&gt;messageManager-&gt;addErrorMessage(__('The review was removed by another user or does not exist.'));\n             } else {\n                 try {\n+                    unset($data['review_id']);\n                     $review-&gt;addData($data)-&gt;save();\n \n                     $arrRatingId = $this-&gt;getRequest()-&gt;getParam('ratings', []);\ndiff --git a/lib/web/underscore.js b/lib/web/underscore.js\nindex 3ce9962341b9d..01ff20f6371bd 100644\n--- a/lib/web/underscore.js\n+++ b/lib/web/underscore.js\n@@ -7,13 +7,13 @@\n                 exports.noConflict = function () { global._ = current; return exports; };\n             }()));\n }(this, (function () {\n-    //     Underscore.js 1.13.6\n+    //     Underscore.js 1.13.8\n     //     https://underscorejs.org\n-    //     (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters &amp; Editors\n+    //     (c) 2009-2026 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters &amp; Editors\n     //     Underscore may be freely distributed under the MIT license.\n \n     // Current version.\n-    var VERSION = '1.13.6';\n+    var VERSION = '1.13.8';\n \n     // Establish the root object, `window` (`self`) in the browser, `global`\n     // on the server, or `this` in some virtual machines. We use `self`\n@@ -150,8 +150,11 @@\n     // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n     // In IE 11, the most common among them, this problem also applies to\n     // `Map`, `WeakMap` and `Set`.\n-    var hasStringTagBug = (\n-            supportsDataView &amp;&amp; hasObjectTag(new DataView(new ArrayBuffer(8)))\n+    // Also, there are cases where an application can override the native\n+    // `DataView` object, in cases like that we can't use the constructor\n+    // safely and should just rely on alternate `DataView` checks\n+    var hasDataViewBug = (\n+            supportsDataView &amp;&amp; (!/\\[native code\\]/.test(String(DataView)) || hasObjectTag(new DataView(new ArrayBuffer(8))))\n         ),\n         isIE11 = (typeof Map !== 'undefined' &amp;&amp; hasObjectTag(new Map));\n \n@@ -159,11 +162,13 @@\n \n     // In IE 10 - Edge 13, we need a different heuristic\n     // to determine whether an object is a `DataView`.\n-    function ie10IsDataView(obj) {\n+    // Also, in cases where the native `DataView` is\n+    // overridden we can't rely on the tag itself.\n+    function alternateIsDataView(obj) {\n         return obj != null &amp;&amp; isFunction$1(obj.getInt8) &amp;&amp; isArrayBuffer(obj.buffer);\n     }\n \n-    var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);\n+    var isDataView$1 = (hasDataViewBug ? alternateIsDataView : isDataView);\n \n     // Is a given value an array?\n     // Delegates to ECMA5's native `Array.isArray`.\n@@ -352,131 +357,157 @@\n     // We use this string twice, so give it a name for minification.\n     var tagDataView = '[object DataView]';\n \n-    // Internal recursive comparison function for `_.isEqual`.\n-    function eq(a, b, aStack, bStack) {\n-        // Identical objects are equal. `0 === -0`, but they aren't identical.\n-        // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n-        if (a === b) return a !== 0 || 1 / a === 1 / b;\n-        // `null` or `undefined` only equal to itself (strict comparison).\n-        if (a == null || b == null) return false;\n-        // `NaN`s are equivalent, but non-reflexive.\n-        if (a !== a) return b !== b;\n-        // Exhaust primitive checks\n-        var type = typeof a;\n-        if (type !== 'function' &amp;&amp; type !== 'object' &amp;&amp; typeof b != 'object') return false;\n-        return deepEq(a, b, aStack, bStack);\n-    }\n-\n-    // Internal recursive comparison function for `_.isEqual`.\n-    function deepEq(a, b, aStack, bStack) {\n-        // Unwrap any wrapped objects.\n-        if (a instanceof _$1) a = a._wrapped;\n-        if (b instanceof _$1) b = b._wrapped;\n-        // Compare `[[Class]]` names.\n-        var className = toString.call(a);\n-        if (className !== toString.call(b)) return false;\n-        // Work around a bug in IE 10 - Edge 13.\n-        if (hasStringTagBug &amp;&amp; className == '[object Object]' &amp;&amp; isDataView$1(a)) {\n-            if (!isDataView$1(b)) return false;\n-            className = tagDataView;\n-        }\n-        switch (className) {\n-            // These types are compared by value.\n-            case '[object RegExp]':\n-            // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n-            case '[object String]':\n-                // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n-                // equivalent to `new String(\"5\")`.\n-                return '' + a === '' + b;\n-            case '[object Number]':\n-                // `NaN`s are equivalent, but non-reflexive.\n-                // Object(NaN) is equivalent to NaN.\n-                if (+a !== +a) return +b !== +b;\n-                // An `egal` comparison is performed for other numeric values.\n-                return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n-            case '[object Date]':\n-            case '[object Boolean]':\n-                // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n-                // millisecond representations. Note that invalid dates with millisecond representations\n-                // of `NaN` are not equivalent.\n-                return +a === +b;\n-            case '[object Symbol]':\n-                return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n-            case '[object ArrayBuffer]':\n-            case tagDataView:\n-                // Coerce to typed array so we can fall through.\n-                return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);\n-        }\n+    // Perform a deep comparison to check if two objects are equal.\n+    function isEqual(a, b) {\n+        // Keep track of which pairs of values need to be compared. We will be\n+        // trampolining on this stack instead of using function recursion.\n+        // (CVE-2026-27601)\n+        var todo = [{a: a, b: b}];\n+        // Initializing stacks of traversed objects for cycle detection.\n+        var aStack = [], bStack = [];\n+\n+        // Keep traversing pairs until there is nothing left to compare.\n+        while (todo.length) {\n+            var frame = todo.pop();\n+            // As a special case, a single `true` on the todo means that we can\n+            // unwind the cycle detection stacks.\n+            if (frame === true) {\n+                // Remove the first object from the stack of traversed objects.\n+                aStack.pop();\n+                bStack.pop();\n+                continue;\n+            }\n+            a = frame.a;\n+            b = frame.b;\n \n-        var areArrays = className === '[object Array]';\n-        if (!areArrays &amp;&amp; isTypedArray$1(a)) {\n-            var byteLength = getByteLength(a);\n-            if (byteLength !== getByteLength(b)) return false;\n-            if (a.buffer === b.buffer &amp;&amp; a.byteOffset === b.byteOffset) return true;\n-            areArrays = true;\n-        }\n-        if (!areArrays) {\n-            if (typeof a != 'object' || typeof b != 'object') return false;\n-\n-            // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n-            // from different frames are.\n-            var aCtor = a.constructor, bCtor = b.constructor;\n-            if (aCtor !== bCtor &amp;&amp; !(isFunction$1(aCtor) &amp;&amp; aCtor instanceof aCtor &amp;&amp;\n-                    isFunction$1(bCtor) &amp;&amp; bCtor instanceof bCtor)\n-                &amp;&amp; ('constructor' in a &amp;&amp; 'constructor' in b)) {\n+            // Identical objects are equal. `0 === -0`, but they aren't identical.\n+            // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n+            if (a === b) {\n+                if (a !== 0 || 1 / a === 1 / b) continue;\n                 return false;\n             }\n-        }\n-        // Assume equality for cyclic structures. The algorithm for detecting cyclic\n-        // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n-\n-        // Initializing stack of traversed objects.\n-        // It's done here since we only need them for objects and arrays comparison.\n-        aStack = aStack || [];\n-        bStack = bStack || [];\n-        var length = aStack.length;\n-        while (length--) {\n-            // Linear search. Performance is inversely proportional to the number of\n-            // unique nested structures.\n-            if (aStack[length] === a) return bStack[length] === b;\n-        }\n+            // `null` or `undefined` only equal to itself (strict comparison).\n+            if (a == null || b == null) return false;\n+            // `NaN`s are equivalent, but non-reflexive.\n+            if (a !== a) {\n+                if (b !== b) continue;\n+                return false;\n+            }\n+            // Exhaust primitive checks\n+            var type = typeof a;\n+            if (type !== 'function' &amp;&amp; type !== 'object' &amp;&amp; typeof b != 'object') return false;\n+\n+            // Internal recursive comparison function for `_.isEqual`.\n+            // Unwrap any wrapped objects.\n+            if (a instanceof _$1) a = a._wrapped;\n+            if (b instanceof _$1) b = b._wrapped;\n+            // Compare `[[Class]]` names.\n+            var className = toString.call(a);\n+            if (className !== toString.call(b)) return false;\n+            // Work around a bug in IE 10 - Edge 13.\n+            if (hasDataViewBug &amp;&amp; className == '[object Object]' &amp;&amp; isDataView$1(a)) {\n+                if (!isDataView$1(b)) return false;\n+                className = tagDataView;\n+            }\n+            switch (className) {\n+                // These types are compared by value.\n+                case '[object RegExp]':\n+                // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n+                case '[object String]':\n+                    // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n+                    // equivalent to `new String(\"5\")`.\n+                    if ('' + a === '' + b) continue;\n+                    return false;\n+                case '[object Number]':\n+                    todo.push({a: +a, b: +b});\n+                    continue;\n+                case '[object Date]':\n+                case '[object Boolean]':\n+                    // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n+                    // millisecond representations. Note that invalid dates with millisecond representations\n+                    // of `NaN` are not equivalent.\n+                    if (+a === +b) continue;\n+                    return false;\n+                case '[object Symbol]':\n+                    if (SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b)) continue;\n+                    return false;\n+                case '[object ArrayBuffer]':\n+                case tagDataView:\n+                    // Coerce to typed array so we can fall through.\n+                    todo.push({a: toBufferView(a), b: toBufferView(b)});\n+                    continue;\n+            }\n+\n+            var areArrays = className === '[object Array]';\n+            if (!areArrays &amp;&amp; isTypedArray$1(a)) {\n+                var byteLength = getByteLength(a);\n+                if (byteLength !== getByteLength(b)) return false;\n+                if (a.buffer === b.buffer &amp;&amp; a.byteOffset === b.byteOffset) continue;\n+                areArrays = true;\n+            }\n+            if (!areArrays) {\n+                if (typeof a != 'object' || typeof b != 'object') return false;\n+\n+                // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n+                // from different frames are.\n+                var aCtor = a.constructor, bCtor = b.constructor;\n+                if (aCtor !== bCtor &amp;&amp; !(isFunction$1(aCtor) &amp;&amp; aCtor instanceof aCtor &amp;&amp;\n+                        isFunction$1(bCtor) &amp;&amp; bCtor instanceof bCtor)\n+                    &amp;&amp; ('constructor' in a &amp;&amp; 'constructor' in b)) {\n+                    return false;\n+                }\n+            }\n \n-        // Add the first object to the stack of traversed objects.\n-        aStack.push(a);\n-        bStack.push(b);\n+            // Assume equality for cyclic structures. The algorithm for detecting cyclic\n+            // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n \n-        // Recursively compare objects and arrays.\n-        if (areArrays) {\n-            // Compare array lengths to determine if a deep comparison is necessary.\n-            length = a.length;\n-            if (length !== b.length) return false;\n-            // Deep compare the contents, ignoring non-numeric properties.\n+            var length = aStack.length;\n             while (length--) {\n-                if (!eq(a[length], b[length], aStack, bStack)) return false;\n+                // Linear search. Performance is inversely proportional to the number of\n+                // unique nested structures.\n+                if (aStack[length] === a) {\n+                    // Cycle detected. Break out of the inner loop and continue the outer\n+                    // loop. Step 1:\n+                    if (bStack[length] === b) break;\n+                    return false;\n+                }\n             }\n-        } else {\n-            // Deep compare objects.\n-            var _keys = keys(a), key;\n-            length = _keys.length;\n-            // Ensure that both objects contain the same number of properties before comparing deep equality.\n-            if (keys(b).length !== length) return false;\n-            while (length--) {\n-                // Deep compare each member\n-                key = _keys[length];\n-                if (!(has$1(b, key) &amp;&amp; eq(a[key], b[key], aStack, bStack))) return false;\n+            // Step 2, use `length` to verify whether we detected a cycle:\n+            if (length &gt;= 0) continue;\n+\n+            // Add the first object to the stack of traversed objects.\n+            aStack.push(a);\n+            bStack.push(b);\n+            // Remember to remove them again after the recursion below.\n+            todo.push(true);\n+\n+            // Recursively compare objects and arrays.\n+            if (areArrays) {\n+                // Compare array lengths to determine if a deep comparison is necessary.\n+                length = a.length;\n+                if (length !== b.length) return false;\n+                // Deep compare the contents, ignoring non-numeric properties.\n+                while (length--) {\n+                    todo.push({a: a[length], b: b[length]});\n+                }\n+            } else {\n+                // Deep compare objects.\n+                var _keys = keys(a), key;\n+                length = _keys.length;\n+                // Ensure that both objects contain the same number of properties before comparing deep equality.\n+                if (keys(b).length !== length) return false;\n+                while (length--) {\n+                    // Deep compare each member\n+                    key = _keys[length];\n+                    if (!has$1(b, key)) return false;\n+                    todo.push({a: a[key], b: b[key]});\n+                }\n             }\n         }\n-        // Remove the first object from the stack of traversed objects.\n-        aStack.pop();\n-        bStack.pop();\n+        // We made it to the end and found no differences.\n         return true;\n     }\n \n-    // Perform a deep comparison to check if two objects are equal.\n-    function isEqual(a, b) {\n-        return eq(a, b);\n-    }\n-\n     // Retrieve all the enumerable property names of an object.\n     function allKeys(obj) {\n         if (!isObject(obj)) return [];\n@@ -1027,25 +1058,30 @@\n     var isArrayLike = createSizePropertyCheck(getLength);\n \n     // Internal implementation of a recursive `flatten` function.\n-    function flatten$1(input, depth, strict, output) {\n-        output = output || [];\n-        if (!depth &amp;&amp; depth !== 0) {\n-            depth = Infinity;\n-        } else if (depth &lt;= 0) {\n-            return output.concat(input);\n-        }\n-        var idx = output.length;\n-        for (var i = 0, length = getLength(input); i &lt; length; i++) {\n-            var value = input[i];\n-            if (isArrayLike(value) &amp;&amp; (isArray(value) || isArguments$1(value))) {\n+    function flatten$1(input, depth, strict) {\n+        if (!depth &amp;&amp; depth !== 0) depth = Infinity;\n+        // We will be avoiding recursive calls because this could be exploited to\n+        // cause a stack overflow (CVE-2026-27601). Instead, we \"trampoline\" on an\n+        // explicit stack.\n+        var output = [], idx = 0, i = 0, length = getLength(input) || 0, stack = [];\n+        while (true) {\n+            if (i &gt;= length) {\n+                if (!stack.length) break;\n+                var frame = stack.pop();\n+                i = frame.i;\n+                input = frame.v;\n+                length = getLength(input);\n+                continue;\n+            }\n+            var value = input[i++];\n+            if (stack.length &gt;= depth) {\n+                output[idx++] = value;\n+            } else if (isArrayLike(value) &amp;&amp; (isArray(value) || isArguments$1(value))) {\n                 // Flatten current level of array or arguments object.\n-                if (depth &gt; 1) {\n-                    flatten$1(value, depth - 1, strict, output);\n-                    idx = output.length;\n-                } else {\n-                    var j = 0, len = value.length;\n-                    while (j &lt; len) output[idx++] = value[j++];\n-                }\n+                stack.push({i: i, v: input});\n+                i = 0;\n+                input = value;\n+                length = getLength(input);\n             } else if (!strict) {\n                 output[idx++] = value;\n             }\ndiff --git a/vendor/magento/module-customer/Controller/Account/Edit.php b/vendor/magento/module-customer/Controller/Account/Edit.php\nindex 2bd4862e42390..3e8a3ba3ae4d5 100644\n--- a/vendor/magento/module-customer/Controller/Account/Edit.php\n+++ b/vendor/magento/module-customer/Controller/Account/Edit.php\n@@ -5,11 +5,14 @@\n  */\n namespace Magento\\Customer\\Controller\\Account;\n \n+use Magento\\Customer\\Api\\CustomerMetadataInterface;\n use Magento\\Customer\\Api\\CustomerRepositoryInterface;\n+use Magento\\Customer\\Model\\Metadata\\FormFactory;\n use Magento\\Customer\\Model\\Session;\n use Magento\\Framework\\Api\\DataObjectHelper;\n use Magento\\Framework\\App\\Action\\Context;\n use Magento\\Framework\\App\\Action\\HttpGetActionInterface;\n+use Magento\\Framework\\App\\ObjectManager;\n use Magento\\Framework\\View\\Result\\PageFactory;\n \n class Edit extends \\Magento\\Customer\\Controller\\AbstractAccount implements HttpGetActionInterface\n@@ -34,24 +37,32 @@ class Edit extends \\Magento\\Customer\\Controller\\AbstractAccount implements HttpG\n      */\n     protected $resultPageFactory;\n \n+    /**\n+     * @var FormFactory\n+     */\n+    private $formFactory;\n+\n     /**\n      * @param Context $context\n      * @param Session $customerSession\n      * @param PageFactory $resultPageFactory\n      * @param CustomerRepositoryInterface $customerRepository\n      * @param DataObjectHelper $dataObjectHelper\n+     * @param FormFactory|null $formFactory\n      */\n     public function __construct(\n         Context $context,\n         Session $customerSession,\n         PageFactory $resultPageFactory,\n         CustomerRepositoryInterface $customerRepository,\n-        DataObjectHelper $dataObjectHelper\n+        DataObjectHelper $dataObjectHelper,\n+        ?FormFactory $formFactory = null\n     ) {\n         $this-&gt;session = $customerSession;\n         $this-&gt;resultPageFactory = $resultPageFactory;\n         $this-&gt;customerRepository = $customerRepository;\n         $this-&gt;dataObjectHelper = $dataObjectHelper;\n+        $this-&gt;formFactory = $formFactory ?: ObjectManager::getInstance()-&gt;get(FormFactory::class);\n         parent::__construct($context);\n     }\n \n@@ -74,11 +85,19 @@ public function execute()\n         $customerId = $this-&gt;session-&gt;getCustomerId();\n         $customerDataObject = $this-&gt;customerRepository-&gt;getById($customerId);\n         if (!empty($data)) {\n+            $customerForm = $this-&gt;formFactory-&gt;create(\n+                CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER,\n+                EditPost::FORM_DATA_EXTRACTOR_CODE\n+            );\n+            $data = array_intersect_key($data, $customerForm-&gt;getAllowedAttributes());\n+\n             $this-&gt;dataObjectHelper-&gt;populateWithArray(\n                 $customerDataObject,\n                 $data,\n                 \\Magento\\Customer\\Api\\Data\\CustomerInterface::class\n             );\n+\n+            $customerDataObject-&gt;setId($customerId);\n         }\n \n         $this-&gt;session-&gt;setCustomerData($customerDataObject);\ndiff --git a/vendor/bin/patch-status b/vendor/bin/patch-status\nindex cbd34a4..a160fdd 100755\n--- a/vendor/bin/patch-status\n+++ b/vendor/bin/patch-status\n@@ -1,3 +1,3 @@\n-#!/usr/bin/env php\n-$this-&gt;baseVersion,'installed_components'=&gt;$this-&gt;installedComponents,'applied_patches'=&gt;$this-&gt;appliedPatches,'missing_patches'=&gt;$this-&gt;missingPatches,'unknown_patches'=&gt;$this-&gt;unknownPatches,'vulnerability_status'=&gt;$this-&gt;vulnerabilityStatus,'registry_source'=&gt;$this-&gt;registrySource,'warnings'=&gt;$this-&gt;warnings,];}}namespace Magento\\PatchStatus\\Util;class UrlValidator{public static function isValid(string $url):bool{if(filter_var($url,FILTER_VALIDATE_URL)===false){return false;}$scheme=parse_url($url,PHP_URL_SCHEME);return is_string($scheme)&amp;&amp;strtolower($scheme)==='https';}}namespace Magento\\PatchStatus\\Credential;class ComposerCredentialResolver{public function resolve(string $magentoRoot,string $host):?array{$creds=$this-&gt;readComposerAuthEnv($host);if($creds!==null){return $creds;}$paths=array_merge([rtrim($magentoRoot,'/').'/auth.json'],$this-&gt;globalAuthJsonPaths(),);foreach($paths as $path){$creds=$this-&gt;readCredentials($path,$host);if($creds!==null){return $creds;}}$creds=$this-&gt;promptCredentials($host);if($creds!==null){$this-&gt;offerToSaveCredentials($magentoRoot,$creds,$host);return $creds;}return null;}protected function globalAuthJsonPaths():array{$composerHome=getenv('COMPOSER_HOME');if($composerHome!==false&amp;&amp;$composerHome!==''){return[rtrim($composerHome,'/').'/auth.json'];}$home=getenv('HOME');if($home!==false&amp;&amp;$home!==''){return[rtrim($home,'/').'/.composer/auth.json'];}return[];}protected function promptCredentials(string $host):?array{$isTty=function_exists('stream_isatty')?stream_isatty(STDIN):(function_exists('posix_isatty')?posix_isatty(STDIN):false);if(!$isTty){return null;}fwrite(STDERR,\"\\n{$host} credentials required.\\n\");fwrite(STDERR,'Username (Composer public key): ');$username=trim((string)fgets(STDIN));fwrite(STDERR,'Password (Composer private key): ');$canHideInput=function_exists('shell_exec');if($canHideInput){shell_exec('stty -echo');}try{$password=trim((string)fgets(STDIN));}finally{if($canHideInput){shell_exec('stty echo');}}fwrite(STDERR,\"\\n\");if($username===''||$password===''){return null;}return['username'=&gt;$username,'password'=&gt;$password];}protected function offerToSaveCredentials(string $magentoRoot,array $credentials,string $host):void{$isTty=function_exists('stream_isatty')?stream_isatty(STDIN):(function_exists('posix_isatty')?posix_isatty(STDIN):false);if(!$isTty){return;}$authJsonPath=rtrim($magentoRoot,'/').'/auth.json';$action=file_exists($authJsonPath)?'Update':'Create';fwrite(STDERR,\"{$action} {$authJsonPath} with these credentials? [Y/n]: \");$rawResponse=fgets(STDIN);if($rawResponse===false){return;}$response=strtolower(trim($rawResponse));if($response!=='n'&amp;&amp;$response!=='no'){$this-&gt;saveCredentialsToAuthJson($authJsonPath,$credentials,$host);}}protected function saveCredentialsToAuthJson(string $path,array $credentials,string $host):void{$data=[];if(file_exists($path)){$existing=@file_get_contents($path);if($existing!==false){$decoded=json_decode($existing,true);if(is_array($decoded)){$data=$decoded;}}}if(!is_array($data['http-basic']??null)){$data['http-basic']=[];}$data['http-basic'][$host]=['username'=&gt;$credentials['username'],'password'=&gt;$credentials['password'],];$encoded=json_encode($data,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);if($encoded===false){return;}$prevUmask=umask(0177);$written=false;try{$written=@file_put_contents($path,$encoded.\"\\n\",LOCK_EX)!==false;}finally{umask($prevUmask);}if($written){@chmod($path,0600);}}private function readComposerAuthEnv(string $host):?array{$raw=getenv('COMPOSER_AUTH');if($raw===false||$raw===''){return null;}$data=json_decode($raw,true);if(!is_array($data)){return null;}return $this-&gt;extractCredentials($data,$host);}private function readCredentials(string $path,string $host):?array{if(!file_exists($path)){return null;}$content=@file_get_contents($path);if($content===false){return null;}$data=json_decode($content,true);if(!is_array($data)){return null;}return $this-&gt;extractCredentials($data,$host);}private function extractCredentials(array $data,string $host):?array{if(!is_array($data['http-basic']??null)){return null;}$username=$data['http-basic'][$host]['username']??null;$password=$data['http-basic'][$host]['password']??null;if(!is_string($username)||$username===''||!is_string($password)||$password===''){return null;}return['username'=&gt;$username,'password'=&gt;$password];}}namespace Magento\\PatchStatus\\Fetcher;class PatchFetcher{public const DIFF_BASE_URL='https://repo.magento.com/patch';private const CACHE_DIR='var/patch_metadata/.patch_diffs';private const TIMEOUT=3;protected int $lastHttpStatus=0;public function __construct(private readonly string $magentoRoot,private readonly string $patchBaseUrl,private readonly?array $credentials=null,private readonly bool $noCache=false,){}public function hasCredentials():bool{return($this-&gt;credentials['username']??'')!==''&amp;&amp;($this-&gt;credentials['password']??'')!=='';}public function fetch(string $patchId,string $patchFile,string $expectedSha256,bool $authRequired=false,array&amp;$warnings=[],):?string{if(!$this-&gt;isSafePatchFileName($patchFile)){return null;}$cachePath=rtrim($this-&gt;magentoRoot,'/').'/'.self::CACHE_DIR.'/'.$patchFile;if(!$this-&gt;noCache&amp;&amp;file_exists($cachePath)){$content=@file_get_contents($cachePath);if($content!==false&amp;&amp;$this-&gt;verifySha256($content,$expectedSha256)){return $content;}@unlink($cachePath);}if($authRequired&amp;&amp;!$this-&gt;hasCredentials()){$warnings[]=\"Patch {$patchId} requires authentication. Set credentials via COMPOSER_AUTH or auth.json.\";return null;}$base=rtrim($this-&gt;patchBaseUrl,'/');$url=$authRequired?\"{$base}/auth/{$patchFile}\":\"{$base}/{$patchFile}\";$creds=$authRequired?$this-&gt;credentials:null;$content=$this-&gt;fetchRemote($url,$creds);if($content===false){$status=$this-&gt;lastHttpStatus;if($status&gt;=400){$suffix=$authRequired?\" Check credentials (COMPOSER_AUTH / auth.json).\":\"\";$warnings[]=\"Could not fetch patch {$patchId} (HTTP {$status}).{$suffix}\";}elseif($authRequired){$warnings[]=\"Could not fetch or verify patch {$patchId}. Check network connectivity and credentials (COMPOSER_AUTH / auth.json).\";}else{$warnings[]=\"Could not fetch patch file for {$patchId}.\";}return null;}if(!$this-&gt;verifySha256($content,$expectedSha256)){$warnings[]=\"SHA-256 verification failed for patch {$patchId}; discarding download.\";return null;}$this-&gt;writeCache($cachePath,$content);return $content;}protected function fetchRemote(string $url,?array $credentials=null):string|false{$headers=[];if(($credentials['username']??'')!==''&amp;&amp;($credentials['password']??'')!==''){$encoded=base64_encode($credentials['username'].':'.$credentials['password']);$headers[]='Authorization: Basic '.$encoded;}$context=stream_context_create(['http'=&gt;['timeout'=&gt;self::TIMEOUT,'ignore_errors'=&gt;true,'user_agent'=&gt;'Adobe-Commerce-PatchStatus/'.\\Magento\\PatchStatus\\PatchStatusCommand::VERSION,'header'=&gt;implode(\"\\r\\n\",$headers),],'ssl'=&gt;['verify_peer'=&gt;true,'verify_peer_name'=&gt;true,],]);$this-&gt;lastHttpStatus=0;$content=@file_get_contents($url,context:$context);if($content!==false){$status=$this-&gt;parseResponseStatus($http_response_header??[]);$this-&gt;lastHttpStatus=$status;if($status&gt;=400){return false;}}return $content;}private function parseResponseStatus(array $responseHeaders):int{$status=0;foreach($responseHeaders as $header){if(preg_match('#^HTTP/\\S+ (\\d{3})#',$header,$m)){$status=(int)$m[1];}}return $status;}private function verifySha256(string $content,string $expectedSha256):bool{return hash('sha256',$content)===strtolower($expectedSha256);}private function writeCache(string $path,string $content):void{$dir=dirname($path);if(!is_dir($dir)){@mkdir($dir,0775,true);}@file_put_contents($path,$content,LOCK_EX);}private function isSafePatchFileName(string $name):bool{return(bool)preg_match('/\\A[A-Za-z0-9][A-Za-z0-9_\\-]*\\.(?:patch|diff)\\z/',$name)&amp;&amp;basename($name)===$name;}}namespace Magento\\PatchStatus\\Detector;final class ComposerDetector{private const BASE_PACKAGES=['magento/product-enterprise-edition','magento/product-community-edition','magento/magento2-base',];public function __construct(private readonly string $magentoRoot){}public function detect():array{$lockFile=rtrim($this-&gt;magentoRoot,'/').'/composer.lock';$empty=['base_version'=&gt;null,'release_line'=&gt;null,'installed_packages'=&gt;[],'method'=&gt;'none','warnings'=&gt;[]];if(!file_exists($lockFile)){return $empty;}$raw=file_get_contents($lockFile);if($raw===false){return array_merge($empty,['warnings'=&gt;['composer.lock exists but could not be read']]);}$lock=json_decode($raw,true);if(!is_array($lock)){return array_merge($empty,['warnings'=&gt;['composer.lock could not be parsed as JSON']]);}$packages=array_merge($lock['packages']??[],$lock['packages-dev']??[]);$installedPackages=[];foreach($packages as $pkg){$installedPackages[$pkg['name']??'']=$pkg['version']??'';}$baseVersion=null;foreach(self::BASE_PACKAGES as $pkg){if(isset($installedPackages[$pkg])){$baseVersion=ltrim($installedPackages[$pkg],'v');break;}}$warnings=[];$method='composer';if($baseVersion===null){$warnings[]='No recognized Commerce base package found in composer.lock';$method='none';}$releaseLine=$baseVersion!==null?$this-&gt;extractReleaseLine($baseVersion):null;return['base_version'=&gt;$baseVersion,'release_line'=&gt;$releaseLine,'installed_packages'=&gt;$installedPackages,'method'=&gt;$method,'warnings'=&gt;$warnings,];}private function extractReleaseLine(string $version):string{if(preg_match('/^(\\d+\\.\\d+\\.\\d+)/',$version,$m)){return $m[1];}return $version;}}namespace Magento\\PatchStatus\\Detector;use Magento\\PatchStatus\\Fetcher\\PatchFetcher;class DryRunDetector{public function __construct(private readonly string $magentoRoot,private readonly array $registry,private readonly PatchFetcher $fetcher,){}public static function isPatchBinaryAvailable():bool{exec('patch --version',$output,$code);return $code===0;}public function detect(array $applicablePatchIds):array{$statuses=[];$warnings=[];$unknownLogs=[];$root=rtrim($this-&gt;magentoRoot,'/');if(!$this-&gt;isTempDirWritable()){throw new \\RuntimeException(\"Temp directory \".sys_get_temp_dir().\" is not writable \u2014 check permissions. Aborting.\");}foreach($applicablePatchIds as $patchId){$entry=$this-&gt;registry['patches'][$patchId]??null;if($entry===null){continue;}$patchFile=$entry['file_name']??null;$patchSha256=$entry['sha256']??null;if($patchFile===null||$patchSha256===null){$statuses[$patchId]='unknown';$warnings[]=\"No file_name or sha256 for {$patchId}\";continue;}$authRequired=!empty($entry['entitlements']??[]);$rawContent=$this-&gt;fetcher-&gt;fetch($patchId,$patchFile,$patchSha256,$authRequired,$warnings);if($rawContent===null){$statuses[$patchId]='unknown';continue;}$diffContent=$rawContent;$descendants=$this-&gt;getDescendants($patchId,$applicablePatchIds);$prerequisites=$this-&gt;getPrerequisites($patchId,$applicablePatchIds,$warnings);[$overlappingDescDiffs,$overlappingPrereqDiffs,$missingDepIds]=$this-&gt;resolveDependencyDiffs($diffContent,$descendants,$prerequisites);if(!empty($missingDepIds)){$warnings[]='descendant diffs unavailable for '.implode(', ',$missingDepIds).\"; dry-run for {$patchId} may be inaccurate\";}$affectedFiles=$this-&gt;collectAffectedFiles($diffContent,$overlappingDescDiffs,$overlappingPrereqDiffs);$tmpDiff=sys_get_temp_dir().'/patch_status_'.$this-&gt;sanitizeForFilename($patchId).'_'.uniqid().'.diff';file_put_contents($tmpDiff,$diffContent);$tmpDirToClean=null;$descendantSanitizationFailed=false;try{$workDir=$root;if(!empty($overlappingDescDiffs)){$tmpDirToClean=$this-&gt;createTempWorkDir($root,$patchId,$affectedFiles);$revertWarn=$this-&gt;revertDescendantsIn($tmpDirToClean,$patchId,$overlappingDescDiffs);if($revertWarn!==null){$warnings[]=$revertWarn;$this-&gt;rmdirRecursive($tmpDirToClean);$tmpDirToClean=null;$descendantSanitizationFailed=true;}else{$workDir=$tmpDirToClean;}}$fwd=$this-&gt;runPatch($tmpDiff,$workDir,reverse:false,dryRun:true);$rev=$this-&gt;runPatch($tmpDiff,$workDir,reverse:true,dryRun:true);$status=$this-&gt;classify($fwd['exit'],$rev['exit']);if($status==='unknown'&amp;&amp;!empty($overlappingPrereqDiffs)&amp;&amp;!$descendantSanitizationFailed){if($tmpDirToClean===null){$tmpDirToClean=$this-&gt;createTempWorkDir($root,$patchId,$affectedFiles);$workDir=$tmpDirToClean;}$applyWarn=$this-&gt;forwardApplyPrereqsIn($tmpDirToClean,$patchId,$overlappingPrereqDiffs);if($applyWarn!==null){$warnings[]=$applyWarn;}else{$fwd=$this-&gt;runPatch($tmpDiff,$workDir,reverse:false,dryRun:true);$rev=$this-&gt;runPatch($tmpDiff,$workDir,reverse:true,dryRun:true);$status=$this-&gt;classify($fwd['exit'],$rev['exit']);}}$statuses[$patchId]=$status;if($status==='unknown'){$unknownLogs[$patchId]=\"FWD:\\n{$fwd['output']}\\nREV:\\n{$rev['output']}\";}}finally{@unlink($tmpDiff);if($tmpDirToClean!==null){$this-&gt;rmdirRecursive($tmpDirToClean);}}}return['statuses'=&gt;$statuses,'method'=&gt;'dry_run','warnings'=&gt;$warnings,'unknown_logs'=&gt;$unknownLogs,];}private function getDescendants(string $patchId,array $applicablePatchIds):array{$applicableSet=array_flip($applicablePatchIds);$descendants=[];$queue=[$patchId];$visited=[$patchId=&gt;true];while(!empty($queue)){$current=array_shift($queue);foreach($this-&gt;registry['patches']??[]as $id=&gt;$entry){if(!isset($applicableSet[$id])||isset($visited[$id])){continue;}if(in_array($current,$entry['requires']??[],true)){$descendants[]=$id;$visited[$id]=true;$queue[]=$id;}}}return $descendants;}private function getPrerequisites(string $patchId,array $applicablePatchIds,array&amp;$warnings):array{$applicableSet=array_flip($applicablePatchIds);$result=[];$visited=[$patchId=&gt;true];$this-&gt;collectTransitivePrereqs($patchId,$applicableSet,$visited,$result,$warnings);return $result;}private function collectTransitivePrereqs(string $patchId,array $applicableSet,array&amp;$visited,array&amp;$result,array&amp;$warnings):void{$requires=$this-&gt;registry['patches'][$patchId]['requires']??[];foreach($requires as $preId){if(isset($visited[$preId])){continue;}$visited[$preId]=true;if(!isset($this-&gt;registry['patches'][$preId])){$warnings[]=\"Registry entry '{$patchId}' requires unknown patch '{$preId}'; skipping.\";continue;}if(!isset($applicableSet[$preId])){continue;}$this-&gt;collectTransitivePrereqs($preId,$applicableSet,$visited,$result,$warnings);$result[]=$preId;}}private function resolveDependencyDiffs(string $diffContent,array $descendants,array $prerequisites):array{$pFiles=array_flip($this-&gt;parseDiffFiles($diffContent));$missingDepIds=[];$overlappingDescDiffs=[];foreach(array_reverse($descendants)as $depId){$diff=$this-&gt;fetchDependencyDiff($depId);if($diff===null){$missingDepIds[]=$depId;continue;}if($this-&gt;diffOverlapsFiles($diff,$pFiles)){$overlappingDescDiffs[$depId]=$diff;}}$overlappingPrereqDiffs=[];foreach($prerequisites as $preId){$diff=$this-&gt;fetchDependencyDiff($preId);if($diff===null){continue;}if($this-&gt;diffOverlapsFiles($diff,$pFiles)){$overlappingPrereqDiffs[$preId]=$diff;}}return[$overlappingDescDiffs,$overlappingPrereqDiffs,$missingDepIds];}private function fetchDependencyDiff(string $patchId):?string{$entry=$this-&gt;registry['patches'][$patchId]??null;if($entry===null){return null;}$authRequired=!empty($entry['entitlements']??[]);$raw=$this-&gt;fetcher-&gt;fetch($patchId,$entry['file_name']??'',$entry['sha256']??'',$authRequired);if($raw===null){return null;}return $raw;}private function diffOverlapsFiles(string $diff,array $fileSet):bool{foreach($this-&gt;parseDiffFiles($diff)as $f){if(isset($fileSet[$f])){return true;}}return false;}private function collectAffectedFiles(string $diffContent,array $overlappingDescDiffs,array $overlappingPrereqDiffs):array{$files=$this-&gt;parseDiffFiles($diffContent);foreach($overlappingDescDiffs as $d){$files=array_merge($files,$this-&gt;parseDiffFiles($d));}foreach($overlappingPrereqDiffs as $d){$files=array_merge($files,$this-&gt;parseDiffFiles($d));}return array_values(array_unique($files));}private function createTempWorkDir(string $root,string $patchId,array $affectedFiles):string{$tmpDir=sys_get_temp_dir().'/patch_status_wd_'.$this-&gt;sanitizeForFilename($patchId).'_'.uniqid();if(!mkdir($tmpDir,0700,true)){throw new \\RuntimeException(\"Could not create temp workdir {$tmpDir}\");}try{foreach($affectedFiles as $relPath){$src=$root.'/'.$relPath;if(!file_exists($src)){continue;}$dst=$tmpDir.'/'.$relPath;$dstDir=dirname($dst);if(!is_dir($dstDir)&amp;&amp;!mkdir($dstDir,0700,true)){throw new \\RuntimeException(\"Could not create directory {$dstDir} in temp workdir\");}if(!copy($src,$dst)){throw new \\RuntimeException(\"Could not copy {$relPath} into temp workdir\");}}}catch(\\RuntimeException $e){$this-&gt;rmdirRecursive($tmpDir);throw $e;}return $tmpDir;}private function revertDescendantsIn(string $workDir,string $patchId,array $overlappingDescDiffs):?string{foreach($overlappingDescDiffs as $depId=&gt;$depDiff){$tmpDepDiff=sys_get_temp_dir().'/patch_status_dep_'.$this-&gt;sanitizeForFilename($depId).'_'.uniqid().'.diff';file_put_contents($tmpDepDiff,$depDiff);$check=$this-&gt;runPatch($tmpDepDiff,$workDir,reverse:true,dryRun:true);if($check['exit']!==0){@unlink($tmpDepDiff);continue;}$result=$this-&gt;runPatch($tmpDepDiff,$workDir,reverse:true,dryRun:false);@unlink($tmpDepDiff);if($result['exit']!==0){return\"Failed to reverse-apply {$depId} when preparing dry-run for {$patchId}; result may be inaccurate\";}}return null;}private function forwardApplyPrereqsIn(string $workDir,string $patchId,array $overlappingPrereqDiffs):?string{foreach($overlappingPrereqDiffs as $preId=&gt;$preDiff){$tmpPreDiff=sys_get_temp_dir().'/patch_status_pre_'.$this-&gt;sanitizeForFilename($preId).'_'.uniqid().'.diff';file_put_contents($tmpPreDiff,$preDiff);$checkRev=$this-&gt;runPatch($tmpPreDiff,$workDir,reverse:true,dryRun:true);if($checkRev['exit']===0){@unlink($tmpPreDiff);continue;}$result=$this-&gt;runPatch($tmpPreDiff,$workDir,reverse:false,dryRun:false);@unlink($tmpPreDiff);if($result['exit']!==0){return\"Failed to forward-apply prerequisite {$preId} when preparing dry-run for {$patchId}; result may be inaccurate\";}}return null;}protected function runPatch(string $diffFile,string $workDir,bool $reverse,bool $dryRun):array{$args=['patch','-p1','--fuzz=0','--batch','--forward'];if($reverse){$args[]='-R';}if($dryRun){$args[]='--dry-run';}$args[]='-d';$args[]=$workDir;$args[]='-i';$args[]=$diffFile;$cmd=implode(' ',array_map('escapeshellarg',$args)).' 2&gt;&amp;1';$descriptors=[0=&gt;['pipe','r'],1=&gt;['pipe','w']];$process=proc_open($cmd,$descriptors,$pipes);if(!is_resource($process)){return['exit'=&gt;-1,'output'=&gt;''];}fclose($pipes[0]);$output=(string)stream_get_contents($pipes[1]);fclose($pipes[1]);$exit=proc_close($process);return['exit'=&gt;$exit,'output'=&gt;trim($output)];}private function classify(int $fwdExit,int $revExit):string{return match(true){$fwdExit!==0&amp;&amp;$revExit===0=&gt;'applied',$fwdExit===0&amp;&amp;$revExit!==0=&gt;'not_applied',default=&gt;'unknown',};}private function parseDiffFiles(string $diffContent):array{$files=[];foreach(explode(\"\\n\",$diffContent)as $line){if(preg_match('#^(?:---|\\+\\+\\+) [ab]/(.+)$#',$line,$m)){$path=trim($m[1]);if($path!=='/dev/null'){$files[$path]=true;}}}return array_keys($files);}private function rmdirRecursive(string $path):void{if(!is_dir($path)){return;}$entries=scandir($path);if($entries===false){return;}foreach($entries as $item){if($item==='.'||$item==='..'){continue;}$full=$path.'/'.$item;is_dir($full)?$this-&gt;rmdirRecursive($full):unlink($full);}rmdir($path);}protected function isTempDirWritable():bool{return is_writable(sys_get_temp_dir());}private function sanitizeForFilename(string $id):string{$sanitized=preg_replace('/[^A-Za-z0-9_.\\-]/','_',$id);if($sanitized!==null){return $sanitized;}return'patch_'.sha1($id);}}namespace Magento\\PatchStatus\\Registry;use Magento\\PatchStatus\\Util\\UrlValidator;class RegistryLoader{public const REMOTE_URL='https://repo.magento.com/patch/patch-registry.json';private const CACHE_FILE='var/patch_metadata/.patch_registry_cache.json';private const CACHE_TTL=3600;private const TIMEOUT=3;public function __construct(private readonly string $magentoRoot,private readonly bool $forceRefresh=false,){}public function load():array{$cachePath=rtrim($this-&gt;magentoRoot,'/').'/'.self::CACHE_FILE;$warnings=[];$cached=$this-&gt;forceRefresh?null:$this-&gt;readCache($cachePath);if($cached!==null&amp;&amp;$this-&gt;cacheAge($cachePath)$cached,'source'=&gt;'cache','warnings'=&gt;[]];}$remote=$this-&gt;fetchRemote($warnings);if($remote!==null){$this-&gt;writeCache($cachePath,$remote);return['registry'=&gt;$remote,'source'=&gt;'remote','warnings'=&gt;[]];}if($this-&gt;forceRefresh){$warnings[]='Could not fetch remote registry and --no-cache was set; aborting.';return['registry'=&gt;[],'source'=&gt;'none','warnings'=&gt;$warnings];}if($cached!==null){$ageHours=(int)round($this-&gt;cacheAge($cachePath)/3600);$warnings[]=sprintf('Could not load remote registry. Using cached registry (%d hour%s old). CVE coverage may be incomplete.',$ageHours,$ageHours===1?'':'s',);return['registry'=&gt;$cached,'source'=&gt;'stale_cache','warnings'=&gt;$warnings];}$warnings[]='Patch registry could not be loaded.';return['registry'=&gt;[],'source'=&gt;'none','warnings'=&gt;$warnings];}protected function fetchRemote(array&amp;$warnings):?array{$context=stream_context_create(['http'=&gt;['timeout'=&gt;self::TIMEOUT,'ignore_errors'=&gt;true,'user_agent'=&gt;'Adobe-Commerce-PatchStatus/'.\\Magento\\PatchStatus\\PatchStatusCommand::VERSION,],'ssl'=&gt;['verify_peer'=&gt;true,'verify_peer_name'=&gt;true,],]);$override=getenv('PATCH_REGISTRY_URL');if($override!==false&amp;&amp;trim($override)!==''){$override=trim($override);if(!UrlValidator::isValid($override)){throw new \\InvalidArgumentException('Environment variable PATCH_REGISTRY_URL contains an invalid URL (must be https).');}$url=$override;}else{$url=self::REMOTE_URL;}$raw=@file_get_contents($url,context:$context);if($raw===false){return null;}$status=$this-&gt;parseHttpStatus($http_response_header??[]);if($status&gt;=400){$warnings[]=sprintf('Remote registry fetch failed (HTTP %d). Check PATCH_REGISTRY_URL (if set) and network connectivity.',$status,);return null;}$data=json_decode($raw,true);if(!is_array($data)){$warnings[]='Remote registry response was not valid JSON; ignoring.';return null;}return $data;}private function parseHttpStatus(array $responseHeaders):int{$status=0;foreach($responseHeaders as $header){if(preg_match('#^HTTP/\\S+ (\\d{3})#',$header,$m)){$status=(int)$m[1];}}return $status;}private function readCache(string $path):?array{if(!file_exists($path)){return null;}$raw=@file_get_contents($path);if($raw===false){return null;}$data=json_decode($raw,true);return is_array($data)?$data:null;}private function writeCache(string $path,array $data):void{$dir=dirname($path);if(!is_dir($dir)){@mkdir($dir,0775,true);}@file_put_contents($path,json_encode($data),LOCK_EX);}private function cacheAge(string $path):int{$mtime=@filemtime($path);return $mtime!==false?(time()-$mtime):PHP_INT_MAX;}}namespace Magento\\PatchStatus\\Resolver;final class PatchResolver{public function __construct(private readonly array $registry){}public function getApplicableIds(array $componentVersions,array $installedAreas):array{$assumeAll=empty($installedAreas)||empty($componentVersions);return array_keys($this-&gt;applicablePatches($componentVersions,$installedAreas,$assumeAll));}public function resolve(array $appliedIds,array $componentVersions,array $installedAreas=[]):array{$warnings=[];$assumeAll=empty($installedAreas)||empty($componentVersions);if($assumeAll){$warnings[]='Installed components could not be detected; all patches treated as applicable. Results may include patches irrelevant to this installation.';}$applicable=$this-&gt;applicablePatches($componentVersions,$installedAreas,$assumeAll);if(empty($applicable)){$versionsStr=implode(', ',array_map(fn($a,$v)=&gt;\"{$a}={$v}\",array_keys($componentVersions),array_values($componentVersions)));$warnings[]=\"No patches found in registry for installed component versions ({$versionsStr})\";return['missing'=&gt;[],'warnings'=&gt;$warnings,];}$appliedSet=array_flip($appliedIds);$missing=[];foreach($applicable as $patchId=&gt;$patch){if(!isset($appliedSet[$patchId])){$missing[]=$patchId;}}return['missing'=&gt;$missing,'warnings'=&gt;$warnings,];}private function applicablePatches(array $componentVersions,array $installedAreas,bool $assumeAll):array{$areaSet=$assumeAll?null:array_flip($installedAreas);$result=[];foreach($this-&gt;registry['patches']??[]as $patchId=&gt;$patch){if($assumeAll){$result[$patchId]=$patch;continue;}$area=$patch['area']??'';if($areaSet!==null&amp;&amp;!isset($areaSet[$area])){continue;}$installedVersion=$componentVersions[$area]??null;if($installedVersion===null){continue;}if(!in_array($installedVersion,$patch['applies_to']??[],true)){continue;}$result[$patchId]=$patch;}return $result;}}namespace Magento\\PatchStatus\\Resolver;final class CveResolver{public function __construct(private readonly array $registry){}public function resolve(array $appliedIds,array $missingIds=[],array $installedAreas=[],array $componentVersions=[],array $unknownIds=[],):array{$appliedSet=array_flip($appliedIds);$unknownSet=array_flip($unknownIds);$areaSet=!empty($installedAreas)?array_flip($installedAreas):null;$byCve=[];foreach($this-&gt;registry['patches']??[]as $patchId=&gt;$patch){$patchArea=$patch['area']??'CE';if(!empty($componentVersions)){$areaIsInstalled=$areaSet===null||isset($areaSet[$patchArea]);if($areaIsInstalled){$installedVersion=$componentVersions[$patchArea]??null;if($installedVersion===null||!in_array($installedVersion,$patch['applies_to']??[],true)){continue;}}}if(isset($appliedSet[$patchId])){$patchStatus='PROTECTED';}elseif($areaSet!==null&amp;&amp;!isset($areaSet[$patchArea])){$patchStatus='NOT_APPLICABLE';}elseif(isset($unknownSet[$patchId])){$patchStatus='UNKNOWN';}else{$patchStatus='VULNERABLE';}foreach($patch['cves']??[]as $cve){$byCve[$cve][$patchStatus]=true;}}$status=[];foreach($byCve as $cve=&gt;$statuses){$status[$cve]=['status'=&gt;match(true){isset($statuses['VULNERABLE'])=&gt;'VULNERABLE',isset($statuses['UNKNOWN'])=&gt;'UNKNOWN',isset($statuses['PROTECTED'])=&gt;'PROTECTED',default=&gt;'NOT_APPLICABLE',},];}ksort($status);return $status;}}namespace Magento\\PatchStatus\\Formatter;use Magento\\PatchStatus\\Model\\PatchStatus;final class JsonFormatter{public function format(PatchStatus $status):string{return json_encode($status-&gt;toArray(),JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES).\"\\n\";}}namespace Magento\\PatchStatus\\Formatter;use Magento\\PatchStatus\\Model\\PatchStatus;final class CsvFormatter{private const HEADERS=['base_version','installed_components','applied_patches','missing_patches','unknown_patches','cve','cve_status',];public function format(PatchStatus $status):string{$buf=fopen('php://temp','r+');fputcsv($buf,self::HEADERS,separator:',',enclosure:'\"',escape:'\\\\');$common=[$status-&gt;baseVersion,implode(';',array_map(static fn($area,$ver)=&gt;\"{$area}:{$ver}\",array_keys($status-&gt;installedComponents),$status-&gt;installedComponents,)),implode(';',$status-&gt;appliedPatches),implode(';',$status-&gt;missingPatches),implode(';',$status-&gt;unknownPatches),];if(empty($status-&gt;vulnerabilityStatus)){fputcsv($buf,array_merge($common,['','']),separator:',',enclosure:'\"',escape:'\\\\');}else{foreach($status-&gt;vulnerabilityStatus as $cve=&gt;$info){fputcsv($buf,array_merge($common,[$cve,$info['status'],]),separator:',',enclosure:'\"',escape:'\\\\');}}rewind($buf);$content=stream_get_contents($buf);fclose($buf);return $content;}}namespace Magento\\PatchStatus;use Magento\\PatchStatus\\Credential\\ComposerCredentialResolver;use Magento\\PatchStatus\\Detector\\ComposerDetector;use Magento\\PatchStatus\\Detector\\DryRunDetector;use Magento\\PatchStatus\\Fetcher\\PatchFetcher;use Magento\\PatchStatus\\Formatter\\CsvFormatter;use Magento\\PatchStatus\\Formatter\\JsonFormatter;use Magento\\PatchStatus\\Model\\PatchStatus;use Magento\\PatchStatus\\Registry\\RegistryLoader;use Magento\\PatchStatus\\Resolver\\CveResolver;use Magento\\PatchStatus\\Resolver\\PatchResolver;use Magento\\PatchStatus\\Util\\UrlValidator;class PatchStatusCommand{public const VERSION='1.0.0';private const LOG_FILE='var/log/patch_status.log';private string $root='.';private string $format='json';private bool $noCache=false;public function run(array $argv):int{try{return $this-&gt;doRun($argv);}catch(\\InvalidArgumentException $e){$this-&gt;error($e-&gt;getMessage());return 1;}}private function doRun(array $argv):int{$this-&gt;parseArgs($argv);$loaded=$this-&gt;makeRegistryLoader($this-&gt;root,forceRefresh:$this-&gt;noCache)-&gt;load();$warnings=$loaded['warnings'];$registry=$loaded['registry'];if(empty($registry)){foreach($warnings as $warning){$this-&gt;error($warning);}if(empty($warnings)){$this-&gt;error('Cannot load patch registry');}return 1;}$comp=(new ComposerDetector($this-&gt;root))-&gt;detect();$warnings=array_merge($warnings,$comp['warnings']);$baseVersion=$comp['base_version']??'unknown';$areaDefinitions=$registry['_areas']??[];$installedAreas=[];$componentVersions=[];foreach($areaDefinitions as $area=&gt;$def){if(($def['detection']??'')==='base_version'){if($baseVersion!=='unknown'){$installedAreas[]=$area;$componentVersions[$area]=$baseVersion;}}elseif(isset($def['composer_package'])){$pkg=$def['composer_package'];if(isset($comp['installed_packages'][$pkg])){$installedAreas[]=$area;$componentVersions[$area]=ltrim($comp['installed_packages'][$pkg],'v');}}}if($baseVersion==='unknown'){$status=new PatchStatus(baseVersion:'unknown',appliedPatches:[],missingPatches:[],installedComponents:[],vulnerabilityStatus:[],warnings:array_values(array_unique($warnings)),registrySource:$loaded['source'],);echo match($this-&gt;format){'csv'=&gt;(new CsvFormatter())-&gt;format($status),default=&gt;(new JsonFormatter())-&gt;format($status),};return 1;}if(!$this-&gt;isPatchBinaryAvailable()){$this-&gt;error('patch(1) binary not found. Install the patch utility and try again.');return 1;}$patchResolver=new PatchResolver($registry);$applicableIds=$patchResolver-&gt;getApplicableIds($componentVersions,$installedAreas);if(empty($applicableIds)){$versionsStr=implode(', ',array_map(fn($a,$v)=&gt;\"{$a}={$v}\",array_keys($componentVersions),array_values($componentVersions),));$warnings[]=\"No patches found in registry for installed component versions ({$versionsStr})\";}try{$detected=$this-&gt;runDryRunDetection($applicableIds,$registry);}catch(\\RuntimeException $e){$this-&gt;error($e-&gt;getMessage());return 1;}$warnings=array_merge($warnings,$detected['warnings']);$unknownLogs=$detected['unknown_logs'];$appliedPatches=[];$missingPatches=[];$unknownPatches=[];foreach($detected['statuses']as $patchId=&gt;$patchStatus){match($patchStatus){'applied'=&gt;$appliedPatches[]=$patchId,'not_applied'=&gt;$missingPatches[]=$patchId,'unknown'=&gt;$unknownPatches[]=$patchId,default=&gt;null,};}$cveResolver=new CveResolver($registry);$vulnStatus=$cveResolver-&gt;resolve($appliedPatches,$missingPatches,$installedAreas,$componentVersions,$unknownPatches,);$status=new PatchStatus(baseVersion:$baseVersion,appliedPatches:array_values($appliedPatches),missingPatches:array_values($missingPatches),installedComponents:$componentVersions,vulnerabilityStatus:$vulnStatus,warnings:array_values(array_unique($warnings)),registrySource:$loaded['source'],unknownPatches:array_values($unknownPatches),);$output=match($this-&gt;format){'csv'=&gt;(new CsvFormatter())-&gt;format($status),default=&gt;(new JsonFormatter())-&gt;format($status),};echo $output;$this-&gt;writeLog($status,$unknownLogs);return 0;}protected function makeRegistryLoader(string $magentoRoot,bool $forceRefresh):RegistryLoader{return new RegistryLoader(magentoRoot:$magentoRoot,forceRefresh:$forceRefresh);}protected function isPatchBinaryAvailable():bool{return DryRunDetector::isPatchBinaryAvailable();}protected function runDryRunDetection(array $applicableIds,array $registry):array{$override=getenv('PATCH_DIFF_BASE_URL');if($override!==false&amp;&amp;trim($override)!==''){$override=trim($override);if(!UrlValidator::isValid($override)){throw new \\InvalidArgumentException('Environment variable PATCH_DIFF_BASE_URL contains an invalid URL (must be https).');}$baseUrl=$override;}else{$baseUrl=PatchFetcher::DIFF_BASE_URL;}$needsAuth=false;foreach($applicableIds as $id){if(!empty($registry['patches'][$id]['entitlements']??[])){$needsAuth=true;break;}}$credentials=null;if($needsAuth){$host=(string)(parse_url($baseUrl,PHP_URL_HOST)??'');$credentials=(new ComposerCredentialResolver())-&gt;resolve($this-&gt;root,$host);}$fetcher=new PatchFetcher($this-&gt;root,$baseUrl,$credentials,noCache:$this-&gt;noCache);$detector=new DryRunDetector($this-&gt;root,$registry,$fetcher);return $detector-&gt;detect($applicableIds);}private function parseArgs(array $argv):void{foreach(array_slice($argv,1)as $arg){if(preg_match('/^--root=(.+)$/',$arg,$m)){$this-&gt;root=rtrim($m[1],'/');}elseif(preg_match('/^--format=(json|csv)$/',$arg,$m)){$this-&gt;format=$m[1];}elseif($arg==='--no-cache'){$this-&gt;noCache=true;}elseif(in_array($arg,['--version','-V'],true)){echo'patch-status '.self::VERSION.\"\\n\";exit(0);}elseif(in_array($arg,['--help','-h'],true)){$this-&gt;printUsage();exit(0);}}}private function printUsage():void{$version=self::VERSION;echo\"Adobe Commerce Monthly Security Release Versioning Tool v{$version}\\n\\n\".\"Usage:\\n\".\"  vendor/bin/patch-status [OPTIONS]\\n\\n\".\"Options:\\n\".\"  --root=PATH           Path to Commerce installation root (default: current directory)\\n\".\"  --format=FORMAT       Output format: json (default) or csv\\n\".\"  --no-cache            Bypass all local caches (registry and patch diffs); force fresh fetches from remote; exits with an error if the remote registry is unreachable\\n\".\"  --version             Show version\\n\".\"  --help                Show this help message\\n\\n\".\"Note: Output format is not final and may change in future releases.\\n\\n\";}private function writeLog(PatchStatus $status,array $unknownLogs):void{$logPath=rtrim($this-&gt;root,'/').'/'.self::LOG_FILE;$logDir=dirname($logPath);if(!is_dir($logDir)&amp;&amp;!@mkdir($logDir,0775,true)){return;}$line=sprintf(\"[%s] base=%s applied=[%s] missing=[%s] unknown=[%s]\\n\",date('c'),$status-&gt;baseVersion,implode(',',$status-&gt;appliedPatches),implode(',',$status-&gt;missingPatches),implode(',',$status-&gt;unknownPatches),);@file_put_contents($logPath,$line,FILE_APPEND|LOCK_EX);foreach($unknownLogs as $patchId=&gt;$logOutput){$block=sprintf(\"[%s] UNKNOWN %s:\\n%s\\n\",date('c'),$patchId,$logOutput);@file_put_contents($logPath,$block,FILE_APPEND|LOCK_EX);}}private function error(string $msg):void{fwrite(STDERR,\"patch-status: {$msg}\\n\");}}\n-$command=new PatchStatusCommand();exit($command-&gt;run($argv));\n+#!/usr/bin/env php\n+$this-&gt;baseVersion,'installed_components'=&gt;$this-&gt;installedComponents,'applied_patches'=&gt;$this-&gt;appliedPatches,'missing_patches'=&gt;$this-&gt;missingPatches,'unknown_patches'=&gt;$this-&gt;unknownPatches,'vulnerability_status'=&gt;$this-&gt;vulnerabilityStatus,'registry_source'=&gt;$this-&gt;registrySource,'warnings'=&gt;$this-&gt;warnings,];}}namespace Magento\\PatchStatus\\Util;class UrlValidator{public static function isValid(string $url):bool{if(filter_var($url,FILTER_VALIDATE_URL)===false){return false;}$scheme=parse_url($url,PHP_URL_SCHEME);return is_string($scheme)&amp;&amp;strtolower($scheme)==='https';}}namespace Magento\\PatchStatus\\Credential;class ComposerCredentialResolver{public function resolve(string $magentoRoot,string $host):?array{$creds=$this-&gt;readComposerAuthEnv($host);if($creds!==null){return $creds;}$paths=array_merge([rtrim($magentoRoot,'/').'/auth.json'],$this-&gt;globalAuthJsonPaths(),);foreach($paths as $path){$creds=$this-&gt;readCredentials($path,$host);if($creds!==null){return $creds;}}$creds=$this-&gt;promptCredentials($host);if($creds!==null){$this-&gt;offerToSaveCredentials($magentoRoot,$creds,$host);return $creds;}return null;}protected function globalAuthJsonPaths():array{$composerHome=getenv('COMPOSER_HOME');if($composerHome!==false&amp;&amp;$composerHome!==''){return[rtrim($composerHome,'/').'/auth.json'];}$home=getenv('HOME');if($home!==false&amp;&amp;$home!==''){return[rtrim($home,'/').'/.composer/auth.json'];}return[];}protected function promptCredentials(string $host):?array{$isTty=function_exists('stream_isatty')?stream_isatty(STDIN):(function_exists('posix_isatty')?posix_isatty(STDIN):false);if(!$isTty){return null;}fwrite(STDERR,\"\\n{$host} credentials required.\\n\");fwrite(STDERR,'Username (Composer public key): ');$username=trim((string)fgets(STDIN));fwrite(STDERR,'Password (Composer private key): ');$canHideInput=function_exists('shell_exec');if($canHideInput){shell_exec('stty -echo');}try{$password=trim((string)fgets(STDIN));}finally{if($canHideInput){shell_exec('stty echo');}}fwrite(STDERR,\"\\n\");if($username===''||$password===''){return null;}return['username'=&gt;$username,'password'=&gt;$password];}protected function offerToSaveCredentials(string $magentoRoot,array $credentials,string $host):void{$isTty=function_exists('stream_isatty')?stream_isatty(STDIN):(function_exists('posix_isatty')?posix_isatty(STDIN):false);if(!$isTty){return;}$authJsonPath=rtrim($magentoRoot,'/').'/auth.json';$action=file_exists($authJsonPath)?'Update':'Create';fwrite(STDERR,\"{$action} {$authJsonPath} with these credentials? [Y/n]: \");$rawResponse=fgets(STDIN);if($rawResponse===false){return;}$response=strtolower(trim($rawResponse));if($response!=='n'&amp;&amp;$response!=='no'){$this-&gt;saveCredentialsToAuthJson($authJsonPath,$credentials,$host);}}protected function saveCredentialsToAuthJson(string $path,array $credentials,string $host):void{$data=[];if(file_exists($path)){$existing=@file_get_contents($path);if($existing!==false){$decoded=json_decode($existing,true);if(is_array($decoded)){$data=$decoded;}}}if(!is_array($data['http-basic']??null)){$data['http-basic']=[];}$data['http-basic'][$host]=['username'=&gt;$credentials['username'],'password'=&gt;$credentials['password'],];$encoded=json_encode($data,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);if($encoded===false){return;}$prevUmask=umask(0177);$written=false;try{$written=@file_put_contents($path,$encoded.\"\\n\",LOCK_EX)!==false;}finally{umask($prevUmask);}if($written){@chmod($path,0600);}}private function readComposerAuthEnv(string $host):?array{$raw=getenv('COMPOSER_AUTH');if($raw===false||$raw===''){return null;}$data=json_decode($raw,true);if(!is_array($data)){return null;}return $this-&gt;extractCredentials($data,$host);}private function readCredentials(string $path,string $host):?array{if(!file_exists($path)){return null;}$content=@file_get_contents($path);if($content===false){return null;}$data=json_decode($content,true);if(!is_array($data)){return null;}return $this-&gt;extractCredentials($data,$host);}private function extractCredentials(array $data,string $host):?array{if(!is_array($data['http-basic']??null)){return null;}$username=$data['http-basic'][$host]['username']??null;$password=$data['http-basic'][$host]['password']??null;if(!is_string($username)||$username===''||!is_string($password)||$password===''){return null;}return['username'=&gt;$username,'password'=&gt;$password];}}namespace Magento\\PatchStatus\\Fetcher;class PatchFetcher{public const DIFF_BASE_URL='https://repo.magento.com/patch';private const CACHE_DIR='var/patch_metadata/.patch_diffs';private const TIMEOUT=3;protected int $lastHttpStatus=0;public function __construct(private readonly string $magentoRoot,private readonly string $patchBaseUrl,private readonly?array $credentials=null,private readonly bool $noCache=false,){}public function hasCredentials():bool{return($this-&gt;credentials['username']??'')!==''&amp;&amp;($this-&gt;credentials['password']??'')!=='';}public function fetch(string $patchId,string $patchFile,string $expectedSha256,bool $authRequired=false,array&amp;$warnings=[],):?string{if(!$this-&gt;isSafePatchFileName($patchFile)){return null;}$cachePath=rtrim($this-&gt;magentoRoot,'/').'/'.self::CACHE_DIR.'/'.$patchFile;if(!$this-&gt;noCache&amp;&amp;file_exists($cachePath)){$content=@file_get_contents($cachePath);if($content!==false&amp;&amp;$this-&gt;verifySha256($content,$expectedSha256)){return $content;}@unlink($cachePath);}if($authRequired&amp;&amp;!$this-&gt;hasCredentials()){$warnings[]=\"Patch {$patchId} requires authentication. Set credentials via COMPOSER_AUTH or auth.json.\";return null;}$base=rtrim($this-&gt;patchBaseUrl,'/');$url=$authRequired?\"{$base}/auth/{$patchFile}\":\"{$base}/{$patchFile}\";$creds=$authRequired?$this-&gt;credentials:null;$content=$this-&gt;fetchRemote($url,$creds);if($content===false){$status=$this-&gt;lastHttpStatus;if($status&gt;=400){$suffix=$authRequired?\" Check credentials (COMPOSER_AUTH / auth.json).\":\"\";$warnings[]=\"Could not fetch patch {$patchId} (HTTP {$status}).{$suffix}\";}elseif($authRequired){$warnings[]=\"Could not fetch or verify patch {$patchId}. Check network connectivity and credentials (COMPOSER_AUTH / auth.json).\";}else{$warnings[]=\"Could not fetch patch file for {$patchId}.\";}return null;}if(!$this-&gt;verifySha256($content,$expectedSha256)){$warnings[]=\"SHA-256 verification failed for patch {$patchId}; discarding download.\";return null;}$this-&gt;writeCache($cachePath,$content);return $content;}protected function fetchRemote(string $url,?array $credentials=null):string|false{$headers=[];if(($credentials['username']??'')!==''&amp;&amp;($credentials['password']??'')!==''){$encoded=base64_encode($credentials['username'].':'.$credentials['password']);$headers[]='Authorization: Basic '.$encoded;}$context=stream_context_create(['http'=&gt;['timeout'=&gt;self::TIMEOUT,'ignore_errors'=&gt;true,'user_agent'=&gt;'Adobe-Commerce-PatchStatus/'.\\Magento\\PatchStatus\\PatchStatusCommand::VERSION,'header'=&gt;implode(\"\\r\\n\",$headers),],'ssl'=&gt;['verify_peer'=&gt;true,'verify_peer_name'=&gt;true,],]);$this-&gt;lastHttpStatus=0;$content=@file_get_contents($url,context:$context);if($content!==false){$status=$this-&gt;parseResponseStatus($http_response_header??[]);$this-&gt;lastHttpStatus=$status;if($status&gt;=400){return false;}}return $content;}private function parseResponseStatus(array $responseHeaders):int{$status=0;foreach($responseHeaders as $header){if(preg_match('#^HTTP/\\S+ (\\d{3})#',$header,$m)){$status=(int)$m[1];}}return $status;}private function verifySha256(string $content,string $expectedSha256):bool{return hash('sha256',$content)===strtolower($expectedSha256);}private function writeCache(string $path,string $content):void{$dir=dirname($path);if(!is_dir($dir)){@mkdir($dir,0775,true);}@file_put_contents($path,$content,LOCK_EX);}private function isSafePatchFileName(string $name):bool{return(bool)preg_match('/\\A[A-Za-z0-9][A-Za-z0-9_\\-]*\\.(?:patch|diff)\\z/',$name)&amp;&amp;basename($name)===$name;}}namespace Magento\\PatchStatus\\Detector;final class ComposerDetector{private const BASE_PACKAGES=['magento/product-enterprise-edition','magento/product-community-edition','magento/magento2-base',];public function __construct(private readonly string $magentoRoot){}public function detect():array{$lockFile=rtrim($this-&gt;magentoRoot,'/').'/composer.lock';$replacedPackages=$this-&gt;detectReplacedPackages();$empty=['base_version'=&gt;null,'release_line'=&gt;null,'installed_packages'=&gt;[],'replaced_packages'=&gt;$replacedPackages,'method'=&gt;'none','warnings'=&gt;[],];if(!file_exists($lockFile)){return $empty;}$raw=file_get_contents($lockFile);if($raw===false){return array_merge($empty,['warnings'=&gt;['composer.lock exists but could not be read']]);}$lock=json_decode($raw,true);if(!is_array($lock)){return array_merge($empty,['warnings'=&gt;['composer.lock could not be parsed as JSON']]);}$packages=array_merge($lock['packages']??[],$lock['packages-dev']??[]);$installedPackages=[];foreach($packages as $pkg){$installedPackages[$pkg['name']??'']=$pkg['version']??'';}$baseVersion=null;foreach(self::BASE_PACKAGES as $pkg){if(isset($installedPackages[$pkg])){$baseVersion=ltrim($installedPackages[$pkg],'v');break;}}$warnings=[];$method='composer';if($baseVersion===null){$warnings[]='No recognized Commerce base package found in composer.lock';$method='none';}$releaseLine=$baseVersion!==null?$this-&gt;extractReleaseLine($baseVersion):null;return['base_version'=&gt;$baseVersion,'release_line'=&gt;$releaseLine,'installed_packages'=&gt;$installedPackages,'replaced_packages'=&gt;$replacedPackages,'method'=&gt;$method,'warnings'=&gt;$warnings,];}private function detectReplacedPackages():array{$composerJsonFile=rtrim($this-&gt;magentoRoot,'/').'/composer.json';if(!file_exists($composerJsonFile)){return[];}$raw=file_get_contents($composerJsonFile);if($raw===false){return[];}$data=json_decode($raw,true);if(!is_array($data)||!is_array($data['replace']??null)){return[];}$replaced=[];foreach($data['replace']as $package=&gt;$versionConstraint){if($versionConstraint==='*'){$replaced[]=$package;}}return $replaced;}private function extractReleaseLine(string $version):string{if(preg_match('/^(\\d+\\.\\d+\\.\\d+)/',$version,$m)){return $m[1];}return $version;}}namespace Magento\\PatchStatus\\Detector;use Magento\\PatchStatus\\Fetcher\\PatchFetcher;class DryRunDetector{public function __construct(private readonly string $magentoRoot,private readonly array $registry,private readonly PatchFetcher $fetcher,private readonly array $replacedVendorPrefixes=[],){}public static function isPatchBinaryAvailable():bool{exec('patch --version',$output,$code);return $code===0;}public function detect(array $applicablePatchIds):array{$statuses=[];$warnings=[];$unknownLogs=[];$root=rtrim($this-&gt;magentoRoot,'/');if(!$this-&gt;isTempDirWritable()){throw new \\RuntimeException(\"Temp directory \".sys_get_temp_dir().\" is not writable \u2014 check permissions. Aborting.\");}foreach($applicablePatchIds as $patchId){$entry=$this-&gt;registry['patches'][$patchId]??null;if($entry===null){continue;}$patchFile=$entry['file_name']??null;$patchSha256=$entry['sha256']??null;if($patchFile===null||$patchSha256===null){$statuses[$patchId]='unknown';$warnings[]=\"No file_name or sha256 for {$patchId}\";continue;}$authRequired=!empty($entry['entitlements']??[]);$rawContent=$this-&gt;fetcher-&gt;fetch($patchId,$patchFile,$patchSha256,$authRequired,$warnings);if($rawContent===null){$statuses[$patchId]='unknown';continue;}[$diffContent,$skippedPackages,$presentPackages]=$this-&gt;filterReplacedPackageHunks($rawContent);if($skippedPackages!==[]&amp;&amp;trim($diffContent)===''){$statuses[$patchId]='not_applicable';$warnings[]=sprintf('Patch %s only applies to package(s) %s not present due to composer replace config; '.'marked as not applicable.',$patchId,implode(', ',$skippedPackages),);continue;}$mixedPackages=array_values(array_intersect($skippedPackages,$presentPackages));$skippedOnly=array_values(array_diff($skippedPackages,$presentPackages));$presentOnly=array_values(array_diff($presentPackages,$skippedPackages));if($skippedOnly!==[]){$warnings[]=sprintf('Patch %s: skipped package(s) %s not present due to composer replace config.',$patchId,implode(', ',$skippedOnly),);}if($presentOnly!==[]){$warnings[]=sprintf('Patch %s: package(s) %s declared replaced at version \"*\" in composer.json, '.'but still present on disk; dry-run normally.',$patchId,implode(', ',$presentOnly),);}if($mixedPackages!==[]){$warnings[]=sprintf('Patch %s: package(s) %s declared replaced at version \"*\" in composer.json '.'and only partially present on disk; absent files skipped, remaining files dry-run normally.',$patchId,implode(', ',$mixedPackages),);}$descendants=$this-&gt;getDescendants($patchId,$applicablePatchIds);$prerequisites=$this-&gt;getPrerequisites($patchId,$applicablePatchIds,$warnings);[$overlappingDescDiffs,$overlappingPrereqDiffs,$missingDepIds]=$this-&gt;resolveDependencyDiffs($diffContent,$descendants,$prerequisites);if(!empty($missingDepIds)){$warnings[]='descendant diffs unavailable for '.implode(', ',$missingDepIds).\"; dry-run for {$patchId} may be inaccurate\";}$affectedFiles=$this-&gt;collectAffectedFiles($diffContent,$overlappingDescDiffs,$overlappingPrereqDiffs);$tmpDiff=sys_get_temp_dir().'/patch_status_'.$this-&gt;sanitizeForFilename($patchId).'_'.uniqid().'.diff';file_put_contents($tmpDiff,$diffContent);$tmpDirToClean=null;$descendantSanitizationFailed=false;try{$workDir=$root;if(!empty($overlappingDescDiffs)){$tmpDirToClean=$this-&gt;createTempWorkDir($root,$patchId,$affectedFiles);$revertWarn=$this-&gt;revertDescendantsIn($tmpDirToClean,$patchId,$overlappingDescDiffs);if($revertWarn!==null){$warnings[]=$revertWarn;$this-&gt;rmdirRecursive($tmpDirToClean);$tmpDirToClean=null;$descendantSanitizationFailed=true;}else{$workDir=$tmpDirToClean;}}$fwd=$this-&gt;runPatch($tmpDiff,$workDir,reverse:false,dryRun:true);$rev=$this-&gt;runPatch($tmpDiff,$workDir,reverse:true,dryRun:true);$status=$this-&gt;classify($fwd['exit'],$rev['exit']);if($status==='unknown'&amp;&amp;!empty($overlappingPrereqDiffs)&amp;&amp;!$descendantSanitizationFailed){if($tmpDirToClean===null){$tmpDirToClean=$this-&gt;createTempWorkDir($root,$patchId,$affectedFiles);$workDir=$tmpDirToClean;}$applyWarn=$this-&gt;forwardApplyPrereqsIn($tmpDirToClean,$patchId,$overlappingPrereqDiffs);if($applyWarn!==null){$warnings[]=$applyWarn;}else{$fwd=$this-&gt;runPatch($tmpDiff,$workDir,reverse:false,dryRun:true);$rev=$this-&gt;runPatch($tmpDiff,$workDir,reverse:true,dryRun:true);$status=$this-&gt;classify($fwd['exit'],$rev['exit']);}}$statuses[$patchId]=$status;if($status==='unknown'){$unknownLogs[$patchId]=\"FWD:\\n{$fwd['output']}\\nREV:\\n{$rev['output']}\";}}finally{@unlink($tmpDiff);if($tmpDirToClean!==null){$this-&gt;rmdirRecursive($tmpDirToClean);}}}return['statuses'=&gt;$statuses,'method'=&gt;'dry_run','warnings'=&gt;$warnings,'unknown_logs'=&gt;$unknownLogs,];}private function getDescendants(string $patchId,array $applicablePatchIds):array{$applicableSet=array_flip($applicablePatchIds);$descendants=[];$queue=[$patchId];$visited=[$patchId=&gt;true];while(!empty($queue)){$current=array_shift($queue);foreach($this-&gt;registry['patches']??[]as $id=&gt;$entry){if(!isset($applicableSet[$id])||isset($visited[$id])){continue;}if(in_array($current,$entry['requires']??[],true)){$descendants[]=$id;$visited[$id]=true;$queue[]=$id;}}}return $descendants;}private function getPrerequisites(string $patchId,array $applicablePatchIds,array&amp;$warnings):array{$applicableSet=array_flip($applicablePatchIds);$result=[];$visited=[$patchId=&gt;true];$this-&gt;collectTransitivePrereqs($patchId,$applicableSet,$visited,$result,$warnings);return $result;}private function collectTransitivePrereqs(string $patchId,array $applicableSet,array&amp;$visited,array&amp;$result,array&amp;$warnings):void{$requires=$this-&gt;registry['patches'][$patchId]['requires']??[];foreach($requires as $preId){if(isset($visited[$preId])){continue;}$visited[$preId]=true;if(!isset($this-&gt;registry['patches'][$preId])){$warnings[]=\"Registry entry '{$patchId}' requires unknown patch '{$preId}'; skipping.\";continue;}if(!isset($applicableSet[$preId])){continue;}$this-&gt;collectTransitivePrereqs($preId,$applicableSet,$visited,$result,$warnings);$result[]=$preId;}}private function resolveDependencyDiffs(string $diffContent,array $descendants,array $prerequisites):array{$pFiles=array_flip($this-&gt;parseDiffFiles($diffContent));$missingDepIds=[];$overlappingDescDiffs=[];foreach(array_reverse($descendants)as $depId){$diff=$this-&gt;fetchDependencyDiff($depId);if($diff===null){$missingDepIds[]=$depId;continue;}if($this-&gt;diffOverlapsFiles($diff,$pFiles)){$overlappingDescDiffs[$depId]=$diff;}}$overlappingPrereqDiffs=[];foreach($prerequisites as $preId){$diff=$this-&gt;fetchDependencyDiff($preId);if($diff===null){continue;}if($this-&gt;diffOverlapsFiles($diff,$pFiles)){$overlappingPrereqDiffs[$preId]=$diff;}}return[$overlappingDescDiffs,$overlappingPrereqDiffs,$missingDepIds];}private function fetchDependencyDiff(string $patchId):?string{$entry=$this-&gt;registry['patches'][$patchId]??null;if($entry===null){return null;}$authRequired=!empty($entry['entitlements']??[]);$raw=$this-&gt;fetcher-&gt;fetch($patchId,$entry['file_name']??'',$entry['sha256']??'',$authRequired);if($raw===null){return null;}[$filtered,]=$this-&gt;filterReplacedPackageHunks($raw);return $filtered;}private function diffOverlapsFiles(string $diff,array $fileSet):bool{foreach($this-&gt;parseDiffFiles($diff)as $f){if(isset($fileSet[$f])){return true;}}return false;}private function collectAffectedFiles(string $diffContent,array $overlappingDescDiffs,array $overlappingPrereqDiffs):array{$files=$this-&gt;parseDiffFiles($diffContent);foreach($overlappingDescDiffs as $d){$files=array_merge($files,$this-&gt;parseDiffFiles($d));}foreach($overlappingPrereqDiffs as $d){$files=array_merge($files,$this-&gt;parseDiffFiles($d));}return array_values(array_unique($files));}private function createTempWorkDir(string $root,string $patchId,array $affectedFiles):string{$tmpDir=sys_get_temp_dir().'/patch_status_wd_'.$this-&gt;sanitizeForFilename($patchId).'_'.uniqid();if(!mkdir($tmpDir,0700,true)){throw new \\RuntimeException(\"Could not create temp workdir {$tmpDir}\");}try{foreach($affectedFiles as $relPath){$src=$root.'/'.$relPath;if(!file_exists($src)){continue;}$dst=$tmpDir.'/'.$relPath;$dstDir=dirname($dst);if(!is_dir($dstDir)&amp;&amp;!mkdir($dstDir,0700,true)){throw new \\RuntimeException(\"Could not create directory {$dstDir} in temp workdir\");}if(!copy($src,$dst)){throw new \\RuntimeException(\"Could not copy {$relPath} into temp workdir\");}}}catch(\\RuntimeException $e){$this-&gt;rmdirRecursive($tmpDir);throw $e;}return $tmpDir;}private function revertDescendantsIn(string $workDir,string $patchId,array $overlappingDescDiffs):?string{foreach($overlappingDescDiffs as $depId=&gt;$depDiff){$tmpDepDiff=sys_get_temp_dir().'/patch_status_dep_'.$this-&gt;sanitizeForFilename($depId).'_'.uniqid().'.diff';file_put_contents($tmpDepDiff,$depDiff);$check=$this-&gt;runPatch($tmpDepDiff,$workDir,reverse:true,dryRun:true);if($check['exit']!==0){@unlink($tmpDepDiff);continue;}$result=$this-&gt;runPatch($tmpDepDiff,$workDir,reverse:true,dryRun:false);@unlink($tmpDepDiff);if($result['exit']!==0){return\"Failed to reverse-apply {$depId} when preparing dry-run for {$patchId}; result may be inaccurate\";}}return null;}private function forwardApplyPrereqsIn(string $workDir,string $patchId,array $overlappingPrereqDiffs):?string{foreach($overlappingPrereqDiffs as $preId=&gt;$preDiff){$tmpPreDiff=sys_get_temp_dir().'/patch_status_pre_'.$this-&gt;sanitizeForFilename($preId).'_'.uniqid().'.diff';file_put_contents($tmpPreDiff,$preDiff);$checkRev=$this-&gt;runPatch($tmpPreDiff,$workDir,reverse:true,dryRun:true);if($checkRev['exit']===0){@unlink($tmpPreDiff);continue;}$result=$this-&gt;runPatch($tmpPreDiff,$workDir,reverse:false,dryRun:false);@unlink($tmpPreDiff);if($result['exit']!==0){return\"Failed to forward-apply prerequisite {$preId} when preparing dry-run for {$patchId}; result may be inaccurate\";}}return null;}protected function runPatch(string $diffFile,string $workDir,bool $reverse,bool $dryRun):array{$args=['patch','-p1','--fuzz=0','--batch','--forward'];if($reverse){$args[]='-R';}if($dryRun){$args[]='--dry-run';}$args[]='-d';$args[]=$workDir;$args[]='-i';$args[]=$diffFile;$cmd=implode(' ',array_map('escapeshellarg',$args)).' 2&gt;&amp;1';$descriptors=[0=&gt;['pipe','r'],1=&gt;['pipe','w']];$process=proc_open($cmd,$descriptors,$pipes);if(!is_resource($process)){return['exit'=&gt;-1,'output'=&gt;''];}fclose($pipes[0]);$output=(string)stream_get_contents($pipes[1]);fclose($pipes[1]);$exit=proc_close($process);return['exit'=&gt;$exit,'output'=&gt;trim($output)];}private function classify(int $fwdExit,int $revExit):string{return match(true){$fwdExit!==0&amp;&amp;$revExit===0=&gt;'applied',$fwdExit===0&amp;&amp;$revExit!==0=&gt;'not_applied',default=&gt;'unknown',};}private function filterReplacedPackageHunks(string $diffContent):array{if($this-&gt;replacedVendorPrefixes===[]){return[$diffContent,[],[]];}$chunks=$this-&gt;splitDiffByFile($diffContent);if($chunks===[]){return[$diffContent,[],[]];}$kept=[];$skippedPackages=[];$presentPackages=[];foreach($chunks as $file=&gt;$chunkText){$prefix=$this-&gt;matchingReplacedPrefix($file);if($prefix!==null){$package=$this-&gt;packageNameFromPrefix($prefix);if(!file_exists(rtrim($this-&gt;magentoRoot,'/').'/'.$file)){$skippedPackages[$package]=true;continue;}$presentPackages[$package]=true;}$kept[]=$chunkText;}if($skippedPackages===[]&amp;&amp;$presentPackages===[]){return[$diffContent,[],[]];}$filteredDiff='';foreach($kept as $chunkText){$filteredDiff.=rtrim($chunkText,\"\\n\").\"\\n\";}return[$filteredDiff,array_keys($skippedPackages),array_keys($presentPackages)];}private function matchingReplacedPrefix(string $file):?string{foreach($this-&gt;replacedVendorPrefixes as $prefix){if(str_starts_with($file,$prefix)){return $prefix;}}return null;}private function packageNameFromPrefix(string $prefix):string{$trimmed=rtrim($prefix,'/');return str_starts_with($trimmed,'vendor/')?substr($trimmed,strlen('vendor/')):$trimmed;}private function splitDiffByFile(string $diffContent):array{$lines=explode(\"\\n\",$diffContent);$hasGitHeaders=false;foreach($lines as $line){if(preg_match('#^diff --git a/.+ b/.+$#',$line)){$hasGitHeaders=true;break;}}$chunks=[];$currentFile=null;$currentLines=[];$count=count($lines);for($i=0;$i&lt;$count;$i++){$line=$lines[$i];$boundaryFile=null;if($hasGitHeaders){if(preg_match('#^diff --git a/.+ b/(.+)$#',$line,$m)){$boundaryFile=trim($m[1]);}}elseif(str_starts_with($line,'--- ')){$prePath=$this-&gt;stripDiffMarkerPrefix($line);$nextLine=$lines[$i+1]??'';$postPath=str_starts_with($nextLine,'+++ ')?$this-&gt;stripDiffMarkerPrefix($nextLine):null;$boundaryFile=match(true){$postPath!==null&amp;&amp;$postPath!=='/dev/null'=&gt;$postPath,$prePath!=='/dev/null'=&gt;$prePath,default=&gt;null,};}if($boundaryFile!==null){if($currentFile!==null){$chunks[$currentFile]=implode(\"\\n\",$currentLines);}$currentFile=$boundaryFile;$currentLines=[$line];continue;}if($currentFile!==null){$currentLines[]=$line;}}if($currentFile!==null){$chunks[$currentFile]=implode(\"\\n\",$currentLines);}return $chunks;}private function stripDiffMarkerPrefix(string $line):string{$path=trim(substr($line,4));if(preg_match('#^[ab]/(.+)$#',$path,$m)){return trim($m[1]);}return $path;}private function parseDiffFiles(string $diffContent):array{$files=[];foreach(explode(\"\\n\",$diffContent)as $line){if(preg_match('#^(?:---|\\+\\+\\+) [ab]/(.+)$#',$line,$m)){$path=trim($m[1]);if($path!=='/dev/null'){$files[$path]=true;}}}return array_keys($files);}private function rmdirRecursive(string $path):void{if(!is_dir($path)){return;}$entries=scandir($path);if($entries===false){return;}foreach($entries as $item){if($item==='.'||$item==='..'){continue;}$full=$path.'/'.$item;is_dir($full)?$this-&gt;rmdirRecursive($full):unlink($full);}rmdir($path);}protected function isTempDirWritable():bool{return is_writable(sys_get_temp_dir());}private function sanitizeForFilename(string $id):string{$sanitized=preg_replace('/[^A-Za-z0-9_.\\-]/','_',$id);if($sanitized!==null){return $sanitized;}return'patch_'.sha1($id);}}namespace Magento\\PatchStatus\\Registry;use Magento\\PatchStatus\\Util\\UrlValidator;class RegistryLoader{public const REMOTE_URL='https://repo.magento.com/patch/patch-registry.json';private const CACHE_FILE='var/patch_metadata/.patch_registry_cache.json';private const CACHE_TTL=3600;private const TIMEOUT=3;public function __construct(private readonly string $magentoRoot,private readonly bool $forceRefresh=false,){}public function load():array{$cachePath=rtrim($this-&gt;magentoRoot,'/').'/'.self::CACHE_FILE;$warnings=[];$cached=$this-&gt;forceRefresh?null:$this-&gt;readCache($cachePath);if($cached!==null&amp;&amp;$this-&gt;cacheAge($cachePath)$cached,'source'=&gt;'cache','warnings'=&gt;[]];}$remote=$this-&gt;fetchRemote($warnings);if($remote!==null){$this-&gt;writeCache($cachePath,$remote);return['registry'=&gt;$remote,'source'=&gt;'remote','warnings'=&gt;[]];}if($this-&gt;forceRefresh){$warnings[]='Could not fetch remote registry and --no-cache was set; aborting.';return['registry'=&gt;[],'source'=&gt;'none','warnings'=&gt;$warnings];}if($cached!==null){$ageHours=(int)round($this-&gt;cacheAge($cachePath)/3600);$warnings[]=sprintf('Could not load remote registry. Using cached registry (%d hour%s old). CVE coverage may be incomplete.',$ageHours,$ageHours===1?'':'s',);return['registry'=&gt;$cached,'source'=&gt;'stale_cache','warnings'=&gt;$warnings];}$warnings[]='Patch registry could not be loaded.';return['registry'=&gt;[],'source'=&gt;'none','warnings'=&gt;$warnings];}protected function fetchRemote(array&amp;$warnings):?array{$context=stream_context_create(['http'=&gt;['timeout'=&gt;self::TIMEOUT,'ignore_errors'=&gt;true,'user_agent'=&gt;'Adobe-Commerce-PatchStatus/'.\\Magento\\PatchStatus\\PatchStatusCommand::VERSION,],'ssl'=&gt;['verify_peer'=&gt;true,'verify_peer_name'=&gt;true,],]);$override=getenv('PATCH_REGISTRY_URL');if($override!==false&amp;&amp;trim($override)!==''){$override=trim($override);if(!UrlValidator::isValid($override)){throw new \\InvalidArgumentException('Environment variable PATCH_REGISTRY_URL contains an invalid URL (must be https).');}$url=$override;}else{$url=self::REMOTE_URL;}$raw=@file_get_contents($url,context:$context);if($raw===false){return null;}$status=$this-&gt;parseHttpStatus($http_response_header??[]);if($status&gt;=400){$warnings[]=sprintf('Remote registry fetch failed (HTTP %d). Check PATCH_REGISTRY_URL (if set) and network connectivity.',$status,);return null;}$data=json_decode($raw,true);if(!is_array($data)){$warnings[]='Remote registry response was not valid JSON; ignoring.';return null;}return $data;}private function parseHttpStatus(array $responseHeaders):int{$status=0;foreach($responseHeaders as $header){if(preg_match('#^HTTP/\\S+ (\\d{3})#',$header,$m)){$status=(int)$m[1];}}return $status;}private function readCache(string $path):?array{if(!file_exists($path)){return null;}$raw=@file_get_contents($path);if($raw===false){return null;}$data=json_decode($raw,true);return is_array($data)?$data:null;}private function writeCache(string $path,array $data):void{$dir=dirname($path);if(!is_dir($dir)){@mkdir($dir,0775,true);}@file_put_contents($path,json_encode($data),LOCK_EX);}private function cacheAge(string $path):int{$mtime=@filemtime($path);return $mtime!==false?(time()-$mtime):PHP_INT_MAX;}}namespace Magento\\PatchStatus\\Resolver;final class PatchResolver{public function __construct(private readonly array $registry){}public function getApplicableIds(array $componentVersions,array $installedAreas):array{$assumeAll=empty($installedAreas)||empty($componentVersions);return array_keys($this-&gt;applicablePatches($componentVersions,$installedAreas,$assumeAll));}public function resolve(array $appliedIds,array $componentVersions,array $installedAreas=[]):array{$warnings=[];$assumeAll=empty($installedAreas)||empty($componentVersions);if($assumeAll){$warnings[]='Installed components could not be detected; all patches treated as applicable. Results may include patches irrelevant to this installation.';}$applicable=$this-&gt;applicablePatches($componentVersions,$installedAreas,$assumeAll);if(empty($applicable)){$versionsStr=implode(', ',array_map(fn($a,$v)=&gt;\"{$a}={$v}\",array_keys($componentVersions),array_values($componentVersions)));$warnings[]=\"No patches found in registry for installed component versions ({$versionsStr})\";return['missing'=&gt;[],'warnings'=&gt;$warnings,];}$appliedSet=array_flip($appliedIds);$missing=[];foreach($applicable as $patchId=&gt;$patch){if(!isset($appliedSet[$patchId])){$missing[]=$patchId;}}return['missing'=&gt;$missing,'warnings'=&gt;$warnings,];}private function applicablePatches(array $componentVersions,array $installedAreas,bool $assumeAll):array{$areaSet=$assumeAll?null:array_flip($installedAreas);$result=[];foreach($this-&gt;registry['patches']??[]as $patchId=&gt;$patch){if($assumeAll){$result[$patchId]=$patch;continue;}$area=$patch['area']??'';if($areaSet!==null&amp;&amp;!isset($areaSet[$area])){continue;}$installedVersion=$componentVersions[$area]??null;if($installedVersion===null){continue;}if(!in_array($installedVersion,$patch['applies_to']??[],true)){continue;}$result[$patchId]=$patch;}return $result;}}namespace Magento\\PatchStatus\\Resolver;final class CveResolver{public function __construct(private readonly array $registry){}public function resolve(array $appliedIds,array $missingIds=[],array $installedAreas=[],array $componentVersions=[],array $unknownIds=[],array $notApplicableIds=[],):array{$appliedSet=array_flip($appliedIds);$unknownSet=array_flip($unknownIds);$notApplicableSet=array_flip($notApplicableIds);$areaSet=!empty($installedAreas)?array_flip($installedAreas):null;$byCve=[];foreach($this-&gt;registry['patches']??[]as $patchId=&gt;$patch){$patchArea=$patch['area']??'CE';if(!empty($componentVersions)){$areaIsInstalled=$areaSet===null||isset($areaSet[$patchArea]);if($areaIsInstalled){$installedVersion=$componentVersions[$patchArea]??null;if($installedVersion===null||!in_array($installedVersion,$patch['applies_to']??[],true)){continue;}}}if(isset($appliedSet[$patchId])){$patchStatus='PROTECTED';}elseif($areaSet!==null&amp;&amp;!isset($areaSet[$patchArea])){$patchStatus='NOT_APPLICABLE';}elseif(isset($notApplicableSet[$patchId])){$patchStatus='NOT_APPLICABLE';}elseif(isset($unknownSet[$patchId])){$patchStatus='UNKNOWN';}else{$patchStatus='VULNERABLE';}foreach($patch['cves']??[]as $cve){$byCve[$cve][$patchStatus]=true;}}$status=[];foreach($byCve as $cve=&gt;$statuses){$status[$cve]=['status'=&gt;match(true){isset($statuses['VULNERABLE'])=&gt;'VULNERABLE',isset($statuses['UNKNOWN'])=&gt;'UNKNOWN',isset($statuses['PROTECTED'])=&gt;'PROTECTED',default=&gt;'NOT_APPLICABLE',},];}ksort($status);return $status;}}namespace Magento\\PatchStatus\\Formatter;use Magento\\PatchStatus\\Model\\PatchStatus;final class JsonFormatter{public function format(PatchStatus $status):string{return json_encode($status-&gt;toArray(),JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES).\"\\n\";}}namespace Magento\\PatchStatus\\Formatter;use Magento\\PatchStatus\\Model\\PatchStatus;final class CsvFormatter{private const HEADERS=['base_version','installed_components','applied_patches','missing_patches','unknown_patches','cve','cve_status',];public function format(PatchStatus $status):string{$buf=fopen('php://temp','r+');fputcsv($buf,self::HEADERS,separator:',',enclosure:'\"',escape:'\\\\');$common=[$status-&gt;baseVersion,implode(';',array_map(static fn($area,$ver)=&gt;\"{$area}:{$ver}\",array_keys($status-&gt;installedComponents),$status-&gt;installedComponents,)),implode(';',$status-&gt;appliedPatches),implode(';',$status-&gt;missingPatches),implode(';',$status-&gt;unknownPatches),];if(empty($status-&gt;vulnerabilityStatus)){fputcsv($buf,array_merge($common,['','']),separator:',',enclosure:'\"',escape:'\\\\');}else{foreach($status-&gt;vulnerabilityStatus as $cve=&gt;$info){fputcsv($buf,array_merge($common,[$cve,$info['status'],]),separator:',',enclosure:'\"',escape:'\\\\');}}rewind($buf);$content=stream_get_contents($buf);fclose($buf);return $content;}}namespace Magento\\PatchStatus;use Magento\\PatchStatus\\Credential\\ComposerCredentialResolver;use Magento\\PatchStatus\\Detector\\ComposerDetector;use Magento\\PatchStatus\\Detector\\DryRunDetector;use Magento\\PatchStatus\\Fetcher\\PatchFetcher;use Magento\\PatchStatus\\Formatter\\CsvFormatter;use Magento\\PatchStatus\\Formatter\\JsonFormatter;use Magento\\PatchStatus\\Model\\PatchStatus;use Magento\\PatchStatus\\Registry\\RegistryLoader;use Magento\\PatchStatus\\Resolver\\CveResolver;use Magento\\PatchStatus\\Resolver\\PatchResolver;use Magento\\PatchStatus\\Util\\UrlValidator;class PatchStatusCommand{public const VERSION='1.0.2';private const LOG_FILE='var/log/patch_status.log';private string $root='.';private string $format='json';private bool $noCache=false;public function run(array $argv):int{try{return $this-&gt;doRun($argv);}catch(\\InvalidArgumentException $e){$this-&gt;error($e-&gt;getMessage());return 1;}}private function doRun(array $argv):int{$this-&gt;parseArgs($argv);$loaded=$this-&gt;makeRegistryLoader($this-&gt;root,forceRefresh:$this-&gt;noCache)-&gt;load();$warnings=$loaded['warnings'];$registry=$loaded['registry'];if(empty($registry)){foreach($warnings as $warning){$this-&gt;error($warning);}if(empty($warnings)){$this-&gt;error('Cannot load patch registry');}return 1;}$comp=(new ComposerDetector($this-&gt;root))-&gt;detect();$warnings=array_merge($warnings,$comp['warnings']);$baseVersion=$comp['base_version']??'unknown';$replacedVendorPrefixes=array_map(static fn(string $pkg):string=&gt;'vendor/'.trim($pkg,'/').'/',$comp['replaced_packages']??[],);$areaDefinitions=$registry['_areas']??[];$installedAreas=[];$componentVersions=[];foreach($areaDefinitions as $area=&gt;$def){if(($def['detection']??'')==='base_version'){if($baseVersion!=='unknown'){$installedAreas[]=$area;$componentVersions[$area]=$baseVersion;}}elseif(isset($def['composer_package'])){$pkg=$def['composer_package'];if(isset($comp['installed_packages'][$pkg])){$installedAreas[]=$area;$componentVersions[$area]=ltrim($comp['installed_packages'][$pkg],'v');}}}if($baseVersion==='unknown'){$status=new PatchStatus(baseVersion:'unknown',appliedPatches:[],missingPatches:[],installedComponents:[],vulnerabilityStatus:[],warnings:array_values(array_unique($warnings)),registrySource:$loaded['source'],);echo match($this-&gt;format){'csv'=&gt;(new CsvFormatter())-&gt;format($status),default=&gt;(new JsonFormatter())-&gt;format($status),};return 1;}if(!$this-&gt;isPatchBinaryAvailable()){$this-&gt;error('patch(1) binary not found. Install the patch utility and try again.');return 1;}$patchResolver=new PatchResolver($registry);$applicableIds=$patchResolver-&gt;getApplicableIds($componentVersions,$installedAreas);if(empty($applicableIds)){$versionsStr=implode(', ',array_map(fn($a,$v)=&gt;\"{$a}={$v}\",array_keys($componentVersions),array_values($componentVersions),));$warnings[]=\"No patches found in registry for installed component versions ({$versionsStr})\";}try{$detected=$this-&gt;runDryRunDetection($applicableIds,$registry,$replacedVendorPrefixes);}catch(\\RuntimeException $e){$this-&gt;error($e-&gt;getMessage());return 1;}$warnings=array_merge($warnings,$detected['warnings']);$unknownLogs=$detected['unknown_logs'];$appliedPatches=[];$missingPatches=[];$unknownPatches=[];$notApplicableIds=[];foreach($detected['statuses']as $patchId=&gt;$patchStatus){match($patchStatus){'applied'=&gt;$appliedPatches[]=$patchId,'not_applied'=&gt;$missingPatches[]=$patchId,'unknown'=&gt;$unknownPatches[]=$patchId,'not_applicable'=&gt;$notApplicableIds[]=$patchId,default=&gt;null,};}$cveResolver=new CveResolver($registry);$vulnStatus=$cveResolver-&gt;resolve($appliedPatches,$missingPatches,$installedAreas,$componentVersions,$unknownPatches,$notApplicableIds,);$status=new PatchStatus(baseVersion:$baseVersion,appliedPatches:array_values($appliedPatches),missingPatches:array_values($missingPatches),installedComponents:$componentVersions,vulnerabilityStatus:$vulnStatus,warnings:array_values(array_unique($warnings)),registrySource:$loaded['source'],unknownPatches:array_values($unknownPatches),);$output=match($this-&gt;format){'csv'=&gt;(new CsvFormatter())-&gt;format($status),default=&gt;(new JsonFormatter())-&gt;format($status),};echo $output;$this-&gt;writeLog($status,$unknownLogs);return 0;}protected function makeRegistryLoader(string $magentoRoot,bool $forceRefresh):RegistryLoader{return new RegistryLoader(magentoRoot:$magentoRoot,forceRefresh:$forceRefresh);}protected function isPatchBinaryAvailable():bool{return DryRunDetector::isPatchBinaryAvailable();}protected function runDryRunDetection(array $applicableIds,array $registry,array $replacedVendorPrefixes=[]):array{$override=getenv('PATCH_DIFF_BASE_URL');if($override!==false&amp;&amp;trim($override)!==''){$override=trim($override);if(!UrlValidator::isValid($override)){throw new \\InvalidArgumentException('Environment variable PATCH_DIFF_BASE_URL contains an invalid URL (must be https).');}$baseUrl=$override;}else{$baseUrl=PatchFetcher::DIFF_BASE_URL;}$needsAuth=false;foreach($applicableIds as $id){if(!empty($registry['patches'][$id]['entitlements']??[])){$needsAuth=true;break;}}$credentials=null;if($needsAuth){$host=(string)(parse_url($baseUrl,PHP_URL_HOST)??'');$credentials=(new ComposerCredentialResolver())-&gt;resolve($this-&gt;root,$host);}$fetcher=new PatchFetcher($this-&gt;root,$baseUrl,$credentials,noCache:$this-&gt;noCache);$detector=new DryRunDetector($this-&gt;root,$registry,$fetcher,$replacedVendorPrefixes);return $detector-&gt;detect($applicableIds);}private function parseArgs(array $argv):void{foreach(array_slice($argv,1)as $arg){if(preg_match('/^--root=(.+)$/',$arg,$m)){$this-&gt;root=rtrim($m[1],'/');}elseif(preg_match('/^--format=(json|csv)$/',$arg,$m)){$this-&gt;format=$m[1];}elseif($arg==='--no-cache'){$this-&gt;noCache=true;}elseif(in_array($arg,['--version','-V'],true)){echo'patch-status '.self::VERSION.\"\\n\";exit(0);}elseif(in_array($arg,['--help','-h'],true)){$this-&gt;printUsage();exit(0);}}}private function printUsage():void{$version=self::VERSION;echo\"Adobe Commerce Monthly Security Release Versioning Tool v{$version}\\n\\n\".\"Usage:\\n\".\"  vendor/bin/patch-status [OPTIONS]\\n\\n\".\"Options:\\n\".\"  --root=PATH           Path to Commerce installation root (default: current directory)\\n\".\"  --format=FORMAT       Output format: json (default) or csv\\n\".\"  --no-cache            Bypass all local caches (registry and patch diffs); force fresh fetches from remote; exits with an error if the remote registry is unreachable\\n\".\"  --version             Show version\\n\".\"  --help                Show this help message\\n\\n\".\"Note: Output format is not final and may change in future releases.\\n\\n\";}private function writeLog(PatchStatus $status,array $unknownLogs):void{$logPath=rtrim($this-&gt;root,'/').'/'.self::LOG_FILE;$logDir=dirname($logPath);if(!is_dir($logDir)&amp;&amp;!@mkdir($logDir,0775,true)){return;}$line=sprintf(\"[%s] base=%s applied=[%s] missing=[%s] unknown=[%s]\\n\",date('c'),$status-&gt;baseVersion,implode(',',$status-&gt;appliedPatches),implode(',',$status-&gt;missingPatches),implode(',',$status-&gt;unknownPatches),);@file_put_contents($logPath,$line,FILE_APPEND|LOCK_EX);foreach($unknownLogs as $patchId=&gt;$logOutput){$block=sprintf(\"[%s] UNKNOWN %s:\\n%s\\n\",date('c'),$patchId,$logOutput);@file_put_contents($logPath,$block,FILE_APPEND|LOCK_EX);}}private function error(string $msg):void{fwrite(STDERR,\"patch-status: {$msg}\\n\");}}\n+$command=new PatchStatusCommand();exit($command-&gt;run($argv));\n", "url": "https://gist.github.com/nthurston/3103c06743f877b5b38c7d8a2f71c31e"}, {"timestamp": "2026-10-27T01:44:27Z", "date_only": false, "value": "2026-10-27T01:44:27Z", "kind": "other", "label": "Updated", "source": "osv_ubuntu \u00b7 UBUNTU-CVE-2026-27601", "record": "UBUNTU-CVE-2026-27601", "field": "modified"}, {"timestamp": "2026-10-27T04:24:20Z", "date_only": false, "value": "2026-10-27T04:24:20+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-10-27T04:24:20Z", "date_only": false, "value": "2026-10-27T04:24:20+00:00", "kind": "other", "label": "Document generated", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "document.tracking.generator.date"}, {"timestamp": "2026-10-27T04:24:20Z", "date_only": false, "value": "2026-10-27T04:24:20+00:00", "kind": "other", "label": "Updated", "source": "csaf_redhat \u00b7 RHSA-2026:24841", "record": "RHSA-2026:24841", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-10-30T18:33:04Z", "date_only": false, "value": "2026-10-30T18:33:04+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-10-30T18:33:04Z", "date_only": false, "value": "2026-10-30T18:33:04+00:00", "kind": "other", "label": "Document generated", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "document.tracking.generator.date"}, {"timestamp": "2026-10-30T18:33:04Z", "date_only": false, "value": "2026-10-30T18:33:04+00:00", "kind": "other", "label": "Updated", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "document.tracking.current_release_date"}, {"timestamp": "2026-10-30T18:33:12Z", "date_only": false, "value": "2026-10-30T18:33:12+00:00", "kind": "other", "label": "Advisory revision", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "document.tracking.revision_history.2.date"}, {"timestamp": "2026-10-30T18:33:12Z", "date_only": false, "value": "2026-10-30T18:33:12+00:00", "kind": "other", "label": "Document generated", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "document.tracking.generator.date"}, {"timestamp": "2026-10-30T18:33:12Z", "date_only": false, "value": "2026-10-30T18:33:12+00:00", "kind": "other", "label": "Updated", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "document.tracking.current_release_date"}], "metrics": {"as_of": "2026-10-30T19:24:38.367Z", "anchors": {"origin": {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, "discovery": {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, "report": null, "acknowledgement": null, "disclosure": {"timestamp": "2026-03-02T00:00:00Z", "date_only": false, "value": "2026-03-02T00:00:00.000Z", "kind": "milestone", "label": "Published", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, "exploit_publication": null, "exploitation": null, "patch": {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}}, "vendor_response_time": {"available": false, "missing": ["start", "end"]}, "time_to_exploit": {"available": false, "missing": ["end"]}, "disclosure_to_exploit": {"available": false, "missing": ["end"]}, "disclosure_to_exploit_publication": {"available": false, "missing": ["end"]}, "time_to_patch": {"available": false, "missing": ["start"]}, "total_time_to_patch": {"available": true, "seconds": 4290879.989, "hours": 1191.9111080555556, "days": 49.66296283564815, "min_seconds": 4290879.989, "max_seconds": 4290879.989, "approximate": false, "ongoing": false, "order_known": true, "batch_listing": false, "end_before_start": false, "start": {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, "end": {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}}, "disclosure_to_patch": {"available": true, "seconds": 4460198.0, "hours": 1238.943888888889, "days": 51.62266203703704, "min_seconds": 4373798.0, "max_seconds": 4460198.0, "approximate": true, "ongoing": false, "order_known": true, "batch_listing": false, "end_before_start": false, "start": {"timestamp": "2026-03-02T00:00:00Z", "date_only": false, "value": "2026-03-02T00:00:00.000Z", "kind": "milestone", "label": "Published", "source": "csaf_microsoft \u00b7 MSRC_CVE-2026-27601", "record": "MSRC_CVE-2026-27601", "field": "document.tracking.initial_release_date", "metric_role": "disclosure", "metric_basis": "recorded_event"}, "end": {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}}, "time_unpatched": {"available": true, "seconds": 4290879.989, "hours": 1191.9111080555556, "days": 49.66296283564815, "min_seconds": 4290879.989, "max_seconds": 4290879.989, "approximate": false, "ongoing": false, "order_known": true, "batch_listing": false, "end_before_start": false, "start": {"timestamp": "2026-03-03T23:01:58.011Z", "date_only": false, "value": "2026-03-03T23:01:58.011378+00:00", "kind": "other", "label": "Discovery date", "source": "csaf_redhat \u00b7 RHSA-2026:13826", "record": "RHSA-2026:13826", "field": "vulnerabilities.9.discovery_date", "metric_role": "discovery", "metric_basis": "recorded_event"}, "end": {"timestamp": "2026-04-22T14:56:38Z", "date_only": false, "value": "2026-04-22T14:56:38+00:00", "kind": "other", "label": "Vendor fix", "source": "csaf_redhat \u00b7 RHSA-2026:9742", "record": "RHSA-2026:9742", "field": "vulnerabilities.12.remediations.0.date", "metric_role": "patch", "metric_basis": "recorded_event"}}, "exploitation_to_patch": {"available": false, "missing": ["start"]}, "exploit_publication_to_patch": {"available": false, "missing": ["start"]}}}
