Skip to content

Commit 5b3cd80

Browse files
committed
ima: limit the number of open-writers integrity violations
Each time a file in policy, that is already opened for write, is opened for read, an open-writers integrity violation audit message is emitted and a violation record is added to the IMA measurement list. This occurs even if an open-writers violation has already been recorded. Limit the number of open-writers integrity violations for an existing file open for write to one. After the existing file open for write closes (__fput), subsequent open-writers integrity violations may be emitted. Cc: stable@vger.kernel.org # applies cleanly up to linux-6.6 Tested-by: Stefan Berger <stefanb@linux.ibm.com> Reviewed-by: Petr Vorel <pvorel@suse.cz> Tested-by: Petr Vorel <pvorel@suse.cz> Reviewed-by: Roberto Sassu <roberto.sassu@huawei.com> Signed-off-by: Mimi Zohar <zohar@linux.ibm.com>
1 parent 7eb1721 commit 5b3cd80

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

security/integrity/ima/ima.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ struct ima_kexec_hdr {
182182
#define IMA_CHANGE_ATTR 2
183183
#define IMA_DIGSIG 3
184184
#define IMA_MUST_MEASURE 4
185+
#define IMA_EMITTED_OPENWRITERS 5
185186

186187
/* IMA integrity metadata associated with an inode */
187188
struct ima_iint_cache {

security/integrity/ima/ima_main.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,13 @@ static void ima_rdwr_violation_check(struct file *file,
137137
} else {
138138
if (must_measure)
139139
set_bit(IMA_MUST_MEASURE, &iint->atomic_flags);
140-
if (inode_is_open_for_write(inode) && must_measure)
141-
send_writers = true;
140+
141+
/* Limit number of open_writers violations */
142+
if (inode_is_open_for_write(inode) && must_measure) {
143+
if (!test_and_set_bit(IMA_EMITTED_OPENWRITERS,
144+
&iint->atomic_flags))
145+
send_writers = true;
146+
}
142147
}
143148

144149
if (!send_tomtou && !send_writers)
@@ -167,6 +172,8 @@ static void ima_check_last_writer(struct ima_iint_cache *iint,
167172
if (atomic_read(&inode->i_writecount) == 1) {
168173
struct kstat stat;
169174

175+
clear_bit(IMA_EMITTED_OPENWRITERS, &iint->atomic_flags);
176+
170177
update = test_and_clear_bit(IMA_UPDATE_XATTR,
171178
&iint->atomic_flags);
172179
if ((iint->flags & IMA_NEW_FILE) ||

0 commit comments

Comments
 (0)