已在Linux内核的ksmbd模块中发现一个释放后使用漏洞,该模块负责实现用于网络文件交换的SMB(服务器消息块)协议。此漏洞标识为CVE-2025-37899,可能允许以高权限远程执行代码。
该发现由研究员Sean Heelan使用OpenAI的o3模型完成,展示了人工智能在识别复杂漏洞方面的潜力。该漏洞存在于对SMB2/3的logoff命令的处理中,可在特定竞争条件下被利用。
释放后使用漏洞发生在处理logoff命令时,一个线程释放了与sess->user对象关联的内存。如果另一个线程试图访问这个已释放的对象,就会产生一个竞争条件,可能导致内存损坏,并可能执行任意代码。
易受攻击的代码位于ksmbd模块中的smb2_session_logoff函数内。在访问sess->user对象时缺乏适当的同步,使得内存仍在被另一个线程使用时被释放。
// Ejemplo simplificado del código vulnerable
void smb2_session_logoff(struct ksmbd_work *work) {
struct smb_session *sess = work->session;
if (sess->user) {
ksmbd_free_user(sess->user); // Liberación de la memoria
sess->user = NULL;
}
}
// Otro hilo podría acceder a sess->user aquí, después de la liberación
远程攻击者可以通过发送一系列精心设计的SMB2/3命令,在访问sess->user对象时制造竞争条件来利用此漏洞。这可以通过建立多个SMB连接并操纵会话关闭以与并发对象访问同步实现。
成功利用此漏洞可允许攻击者:
建议尽快应用Linux发行版提供的安全补丁。主要发行版已在发布更新。
// Antes (vulnerable)
void smb2_session_logoff(struct ksmbd_work *work) {
struct smb_session *sess = work->session;
if (sess->user) {
ksmbd_free_user(sess->user);
sess->user = NULL;
}
}
// Después (arreglado)
void smb2_session_logoff(struct ksmbd_work *work) {
struct smb_session *sess = work->session;
spin_lock(&sess->user_lock); // Lock para proteger el acceso concurrente
if (sess->user) {
ksmbd_free_user(sess->user);
sess->user = NULL;
}
spin_unlock(&sess->user_lock); // Unlock después de la operación
}
在访问sess->user的函数中,也必须进行保护:
// Ejemplo de acceso seguro en otra función
void smb2_check_user_session(struct smb_session *sess) {
spin_lock(&sess->user_lock);
if (sess->user) {
// Acceso seguro a sess->user
// ...
}
spin_unlock(&sess->user_lock);
}
若无法立即应用补丁,建议:
ksmbd模块。感谢Sean Heelan发现此漏洞,并感谢网络安全社区在缓解此漏洞方面的合作。