lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 389/453] ima: Dont modify file descriptor mode on the fly
    Date
    From: Roberto Sassu <roberto.sassu@huawei.com>

    commit 207cdd565dfc95a0a5185263a567817b7ebf5467 upstream.

    Commit a408e4a86b36b ("ima: open a new file instance if no read
    permissions") already introduced a second open to measure a file when the
    original file descriptor does not allow it. However, it didn't remove the
    existing method of changing the mode of the original file descriptor, which
    is still necessary if the current process does not have enough privileges
    to open a new one.

    Changing the mode isn't really an option, as the filesystem might need to
    do preliminary steps to make the read possible. Thus, this patch removes
    the code and keeps the second open as the only option to measure a file
    when it is unreadable with the original file descriptor.

    Cc: <stable@vger.kernel.org> # 4.20.x: 0014cc04e8ec0 ima: Set file->f_mode
    Fixes: 2fe5d6def1672 ("ima: integrity appraisal extension")
    Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    security/integrity/ima/ima_crypto.c | 20 +++++---------------
    1 file changed, 5 insertions(+), 15 deletions(-)

    --- a/security/integrity/ima/ima_crypto.c
    +++ b/security/integrity/ima/ima_crypto.c
    @@ -411,7 +411,7 @@ int ima_calc_file_hash(struct file *file
    loff_t i_size;
    int rc;
    struct file *f = file;
    - bool new_file_instance = false, modified_mode = false;
    + bool new_file_instance = false;

    /*
    * For consistency, fail file's opened with the O_DIRECT flag on
    @@ -429,18 +429,10 @@ int ima_calc_file_hash(struct file *file
    O_TRUNC | O_CREAT | O_NOCTTY | O_EXCL);
    flags |= O_RDONLY;
    f = dentry_open(&file->f_path, flags, file->f_cred);
    - if (IS_ERR(f)) {
    - /*
    - * Cannot open the file again, lets modify f_mode
    - * of original and continue
    - */
    - pr_info_ratelimited("Unable to reopen file for reading.\n");
    - f = file;
    - f->f_mode |= FMODE_READ;
    - modified_mode = true;
    - } else {
    - new_file_instance = true;
    - }
    + if (IS_ERR(f))
    + return PTR_ERR(f);
    +
    + new_file_instance = true;
    }

    i_size = i_size_read(file_inode(f));
    @@ -455,8 +447,6 @@ int ima_calc_file_hash(struct file *file
    out:
    if (new_file_instance)
    fput(f);
    - else if (modified_mode)
    - f->f_mode &= ~FMODE_READ;
    return rc;
    }


    \
     
     \ /
      Last update: 2020-12-28 14:57    [W:3.387 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site