mirror of
https://github.com/torvalds/linux
synced 2026-07-22 02:00:44 +09:00
Add the documentation of exporting and deleting IMA measurements in Documentation/security/IMA-export-delete.rst. Also add the missing Documentation/security/IMA-templates.rst file in MAINTAINERS. Link: https://github.com/linux-integrity/linux/issues/1 Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
204 lines
8.5 KiB
ReStructuredText
204 lines
8.5 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
==================================
|
|
IMA Measurements Export and Delete
|
|
==================================
|
|
|
|
|
|
Introduction
|
|
============
|
|
|
|
The IMA measurements list is currently stored in the kernel memory. Memory
|
|
occupation grows linearly with the number of records, and can become a
|
|
problem especially in environments with reduced resources.
|
|
|
|
While there is an advantage in keeping the IMA measurements list in kernel
|
|
memory, so that it is always available for reading from the securityfs
|
|
interfaces, storing it elsewhere would make it possible to free precious
|
|
memory for other kernel usage.
|
|
|
|
The IMA measurements list needs to be retained and safely stored for new
|
|
attestation servers to validate it. Assuming the IMA measurements list is
|
|
properly saved, storing it outside the kernel does not introduce security
|
|
issues, since its integrity is anyway protected by the TPM.
|
|
|
|
Hence, the new IMA staging mechanism is introduced to export IMA
|
|
measurements to user space and delete them from kernel space.
|
|
|
|
Staging consists in atomically moving the current measurements list to a
|
|
temporary list, so that measurements can be deleted afterwards. The staging
|
|
operation locks the hot path (racing with addition of new measurements) for
|
|
a very short time, only for swapping the list pointers. Deletion of the
|
|
measurements instead is done locklessly, away from the hot path.
|
|
|
|
There are two flavors of the staging mechanism. In the staging with prompt,
|
|
all current measurements are staged, read and deleted upon confirmation. In
|
|
the staging and deleting flavor, N measurements are staged from the
|
|
beginning of the current measurements list and immediately deleted without
|
|
confirmation.
|
|
|
|
|
|
Management of Staged Measurements
|
|
=================================
|
|
|
|
Since with the staging mechanism measurement records are removed from the
|
|
kernel, the staged measurements need to be saved in a storage and
|
|
concatenated together, so that they can be presented during remote
|
|
attestation as if staging was never done. This task can be accomplished by
|
|
a remote attestation agent modified to support staging, or a system
|
|
service.
|
|
|
|
Coordination is necessary in the case where there are multiple actors
|
|
requesting measurements to be staged.
|
|
|
|
In the staging with prompt case, the measurement interfaces can be accessed
|
|
only by one actor (writer) at a time, so the others will get an error until
|
|
the former closes it. Since the actors don't care about N, when they gain
|
|
access to the interface, they will get all the staged measurements at the
|
|
time of their request.
|
|
|
|
In the case of staging and deleting, coordination is more important, since
|
|
there is the risk that two actors unaware of each other compute the value N
|
|
on the current measurements list and request IMA to stage N twice.
|
|
|
|
|
|
Remote Attestation Agent Workflow
|
|
=================================
|
|
|
|
Remote attestation agents can be configured to always present all the
|
|
measurements to the remote verifiers or, alternatively, to only provide the
|
|
measurements that have not been verified yet by the remote verifiers.
|
|
|
|
In the latter case, determining which measurements need to be sent and
|
|
verified must solely depend on the remote verifier. The remote attestation
|
|
agent can proactively send partial measurements, at the condition that they
|
|
are the ones that the remote verifier needs.
|
|
|
|
An agent can rely on one of the supported staging methods to proactively
|
|
send to a remote verifier the measurements since the previous request up
|
|
to the ones that verify the TPM quote obtained in the current request.
|
|
The workflow with each staging method is the following.
|
|
|
|
With staging with prompt, the agent stages the current measurements list,
|
|
reads and stores the measurements in a storage and immediately requests
|
|
IMA to delete the staged measurements from kernel memory. Afterwards, it
|
|
calculates N by replaying the PCR extend on the stored measurements until
|
|
the calculated PCRs match the quoted PCRs. It then keeps the measurements
|
|
in excess for the next attestation request.
|
|
|
|
At the next attestation request, the agent performs the same steps above,
|
|
and concatenates the new measurements to the ones in excess from the
|
|
previous request. Also in this case, the agent replays the PCR extend until
|
|
it matches the currently quoted PCRs, keeps the measurements in excess and
|
|
presents the new N measurement records to the remote attestation server.
|
|
|
|
With the staging and deleting method, the agent reads the current
|
|
measurements list, calculates N and requests IMA to delete only those. The
|
|
measurements in excess are kept in the IMA measurements list and can be
|
|
retrieved at the next remote attestation request.
|
|
|
|
While keeping only the excess measurements in the storage could be
|
|
sufficient to serve the requests of a remote verifier, it is advised to
|
|
keep all the obtained measurements locally, as they might be needed for the
|
|
attestation with a different remote verifier.
|
|
|
|
|
|
Usage
|
|
=====
|
|
|
|
The IMA staging mechanism can be enabled from the kernel configuration with
|
|
the CONFIG_IMA_STAGING option. This option prevents inadvertently removing
|
|
the IMA measurement list on systems which do not properly save it.
|
|
|
|
If the option is enabled, IMA duplicates the current securityfs
|
|
measurements interfaces (both binary and ASCII), by adding the ``_staged``
|
|
file suffix. Both the original and the staging interfaces gain the write
|
|
permission for the root user and group, but require the process to have
|
|
CAP_SYS_ADMIN set.
|
|
|
|
The staging mechanism supports two flavors.
|
|
|
|
|
|
Staging with prompt
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
The current measurements list is moved to a temporary staging area,
|
|
allowing it to be saved to external storage, before being deleted upon
|
|
confirmation.
|
|
|
|
This staging process is achieved with the following steps.
|
|
|
|
1. ``echo A > <_staged interface>``: the user requests IMA to stage the
|
|
entire measurements list;
|
|
2. ``cat <_staged interface>``: the user reads the staged measurements;
|
|
3. ``echo D > <_staged interface>``: the user requests IMA to delete
|
|
staged measurements.
|
|
|
|
|
|
Staging and deleting
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
N measurements are staged to a temporary staging area, and immediately
|
|
deleted without further confirmation.
|
|
|
|
This staging process is achieved with the following steps.
|
|
|
|
1. ``cat <original interface>``: the user reads the current measurements
|
|
list and determines what the value N for staging should be;
|
|
2. ``echo N > <original interface>``: the user requests IMA to delete N
|
|
measurements from the current measurements list.
|
|
|
|
|
|
Interface Access
|
|
================
|
|
|
|
In order to avoid the IMA measurements list being suddenly truncated by the
|
|
staging mechanism during a read, or having multiple concurrent staging, a
|
|
semaphore-like locking scheme has been implemented on all the measurements
|
|
list interfaces.
|
|
|
|
Multiple readers can access concurrently the original and staged
|
|
interfaces, and they can be in mutual exclusion with one writer. In order
|
|
to see the same state across all the measurement interfaces, the same
|
|
writer is allowed to open multiple interfaces for write or read/write.
|
|
|
|
If an illegal access occurs, the open to the measurements list interface is
|
|
denied.
|
|
|
|
|
|
Kexec
|
|
=====
|
|
|
|
In the event a kexec() system call occurs between staging and deleting, the
|
|
staged measurement records are marshalled before the current measurements
|
|
list, so that they are both available when the secondary kernel starts.
|
|
|
|
If measurement is suspended before requesting to delete staged or current
|
|
measurements, IMA returns an error to user space to let it know that
|
|
marshalling is already in progress, so that it does not save the
|
|
measurements twice.
|
|
|
|
IMA also disallows staging when suspending measurement, to avoid the
|
|
situation where neither measurements are carried over to the secondary
|
|
kernel, nor they are saved by user space to the storage.
|
|
|
|
|
|
Hash table
|
|
==========
|
|
|
|
By default, the template digest of staged measurement records are kept in
|
|
kernel memory (only template data are freed), to be able to detect
|
|
duplicate records independently of staging.
|
|
|
|
The new kernel option ``ima_flush_htable`` has been introduced to
|
|
explicitly request a complete deletion of the staged measurements, for
|
|
maximum kernel memory saving. If the option has been specified, duplicate
|
|
records are still avoided on records of the current measurements list,
|
|
but there can be duplicates between different groups of staged
|
|
measurements.
|
|
|
|
Flushing the hash table is supported only for the staging with prompt
|
|
flavor. For the staging and deleting flavor, it would have been necessary
|
|
to lock the hot path adding new measurements for the time needed to remove
|
|
each selected measurement individually.
|