原文标题:Beyond Exploit Scanning: A Functional Change-Driven Approach to Remote Software Version Identification

原文作者:Jinsong Chen, Mengying Wu, Geng Hong, Baichao An, Mingxuan Liu, Lei Zhang, Baojun Liu, Haixin Duan, Min Yang

原文链接:https://www.usenix.org/conference/usenixsecurity25/presentation/chen-jinsong

发表会议:USENIX

笔记作者:尹鑫宇@安全学术圈

主编:黄诚@安全学术圈

编辑:张贝宁@安全学术圈

1、背景介绍

远程软件攻击的效力在很大程度上取决于对目标软件版本的精确识别。传统攻击往往因缺乏版本信息而不得不采用资源消耗大且易于被察觉的暴力破解方式。对于安全研究人员而言,获取版本信息同样是评估漏洞威胁、及时预警的关键。现有的版本识别工具通常依赖于预定义的字符串或静态资产特征作为指纹,然而,当软件部署时采取了混淆版本信息或启用认证等防御措施后,此类方法的有效性便会显著降低。

为此,这项研究提出了一种基于功能性变更的隐蔽式软件版本识别方法。其核心思想在于利用软件版本更新所引入的、难以被管理员轻易修改的功能性差异来设计探测请求。这些功能性变化是版本更新的内在驱动力,通常会引发不同的服务器响应,从而成为可靠的识别指纹。为了在保证识别准确率的同时最大限度地降低探测行为对目标服务器的影响,该方案从官方文档和变更日志中提炼领域知识以生成精准探测,并采用动态决策树来规划高效的探测序列,以应对现实世界中非标准部署带来的挑战。

研究团队在Elasticsearch、Redis、Dubbo、Joomla和phpMyAdmin等五种广泛使用的软件上对该方法进行了实现与评估。实验结果表明,相较于现有技术,这一方法将版本识别率提升了2.8倍,同时发送的数据包数量减少了65.37%。此外,通过大规模真实网络扫描,该工作成功为240,020个软件实例识别出版本信息,并揭示出超过72.25%的用户仍在部署至少一年前发布的旧版本,面临着严重的安全威胁。

2、研究动机

现有远程软件版本识别技术面临根本性局限。传统方法依赖预定义的版本字符串、哈希值或文件结构等静态特征作为识别指纹。然而,这类方法存在两个关键缺陷:首先,部分软件(如Dubbo)根本不提供可识别版本信息的预定义字符串;其次,管理员可通过混淆工具轻易修改或隐藏这些特征,导致现有识别工具失效。

下图揭示了关键突破口:当使用"logstash_system"用户登录两个启用认证的Elasticsearch版本时,v5.1.2返回"unable to authenticate user..."错误,而v5.2.0则返回"failed to authenticate user..."。这种本质差异源于v5.2.0引入了新的内置用户功能,它表明软件版本更新带来的功能性变化会不可避免地导致响应差异,且这些由核心功能变更引入的特征难以被管理员修改或隐藏。

这一发现启发了本研究的核心动机:探索利用版本更新引入的功能性变化作为新型“指纹”,以突破现有识别技术的局限。特别是功能增加、调整和移除这三类变化,它们直接关联软件核心功能,必然在响应中留下可观测的痕迹。通过系统挖掘和利用这些功能性特征,旨在实现一种更隐蔽、更准确的版本识别方法,从而在目标软件启用认证或混淆版本信息等防御措施下,仍能保持有效的识别能力。

3、本文方法

本文提出了一个名为VersionSeek的新型版本识别框架,该框架由三个核心模块组成:功能探针生成模块、响应处理模块和版本识别模块。

首先,功能探针生成模块从软件发布说明中提取功能性变更特征,并自动生成触发这些功能的探针。由于发布说明中的功能描述通常较为简略,该模块通过结合拉取请求(PR)中的详细说明和用户指南中的使用示例,为每个功能特征收集充分的上下文信息。基于这些增强信息,模块采用检索增强生成(RAG)方法,利用大语言模型自动生成能够准确触发功能性特征的探测请求。

其次,响应处理模块负责标准化不同版本的软件响应并进行分类,以确定每个功能探针对应的版本分类。该模块通过自动化部署方案收集各版本软件对探针的响应,并采用差分测试方法识别和标准化由网络环境、操作系统等外部因素引起的响应噪声。处理后的响应被自动分类,形成每个探针的分类函数,记录不同响应类型对应的版本集合。

最后,版本识别模块通过动态决策树算法优化探针使用顺序,实现以最少的探针达到最高的识别准确率。该模块将探针调度问题形式化为:在给定待区分版本集合、可用探针集合和分类函数的情况下,寻找能够最大程度区分版本的最小探针序列。算法通过递归缩减方法找到局部最优解,并构建决策树来指导探针调度过程。为解决用户自定义设置可能引起的版本冲突,系统采用多数投票算法进行冲突消解。当检测到冲突时,系统会回溯决策树,生成新的决策树进行重新识别,并通过比较路径长度选择获得最多探针支持的版本作为最终结果,从而在控制开销的同时保证识别准确性。

4、评估

4.1 实验设置

评估对象。本研究选取了五类软件进行验证:Elasticsearch、Redis、Dubbo、Joomla和phpMyAdmin。基于这些软件过去十年(2014–2024)的发布版本,开发了原型框架VersionSeek。

研究问题。评估实验围绕五个研究问题展开:RRQ1(RAG消融实验):探究上下文信息在探针生成模块中对实验结果的贡献程度;RQ2(探针有效性):评估VersionSeek生成探针的功能区分能力;RQ3(扫描效率):分析探针规划算法对系统运行时效率的提升效果;RQ4(版本识别性能):比较VersionSeek与现有先进工具在版本识别准确率方面的表现;RQ5(鲁棒性):测试VersionSeek在版本信息被故意隐藏或混淆等对抗环境下的稳定性。

数据集构建

  • RQ1(消融实验):基于Elasticsearch构建专用数据集,从其过去十年各主要版本系列中选取首尾版本(如5.x系列的5.0.0和5.6.0),每个版本人工筛选最多8项功能特性,结合搜索引擎和官方文档手动构建对应触发探针,最终获得30个功能特性及其探针构成核心数据集。

  • RQ2:数据集来源于本地实验中生成的探针及其在不同版本中触发的响应记录,通过多版本环境验证探针区分能力。

  • RQ3和RQ4:针对需要真实活跃服务器的测试需求,利用Shodan平台的持续扫描能力,通过“product”筛选器获取特定软件记录,限定24小时内数据采集窗口,经Netcat端口扫描验证服务可用性后,最终为每种软件随机选取100个活跃服务器组成测试集。

  • RQ5:基于本地部署服务器构建对抗测试环境,通过实施两种版本隐藏技术(篡改内容、切断访问)收集响应变异数据,模拟现实场景中的版本混淆与阻断情况。

基线工具。与WhatWeb、BlindElephant、Nmap和Metasploit进行对比。所有对比工具均配置为最佳性能模式。

4.2 RAG消融实验

实验比较了四种主流大语言模型(GPT-3.5、Gemini1.5、Llama3.2、Qwen2.5)在有无RAG增强条件下的探针生成成功率。结果显示,引入上下文信息后,所有模型的生成率均获得提升,其中GPT-3.5提升最为显著(从0.45升至0.63)。Qwen2.5在RAG条件下达到最高生成率(0.67),因此被选为后续实验的默认模型。这表明领域知识和上下文信息能有效帮助LLM理解功能特性并生成更准确的探针。

4.3 探针生成有效性

通过对五个软件过去十年版本的全面分析,系统成功生成了1,258个有效探针。具体而言,利用684份Release-Notes、相关的7,963个Pull Requests以及对应的6,657个Document Retrieved,通过自动匹配标准化命令模板生成3,681个格式正确的探针(Probes)。经过伦理过滤和性能测试后,最终探针可用率达到34.17%。分析显示,88.01%的探针能够将响应和版本分类为2到5个类别,而针对高频变更功能的探针(如Elasticsearch的xpack功能)甚至能区分17个版本类别。值得注意的是,即使在没有授权凭证的情况下,不同版本的错误处理差异仍可使探针有效区分版本。

4.4 扫描效率分析

实验数据显示,探针生成阶段虽然耗时(平均每个功能特性约1分钟),但属于一次性过程。在实际识别过程中,探针调度仅需数秒即可完成,单个探针执行平均耗时约1.4秒。VersionSeek识别单个版本所需探针数量显著低于传统方法:Elasticsearch平均5.8个、Dubbo 4.867个、Redis 2.633个、Joomla 6.233个、phpMyAdmin 9.416个。与WhatWeb在激进模式下需要18个请求相比,VersionSeek减少了65.37%的数据包发送,平均扫描时间控制在7.4到14.611秒之间,证明其具备大规模版本识别的可行性。

4.5 扫描效率分析

与现有工具对比:VersionSeek在所有五类软件上均表现出显著优势,特别是在phpMyAdmin上相比WhatWeb准确率提升284%。对于Dubbo这类不提供预定义版本字符串的软件,现有工具完全失效,而VersionSeek通过分析“invoke”和“help”等命令的功能变更,成功识别出100个Dubbo服务器的版本(46个精确到补丁版本)。

与现代方法对比:与黑盒差分分析方法和机器学习方法相比,VersionSeek在phpMyAdmin上的识别性能分别提升31.50%和62.71%。传统方法依赖BlindElephant的公开探针的公开探针易被管理员阻断,而VersionSeek基于功能性特征设计的探针(如通过界面语言支持变化推断版本)更难被完全屏蔽。在探针使用效率上,VersionSeek平均仅需9.41个探针,而传统的机器学习方法固定需要15个探针;此外,VersionSeek通过功能性探针设计与动态调度策略,在真实复杂环境中实现了更优的识别效率与鲁棒性。

4.6 抗干扰能力验证

在模拟对抗环境中,VersionSeek在两种版本隐藏场景下均保持100%的识别率。在混淆场景中,VersionSeek系统通过分析版本字符串之外的功能差异(例如Redis 6.2.0新增的“server_time_usec”字段)实现版本识别;在阻断场景中,当探针失效时VersionSeek系统能自动生成后续决策树继续推理实现版本识别。相比之下,严重依赖显式版本字符串的Nmap和Metasploit在两种条件下对Redis和Elasticsearch的识别完全失败。虽然BlindElephant对Joomla和phpMyAdmin展现出一定鲁棒性,但因缺乏动态调度策略而始终发送固定15个探针。结果表明,VersionSeek通过功能性差异识别版本和动态决策树调度,在对抗环境下表现出更强的鲁棒性和效率。

5、真实场景测量与案例分析

5.1 扫描效率分析大规模版本识别结果

基于实验室实验结果,本研究开发了版本扫描工具并对真实场景中的软件版本分布进行了大规模测量。通过整合Shodan和FOFA平台两个月内的实时扫描数据,共获取475,281条服务器记录。经扫描验证,在277,251个活跃服务器中成功识别出240,020个服务器的版本信息,识别率达86.57%。其中:

  • 平台收集277,251个活跃服务器中,191,102个服务器缺乏版本信息,86,149个服务器有版本信息。

  • 对86,149个已有版本记录的服务器,识别准确率达97.23%

  • 在识别结果中,次要版本占比27.33%,补丁版本占比68.29%

5.2 漏洞威胁分析

通过将识别出的版本与CVE漏洞数据库进行匹配,发现各软件均存在严重安全隐患:

Elasticsearch:26.84%的服务器运行7.14.0-7.17.12版本,存在10个CVE漏洞,其中5个为高危漏洞。其中CVE-2023-31418权限提升漏洞仍然影响27,035个服务器。

Redis:28.29%的服务器运行7.4.0-7.4.1版本,但仅6.27%启用认证,剩下93.73%面临严重安全威胁。

Dubbo:23.83%的服务器使用2018年停止更新的2.5.5-2.5.10版本,存在9个CVE漏洞,其中8个为可导致远程代码执行的严重反序列化漏洞。

Joomla:24.32%的服务器运行3.9系列版本,其中62.28%可能受73个CVE漏洞影响。更严重的是,24.98%的用户仍在使用十年前发布的版本。

phpMyAdmin:44.31%的服务器运行5.1.0-5.1.4版本,35.47%的服务器运行5.2.0–5.2.1版本,其中CVE-2020-22452影响范围覆盖5.0.0–5.1.4版本,涉及48.40%的部署实例。

总体而言,72.25%的被测服务仍在运行至少一年前发布的旧版本,面临严重的漏洞威胁。

5.3 蜜罐系统识别案例

在大规模扫描过程中,研究发现了设备搜索引擎误报的蜜罐系统,这些系统表现出两个典型特征:

  • 功能不完整:某些标记为Redis的服务器在响应"NOTCOMMAND ARGS"请求时,虽模仿新版本返回错误信息格式,但未能正确解析参数,暴露出功能不一致的破绽。

  • 响应不变:部分被识别为Elasticsearch的服务器无论接收何种请求参数,始终返回相同的默认响应,缺乏真实软件的行为多样性。

这些案例表明,依赖固定请求模式的传统版本识别工具容易被伪造的简单响应所欺骗。相比之下,VersionSeek基于功能性变更的动态探针调度机制,能够通过分析多个功能点的响应差异,有效区分真实服务与蜜罐系统,实现更可靠的版本识别。

6、讨论与总结

6.1 安全影响

本研究提出了一种基于功能性变更的版本识别新方法,通过分析不同版本间难以被修改或检测的细微响应差异来实现版本区分。与现有版本识别工具相比,该工具展现出更好的可扩展性、适用性和鲁棒性。

大规模测量结果显示,许多用户仍依赖过时的服务器版本,且未能启用软件提供的安全措施,使其面临严重的漏洞威胁。与现有设备搜索引擎的结果相比,本研究识别并评估了更广泛的攻击面,这些攻击面此前因版本信息缺失而被忽视。

6.2 局限性分析

尽管VersionSeek取得了优异的远程版本识别性能,但该方法仍存在一定局限性:

版本覆盖范围:探针生成依赖于本地部署组件的测试,虽然适用于所有版本,但许多旧版本的源代码和依赖项难以收集,因此研究集中于过去十年的版本。部分缺失部署环境的版本会导致识别精度下降,不过持续运行这些缺失版本的服务预期占比很低,对整体结果影响有限。

认证服务限制:面对启用认证的组件时,VersionSeek的有效性会降低,因为许多探针需要认证凭据。尽管如此,通过分析不同版本的错误处理差异,仍能推断出近似的版本范围。这一局限也凸显了认证服务的安全性优势,提高了攻击门槛。

闭源软件适用性:虽然VersionSeek理论上适用于闭源或专有软件系统,但由于缺乏详细的开发信息,实际效果可能受限。对这些系统进行自动程序分析和功能变更提取更为困难,扩展探针可能需要额外的人工努力,如逆向工程或众包分析。

功能探针覆盖不足:部分版本可能缺乏合适的功能探针,导致无法准确识别。并非所有功能变更都能生成对应探针,例如依赖升级或性能优化。此外,某些仅存在补丁级别差异的相邻版本(如Elasticsearch 6.8.18-6.8.23)除依赖升级外无显著修改,难以区分。某些探针还需要特定前提条件,如Redis的"CLUSTER INFO"探针需要集群服务器配置,限制了其在非集群服务器测试中的适用性。

6.3 全文总结

本文提出了一种基于功能性变更的版本识别方法,并在五个具有大量漏洞的知名远程软件系统上实现了原型框架VersionSeek。与现有版本识别工具相比,VersionSeek实现了显著更高的识别率,在phpMyAdmin上提升达284%,并具备独有的Dubbo版本识别能力。

通过开展大规模版本识别实验,成功为240,020个软件实例识别出版本信息,其中95.61%的结果达到次要版本和补丁级别的识别精度。通过对结果的分析,揭示了用户在版本选择上的偏好,并强调了使用过时版本和未启用安全功能可能导致的严重安全漏洞。这一研究为软件版本识别提供了新的技术途径,并对网络安全态势评估提供了重要参考。

安全学术圈招募队友-ing

有兴趣加入学术圈的请联系 secdr#qq.com

声明:本文来自安全学术圈,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。