Web 应用指纹识别作为网络安全领域的基础技术,其精准性和时效性对安全团队开展漏洞扫描、供应链 0day/Nday 排查等工作至关重要。然而,随着公司内部自研系统、三方采购系统以及开源应用的大量涌现,传统人工添加指纹规则的方式逐渐显露出诸多弊端,难以满足对全部业务的安全保障需求。
大语言模型( LLM )技术的应用能够在一定程度上解决此类问题,本文将详细探讨如何借助 LLM 技术推动 Web 应用指纹识别实现新的突破与变革。
1.1 传统 Web 应用指纹识别
传统 Web 应用指纹识别主要依赖字符串匹配或正则匹配,以下列 Jenkins 应用的响应为例,通过人工添加匹配规则<title>Dashboard [Jenkins]</title>或者X-Jenkins:s*(?P<version>[d.]+),即可识别该应用为 Jenkins 并获取其版本号,识别结果可直接应用于攻击面管理、漏洞扫描等场景。
HTTP/1.1 200 OK X-Content-Type-Options: nosniff Content-Type: text/html;charset=utf-8 Cache-Control: no-cache,no-store,must-revalidateX-Jenkins: 2.462.3 <!DOCTYPE html><html><head resURL="/static/d3a34aba" ><title>Dashboard [Jenkins]</title> ……省略…… <button type="button" class="jenkins-button jenkins-button--tertiary jenkins_ver" > Jenkins 2.462.3 </button><template><div> ……省略……
1.2 传统识别及 LLM 技术对比
大语言模型技术的蓬勃发展和快速迭代,以及字节跳动推出的豆包大模型、Coze平台等,为黑盒扫描团队借助 LLM 提升 Web 指纹识别能力提供了便利,能够有效克服传统指纹识别存在的局限性。
基于上述因素的考虑,我们尝试在已有的 Web 指纹识别系统上使用 LLM 进行功能增强。
2.1 整体方案
为了保证当前黑盒扫描系统稳定性,识别方案采用旁路方案异步执行:
发送请求、记录响应:黑盒扫描系统对资产库中的资产定时发起扫描,记录扫描过程中发出的 HTTP 请求及响应数据,并使用已有指纹库规则进行初步匹配。这一步骤可以快速筛选出已知应用,减少后续处理的大模型调用量。
LLM 应用指纹识别:调用 LLM 对收集到的请求响应数据进行分析,让 LLM 识别并总结出该数据对应的 CPE(Common Platform Enumeration) 信息和指纹特征。LLM 的强大能力在这个过程中得到充分发挥,能够从复杂的数据中挖掘出有价值的信息。
指纹特征 review 添加:LLM 输出的指纹信息被存储在数据集中,经过人工审核后,将准确可靠的指纹规则添加到指纹库中,进一步完善指纹识别体系。
整个方案中最核心的功能模块就是 LLM Agent,下面重点介绍如何开发此 Agent。
2.2 LLM Agent 开发
在具体的实践过程中,我们按照 LLM 常见的 Agent 开发模式,首先进行了基座模型选型和 Prompt 编写,即提示词工程(Prompt Engineering)。
1. Prompt Engineering
基座模型选型:豆包大模型是字节跳动推出的自研大模型,为多种应用场景提供强有力的人工智能支持,其在多项指标上表现优异。我们综合考量性能、成本、数据安全等因素,选定豆包大模型作为基座模型。
##目标:- 根据 url 的请求和响应数据,进行网页指纹识别,分析这个url 是什么应用,给出 CPE 和识别的指纹特征。## 规则:- 传入一个 json 数据,其中包括 host、ip、port、url、path、整体 url、响应码、请求响应体, 示例:```{"host":"","ip":"10.0.0.1","port":"2280","url":"http://10.0.0.1:2280/","responses":{"/?query=":{"url":"http://10.0.0.1:2280/?query=","status_code":200,"text":"HTTP/1.1 200 OKrnContent-Length: 12rnContent-Type: text/plain; charset=utf-8rnDate: Fri, 01 Nov 2024 06:50:34 GMTrnrnNot Found .."},"_index_path_":{"url":"http://10.0.0.1:2280/","status_code":200,"text":"HTTP/1.1 200 OKrnContent-Length: 12rnContent-Type: text/plain; charset=utf-8rnDate: Fri, 01 Nov 2024 06:50:34 GMTrnrnConsul Agent"}}}```- 请求响应体如果超过 32KB,则已被截断;- 尽量根据互联网上已知的指纹库进行匹配,比如 tidefinger、Wappalyzer、webanalyzer、WhatWeb、fofa 等;- 必须尽可能地进行匹配识别;- 必须深入的对传入给你的响应信息进行分析,在得出结论前,请对你分析的结果再次思考确认是否正确;- 必须全面的分析评估响应结构,全面理解语义,并清楚表达你得出当前结论的原因;## 输出:- 需要输出匹配结果,包括合法符合规范的 CPE、匹配规则、原因,示例:```[{"cpe":"cpe:2.3:a:hashicorp:consul","rule":"Consul Agent","path":"_index_path_","reason":"响应体中包含 Consul Agent 字符串"}]```- 给出的 CPE 需要是 National Vulnerability Database 中明确已有的,否则,需要在另外单独的字段中给出提示;- 匹配规则必须是可以直接被代码使用的格式,比如正则表达式等;- 原因需要用中文简体进行展示;- 必须记住回复内容必须是合法的json格式,在做出回复前,请调整格式为能被json正常解析的内容,不能出现字符串中引号未转义的问题;
通过随机收集的50条真实 Web 响应数据在 Doubao 多个版本的模型上进行对比测试,当时发现 Doubao-pro-32k 的效果最佳(随着基座模型更新发文时已切换至更优的 Doubao-1.5-pro-32k)。然而测试过程中也暴露出一些问题,如模型幻觉(胡编乱造指纹)、不能理解指令(不对结果列表去重)等,此时识别准召率均低于70%。
2. Few-shot
为进一步提升 Web 应用指纹识别准确性,我们在 Prompt 中增加了 few-shot,即添加了几个正确示例和错误示例,示例中包括人工添加的解释信息,让 LLM 通过少量示例理解要推理的过程和结果。这一改进使 LLM 应用在 Doubao-pro-32k 达到了可用的状态,在测试数据集上取得了较好的效果,准召率均超过 80%。增加的 few-shot:
few-shot示例
此时模型能够根据响应头中包含 “Server: Bytedance NSS” 字符串推理出 “cpe:2.3:a:bytedance:nss” 这种 CPE,展现出了它拥有了一定的智能推理能力。它利用 Server 这个响应头判断出这是某种类似于 NGINX 的服务器,并且 Bytedance 是个全球知名科技公司,NSS 可能是该公司开发的一种特殊服务器(备注:NSS 是字节跳动视频架构 LiveNet 团队基于 Go 语言研发的一款高性能流媒体服务器)。
但整体上,仍然存在准确率不高、模型幻觉严重、没有对结果去重、添加 few-shot 后 Prompt 过长消耗大量 tokens 等问题,在 Prompt Engineering 上已经遇到了瓶颈。
3. Supervised Fine Tuning
为了突破这一瓶颈,我们通过进一步调研和交流学习,了解到 RAG 和 SFT 两种方案可以提升 LLM 在特定场景下的表现。
RAG(Retrieval-Augmented Generation)检索增强生成,即大模型 LLM 在回答问题或生成文本时,会先从大量的文档中检索出相关信息,然后基于这些检索出的信息进行回答或生成文本,从而可以提高回答的质量,而不是任由 LLM 来发挥。RAG 主要解决长尾知识、数据安全、数据时效性、来源可信和可解释等问题。
SFT(Supervised Fine Tuning)监督微调是指在一个预训练的神经网络模型基础上,利用带有标签的新数据对其进行微调以提高其性能的过程。SFT 主要解决 Prompt Engineering 无法解决问题、Prompt 中描述过于复杂、大模型输出结果格式错误等问题。
我们的应用场景是想让 LLM 利用公开知识加上它的推理能力去完成应用指纹识别,这些数据都是在互联网公开的,所以 RAG 方案并不适用。采用 SFT 可以解决前述的 Prompt 过长、输出格式错误、模型幻觉等问题。
SFT 过程:
首先,使用数据回流功能收集 LLM 识别的输入输出数据。然后,人工选择标注收集的指纹数据并校准结果,得到一个 50 条优质数据做成的微调训练数据集,并将其上传到火山引擎方舟平台。接着,选择 Doubao-pro-32k 作为基础模型进行 SFT 微调,从当前训练集中随机分割 20% 作为验证集,训练 epoch 设置为 20。训练效果表明,识别结果有明显的收敛趋势,微调后的模型效果优于直接使用基础模型,此次微调成本约为 80 元。
将该次微调的模型接入到系统中,去除掉 Prompt 中的 few-shot,并使用数据回流任务继续收集数据。通过人工判断,发现此时基本已经解决结果列表内重复问题,识别准确率也有明显提升。但是仍有
cpe:2:not_found:no_app
或cpe:2.3:a:unknown:unknown
这种不该出现的CPE。为了进一步优化模型,我们继续人工选择标注数据并校准结果,得到一个 120 条优质数据的微调训练数据集,并从当前训练集随机分割 10% 作为验证集,训练 epoch 设置为 30,再次微调模型。训练结果显示,在 epoch 超过 20 后,结果基本稳定,说明已达到使用 120 条数据微调的极限,此次微调成本约为 300 元。
2.3 工程优化
鉴于需扫描的资产规模极为庞大,若调用大语言模型(LLM)对所有 Web 响应数据进行指纹识别,成本过高。基于成本考虑,我们采取了一系列工程优化措施。例如,在调用 LLM 之前,进行信息去重和采样工作:
针对常见的、经确认无任何特征的 404/403 响应数据,通过字符串匹配予以直接过滤,使其不进入 LLM 识别流程。
HTTP/1.1 404 Not FoundrnContent-Type: text/plainrnDate: Fri, 01 Nov 2024 02:32:08 GMTrnContent-Length: 18rnrn404 page not found
针对常见的确认有指纹的响应数据,已多次对其进行识别,且每次均给出正确结果并经过人工确认,后续无需再次通过 LLM 进行识别,可直接返回识别结果。采用 simhash 算法进行去重,例如:
响应去重示例 { "content": "HTTP/1.1 403 ForbiddenrnServer: nginxrnDate: Wed, 13 Nov 2024 03:28:14 GMTrnContent-Type: text/htmlrnContent-Length: 571rnConnection: keep-alivernserver-timing: cdn-cache;desc=HIT,edge;dur=0rnx-tt-trace-tag: id=09;cdn-cache=hit;type=staticrnx-response-cinfo: 1.2.3.4rnx-response-cache: missrnAccess-Control-Allow-Credentials: truernAccess-Control-Allow-Headers: rangernAccess-Control-Allow-Methods: GET,HEAD,POST,OPTIONSrnAccess-Control-Allow-Origin: *rnTiming-Allow-Origin: *rnAccess-Control-Max-Age: 3600rnrn<html>rn<head><title>403 Forbidden</title></head>rn<body>rn<center><h1>403 Forbidden</h1></center>rn<hr><center></center>rn<hr><center>nginx</center>rn</body>rn</html>rn<!-- a padding to disable MSIE and Chrome friendly error page -->rn<!-- a padding to disable MSIE and Chrome friendly error page -->rn<!-- a padding to disable MSIE and Chrome friendly error page -->rn<!-- a padding to disable MSIE and Chrome friendly error page -->rn<!-- a padding to disable MSIE and Chrome friendly error page -->rn<!-- a padding to disable MSIE and Chrome friendly error page -->rn", "result": [ { "cpe": "cpe:2.3:a:nginx:nginx", "rule": "Server: nginx", "path": "_index_path_", "reason": "响应头中包含 Server: nginx 字符串" } ], "diff": 3}
对所有类型的公网 Web 响应数据的 1‰ 以及全部 HTML 类响应体进行采样,以用于 LLM 识别。
通过整合 Web 应用响应数据、 LLM 精准识别出的 CPE 信息与指纹规则,我们构建了离线数据集与可视化看板。其在投入使用后,为安全能力建设与应急响应带来显著效能提升:
1. 规则拓展效率大幅提升:依托 LLM 的强大识别能力,指纹库更新显著提效,规则周新增量从数十条跃升至数百条,效率提升超 15 倍。
2. “被动变主动”的风险识别模式革新:此过程中,黑盒平均每月能够主动挖掘出10+种新类型未授权访问漏洞。过往这些漏洞只能在蓝军演练、白帽子报告或黑客攻击事件发生后,通过复盘追溯才能知晓。如今借助新体系,成功实现从被动应对到主动识别,将风险发现关口大幅前移,有效降低潜在安全威胁。
上述方案还在迭代中,需要持续投入更多的资源去完善优化,后续我们计划围绕降低成本、自动化建设及智能应用探索三大方向展开:
1. 降低成本:现有的 simhash 去重算法在捕捉语义特征方面存在不足,我们打算构建一个由 Doubao embedding 和 VikingDB 向量数据库组成的混合去重方案。这个方案会用高维语义向量来表示响应体的特征,提高数据去重的准确率,最终降低大模型的调用成本。
2. 自动化建设:逐步实现指纹自动生成-验证-同步流水线,即 LLM 生成结构化指纹数据后直接自主调用校验模块,校验通过后实时同步至指纹库,目标是将人工介入环节减少 80%,规则库更新时效从 T+24h 缩短至 T+1h。
3. 智能应用探索:我们将探索通过构建 “指纹-CVE-漏洞检测规则” 知识图谱,实现指纹与 CVE 漏洞的实时关联匹配,能够自动化生成漏洞检测规则,针对性进行漏洞检测评估。
后续,无恒实验室将持续输出 LLM 技术在漏洞检测领域的实践和探索,欢迎大家通过公众号后台留言或线下与我们讨论交流。
无恒实验室是由字节跳动顶尖安全专家组成的专业攻防研究团队,为字节跳动全系产品与业务安全保驾护航。通过漏洞挖掘、攻防实战、黑产打击、高效应急等核心能力,系统性提升公司基础安全与业务安全防护水平,最大限度降低安全事件对业务及公司的潜在影响。
同时,无恒实验室致力于构建开放协作的网络安全生态,持续向业界输出研究成果,协助行业降低安全风险,并积极寻求与行业伙伴的合作创新,共同为网络安全生态建设贡献力量。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...