Skip to content

Pin iPXE to v2.0.0-fog.7 - #1188

Merged
mastacontrola merged 1 commit into
dev-branchfrom
pin-ipxe-v2.0.0-fog.7-dev
Aug 18, 2026
Merged

Pin iPXE to v2.0.0-fog.7#1188
mastacontrola merged 1 commit into
dev-branchfrom
pin-ipxe-v2.0.0-fog.7-dev

Conversation

@mastacontrola

@mastacontrola mastacontrola commented Aug 18, 2026

Copy link
Copy Markdown
Member

Same fix as #1187 on working-1.6, and this branch has the same bug: _nameConstraints() here writes nameConstraints = critical into both intermediates too, so a 1.5 server's Web CA is rejected by stock iPXE for exactly the same reason.

Makes HTTPS netboot work at all against a FOG server whose web certificate is issued by FOG's own CA — which is every -S install that has not supplied a public certificate.

The Web CA carries a critical nameConstraints extension on purpose: it is what stops a compromised web leaf from being usable to impersonate anything outside this server's own names. Upstream iPXE has no parser for that extension, and a critical extension a validator cannot parse is one it must reject. So the Web CA was rejected before the leaf was ever considered, and every client died at the first chain with

Operation not supported (https://ipxe.org/3c16e283)

then reboot-looped.

fog-ipxe#6 teaches iPXE the extension rather than weakening the CA — permittedSubtrees/excludedSubtrees over dNSName and iPAddress, enforced across the whole validated path, with constraint types iPXE cannot evaluate refused at parse time so an unenforceable constraint fails closed rather than being silently skipped. Full reasoning is in ADR 0016 on working-1.6 (#1184); this branch keeps no docs/adr tree.

Verified end to end on a UEFI Secure Boot VM against the 1.6 server: the stock binary fails to parse the Web CA; the patched one validates the chain and reaches the FOG boot menu over HTTPS. The binaries are the same build on both branches.

What a re-run does here

/tftpboot is only rewritten when the installer re-runs. On this branch every https install rebuilds iPXE locally and unconditionally — there is no build stamp and no manifest comparison in fetchipxeasset() — so the re-run picks up the patched sources by way of prepareiPXEsource() checking $buildipxesrc out at $ipxeVer, and overwrites the old binaries outright. working-1.6's stamp-and-manifest layer is not present here, which is why the two PR descriptions differ on this point.

🤖 Generated with Claude Code

Makes HTTPS netboot work at all against a FOG server whose web
certificate is issued by FOG's own CA -- which is every -S install that
has not supplied a public certificate.

FOG issues its Web CA with a CRITICAL nameConstraints extension, on
purpose: it is what stops a compromised web leaf from being usable to
impersonate anything outside this server's own names. Upstream iPXE has
no parser for that extension, and a critical extension a validator
cannot parse is one it must reject. So the Web CA was rejected before
the leaf was ever considered, and every client died at the first chain
with

    Operation not supported (https://ipxe.org/3c16e283)

then reboot-looped. The two available fixes were to stop constraining
the CA, or to teach iPXE the extension. v2.0.0-fog.7 does the second:
permittedSubtrees and excludedSubtrees over dNSName and iPAddress,
enforced across the whole validated path, with constraint types iPXE
cannot evaluate refused at parse time so an unenforceable constraint
fails closed rather than being skipped. Reasoning and the rejected
alternatives: the ADR on working-1.6,
docs/adr/0016-ipxe-enforces-x509-name-constraints.md (this branch keeps no
docs/adr tree).

Servers do not self-heal. /tftpboot is only rewritten when the
installer re-runs. On this branch every https install rebuilds iPXE
locally and unconditionally -- there is no build stamp and no manifest
comparison here -- so a re-run picks the patched sources up by way of
prepareiPXEsource() checking the tree out at $ipxeVer, and overwrites
the old binaries outright.
@mastacontrola
mastacontrola force-pushed the pin-ipxe-v2.0.0-fog.7-dev branch from dd90633 to aebbea7 Compare August 18, 2026 14:23
@mastacontrola
mastacontrola merged commit a49fb96 into dev-branch Aug 18, 2026
3 checks passed
@mastacontrola
mastacontrola deleted the pin-ipxe-v2.0.0-fog.7-dev branch August 21, 2026 11:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant