From: Zilin Guan zilin@seu.edu.cn
[ Upstream commit c8ef20fe7274c5766a317f9193b70bed717b6b3d ]
The tipc_aead_free() function currently uses kfree() to release the aead structure. However, this structure contains sensitive information, such as key's SALT value, which should be securely erased from memory to prevent potential leakage.
To enhance security, replace kfree() with kfree_sensitive() when freeing the aead structure. This change ensures that sensitive data is explicitly cleared before memory deallocation, aligning with the approach used in tipc_aead_init() and adhering to best practices for handling confidential information.
Signed-off-by: Zilin Guan zilin@seu.edu.cn Reviewed-by: Tung Nguyen tung.quang.nguyen@est.tech Link: https://patch.msgid.link/20250523114717.4021518-1-zilin@seu.edu.cn Signed-off-by: Jakub Kicinski kuba@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
**YES** This commit should be backported to stable kernel trees. Here's my detailed analysis: ## Security Justification The commit addresses a clear security vulnerability by replacing `kfree()` with `kfree_sensitive()` for the `tipc_aead` structure in `tipc_aead_free()`. This is a critical security improvement because: 1. **Sensitive Data Content**: The `tipc_aead` structure contains highly sensitive cryptographic information: - `salt` field: Cryptographic salt used in key derivation - `key` pointer: References actual cryptographic key material - `hint` field: Contains key identification information 2. **Memory Security Risk**: Using regular `kfree()` leaves sensitive cryptographic data in freed memory, creating a potential information leakage vector where: - Attackers could potentially recover salt values and key hints from freed memory - Subsequent memory allocations might access residual cryptographic data - This violates cryptographic security best practices ## Code Change Analysis The specific change from `kfree(aead)` to `kfree_sensitive(aead)` on line 428 of `net/tipc/crypto.c` is: ```c - kfree(aead); + kfree_sensitive(aead); ``` This change is: - **Minimal and contained**: Single line change with no functional impact - **Low risk**: `kfree_sensitive()` performs the same deallocation as `kfree()` but adds explicit memory zeroing - **Consistent**: The same file already uses `kfree_sensitive(aead->key)` on line 427, showing this practice is established ## Alignment with Similar Commits This commit closely parallels the "YES" backport examples: 1. **Similar Commit #1**: Used `aead_request_free()` instead of `kfree()` for proper crypto data handling 2. **Similar Commit #2**: Applied `kfree_sensitive()` to crypto buffers containing key material 3. **Similar Commit #5**: Fixed TIPC crypto security issue (preemption problem) The pattern of replacing standard memory deallocation with secure alternatives for cryptographic structures is well-established and consistently approved for backporting. ## Stable Tree Criteria Compliance This commit meets all stable tree requirements: - **Important bugfix**: Fixes potential cryptographic information leakage - **Minimal risk**: Single line change with no behavioral modifications - **No architectural changes**: Uses existing kernel API - **Contained scope**: Limited to TIPC crypto subsystem cleanup ## Security Impact Given TIPC's history of security vulnerabilities (including heap overflows and use- after-free issues), this defensive security measure is particularly valuable for preventing information disclosure attacks targeting cryptographic material. The commit represents a clear security hardening improvement with negligible risk, making it an excellent candidate for stable kernel backporting.
net/tipc/crypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index 8584893b47851..f4cfe88670f55 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -425,7 +425,7 @@ static void tipc_aead_free(struct rcu_head *rp) } free_percpu(aead->tfm_entry); kfree_sensitive(aead->key); - kfree(aead); + kfree_sensitive(aead); }
static int tipc_aead_users(struct tipc_aead __rcu *aead)