VYPR
Medium severity4.9NVD Advisory· Published Jun 4, 2026· Updated Jun 4, 2026

CVE-2026-44917

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

2
  • OpenStack/Ironicinferred2 versions
    <35.0.2+ 1 more
    • (no CPE)range: <35.0.2
    • (no CPE)range: <35.0.2

Patches

1
e07527aa47e5

security: disable driver_info level pxe_template override

https://github.com/openstack/ironicJulia KregerMay 7, 2026via github-commit-search
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

3

News mentions

1