从这个网页截图中,可以获取到以下关于漏洞的关键信息: 1. 漏洞编号:CVE-2024-10397 2. 漏洞名称:Preallocated buffer overflows in XDR responses 3. 受影响的软件版本: - OpenAFS clients running versions 1.0 through 1.6.24 - 1.8.0 through 1.8.12.2 - 1.9.0 through 1.9.1 4. 受影响的软件:OpenAFS 5. 漏洞描述: - 恶意服务器可以导致OpenAFS缓存管理器和其他客户端工具崩溃,并可能执行任意代码。 - 多个RPC由OpenAFS使用,返回动态大小的字符串、缓冲区和数组作为输出参数。调用这些RPC的调用者可能提供预分配的内存来存储这些结果。在某些情况下,调用者提供预分配的缓冲区,其大小小于RPC接口定义的限制。在这种情况下,如果服务器响应的数据量大于预分配的缓冲区,XDR编码器将写入缓冲区之外的内存,导致错误、崩溃或可能的代码执行。 6. 影响: - 根据本地配置,本地未授权用户可能能够联系恶意vserver或文件服务器触发缓存管理器的缓冲区溢出。对于Unix缓存管理器,这意味着崩溃或可能在内核模式下执行任意代码。 - 如果afsd守护进程运行时没有使用“-afsdb”选项,恶意细胞可以触发缓冲区溢出,但缓存管理器只能联系在本地CellServDB中配置的细胞或手动运行“fs newcell”(一个只能由root成功运行的操作)。 - 恶意用户有能力修改网络包也可以通过修改真实服务器的响应触发缓冲区溢出。 - 在Solaris内核客户端上,恶意细胞也可以触发系统崩溃或内存损坏。 7. 受影响的软件版本: - 所有OpenAFS的版本,从1.6.24到1.8.12.2,以及从1.9.0到1.9.1。 8. 修复措施: - 建议所有受影响的客户端和工具升级到OpenAFS版本1.6.25或1.8.13。 - 对于无法或不愿意升级的站点,提供补丁来解决此问题。 - 在缓存管理器上限制用户对远程细胞的访问,运行afsd时禁用-dynroot/-dynroot-sparse选项可以防止被轻易利用的未授权进程,运行afsd时禁用-afsdb选项可以防止被轻易利用的任何本地进程。 9. 详细信息: - RPC定义输出参数为字符串、不透明或数组时,将使用相应的函数xdr_string()、xdr_opaque()、xdr_array()或xdr_arrayN()来解码服务器响应。所有这些都可以使用预分配的缓冲区来存储解码数据,但都没有检查给定的预分配缓冲区是否足够大来存储响应。对于字符串,不可能检查给定的缓冲区是否足够大,因为调用者不传递缓冲区的大小。 - 如果调用者提供的预分配缓冲区大于或等于接口定义的大小,那么就没有溢出的可能性。否则,相关的XDR函数可以存储比给定缓冲区更多的数据,导致缓冲区溢出。 - 一些RPC在重试/回退循环中有效使用预分配输出参数,即使它们没有这样做。例如,Unix和WINNT缓存管理器也包含对VL_GetAddrSU()的调用,看起来像这样: - 如果第一次调用VL_GetAddrSU()填充了'addr'参数并中断,我们可能会尝试再次调用VL_GetAddrSU(),传递第一次调用中分配的'addr'数组。这允许在堆中触发缓冲区溢出,如果下一次调用返回一个'addr'数组比第一次调用中分配的'addr'数组更大的话。 - 所有通过ubik_包装器(例如ubik_VL_GetAddrSU())调用的RPC,即使它们不传递预分配的输出参数,也受到相同的问题影响,因为底层RPC可能被调用多次。这主要发生在联系已知服务器(vos、pts、aklog)的用户空间实用程序中,因此通常不太是一个安全问题。 - 与字符串相关的另一个问题可能发生在Solaris内核代码中: - 字符串在XDR中以长度开头,然后是字符串内容。但是,当xdr_string()释放字符串时,它计算缓冲区的大小,然后通过调用strlen()来释放字符串。如果服务器以长度为N的字符串响应,其中内容包含一个NUL字节,xdr_string()将分配N+1字节的内存,然后尝试通过调用osi_free()释放分配的缓冲区,其大小为N或更小。 - 大多数平台忽略size参数到osi_free(),但Solaris将其传递给kmem_free()。如果传递给kmem_free()的大小错误,这可能导致内核崩溃或内存损坏。 这些信息提供了关于OpenAFS中预分配缓冲区溢出漏洞的详细描述,包括受影响的软件、漏洞的触发条件、影响范围以及修复措施。