Commit Graph
6884 Commits
Author SHA1 Message Date
Luca Boccassi 2e1c8bc3d7 udev: fix several option parsing edge cases (#42997)
Boundary tests were conducted on the udev subsystem, and some issues
were identified and resolved.
2026-07-13 13:42:27 +01:00
Jonas Dreßler 71d20a990e repart: Don't copy trailing padding when using --copy-from=
Currently, --copy-from= copies the paddings in between the source partitions,
as well as the trailing padding that is at the end of the source partition table.
It doesn't copy the leading padding at the start of the source partition table
though.

This seems inconsistent, and likely it was an oversight that the trailing padding
is copied.

Fix that, and add a test to ensure we don't regress.
2026-07-13 12:23:20 +02:00
Jonas Dreßler 0df5ebc079 repart: Clarify and test that --copy-from= argument respects grain size
The --copy-from= argument currently is documented as "copied partitions will have
the same size". This doesn't hold true in the case where a different grain-size is
passed to repart. Because `partition_min/max_size()` currently do rounding, the
size is implicitly rounded to grain size, and therefore partitions are enlarged
to align to grain size whenever possible.

Clarify this behavior and change the manpage, and also add a test for it.
2026-07-13 12:09:43 +02:00
Jonas Dreßler 2b1be5d909 repart: Don't get old grain size from fdisk for --copy-from=
This is a little bit confusing, but grain size is not actually stored in the gpt
metadata. Rather, fdisk's `get_grain_size()` returns an autodiscovered "optimal io
size" value as grain size. This might not actually be the grain size that the
disk we're copying is using.

Since we're setting the padding of the copied partitions using that value from
fdisk, we're rounding the new paddings by fdisk's optimal grain size, which is
usually 1MiB (a lot more then the default 4KiB that we're using otherwise).

Set the grain size here to 1 byte instead, ensuring that the min/max padding set
is exactly the padding that was present before.

Also add a test to confirm the behavior is fixed: The test calls --copy-from= on
an existing disk with 4MiB grain size, and because we pass --grain-size=512, now
no rounding should happen and the paddings should be transferred to exactly the
same size.
2026-07-13 12:09:13 +02:00
dongshengyuan 4106cf7439 udevadm-trigger: reject invalid wait-daemon timeout
Return from argument parsing when --wait-daemon= cannot be parsed.

This matches the other timeout options.

Reproducer:
  udevadm trigger --dry-run --wait-daemon=bad

Before:
  Failed to parse timeout value 'bad', ignoring: Invalid argument

Follow-up:
  2001622c58
2026-07-13 12:18:49 +08:00
dongshengyuan 778f932032 udevadm-settle: reject positional arguments
The settle command does not define positional arguments.

Reject them during argument parsing instead of silently ignoring
them.

Reproducer:
  udevadm settle /no/such/argument

Before:
  The command exits successfully and ignores the argument.

Follow-up:
  c71509028f
2026-07-13 12:18:49 +08:00
dongshengyuan 7bd6b8c587 udevadm-wait: let --removed override initialization
The documentation says --initialized= is ignored when --removed is
specified.

Track --removed separately so it wins regardless of option order.

Reproducer:
  udevadm wait --timeout=0 --removed --initialized=no /dev/no-such-test-device

Before:
  Timed out for waiting devices being added.

Follow-up:
  aa2b0d8d29
2026-07-13 12:18:49 +08:00
dongshengyuan c5a6425b81 udevadm-info: allow valueless attr filters
The --attr-match= and --attr-nomatch= filters are documented as
FILE[=VALUE], like the trigger filters.

Accept a bare attribute name for sysfs attribute presence matches.

Reproducer:
  udevadm info --export-db --attr-match=ifindex

Before:
  Expected <ATTR>=<value> instead of 'ifindex'

Follow-up:
  a6b4b2fa01
2026-07-13 12:18:48 +08:00
Lennart Poettering 5cead3f269 credentials: add policy that can allow key=null creds from the ESP (#42555)
This PR only sets the default to "relaxed" - I can change the default
to "tofu" if desired. But for that we will also need to update the NEWS
file to ensure everyone is aware of this new default.

---

This PR adds a new `systemd.credentials-boot=` kernel
commandline that allows to control if credentials with
a `null` key are accepted.

The possible options are:
* strict: always insist on tpm encryption
* tofu: allow null encryption in firstboot mode and when no tpm is
available
* relaxed: allow null encryption when sb is off, or no tpm is available
* off: allow null encryption always

The default is `relaxed` which is exactly the behavior we had before.

This replaces the initial idea of using plaintext credentials
at firstboot (thanks to Lennart for this nicer and simpler design).

---

With that we can drop `- firstboot: optionally accept credentials at
firstboot without authentication` from TODO.md
2026-07-10 14:43:12 +02:00
Kai Lüke c8a2e035ce sysupdate: Evaluate all patterns before descending into a subdir
When we have two match patterns, e.g., because the repository layout
changed and we look for old and new style files, we can have the case
that one pattern suggests a descend into a subdir but the other pattern
would be a direct match. This was missed and only the descent was done.
Yet the other way round also has to be covered: We can't just use the
direct match because it might be that it's rejected if the type doesn't
fit (directory vs. regular file). In this case we should still descent.

Remember that we want to descend but continue checking the other
pattern first to maybe get a direct match. Introduce a new combined
return code YES_AND_RETRY to give the full information to the caller
which now can decide to fallback to a descent. While at it, use the
stat info for the directory check. Also add tests to ensure that the
order of patterns doesn't matter and we handle the above corner cases.
2026-07-10 14:25:38 +02:00
Kai Lüke 761c664110 sysupdate: Support matching for filenames in subdirectories
While for sysupdate it's fine to consume a large set of all possible
update payloads in a single directory this is not so handy for managing
and serving the update payloads. Since this large update folder is not
where the build output directly gets written to one has to create
copies and later possibly delete this added set of files.

Support matching for filenames in subdirectories by having a new **/
match pattern prefix which matches any number of nested subdirectories
or no subdirectory at all. For simplicity it's only allowed at the start
of a pattern and not a regular wildcard as the rest because the main
use case is to descend into subdirectories and only do the pattern
matching for the basenames. This way one can create a SHA256SUMS file
in the top folder and have it include all update payloads from the
release-specific (or arch-specific) subdirectories. Something similar
was already supported for directory sources where the match pattern can
start with a subdirectory path. Do also support this for SHA256SUMS for
parity while we are at it. Having the new wildcard makes mirroring also
easier because one does not have to follow the exact subdirectory layout
and one can filter by folder instead of by filename. It also makes it
possible to point the same transfer files with the new wildcard to
either a SHA256SUMS file that uses release-specific (or arch-specific)
subdirectories and includes all versions or to a SHA256SUMS file as
generated from mkosi that does not use subdirectories because it only
has files for a single version.
With the upcoming UAPI.16 JSON format we will also be able to encode
subdirectories and it makes sense to add this to SHA256SUMS for being
able to convert them. It also supports custom URLs for each entry which
is more powerful than the (arbitrary) subdirectory feature used here but
subdirectories have the advantage that they don't break mirroring.
This change also fixes the existing subdirectory handling bugs where
everything greater than two subdirectory levels failed to work because
rel_joined instead of de->d_name got used, symlinks were followed, and
we would continue silently on non-ENOENT errors.
2026-07-10 14:25:38 +02:00
Simran Singh 104970a8bd clonesetup: add support to clone devices via /etc/clonetab
Adds dm-clone device setup at boot via a new /etc/clonetab config file,
following the crypttab/veritytab pattern.

- Add systemd-clonesetup-generator to parse /etc/clonetab and generate units.
- Add systemd-clonesetup binary to create/remove dm-clone devices via ioctl.
- Add clonesetup.target for ordering dm-clone activation at boot.
- Add region_size= option in clonetab to configure dm-clone hydration granularity.
- Add clonetab(5) and systemd-clonesetup-generator(8) man pages.

Fixes: https://github.com/systemd/systemd/issues/39500
2026-07-10 14:01:24 +02:00
dongshengyuan c0c5ba9662 udev: require exact builtin command matches
Commit 9b917abe02 (udev-builtin:
simplify code a bit) changed builtin lookup from copying the first
command word and comparing it with streq() to comparing only the first
command word length with strneq().

That made prefixes such as "k" or "key" resolve to the "keyboard"
builtin, depending on the builtins table order. This was not the
original behavior.

Require the matched builtin name to end at the first command word
boundary so only complete builtin names are accepted. Arguments after
the builtin name continue to work as before.
2026-07-10 20:41:13 +09:00
Yu Watanabe 71bc8f4fe5 udev: fix several reproducible command handling issues (#42958)
This PR fixes several independent udev command and rule handling issues.
Each commit contains the corresponding reproducer and fix details.
2026-07-10 20:04:51 +09:00
dongshengyuan 4b7f3de68c udevadm-info: handle missing data db cleanup
udevadm info --cleanup-db cleaned links and tags by comparing them
against /run/udev/data, but asserted when that data directory was
missing.

Treat a missing data directory as an empty database, so stale link
and tag entries can be removed without aborting.

Add a database test that runs cleanup-db with links and tags present
but no data directory.

Reproducer:

$ sudo unshare --mount --propagation private sh -c '
mount -t tmpfs tmpfs /run/udev
mkdir -p /run/udev/links/foo
udevadm info --cleanup-db
'
Assertion 'datadir' failed at src/udev/udevadm-info.c:676, function cleanup_dirs_after_db_cleanup(). Aborting.
Aborted (core dumped)

The command should handle a missing /run/udev/data directory instead
of aborting.
2026-07-10 16:09:34 +08:00
dongshengyuan 351e29e739 udevadm-control: reject oversized children-max
The --children-max= option parsed into an unsigned value and then
stored it in an int sentinel field.

Values above INT_MAX could wrap negative and make the command look as
if no control option had been specified.

Reject oversized values before assigning the parsed value.

Reproducer:

$ udevadm control --children-max=2147483648
No control command option is specified.
$ echo $?
1

The value should be rejected as out of range instead of being wrapped
into the unset sentinel value.
2026-07-10 16:08:07 +08:00
dongshengyuan 9095da896f udev-rules: drop truncated import output line
When IMPORT{program} output was truncated, the code intended to drop
the last incomplete result line before importing properties.

It edited the command buffer instead of the output buffer, so the
incomplete line could still be parsed and imported.

Trim the result buffer and cover the behavior with the existing IMPORT
test.

Follow-up for 6b6e471a32.

Reproducer:

Configure an IMPORT{program} rule whose output exceeds UDEV_LINE_SIZE
and ends with an incomplete property line, for example:

TRUNCATED_OK=yes
TRUNCATED_BAD=<very long value without terminating newline>

Only TRUNCATED_OK should be imported. Before this fix, the truncation
handler edited the command buffer instead of the output buffer, so
TRUNCATED_BAD could still be parsed from the truncated result.
2026-07-10 16:05:24 +08:00
Yu Watanabe 5b05fbe53e test: add dlopen note checker
This introduces a test utility to validate the presence and correctness
of dlopen ELF notes.

The test extracts and compares dlopen ELF notes between the dynamic and
static versions of target binaries to catch missing entries. Furthermore,
it scans the code for dlopen_foo() invocations to ensure that no stale or
unused notes remain in the final binary, thereby verifying the linker's
garbage-collection integration.
2026-07-10 16:35:19 +09:00
Kai Lüke 19eac27e62 TEST-70-TPM2.cryptsetup: Make sure we iterate over foreign tokens
When we enroll two UKIs with different PCR pub keys into one LUKS slot/
token each, we can encounter the wrong one and should not give up
but continue iterating.
2026-07-10 08:07:47 +02:00
Kai Lüke f6a7a9ec3d mount-util/sysext: Clone sub mounts as private to preserve nested ones
When nested mounts appear under a sysext hierarchy like this:
  mkdir -p /opt/trigger/
  mount -t tmpfs tmpfs /opt/trigger
  mkdir -p /opt/trigger/inner
  mount -t tmpfs tmpfs /opt/trigger/inner
Then systemd-sysext merge will lose the inner mount because it uses a
regular bind mount with propagation and then unmounts the source,
unmounting all children with it which propagates (as found out in
https://github.com/flatcar/Flatcar/issues/2111).
To solve this, clone the sub mount with MS_PRIVATE to decouple sub
mounts from the original mount. Then attach the cloned mount instead of
doing regular bind mounts. For old kernels we still attach the cloned
mount but we fallback to cloning without MS_PRIVATE. This change also
affects mount_private_apivfs which is used for private /proc, /sys, and
cgroupfs but I think it makes sense there, too, instead of only doing
mount_setattr for sysext alone because, e.g., a container and the host
should not be leaking mount actions into each other for these mounts.
2026-07-10 03:34:54 +02:00
Michael Vogt cb7f95ff5f credentials: add policy that can allow key=null creds from the ESP
This commit adds a new `systemd.credentials_boot_policy=` kernel
commandline that allows to control if credentials with
a `null` key are accepted.

The possible options are:
* strict: always insist on tpm encryption
* tofu: allow null encryption in firstboot mode and when no tpm is available
* relaxed: allow null encryption when sb is off, or no tpm is available
* off: allow null encryption always

The default is currently `relaxed` which is the same behavior
as before.

This replaces the initial idea of using plaintext credentials
at firstboot (thanks to Lennart for this nicer and simpler design).

Note that this also moves `in_first_boot()` to `basic/initrd-util`
which is a better fit now.
2026-07-09 16:48:26 +02:00
dongshengyuan 8cbae52fc9 pcrlock: handle piped PE input
When lock-pe or lock-uki read from stdin,
copy non-regular input to a seekable temporary fd before hashing it.

Fixes #42893.
Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
2026-07-09 11:02:46 +02:00
Luca Boccassi 052ff5fb5d resolved: honour per-link DNSOverTLS=yes for certificate verification
dnstls_stream_connect_tls() reads the manager-wide dns_over_tls_mode
field directly, so when the global mode was 'no' or 'opportunistic' but
a link was configured with strict DNSOverTLS=yes, the DoT connection
was established without SSL_VERIFY_PEER or hostname/IP checks.
Use dns_server_get_dns_over_tls_mode() which honours the per-link
override.
2026-07-08 17:29:03 +02:00
Luca Boccassi feda6f31d8 pcrlock: add vl method for list-components
Add varlink method wrapper for list-components verb.
2026-07-08 16:22:05 +01:00
Lars Sjöstrom 231fddc337 core: support stdio fd passing in io.systemd.Unit.StartTransient
Add StandardInputFileDescriptor, StandardOutputFileDescriptor and
StandardErrorFileDescriptor to the Service context of the Varlink
StartTransient() method. Each carries the push-order index of a file descriptor
passed along with the method call (via SCM_RIGHTS), and connects it to the
transient service's standard input/output/error. This is the Varlink equivalent
of the StandardInputFileDescriptor= / StandardOutputFileDescriptor= /
StandardErrorFileDescriptor= D-Bus transient properties behind
"systemd-run --pipe", which had no Varlink counterpart.

The manager Varlink server now enables SD_VARLINK_SERVER_ALLOW_FD_PASSING_INPUT
so clients may attach descriptors to their method calls, matching other
fd-accepting Varlink services (mountfsd, networkd, vmspawn, ...). The indices are
resolved with sd_varlink_peek_dup_fd() after the polkit authorization check and
stored on the Service exactly like the D-Bus path
(bus_set_transient_exec_context_fd()): the fds land in stdin_fd/stdout_fd/
stderr_fd and exec_context.stdio_as_fds is set, so the existing exec-invoke
plumbing wires them to the spawned process unchanged. Unsuitable fds (bad
index, wrong access mode) are rejected as InvalidParameter, other resolution
failures propagate as raw errnos.

Add coverage to TEST-74-AUX-UTILS.varlinkctl-unit.sh, passing regular files as
the stdout/stderr fds and asserting the unit's output lands on them.
2026-07-08 08:31:29 +02:00
Zbigniew Jędrzejewski-Szmek 6b325a3613 Adjust naming of meson variables and allow systemd-report* binaries to be built standalone (#42874) 2026-07-07 21:35:41 +02:00
dongshengyuan a977bf4d06 portable: detect drop-in-only attachments
Commit edea370222 (portable: remove drop-in configs even if the main unit file does not exist)
taught detach to handle leftover .service.d directories
after the main unit symlink was removed.

portable_get_state_internal() still had the same blind
spot: it only considered regular unit entries, so portablectl
is-attached could report detached while a portable drop-in directory was still present.

Handle those drop-in-only entries like detach does, preserve
the existing unit-file based enabled checks when the
main unit file is still present, and add TEST-29 coverage.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
2026-07-07 18:47:30 +02:00
Zbigniew Jędrzejewski-Szmek f731334d84 meson: use modern syntax for dict checks 2026-07-07 13:40:13 +02:00
Michael Vogt 6bfd3424e8 journalctl: add follow mode to the varlink method
This commit implements `journalctl -f` like behavior for the
varlink API of journalctl. It is used via:
```
$ varlinkctl call -E \
    /run/systemd/io.systemd.JournalAccess \
    io.systemd.JournalAccess.GetEntries '{"follow": true, "limit": 10}'
```
This gives the last 10 message and then it keeps the connection
open and output each new log line that matches the set filters.

The code is modeled after `journalctl -f`. It seems there is little
to extract into shared code here so I left it for now.
2026-07-07 09:45:03 +02:00
Lennart Poettering 79c6e4fed2 Add varlink interface for sysinstall (#42261)
Allow graphical installers to use system sysinstall. This will be used
by gnome-setup to install GNOME OS and ideally installers of other
distributions talk to the same varlink interface.
2026-07-03 16:04:25 +02:00
Julian Sparber 2acdbae8eb test: Add basic test for sysinstall varlink interface
This adds a basic test for the newly added varlink interface of
sysinstall.
2026-07-03 12:19:03 +02:00
Daan De Meyer d04fbcf956 tree-wide: get rid of backslashes in file names
File names containing backslashes cannot be checked out on Windows,
are not handled properly by build systems such as buck, and are awkward
to work with in general, so store the \x2d slice units under sanitized
file names, and rename them to the real unit name on install via a new
optional "name" key in the units list.

The fuzz-unit-file corpus sample is renamed as well; its file name is
not meaningful to the fuzzer, and dropping the backslash means it is no
longer skipped by the meson workaround for
https://github.com/mesonbuild/meson/issues/1564, so it runs as a
regression test again.
2026-07-03 10:10:09 +02:00
Zbigniew Jędrzejewski-Szmek 8c4218ab9f core: add all manager timestamps to metrics report (#42842)
These are all very useful for establishing the health of a fleet, so
export them too

Follow-up for 0b0db27050
2026-07-03 10:06:43 +02:00
Lennart Poettering b19ef189ee bootctl: expose --esp-path/--boot-path/--make-entry-directory via Varlink (#42838)
The Install/Unlink/Link/LinkAuto Varlink methods always auto-discover
the ESP and XBOOTLDR partitions and Install always runs
make-entry-directory in auto mode, so IPC callers cannot match what the
CLI verbs do with `--esp-path`, `--boot-path` and
`--make-entry-directory`. Add optional `espPath`, `xbootldrPath` and
`makeEntryDirectory` parameters that feed into the same code paths the
CLI already uses.
2026-07-02 21:56:57 +02:00
Lennart Poettering 231176d25b import: Trust subkeys included in signature (#41860)
- import: Trust subkeys included in signature
    
    With gpg sub keys one can rotate signing keys while having a stable
trust anchor. So far one still had to ship the sub key out of band but
a newer gpg has the option to include the sub key in the signature and
import it automatically. This is safe if we only allow importing a sub
    key signed by the top key we already have in the key ring.
    Add the --auto-key-import argument to gpg to import subkeys but also
set --import-options=merge-only,import-clean to restrict what we import
    to only be sub keys signed by the top key we have in the keyring and
    discard any irrelevant parts.
- import: Support env var to override gpg keyring
    
By default there is a fixed keyring in /usr or /etc. But when running
systemd-pull unprivileged in the user context or with a custom transfer
definition as in systemd-sysupdate --definitions=./... (e.g., for local
ParticleOS updates) it is limiting to require that all keys have to be
part of the OS keyring or otherwise no verification can be used. Also,
    for testing it is valuable to point it at a different keyring.
    Add a SYSTEMD_OPENPGP_KEYRING env var where the omission or empty
assignment sticks to the current behavior of the global OS keyrings but
    a keyring path given will take precedence. While an env var can leak
    down the process tree and is more difficult to secure for being the
trust anchor the advantage is that one can directly specify it in the
    service unit as drop-in instead of having to patch the command
invocation. Anyway it's a niche use case and thus not part of the man
    page.
2026-07-02 21:38:03 +02:00
Chris Coulson 2348941b5d measure: Support binding signed policies to individual phases
systemd-measure can produce multiple signed policies for different
phases. However, a policy for a TPM resource that includes these signed
policies can currently be satisfied by any policy that is signed
with the same key.

It can be desirable to bind a resource's policy to one or more
specific phases. One way to do this could be to sign policies for
different phases or phase combinations with different keys. Another
approach is to limit the scope of signed policies using a policy
reference.

Using a policy reference works because:
- The reference is included along with the approved policy digest in the
  digest that is signed.
- The reference argument is included in the authorization policy for a
  resource via the TPM2_PolicyAuthorize assertion.
- During execution of the TPM2_PolicyAuthorize assertion, the TPM checks
  that the session's current policy digest is the approved policy digest,
  computes a digest from the approved policy digest and the supplied policy
  reference, and checks that the resulting digest is the one that was
  verified by TPM2_VerifySignature (via the returned ticket).

This adds a new --policyref argument to systemd-measure which binds all
of the signed policies to the specified policy reference. I did consider
making this more intelligent by auto-generating policy references for each
phase, but this approach provides the most flexibility for now. By making
use of the existing --append argument, a signer can produce multiple
signed policies with the same key that are bound to any individual phases
or combinations of phases.

The policy reference is a string without the NULL terminator. It is
supplied to the TPM via the TPM2B_NONCE type, which has a maximum size
equivalent to the size of the largest digest supported by the TPM. As
the signer doesn't know the capabilities of the target TPM,
systemd-measure limits the size of the policy reference to 32 bytes, to
fit within the size of a SHA256 digest.

This also includes the corresponding changes to systemd-cryptenroll and
systemd-repart (to add an equivalent --tpm2-public-key-policyref argument
so that the policy can be bound to the desired corresponding phase, and to
ensure that the policy reference is included in the LUKS2 token metadata),
and systemd-cryptsetup (to handle the policy reference stored in the LUKS2
token metadata).

This doesn't include policy reference support for credentials yet
because it requires a change to the credential headers.
2026-07-02 21:28:42 +02:00
Luca Boccassi c32bd8b0dc core: add all manager timestamps to metrics report
These are all very useful for establishing the health of a fleet,
so export them too

Follow-up for 0b0db27050
2026-07-02 17:01:02 +01:00
r-vdp e2cda710c1 bootctl: accept makeEntryDirectory in Install Varlink method
The CLI defaults --make-entry-directory to off and lets callers opt in
or request auto mode. The Varlink Install method always ran in auto
mode with no way to override it. Expose the tri-state so IPC callers
can match the CLI behaviour.
2026-07-02 17:34:26 +02:00
r-vdp ca7fd21cf3 bootctl: accept espPath/xbootldrPath in Varlink methods
The CLI verbs have --esp-path/--boot-path but the Varlink methods
always auto-discover the partitions, so callers that mount the ESP
or XBOOTLDR at a non-standard location have to fall back to the
SYSTEMD_ESP_PATH/SYSTEMD_XBOOTLDR_PATH environment variables.
Allow to specify the paths when calling Install/Unlink/Link/LinkAuto
so the Varlink API is on par with the CLI.
2026-07-02 17:34:03 +02:00
Daan De Meyer d08882653d meson: fix fs.exists() check for fuzz corpus samples
Commit 8355eb6e11 ("meson: Check if files returned by git ls-files
actually exist") checks the paths printed by git ls-files, which are
relative to the project root, with fs.exists(), which resolves them
relative to the test/fuzz subdirectory. As a result, every corpus
sample was silently skipped, and only the generated directives tests
were registered. Resolve the paths against the project source root
instead.
2026-07-02 15:33:28 +01:00
Kai Lüke f04736fffd test: Add sysupdate gpg verification test
The test first checks that simple signatures work and that a foreign
signature is rejected. Then it also tests that sub key signatures are
accepted when the public sub key is included in the signature.
2026-07-02 17:48:51 +09:00
Chris Coulson 5a80137aa4 tpm2-setup: Create and persist an endorsement key
This updates systemd-tpm2-setup to create and persist an endorsement
key if there isn't one already. For each supported EK template profile,
it will read the EK certificate from its NV index if there is one.
When there is an EK certificate present, a primary key is created using
the corresponding template. If the resulting EKpub matches the public
key in the certificate, the created EK is persisted and the process is
complete.

The low-range templates and the high-range RSA 2048/3072 and ECC NIST
P256/P384 storage templates are supported, as detailed in section
5.3 of the "TCG EK Credential Profile For TPM Family 2.0" spec v2.7.
High-range templates are preferred because these permit EK usage without
requiring knowledge of the authorization value for the endorsement
hierarchy, meaning that, like with the SRK, it is possible to restrict
the usage of the endorsement hierarchy whilst still permitting use of
the persistent EK.

The EK is always persisted at handle 0x81010001. This handle is
reserved in Table 2 of the "TCG TPM v2.0 Provisioning Guidance" spec
v1.0r1.0, although this is only a recommendation. This
handle is within the block of handles reserved for endorsement
primary keys in the "Registry of Reserved TPM 2.0 Handles and
Localities" spec v1.2r1.00. Section 2.3.2 of this specification also
makes a suggestion that there should be a relationship between the EK
certificate NV index and a corresponding persistent EK handle by
using handles at the same offsets within their respective ranges.
However, this contradicts the provisioning guidance spec which reserves
0x81010001 when there isn't a certificate at 0x01c00001. For simplicity,
I've chosen to use a single handle for the EK regardless of which profile
it is created with.

The "TCG EK Credential Profile For TPM Family 2.0" spec also provides a
way for endorsement keys to be certified with non-standard templates by
storing the template in a NV index. This is also supported.

The EK creation is not executed with tpm2-setup --early, as there's no
need for it to be created so early, unlike with the SRK. I also haven't
stored EKpub in /var/lib/systemd like with the SRKpub, as I'm not sure
there will be a use case for this yet.

A follow-up PR may be needed to add some internal helpers to make use
of the persisted EK, as use of low-range EKs requires a policy session.
High-range EKs can be used with a HMAC session because they have the
userWithAuth attribute set and we are creating them with an empty
authorization value.

https://trustedcomputinggroup.org/resource/http-trustedcomputinggroup-org-wp-content-uploads-tcg-ek-credential-profile/
https://trustedcomputinggroup.org/resource/tcg-tpm-v2-0-provisioning-guidance/
https://trustedcomputinggroup.org/resource/registry/
2026-07-01 17:36:50 +02:00
Michael Vogt ab344eb750 core: add absolute-path properties to varlink StartTransient
Similar to PR#42360 this commit adds missing properties for
absolute path handling in io.systemd.Unit.StartTransient for
the `Exec` context and a macro helper to share the common code.

The properties added are:
IPCNamespacePath, NetworkNamespacePath, RootDirectory, RootHashPath,
RootHashSignaturePath, RootImage, RootVerity, UserNamespacePath,
RootMStack.

Note that RootHashPath, RootHashSignaturePath need custom apply
functions because the varlink name "RootHashPath" differs from the
name that needs to be written into the unit file ("RootHash=")
and the iovec must be cleared.
2026-07-01 16:14:37 +02:00
Luca Boccassi ef7b9f679b pcrlock: add vl methods for fw and sb
Add varlink method wrappers for locking/unlocking firmware code and config,
and secure boot policy and authority.
2026-07-01 14:56:53 +01:00
Luca Boccassi 04f8927173 Add more shutdown timestamps and preserve via LUO (#42671)
Add more shutdown timestamps, export them via D-Bus/Varlink, use them in
`systemd-analyze time`, and preserve them across kexec via LUO. This is
useful to measure reboot performance with added measurement points and
more granular intervals.
2026-07-01 14:12:21 +01:00
Luca Boccassi 12bf083d8a Assorted hardening issues flagged by kres (#42802) 2026-07-01 10:39:04 +01:00
Nick Rosbrook 2e89b19aa1 test: reduce number of disks in TEST-64-UDEV-STORAGE-simultaneous_events on Debian/Ubuntu
This test never finishes in Ubuntu autopkgtest with the current values,
and is currently skipped all together on Debian. When running on either,
reduce the number of disks to make the test more reliable.
2026-06-30 16:24:06 +01:00
Luca Boccassi 12bf400b13 ptyfwd: avoid touching forwarder after exit drain
on_exit_event() can synchronously drain buffered data through
shovel_force(). If that completes the drain, pty_forward_done() runs
the hangup handler and may free the forwarder, so do not call
pty_forward_done() again afterwards.

[   25.052879] TEST-74-AUX-UTILS.sh[909]: ==909==ERROR: AddressSanitizer: heap-use-after-free on address 0x7ccc8a5e0b41 at pc 0x7efc8cde106e bp 0x7ffd668629b0 sp 0x7ffd668629a8
[   25.053136] TEST-74-AUX-UTILS.sh[909]: READ of size 1 at 0x7ccc8a5e0b41 thread T0
[   25.092784] TEST-74-AUX-UTILS.sh[909]:     #0 0x7efc8cde106d in pty_forward_done ../src/src/shared/ptyfwd.c:187
[   25.093920] TEST-74-AUX-UTILS.sh[909]:     #1 0x7efc8cdedba1 in on_exit_event ../src/src/shared/ptyfwd.c:904
[   25.094148] TEST-74-AUX-UTILS.sh[909]:     #2 0x7efc8d375eff in source_dispatch ../src/src/libsystemd/sd-event/sd-event.c:4301
[   25.095074] TEST-74-AUX-UTILS.sh[909]:     #3 0x7efc8d378032 in dispatch_exit ../src/src/libsystemd/sd-event/sd-event.c:4431
[   25.095295] TEST-74-AUX-UTILS.sh[909]:     #4 0x7efc8d37e932 in sd_event_dispatch ../src/src/libsystemd/sd-event/sd-event.c:4896
[   25.095467] TEST-74-AUX-UTILS.sh[909]:     #5 0x7efc8d37fc8c in sd_event_run ../src/src/libsystemd/sd-event/sd-event.c:4971
[   25.095647] TEST-74-AUX-UTILS.sh[909]:     #6 0x7efc8d3800ad in sd_event_loop ../src/src/libsystemd/sd-event/sd-event.c:4992
[   25.097174] TEST-74-AUX-UTILS.sh[909]:     #7 0x56049b541aba in start_transient_service ../src/src/run/run.c:2479
[   25.097403] TEST-74-AUX-UTILS.sh[909]:     #8 0x56049b552a65 in run ../src/src/run/run.c:3288
[   25.097569] TEST-74-AUX-UTILS.sh[909]:     #9 0x56049b552cb0 in main ../src/src/run/run.c:3291
[   25.097780] TEST-74-AUX-UTILS.sh[909]:     #10 0x7efc8b882300 in __libc_start_call_main (/lib64/libc.so.6+0x7d300) (BuildId: 830c94f480c13d9b01dc65a1035310882136094a)
[   25.097952] TEST-74-AUX-UTILS.sh[909]:     #11 0x7efc8b882417 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x7d417) (BuildId: 830c94f480c13d9b01dc65a1035310882136094a)
[   25.098139] TEST-74-AUX-UTILS.sh[909]:     #12 0x56049b51cf54 in _start (/usr/bin/systemd-run+0x19f54) (BuildId: 0daacdb9f20151f3517312ee99e489a9b8f4989c)
[   25.098316] TEST-74-AUX-UTILS.sh[909]: 0x7ccc8a5e0b41 is located 193 bytes inside of 2384-byte region [0x7ccc8a5e0a80,0x7ccc8a5e13d0)
[   25.099202] TEST-74-AUX-UTILS.sh[909]: freed by thread T0 here:
[   25.099410] TEST-74-AUX-UTILS.sh[909]:     #0 0x7efc8e76420f in free.part.0 (/lib64/libasan.so.8+0x16420f) (BuildId: 173395e60f171589489dde2b7a156d0ae380734b)
[   25.099557] TEST-74-AUX-UTILS.sh[909]:     #1 0x7efc8cdf14d1 in pty_forward_free ../src/src/shared/ptyfwd.c:1122
[   25.099691] TEST-74-AUX-UTILS.sh[909]:     #2 0x56049b535328 in pty_forward_handler ../src/src/run/run.c:1952
[   25.100063] TEST-74-AUX-UTILS.sh[909]:     #3 0x7efc8cde138c in pty_forward_done ../src/src/shared/ptyfwd.c:196
[   25.100197] TEST-74-AUX-UTILS.sh[909]:     #4 0x7efc8cdec757 in shovel ../src/src/shared/ptyfwd.c:813
[   25.101144] TEST-74-AUX-UTILS.sh[909]:     #5 0x7efc8cdecc1f in shovel_force ../src/src/shared/ptyfwd.c:828
[   25.102273] TEST-74-AUX-UTILS.sh[909]:     #6 0x7efc8cdedb82 in on_exit_event ../src/src/shared/ptyfwd.c:899
[   25.103564] TEST-74-AUX-UTILS.sh[909]:     #7 0x7efc8d375eff in source_dispatch ../src/src/libsystemd/sd-event/sd-event.c:4301
[   25.103712] TEST-74-AUX-UTILS.sh[909]:     #8 0x7efc8d378032 in dispatch_exit ../src/src/libsystemd/sd-event/sd-event.c:4431
[   25.104081] TEST-74-AUX-UTILS.sh[909]:     #9 0x7efc8d37e932 in sd_event_dispatch ../src/src/libsystemd/sd-event/sd-event.c:4896
[   25.104954] TEST-74-AUX-UTILS.sh[909]:     #10 0x7efc8d37fc8c in sd_event_run ../src/src/libsystemd/sd-event/sd-event.c:4971
[   25.105160] TEST-74-AUX-UTILS.sh[909]:     #11 0x7efc8d3800ad in sd_event_loop ../src/src/libsystemd/sd-event/sd-event.c:4992
[   25.105310] TEST-74-AUX-UTILS.sh[909]:     #12 0x56049b541aba in start_transient_service ../src/src/run/run.c:2479
[   25.105454] TEST-74-AUX-UTILS.sh[909]:     #13 0x56049b552a65 in run ../src/src/run/run.c:3288
[   25.105572] TEST-74-AUX-UTILS.sh[909]:     #14 0x56049b552cb0 in main ../src/src/run/run.c:3291
[   25.106136] TEST-74-AUX-UTILS.sh[909]:     #15 0x7efc8b882300 in __libc_start_call_main (/lib64/libc.so.6+0x7d300) (BuildId: 830c94f480c13d9b01dc65a1035310882136094a)
[   25.106263] TEST-74-AUX-UTILS.sh[909]:     #16 0x7efc8b882417 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x7d417) (BuildId: 830c94f480c13d9b01dc65a1035310882136094a)
[   25.106385] TEST-74-AUX-UTILS.sh[909]:     #17 0x56049b51cf54 in _start (/usr/bin/systemd-run+0x19f54) (BuildId: 0daacdb9f20151f3517312ee99e489a9b8f4989c)
[   25.106792] TEST-74-AUX-UTILS.sh[909]: previously allocated by thread T0 here:
[   25.106957] TEST-74-AUX-UTILS.sh[909]:     #0 0x7efc8e76515f in malloc (/lib64/libasan.so.8+0x16515f) (BuildId: 173395e60f171589489dde2b7a156d0ae380734b)
[   25.108013] TEST-74-AUX-UTILS.sh[909]:     #1 0x7efc8cddebed in malloc_multiply ../src/src/basic/alloc-util.h:92
[   25.108188] TEST-74-AUX-UTILS.sh[909]:     #2 0x7efc8cdee47b in pty_forward_new ../src/src/shared/ptyfwd.c:955
[   25.108324] TEST-74-AUX-UTILS.sh[909]:     #3 0x56049b538700 in run_context_setup_ptyfwd ../src/src/run/run.c:2130
[   25.108472] TEST-74-AUX-UTILS.sh[909]:     #4 0x56049b5419f9 in start_transient_service ../src/src/run/run.c:2465
[   25.109152] TEST-74-AUX-UTILS.sh[909]:     #5 0x56049b552a65 in run ../src/src/run/run.c:3288
[   25.109311] TEST-74-AUX-UTILS.sh[909]:     #6 0x56049b552cb0 in main ../src/src/run/run.c:3291
[   25.109450] TEST-74-AUX-UTILS.sh[909]:     #7 0x7efc8b882300 in __libc_start_call_main (/lib64/libc.so.6+0x7d300) (BuildId: 830c94f480c13d9b01dc65a1035310882136094a)
[   25.109847] TEST-74-AUX-UTILS.sh[909]:     #8 0x7efc8b882417 in __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x7d417) (BuildId: 830c94f480c13d9b01dc65a1035310882136094a)
[   25.110760] TEST-74-AUX-UTILS.sh[909]:     #9 0x56049b51cf54 in _start (/usr/bin/systemd-run+0x19f54) (BuildId: 0daacdb9f20151f3517312ee99e489a9b8f4989c)
[   25.110911] TEST-74-AUX-UTILS.sh[909]: SUMMARY: AddressSanitizer: heap-use-after-free ../src/src/shared/ptyfwd.c:187 in pty_forward_done
[   25.111054] TEST-74-AUX-UTILS.sh[909]: Shadow bytes around the buggy address:
[   25.111213] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0880: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[   25.111378] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0900: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[   25.111520] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0980: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[   25.112210] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0a00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
[   25.112399] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0a80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
[   25.112767] TEST-74-AUX-UTILS.sh[909]: =>0x7ccc8a5e0b00: fd fd fd fd fd fd fd fd[fd]fd fd fd fd fd fd fd
[   25.112901] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0b80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
[   25.113789] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0c00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
[   25.113906] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0c80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
[   25.114046] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0d00: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
[   25.114159] TEST-74-AUX-UTILS.sh[909]:   0x7ccc8a5e0d80: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
[   25.114278] TEST-74-AUX-UTILS.sh[909]: Shadow byte legend (one shadow byte represents 8 application bytes):
[   25.114400] TEST-74-AUX-UTILS.sh[909]:   Addressable:           00
[   25.115099] TEST-74-AUX-UTILS.sh[909]:   Partially addressable: 01 02 03 04 05 06 07
[   25.115246] TEST-74-AUX-UTILS.sh[909]:   Heap left redzone:       fa
[   25.115365] TEST-74-AUX-UTILS.sh[909]:   Freed heap region:       fd
[   25.115483] TEST-74-AUX-UTILS.sh[909]:   Stack left redzone:      f1
[   25.115618] TEST-74-AUX-UTILS.sh[909]:   Stack mid redzone:       f2
[   25.115882] TEST-74-AUX-UTILS.sh[909]:   Stack right redzone:     f3
[   25.116735] TEST-74-AUX-UTILS.sh[909]:   Stack after return:      f5
[   25.116857] TEST-74-AUX-UTILS.sh[909]:   Stack use after scope:   f8
[   25.116974] TEST-74-AUX-UTILS.sh[909]:   Global redzone:          f9
[   25.117108] TEST-74-AUX-UTILS.sh[909]:   Global init order:       f6
[   25.117257] TEST-74-AUX-UTILS.sh[909]:   Poisoned by user:        f7
[   25.118128] TEST-74-AUX-UTILS.sh[909]:   Container overflow:      fc
[   25.118288] TEST-74-AUX-UTILS.sh[909]:   Array cookie:            ac
[   25.118433] TEST-74-AUX-UTILS.sh[909]:   Intra object redzone:    bb
[   25.118546] TEST-74-AUX-UTILS.sh[909]:   ASan internal:           fe
[   25.118684] TEST-74-AUX-UTILS.sh[909]:   Left alloca redzone:     ca
[   25.118792] TEST-74-AUX-UTILS.sh[909]:   Right alloca redzone:    cb
[   25.119282] TEST-74-AUX-UTILS.sh[909]: Command: systemd-run --quiet --pty -- bash -c echo PTY_FORWARD_READY; exec sleep 60
[   25.119395] TEST-74-AUX-UTILS.sh[909]: ==909==ABORTING

Follow-up for d3218c4c80
2026-06-30 13:27:57 +01:00
Luca Boccassi ec919e7ec1 core: preserve shutdown timestamps via LUO 2026-06-30 10:21:18 +01:00
Luca Boccassi 58d6d403ce test: drop ASAN workaround in TEST-07-PID1.issue-14566
https://bugzilla.redhat.com/show_bug.cgi?id=2098125 was marked as
fixed some years ago, so it should be safe to run this test again
now.

Follow-up for 11562ee585
2026-06-29 12:06:33 +01:00