Re: [PATCH v3] mm: Add kvfree_sensitive() for freeing sensitive data objects

From: Waiman Long
Date: Sun May 17 2020 - 22:39:50 EST


On 5/16/20 8:27 PM, Balbir Singh wrote:

On 14/5/20 10:00 pm, Matthew Wilcox wrote:
On Thu, May 14, 2020 at 09:00:40PM +1000, Balbir Singh wrote:
I wonder if the right thing to do is also to disable pre-emption, just so that the thread does not linger on with sensitive data.

void kvfree_sensitive(const void *addr, size_t len)
{
preempt_disable();
if (likely(!ZERO_OR_NULL_PTR(addr))) {
memzero_explicit((void *)addr, len);
kvfree(addr);
}
preempt_enable();
}
EXPORT_SYMBOL(kvfree_sensitive);
If it's _that_ sensitive then the caller should have disabled preemption.
Because preemption could otherwise have occurred immediately before
kvfree_sensitive() was called.

May be, but the callers of the API have to be explictly aware of the contract.
I don't disagree with you on what you've said, but I was referring to the
intent of freeing sensitive data vs the turn around time for doing so.

We can't disable preemption like that. The vfree() call may potentially sleep. It could be a mess to keep track of the preemption state to make that works.

The purpose of this API is to make sure that a newly allocated memory block won't contain secret left behind from another task. There is no guarantee on how long the freeing process will take.

Cheers,
Longman