首页 网络安全 正文
  • 本文约2315字,阅读需12分钟
  • 3
  • 0

LIBSSH SFTP服务器整数溢出服务拒绝CVE-2025-5449

摘要

栋科技漏洞库关注到LIBSSH SFTP服务器消息解码逻辑中存在导致服务拒绝的缺陷,该漏洞现被追踪为CVE-2025-5449,CVSS评分4.3。

LIBSSH是一个用于 SSH 协议的开源库,它提供了客户端和服务器端的实现,它支持 SSH 会话、SFTP(SSH File Transfer Protocol)等。

一、基本情况

LIBSSH是一个C语言编写的库,提供SSH2协议实现,允许开发者在自己的应用中集成SSH功能,以实现远程命令执行、文件传输等功能。

LIBSSH SFTP服务器整数溢出服务拒绝CVE-2025-5449

栋科技漏洞库关注到LIBSSH SFTP服务器消息解码逻辑中存在导致服务拒绝的缺陷,该漏洞现被追踪为CVE-2025-5449,CVSS评分4.3。

二、漏洞分析

CVE-2025-5449漏洞是在LIBSSH SFTP服务器消息解码逻辑中发现的,这是一个服务器数据包长度验证的整数溢出而导致服务拒绝漏洞。

CVE-2025-5449漏洞源于不正确的数据包长度检查造成,即检入数据包长度不正确,当32位系统上处理大负载时,该检查允许整数溢出。

该漏洞可能在SFTP服务器消息解码中越界读取,导致过多的内存分配尝试或内存分配失败,并导致服务器进程崩溃,从而导致拒绝服务。

Red Hat产品安全小组将此漏洞的严重性评估为中等,因为只有具有SFTP访问权限的经过身份验证的用户才能在32位系统上利用此漏洞。

虽然该缺陷不会导致内存损坏或代码执行,但会中断合法用户的可用性,这里需要明确,没有任何Red Hat产品或服务受到此漏洞的影响。

具体来说,恶意客户端可以发送有效负载大小字段设置为的无效SFTP数据包 ,值0x7ffffffc (2GB - 3B)。

该值错误地通过了32b平台上有效性检查 ,函数sftp _ decode _ channel _ data _ to _ packet()中, 由数据包长度检查中的整数溢出引起。

缓冲区界限不用于超出缓冲区界限的访问,因为对“ssh_buffer_add_data()”的后续调用将无法分配缓冲区 大小> 256MB,

因此导致sftp服务器进程的自拒绝服务,这只能被运行在32b平台上的sftp服务器利用。

具体漏洞代码如下:

1、

Diffstat
-rw-r--r--    src/sftp.c    18    
1 files changed, 10 insertions, 8 deletions
diff --git a/src/sftp.c b/src/sftp.c
index 154de480..37b4133b 100644
--- a/src/sftp.c
+++ b/src/sftp.c
@@ -361,10 +361,10 @@ int
 sftp_decode_channel_data_to_packet(sftp_session sftp, void *data, uint32_t len)
 {
     sftp_packet packet = sftp->read_packet;
-    int nread;
-    int payload_len;
-    unsigned int data_offset;
-    int to_read, rc;
+    size_t nread;
+    size_t payload_len;
+    size_t data_offset;
+    size_t to_read, rc;

     if (packet->sftp == NULL) {
         packet->sftp = sftp;
@@ -380,7 +380,7 @@ sftp_decode_channel_data_to_packet(sftp_session sftp, void *data, uint32_t len)
     packet->type = PULL_BE_U8(data, 4);

     /* We should check the legality of payload length */
-    if (payload_len + sizeof(uint32_t) > len || payload_len < 0) {
+    if (payload_len > len - sizeof(uint32_t) || payload_len < sizeof(uint8_t)) {
         return SSH_ERROR;
     }

@@ -399,10 +399,12 @@ sftp_decode_channel_data_to_packet(sftp_session sftp, void *data, uint32_t len)
     }

     /*
-     * We should return how many bytes we decoded, including packet length header
-     * and the payload length.
+     * We should return how many bytes we decoded, including packet length
+     * header and the payload length.
+     * This can't overflow as we pulled this from unit32_t and checked this fits
+     * into the buffer's max size of 0x10000000 (256MB).
      */
-    return payload_len + sizeof(uint32_t);
+    return (int)(payload_len + sizeof(uint32_t));
 }

 /* Get the last sftp error */

2、

-rw-r--r--    src/sftpserver.c    12    
1 files changed, 8 insertions, 4 deletions
diff --git a/src/sftpserver.c b/src/sftpserver.c
index d3356228..648cab95 100644
--- a/src/sftpserver.c
+++ b/src/sftpserver.c
@@ -952,7 +952,7 @@ process_read(sftp_client_message client_msg)
                     ssh_string_len(handle));

     h = sftp_handle(sftp, handle);
-    if (h->type == SFTP_FILE_HANDLE) {
+    if (h != NULL && h->type == SFTP_FILE_HANDLE) {
         fd = h->fd;
     }

@@ -1010,7 +1010,7 @@ process_write(sftp_client_message client_msg)
                     ssh_string_len(handle));

     h = sftp_handle(sftp, handle);
-    if (h->type == SFTP_FILE_HANDLE) {
+    if (h != NULL && h->type == SFTP_FILE_HANDLE) {
         fd = h->fd;
     }
     if (fd < 0) {
@@ -1055,7 +1055,11 @@ process_close(sftp_client_message client_msg)
                     ssh_string_len(handle));

     h = sftp_handle(sftp, handle);
-    if (h->type == SFTP_FILE_HANDLE) {
+    if (h == NULL) {
+        SSH_LOG(SSH_LOG_PROTOCOL, "invalid handle");
+        sftp_reply_status(client_msg, SSH_FX_INVALID_HANDLE, "Invalid handle");
+        return SSH_OK;
+    } else if (h->type == SFTP_FILE_HANDLE) {
         int fd = h->fd;
         close(fd);
         ret = SSH_OK;
@@ -1223,7 +1227,7 @@ process_readdir(sftp_client_message client_msg)
                     ssh_string_len(handle));

     h = sftp_handle(sftp, client_msg->handle);
-    if (h->type == SFTP_DIR_HANDLE) {
+    if (h != NULL && h->type == SFTP_DIR_HANDLE) {
         dir = h->dirp;
         handle_name = h->name;
     }

三、影响范围

LIBSSH SFTP < 0.11.2-r0

四、修复建议

LIBSSH SFTP >= 0.11.2-r0

五、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接