VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-45994

CVE-2026-45994

Description

In the Linux kernel, the following vulnerability has been resolved:

ibmasm: fix OOB reads in command_file_write due to missing size checks

The command_file_write() handler allocates a kernel buffer of exactly count bytes and copies user data into it, but does not validate the buffer against the dot command protocol before passing it to get_dot_command_size() and get_dot_command_timeout().

Since both the allocation size (count) and the header fields (command_size, data_size) are independently user-controlled, an attacker can cause get_dot_command_size() to return a value exceeding the allocation, triggering OOB reads in get_dot_command_timeout() and an out-of-bounds memcpy_toio() that leaks kernel heap memory to the service processor.

Fix with two guards: reject writes smaller than sizeof(struct dot_command_header) before allocation, then after copying user data reject commands where the buffer is smaller than the total size declared by the header (sizeof(header) + command_size + data_size). This ensures all subsequent header and payload field accesses stay within the buffer.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Missing size checks in ibmasm's command_file_write() allow OOB reads and kernel heap memory leak via crafted dot commands.

Vulnerability

The command_file_write() handler in the IBM ASM (Advanced System Management) driver allocates a kernel buffer of exactly count bytes and copies user data into it without validating the buffer against the dot command protocol. The functions get_dot_command_size() and get_dot_command_timeout() then parse the header fields (command_size, data_size) which are user-controlled. Because the allocation size (count) and the header-declared total size (sizeof(struct dot_command_header) + command_size + data_size) are independently controlled, an attacker can cause get_dot_command_size() to return a value exceeding the allocation, leading to out-of-bounds reads. This vulnerability affects Linux kernel versions prior to the inclusion of commit 0eb09f737428 [1].

Exploitation

An attacker must have the ability to write to the ibmasm device file (typically requiring root privileges or appropriate permissions). The attacker sends a crafted write request where the count parameter is smaller than the total size declared in the dot command header. The kernel allocates a buffer of count bytes, copies the user data, and then passes it to get_dot_command_size() and get_dot_command_timeout(). These functions read beyond the allocated buffer because they trust the header's declared sizes, resulting in out-of-bounds reads [1].

Impact

Successful exploitation allows an attacker to trigger out-of-bounds reads in get_dot_command_timeout() and an out-of-bounds memcpy_toio() that leaks kernel heap memory to the service processor. This constitutes an information disclosure vulnerability, potentially exposing sensitive kernel data [1].

Mitigation

The fix is included in Linux kernel commit 0eb09f737428 [1]. Users should apply the latest kernel updates from their distribution. No workaround is available; the vulnerability is resolved by the patch that adds two size checks: rejecting writes smaller than sizeof(struct dot_command_header) before allocation, and after copying user data, rejecting commands where the buffer is smaller than the total size declared by the header [1].

AI Insight generated on May 27, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

1
  • Linux/Kernelllm-fuzzy
    Range: stable kernels containing the patches

Patches

10
a672682d39dd

ibmasm: fix OOB reads in command_file_write due to missing size checks

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitTyllis XuMar 14, 2026Fixed in 6.6.140via kernel-cna
2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index 5867af9f592cdb..93dba0d79b5a22 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index 5867af9f592cdb..93dba0d79b5a22 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
aefc1a97da17

ibmasm: fix OOB reads in command_file_write due to missing size checks

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitTyllis XuMar 14, 2026Fixed in 6.12.86via kernel-cna
2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index c44de892a61ec4..b8b22717c05e73 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index c44de892a61ec4..b8b22717c05e73 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
ee5737891464

ibmasm: fix OOB reads in command_file_write due to missing size checks

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitTyllis XuMar 14, 2026Fixed in 6.18.27via kernel-cna
2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index b26c930e3edb4f..0aecf366e61ba6 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index b26c930e3edb4f..0aecf366e61ba6 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
0eb09f737428

ibmasm: fix OOB reads in command_file_write due to missing size checks

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitTyllis XuMar 14, 2026Fixed in 7.1-rc1via kernel-cna
2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
d0fb4d1dc43f

ibmasm: fix OOB reads in command_file_write due to missing size checks

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitTyllis XuMar 14, 2026Fixed in 7.0.4via kernel-cna
2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
a672682d39dd

ibmasm: fix OOB reads in command_file_write due to missing size checks

2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index 5867af9f592cdb..93dba0d79b5a22 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index 5867af9f592cdb..93dba0d79b5a22 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
aefc1a97da17

ibmasm: fix OOB reads in command_file_write due to missing size checks

2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index c44de892a61ec4..b8b22717c05e73 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index c44de892a61ec4..b8b22717c05e73 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
d0fb4d1dc43f

ibmasm: fix OOB reads in command_file_write due to missing size checks

2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
ee5737891464

ibmasm: fix OOB reads in command_file_write due to missing size checks

2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index b26c930e3edb4f..0aecf366e61ba6 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index b26c930e3edb4f..0aecf366e61ba6 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
0eb09f737428

ibmasm: fix OOB reads in command_file_write due to missing size checks

2 files changed · +14 2
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/misc/ibmasm/ibmasmfs.c+7 1 modified
    diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
    index f68a8957b98f87..dfdfa9ba474799 100644
    --- a/drivers/misc/ibmasm/ibmasmfs.c
    +++ b/drivers/misc/ibmasm/ibmasmfs.c
    @@ -303,6 +303,8 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EINVAL;
     	if (count == 0 || count > IBMASM_CMD_MAX_BUFFER_SIZE)
     		return 0;
    +	if (count < sizeof(struct dot_command_header))
    +		return -EINVAL;
     	if (*offset != 0)
     		return 0;
     
    @@ -319,6 +321,11 @@ static ssize_t command_file_write(struct file *file, const char __user *ubuff, s
     		return -EFAULT;
     	}
     
    +	if (count < get_dot_command_size(cmd->buffer)) {
    +		command_put(cmd);
    +		return -EINVAL;
    +	}
    +
     	spin_lock_irqsave(&command_data->sp->lock, flags);
     	if (command_data->command) {
     		spin_unlock_irqrestore(&command_data->sp->lock, flags);
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing size validation in command_file_write() allows user-controlled header fields to declare a total command size larger than the allocated buffer, causing out-of-bounds reads."

Attack vector

An attacker writes a crafted dot command to the ibmasm command file via the `command_file_write()` handler. The allocation size (`count`) and the header fields (`command_size`, `data_size`) are independently user-controlled, so the attacker can supply a small `count` but large `command_size`/`data_size` values in the header [patch_id=2660602]. This causes `get_dot_command_size()` to return a total size exceeding the allocated buffer, leading to out-of-bounds reads in `get_dot_command_timeout()` and an out-of-bounds `memcpy_toio()` that leaks kernel heap memory to the service processor [patch_id=2660602]. No special privileges beyond write access to the ibmasm filesystem node are required.

Affected code

The vulnerable function is `command_file_write()` in `drivers/misc/ibmasm/ibmasmfs.c` [patch_id=2660602]. The handler allocates a kernel buffer of exactly `count` bytes and copies user data into it, then passes the buffer to `get_dot_command_size()` and `get_dot_command_timeout()` without validating that the buffer is large enough for the dot command protocol fields it reads [patch_id=2660602].

What the fix does

The patch adds two size checks in `command_file_write()` [patch_id=2660602]. First, before allocation, it rejects writes smaller than `sizeof(struct dot_command_header)` to ensure the header itself fits. Second, after copying user data, it checks that `count` is at least `get_dot_command_size(cmd->buffer)` — which computes `sizeof(header) + command_size + data_size` — and returns `-EINVAL` if the buffer is too small [patch_id=2660602]. This ensures all subsequent header and payload field accesses stay within the allocated buffer, closing the OOB read and memory leak.

Preconditions

  • authAttacker must have write access to the ibmasm filesystem command node (e.g., /dev/ibmasm or similar)
  • configThe ibmasm driver must be loaded and the service processor interface active
  • inputAttacker sends a crafted dot command via write() syscall with a small count but large header field values

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.