Puppet Core 9.0.0
Released August 2026. Puppet Core 9.0.0 adds support for Rocky Linux 10 and Alma Linux 10. Security improvements include stricter SSH key validation, stricter autoloader validation, and updated versions of OpenSSL, curl, and Ruby. Support is removed for EOL OS versions of Amazon Linux, Debian, Enterprise Linux, Fedora, macOS, Red Hat Enterprise Linux, Ubuntu, and Windows Server. Support was removed for PSON and bundled multi_json.
Before upgrading, make sure you review all release notes for this release and Upgrade from Puppet 8 to Puppet 9 for breaking changes.
On this page:
New features and enhancements
Updated Ruby
Ruby was updated to version 4.0.5. This change also addresses CVE-2026-41316 and CVE-2026-46727. Make sure to read Upgrade from Puppet 8 to Puppet 9 for breaking changes and update your Puppet code so that it is compatible with this version of Ruby. PA-8429, PA-8510
Updated OpenSSL
OpenSSL was updated to version 3.5.7.
Default TLS supported groups list changed to include and prefer hybrid PQC KEM groups. In OpenSSL 3.5, support for post-quantum cryptography key encapsulation mechanism (PQC KEM) algorithms (ML-KEM, ML-DSA, and SLH-DSA) was added. Additionally, less-used legacy groups have been removed from the default.
Default TLS keyshares now include X25519MLKEM768 and X25519. X25519 is an elliptic curve Diffie-Hellman (ECDH) key agreement algorithm using Curve25519.
X25519MLKEM768 is a hybrid post quantum key exchange that combines 2 different key agreement algorithms: X25519 (elliptic curve Diffie-Hellman) with ML-KEM-768 (Module-Lattice-based Key Encapsulation mechanism, a post-quantum algorithm). The final shared secret is derived from both mechanisms combined. Both algorithms are used independently to generate a secret key. Then, the two secret keys are combined to create a final session key.
By using two algorithms, X25519MLKEM768 provides more robust, quantum-resistant security while maintaining backward compatibility with classical cryptography. Additionally, it remains secure even if either algorithm is broken. TLS 1.3 is the default protocol version in OpenSSL 3.5 and is required to use X25519MLKEM768.
This Open SSL update also addresses:
-
CVE-2026-2673
-
CVE-2026-7383
-
CVE-2026-9076
-
CVE-2026-28387
-
CVE-2026-28388
-
CVE-2026-28389
-
CVE-2026-28390
-
CVE-2026-31789
-
CVE-2026-31790
-
CVE-2026-34180
-
CVE-2026-34182
-
CVE-2026-42766
-
CVE-2026-42767
-
CVE-2026-45445
-
CVE-2026-45446
-
CVE-2026-45447
PA-8350, PA-8824
Agent platforms added
This release adds support for the Puppet agent on the following operating system platforms:
-
Rocky Linux 10 (x86_64) PA-8559
-
Alma Linux 10 (x86_64) PA-8568
UTF-8 default encoding on Windows
Puppet Core now uses UTF-8 as a default for external encoding on Windows platforms, aligning Puppet with the broader Windows Ruby ecosystem, which adopted UTF-8 as the default encoding starting in Ruby 3.x. Most modern versions of Windows have UTF-8 as the locale default. However, if you have Puppet configuration files, resource names, or command output that contain non-ASCII characters encoded with Windows-1252 or ISO-8859-1, ensure your output is UTF-8 before upgrading. PA-8449
Updated Resource API
The Puppet Resource API was updated to version 2.0.0. Schema validation is now performed only on resources that are consumed. This change prevents unmanaged resources from causing catalog application failures while preserving validation where it is expected. PA-8394, PA-8838
Updated realpath emulation on Windows
In Ruby 3.x, a patch was applied to mitigate performance problems caused by realpath emulation in Ruby on Windows. The patch was updated for Ruby 4.0 to ensure continued optimal performance on Windows systems. PA-8142
Security updates
Improved SSH key validation
Previously, the validation for SSH keys accepted invalid input, including embedded newline characters, allowing malformed SSH keys to be validated. Puppet Core now enforces stricter validation of SSH keys to help prevent unsafe content from being written to files. PA-8911
Improved autoloader input validation
Previously, Puppet Core's autoloader input validation for puppet resource could allow unintended code to be loaded via the puppet resource command. Puppet Core now validates autoloader input to help prevent arbitrary code from being loaded via user-controlled values. PA-8908
PA-8350, PA-8824
Updated curl
Updated curl from 8.20.0 to 8.21.0 to address the following CVEs:
-
CVE-2026-8286
-
CVE-2026-8458
-
CVE-2026-8924
-
CVE-2026-8925
-
CVE-2026-8926
-
CVE-2026-8927
-
CVE-2026-8932
-
CVE-2026-9079
-
CVE-2026-9080
-
CVE-2026-9545
-
CVE-2026-9546
-
CVE-2026-9547
-
CVE-2026-10536
-
CVE-2026-11352
-
CVE-2026-11564
-
CVE-2026-11586
-
CVE-2026-11856
-
CVE-2026-12064
PA-8903
Patches for Windows certificate store removed
On Windows systems, Puppet now relies on OpenSSL's native integration with the Windows certificate store instead of patches. This change removes the custom behavior previously used to make OpenSSL::X509::Store#set_default_paths work with the Windows certificate store and aligns certificate trust handling with OpenSSL's built-in functionality. As a result of this change, Puppet Core 9.x might reject certificates that were previously accepted in Puppet 8.x. If puppet module install fails when run on a Windows host or if Puppet cannot manage files from https file sources, verify the root certificate is present in the Windows ROOT certificate store and has not expired. PA-8335
Resolved issues
Deferred functions are pre-processed by default
In Puppet 8, preprocess_deferred was by default set to false, so deferred functions were lazily evaluated during catalog application. This behavior caused regressions in some custom types and providers. including many third-party types and providers.
In Puppet Core 9, preprocess_deferred is set to true by default, so deferred functions are processed before catalog application. This change restores the behavior used in Puppet 7. There is no change to preprocessed resources, just a change to when they are applied.
If you rely on deferred function dependencies to be run when the catalog is applied, refactor your code to work with the updated setting. PUPDOC-6047
macOS providers now correctly report plist write failures
Previously, macOS providers reported success when writing a property list (plist) file failed. During plist writes, I/O and system call errors were logged but not propagated, causing operations such as user, group, password, or launchd service management to fail while appearing to be successful. Now, failures are reported, allowing you to find and troubleshoot underlying issues. PA-8822
Updated CFPropertyList dependency for macOS compatibility
CFPropertyList was updated to version 4, which includes runtime dependencies required by newer Ruby versions. This improves compatibility for macOS workflows that depend on plist-related provider operations. PA-8145
Fixed a macOS 26 x86_64 agent crash during pluginsync
During pluginsync, Puppet runs on macOS 26 (x86_64) terminated with a segmentation fault in the macOS unified logging subsystem (os_log). The affected tracing path is now disabled on macOS 26 (x86_64), allowing agent runs to complete successfully. This issue does not affect Puppet Core agent 8 for macOS or Puppet Core 9 macOS 26 for ARM64. PA-8823
Deprecations
Agent platforms removed
Support was removed for the following EOL OS versions. The following are no longer available as Puppet Core agents:
-
AmazonLinux 2 (aarch64) PA-9056
-
Debian 10 PA-9056
-
Debian 11 PE-44231
-
Debian 12 PE-44231
- Fedora 36 (x86_64) PA-9056
-
Fedora 40 (x86_64) PA-9056
-
EL 7 (x86_64) PA-9056
-
macOS 13 (x86_64, ARM) PA-8929
-
Red Hat Enterprise Linux 7 (x86_64) PA-9056
- Ubuntu 18.04 (amd64, aarch64) PA-9056
-
Ubuntu 20.04 (amd64, aarch64) PA-9056
-
Windows Server 2012R2 (x86) PA-9056
Puppet no longer bundles the multi_json gem
Starting in Puppet Core 9.0.0, multi_json is no longer included in the puppet-agent package. If any custom code or tooling relies on multi_json being provided by puppet-agent, that dependency must now be managed independently. PA-8829
PSON support removed
Starting in Puppet Core 9.0.0, PSON is no longer supported. If your Puppet code relies on PSON, update your code to use supported data formats before upgrading. PA-9017