| .. 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. |