On Thu, 2025-11-06 at 17:15 -0500, Mimi Zohar wrote: > On Thu, 2025-11-06 at 21:29 +0800, Coiby Xu wrote: > > On Wed, Nov 05, 2025 at 03:47:25PM -0500, Mimi Zohar wrote: > > > On Wed, 2025-11-05 at 08:18 +0800, Coiby Xu wrote: > > [...] > > > > > > Hi Coiby, > > > > > > Based on the conversation with Paul, there is no reason to remove the > > > existing > > > security_kernel_post_read_file() call. > > > > > > The changes are similar to the 2nd link, but a bit different. > > > - Define a single enumeration named READING_MODULE_COMPRESSED. > > > > > > - In module/main.c add a new security_kernel_post_read_file() call > > > immediately > > > after decompressing the kernel module. Like a previous version of this > > > patch, > > > call kernel_read_file() with either READING_MODULE or > > > READING_MODULE_COMPRESSED > > > based on MODULE_INIT_COMPRESSED_FILE. > > > > > > - In ima_post_read_file() defer verifying the signature when the > > > enumeration is > > > READING_MODULE_COMPRESSED. (No need for a new function > > > ima_read_kernel_module.) > > > > Hi Mimi, > > > > Thanks for summarizing your conversation with Paul! I can confirm Paul's > > approach works > > https://github.com/coiby/linux/tree/in_kernel_decompression_ima_no_lsm_hook_paul > > > > While testing the patch today, I realized there is another > > issue/challenge introduced by in-kernel module decompression. IMA > > appraisal is to verify the digest of compressed kernel module but > > currently the passed buffer is uncompressed module. When IMA uses > > uncompressed module data to calculate the digest, xattr signature > > verification will fail. If we always make IMA read the original kernel > > module data again to calculate the digest, does it look like a > > quick-and-dirty fix? If we can assume people won't load kernel module so > > often, the performance impact is negligible. Otherwise we may have to > > introduce a new LSM hook so IMA can access uncompressed and original > > module data one time. > > ima_collect_measurement() stores the file hash info in the iint and uses that > information to verify the signature as stored in the security xattr. > Decompressing the kernel module shouldn't affect the xattr signature > verification.
In the case when the compressed kernel module hasn't previously been measured or appraised before loading the kernel module, we need to "collect" the file data hash on READING_MODULE_COMPRESSED, but defer appraising/measuring it. An alternative to your suggestion of re-reading the original kernel module data to calculate the digest or defining a new hook, would be to define "collect" as a new "action" and pass the kernel_read_file_id enumeration to process_measurement(). IMA_COLLECTED already exists. Only IMA_COLLECT would need to be defined. The new collect "action" should be limited to func=MODULE_CHECK. The downside of this alternative is that it requires a new collect rule: collect func=MODULE_CHECK mask=MAY_READ uid=0 appraise func=MODULE_CHECK appraise_type=imasig|modsig -- thanks, Mimi
