[PATCH v7 00/12] ima: Exporting and deleting IMA measurement records from kernel memory
Roberto Sassu <[email protected]> Fri, 5 Jun 2026 19:22:24 +0200
| Newsgroups | org.kernel.vger.linux-integrity,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-security-module |
|---|---|
| Message-ID | <[email protected]> |
From: Roberto Sassu <[email protected]> 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. 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 measurement 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. 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. Patch set content ================= Patches 1-8 are preparatory patches to quickly replace the hash table, maintain separate counters for the different measurements list types, mediate access to the measurements list interface, and simplify the staging patches. Patch 9 introduces the staging with prompt flavor. Patch 10 makes it possible to flush the hash table when deleting all the staged measurements. Patch 11 introduces the staging and deleting flavor. Patch 12 adds the documentation of the staging mechanism. Changelog ========= v6: - Make ima_extend_list_mutex as static since it is not needed anymore by ima_dump_measurement_list() (suggested by Mimi) - Export ima_flush_htable in patch 11 instead of 10 (suggested by Mimi) - Add clarification in the documentation regarding a proactive remote attestation agent, and storing all the measurements in the storage (suggested by Mimi) v5: - Add motivation for the ima_flush_htable= kernel option (suggested by Mimi) - New documentation title and fixes (suggested by Mimi) - Allow stage all command on the _staged interface instead of the original - Set CONFIG_IMA_STAGING default to n (suggested by Mimi) - Rename ima_num_entries to ima_num_records (suggested by Mimi) - Comment for ima_num_records and ima_num_violations (suggested by Mimi) - Add overflow check in ima_measure_lock() - Allow a writer to open for write or read/write the other staging interfaces - Ignore ppos in _ima_measurements_write() - Implement lockless kexec measurement lists dump by denying staging/delete after measurement suspend (collapse patch 12 into 9 and 11) - Refuse delete based on measurement suspend instead of using ima_copied_flags (suggested by Mimi) - Add staging/deleting functions documentation v4: - Add write permission to the original measurement interface, and move the A and N staging commands to that interface - Explain better the two staging flavors and highlight that the staging and delete only stages measurements internally - Rename ima_queue_staged_delete_partial() to ima_queue_delete_partial() - Replace ima_staged_measurements_prepended with per measurements list flag to avoid copying staged and active list measurements twice - Optimize the staging and deleting flavor by locklessly determining the cut position in the active list, and immediately deleting entries without explicit staging and splicing (suggested by Steven Chen) v3: - Add Kconfig option to enable the staging mechanism (suggested by Mimi) - Change the meaning of BINARY_STAGED to be just the staged measurements - Separate the two staging flavors in two different functions: ima_queue_staged_delete_all() for staging with prompt, ima_queue_staged_delete_partial() for staging and deleting - Delete N entries without staging first (suggested by Mimi) - Avoid duplicate staged entries if there is contention between the measurements list interfaces and kexec v2: - New patch to move measurements and violation counters outside the ima_h_table structure - New patch to quickly replace the hash table - Forbid partial deletion when flushing hash table (suggested by Mimi) - Ignore ima_flush_htable if CONFIG_IMA_DISABLE_HTABLE is enabled - BINARY_SIZE_* renamed to BINARY_* for better clarity - Removed ima_measurements_staged_exist and testing list empty instead - ima_queue_stage_trim() and ima_queue_delete_staged_trimmed() renamed to ima_queue_stage() and ima_queue_delete_staged() - New delete interval [1, ULONG_MAX - 1] - Rename ima_measure_lock to ima_measure_mutex - Move seq_open() and seq_release() outside the ima_measure_mutex lock - Drop ima_measurements_staged_read() and use seq_read() instead - Optimize create_securityfs_measurement_lists() changes - New file name format with _staged suffix at the end of the file name - Use _rcu list variant in ima_dump_measurement_list() - Remove support for direct trimming and splice the remaining entries to the active list (suggested by Mimi) - Hot swap the hash table if flushing is requested v1: - Support for direct trimming without staging - Support unstaging on kexec (requested by Gregory Lumen) Roberto Sassu (12): ima: Remove ima_h_table structure ima: Replace static htable queue with dynamically allocated array ima: Introduce per binary measurements list type ima_num_records counter ima: Introduce per binary measurements list type binary_runtime_size value ima: Introduce _ima_measurements_start() and _ima_measurements_next() ima: Mediate open/release method of the measurements list ima: Use snprintf() in create_securityfs_measurement_lists ima: Introduce ima_dump_measurement() ima: Add support for staging measurements with prompt ima: Add support for flushing the hash table when staging measurements ima: Support staging and deleting N measurements records doc: security: Add documentation of exporting and deleting IMA measurements .../admin-guide/kernel-parameters.txt | 6 + Documentation/security/IMA-export-delete.rst | 203 ++++++++++ Documentation/security/index.rst | 1 + MAINTAINERS | 2 + security/integrity/ima/Kconfig | 15 + security/integrity/ima/ima.h | 28 +- security/integrity/ima/ima_api.c | 2 +- security/integrity/ima/ima_fs.c | 346 ++++++++++++++++-- security/integrity/ima/ima_init.c | 5 + security/integrity/ima/ima_kexec.c | 42 ++- security/integrity/ima/ima_queue.c | 327 ++++++++++++++++- 11 files changed, 905 insertions(+), 72 deletions(-) create mode 100644 Documentation/security/IMA-export-delete.rst -- 2.43.0