CVE-2026-44917
Description
OpenStack Ironic allows authenticated admins to read local files on the conductor via pxe_template, affecting versions before 35.0.2.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
OpenStack Ironic allows authenticated admins to read local files on the conductor via pxe_template, affecting versions before 35.0.2.
Vulnerability
A vulnerability exists in OpenStack Ironic's boot interfaces, specifically in how the pxe_template driver information is handled. Versions prior to 35.0.2 are affected. A malicious authenticated project admin or manager can exploit this by setting the node.driver_info[pxe_template] to a sensitive file path, such as /etc/ironic/ironic.conf, which the Ironic conductor process can read [1, 2].
Exploitation
An attacker with baremetal:node:update:driver_info permissions, such as a project owner or manager, can exploit this vulnerability. The attacker needs to modify a node's driver_info to set the pxe_template parameter to an absolute path of a sensitive file readable by the Ironic conductor process. The render_template() function then uses this path to read the file's contents, which are rendered and potentially returned in boot configurations [2].
Impact
Successful exploitation allows an attacker to read arbitrary local files from the Ironic conductor host. The scope of the compromise is limited to files readable by the ironic-conductor process user. This could lead to the disclosure of sensitive information, such as configuration files, which may grant further access or compromise system security [2].
Mitigation
OpenStack Ironic versions 35.0.2 and later contain a fix for this vulnerability. Specific fixed versions include >=17.0.0 <26.1.7, >=27.0.0 <29.0.6, >=30.0.0 <32.0.2, and >=33.0.0 <35.0.2 [1]. A recommended fix involves validating that pxe_template paths are within allowed directories [2]. No workarounds are mentioned in the available references.
AI Insight generated on Jun 4, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected products
2Patches
1e07527aa47e5security: disable driver_info level pxe_template override
4 files changed · +90 −4
ironic/conf/pxe.py+7 −0 modified@@ -209,6 +209,13 @@ '$pybasedir', 'drivers/modules/initial_grub_cfg.template'), help=_('On ironic-conductor node, the path to the initial grub' 'configuration template for grub network boot.')), + cfg.BoolOpt('enable_insecure_template_override', + default=False, + help=_('If node level pxe_template override is permitted to ' + 'be used in this Ironic deployment. This is an ' + 'insecure pattern filed under CVE-2026-44917 and ' + 'the feature this guards this is expected to be ' + 'removed in Ironic release 2027.2.')), ]
ironic/drivers/modules/deploy_utils.py+32 −4 modified@@ -460,9 +460,22 @@ def get_ipxe_config_template(node): # loaders by architecture as they are all consistent. Where as PXE # could need to be grub for one arch, PXELINUX for another. configured_template = CONF.pxe.ipxe_config_template - override_template = node.driver_info.get('pxe_template') - if override_template: - configured_template = override_template + insecure_override_template = node.driver_info.get('pxe_template') + if CONF.pxe.enable_insecure_template_override: + # TODO(TheJulia): Remove the node level pxe_template setting in + # a future release as it is inhernetly insecure. + if insecure_override_template: + configured_template = insecure_override_template + elif insecure_override_template: + raise exception.InvalidParameterValue(_( + 'The node\'s driver_info field pxe_template override value is ' + 'insecure (CVE-2026-44917) and should not be used. The ' + 'appropriate approach is to utilize [pxe]ipxe_template_by_arch ' + 'configuration in ironic.conf to match the baremetal node\'s ' + 'architecture. Please work with your Ironic operator to remedy ' + 'your usage and configuration. Default templates may be ' + 'leveraged by deleting the pxe_template value in the driver_info ' + 'field.')) return configured_template or get_pxe_config_template(node) @@ -477,7 +490,22 @@ def get_pxe_config_template(node): :param node: A single Node. :returns: The PXE config template file name. """ - config_template = node.driver_info.get("pxe_template", None) + config_template = None + insecure_override_template = node.driver_info.get("pxe_template", None) + if CONF.pxe.enable_insecure_template_override: + # TODO(TheJulia): Remove the node level pxe_template setting in + # a future release as it is inhernetly insecure. + config_template = insecure_override_template + elif insecure_override_template: + raise exception.InvalidParameterValue(_( + 'The node\'s driver_info field pxe_template override value is ' + 'insecure (CVE-2026-44917) and should not be used. The ' + 'appropriate approach is to utilize [pxe]pxe_template_by_arch ' + 'configuration in ironic.conf to match the baremetal node\'s ' + 'architecture. Please work with your Ironic operator to remedy ' + 'your usage and configuration. Default templates may be ' + 'leveraged by deleting the pxe_template value in the driver_info ' + 'field.')) if config_template is None: cpu_arch = node.properties.get('cpu_arch') config_template = CONF.pxe.pxe_config_template_by_arch.get(cpu_arch)
ironic/tests/unit/drivers/modules/test_deploy_utils.py+23 −0 modified@@ -425,13 +425,25 @@ def test_get_pxe_config_template_emtpy_property_bios(self): self.assertEqual('bios-template', result) def test_get_pxe_config_template_per_node(self): + cfg.CONF.set_override('enable_insecure_template_override', True, + group='pxe') node = obj_utils.create_test_node( self.context, driver='fake-hardware', driver_info={"pxe_template": "fake-template"}, ) result = utils.get_pxe_config_template(node) self.assertEqual('fake-template', result) + def test_get_pxe_config_template_per_node_disabled(self): + self.assertFalse(cfg.CONF.pxe.enable_insecure_template_override) + node = obj_utils.create_test_node( + self.context, driver='fake-hardware', + driver_info={"pxe_template": "fake-template"}, + ) + self.assertRaisesRegex( + exception.InvalidParameterValue, 'CVE-2026-44917', + utils.get_pxe_config_template, node) + def test_get_ipxe_config_template(self): node = obj_utils.create_test_node( self.context, driver='fake-hardware') @@ -458,12 +470,23 @@ def test_get_ipxe_config_template_none_bios(self): utils.get_ipxe_config_template(node)) def test_get_ipxe_config_template_override_pxe_fallback(self): + cfg.CONF.set_override('enable_insecure_template_override', True, + group='pxe') node = obj_utils.create_test_node( self.context, driver='fake-hardware', driver_info={'pxe_template': 'magical'}) self.assertEqual('magical', utils.get_ipxe_config_template(node)) + def test_get_ipxe_config_template_override_pxe_fallback_disabled(self): + self.assertFalse(cfg.CONF.pxe.enable_insecure_template_override) + node = obj_utils.create_test_node( + self.context, driver='fake-hardware', + driver_info={'pxe_template': 'magical'}) + self.assertRaisesRegex( + exception.InvalidParameterValue, 'CVE-2026-44917', + utils.get_ipxe_config_template, node) + @mock.patch('time.sleep', lambda sec: None) class OtherFunctionTestCase(db_base.DbTestCase):
releasenotes/notes/security-bug-2148319-49974afdcd38d9c0.yaml+28 −0 added@@ -0,0 +1,28 @@ +--- +security: + - | + A vulnerability was discovered in an minimally documented feature of + Ironic where an absolute path to a ``pxe_template`` override value could + be defined by an authenticated and privilged API user. The Ironic team has + chosen to immediately deprecate and remove this functionality. To provide + an immediate security fix, this functionality is now disabled by default. + The functionality can be re-enabled via the + ``[pxe]enable_insecure_template_override`` configuration option which + was added to ironic.conf with a default value of ``False``. + This issue is tracked as + `bug 2148319 <https://bugs.launchpad.net/ironic/+bug/2148319>`_. +fixes: + - | + Fixes a vulnerability (CVE-2026-44917) which was identified inhandling + of pxe_template overrides where an authenticated and authorized user + could request an override template via direct file path which would + bypass file URL handling guards introduced in OSSA-2025-001. This + feature was minimally documented through only a release note, and + does not appear to have actual use. This functionality is being + disabled by default, and will be promptly removed from Ironic's + current development branch. +deprecations: + - | + The node ``driver_info`` field value ``pxe_template`` has been + deprecated and is expected to be removed in the future Ironic + 2027.2 release.
Vulnerability mechanics
Synthesis attempt was rejected by the grounding validator. Re-run pending.
References
3News mentions
1- OpenStack: Critical RCE and Multiple Ironic Flaws Disclosed TogetherVypr Intelligence · Jun 4, 2026