阅读笔记——《AFLNeTrans:状态间关系感知的网络协议模糊测试》

  • 【参考文献】洪玄泉,贾鹏,刘嘉勇.AFLNeTrans:状态间关系感知的网络协议模糊测试[J].信息网络安全,2024,24(01):121-132.
  • 【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。

目录

摘要

1、引言

2、背景及动机

2.1、网络协议实现程序的模糊测试

2.2、现有问题分析

3、设计与实现

3.1、方法概述

3.2、状态间关系反馈设计

3.3、状态选择算法

3.4、模糊测试循环

4、实验设计与评估

4.1、实验设计

4.2、状态转移数量

4.3、代码覆盖率

4.4、Crash发现


摘要

  • 网络协议模糊测试通常指对网络协议实现程序进行模糊测试,然而传统模糊测试在此类程序的测试上仍存在一些问题。
    • 首先,由于网络协议实现程序中不同状态对应不同代码,传统灰盒模糊测试中使用的代码覆盖不能表示网络协议实现程序的内部状态。
    • 其次现有灰盒协议模糊器中的状态引导机制依赖于代码覆盖率,不能很好地挖掘网络协议实现程序的状态间关系。
  • 对此,文章提出了一种由协议状态间关系和程序代码覆盖率共同引导模糊测试过程从而提升模糊测试效果的模糊器 AFLNeTrans,其利用状态间关系作为主要引导机制,引导模糊测试快速探索协议实现程序更多的状态空间,并在 Profizzbench 上对其进行了评估实验。
  • 实验结果表明,AFLNeTrans 在发现状态转移数量上有较明显的提升,并且在代码覆盖率和unique_crash 数量上相比现有工具也有提升。

1、引言

  • AFL/AFL++、LibFuzzer、HonggFuzz等模糊器已在开源软件和一些商业软件中发现了数千个漏洞。 传统灰盒模糊工具通常依赖代码覆盖率来指导整个模糊测试。
  • 网络协议实现程序无法直接从文件中读取测试用例,需要从网络中接收客户端请求来调用相应 的回调函数。同时,网络协议实现程序内具有大量的状态空间,与客户端交互的过程中会实时更新自身内部状态。传统模糊测试工具使用的代码覆盖率无法直接反映协议程序内部状态。
  • 对网络协议实现程序进行模糊测试时,模糊器通常需要充当客户端,网络协议实现程序运行在待测服务器上。模糊器通过特定的端口与网络协议实现程序进行交互,客户端生成并发送数据包,同时接收来自待测服务器的响应包。待测服务器接收来自客户端的数据包,处理请求后更新内部状态,并将处理结果返回客户端。
  • 目前针对网络服务器的模糊测试主要有两种方法。
    • 第一种是黑盒协议模糊测试,这种方法速度较快,代表性工作有Peach和Boofuzz。主流方法是使用定制模板生成测试数据包并发送到指定待测端口处,根据服务器响应时间等侧信道信息,来识别软件程序中是否存在的安全隐患。但协议原语的编写需要大量的专家经验和人力介入,并且黑盒模糊测试不能获取服务器内部反馈信息来提高生成测试用例的质量, 存在较大的随机性,会浪费很多时间在无效的测试用例上。
    • 第二种是灰盒协议模糊测试。一些研究人员将灰盒模糊测试技术移植到网络上。灰盒模糊器AFLNET将传统模糊测试中的文件型测试用例拆分成消息链,使用消息级别的变异方法对数据包进行变异,并通过网络通信的方式发送。AFLNET通过分析网络服务器响应包内容来提取服务器内部状态,从而实现对某个特定状态进行模糊测试,同时可以获取待测服务器的代码覆盖率,提高测试用例的有效性。
  • 现有的协议灰盒模糊工具不能高效地探索网络协议服务器状态空间。主要的挑战有两个方面:
    • 状态引导不够全面, 当下较流行的灰盒模糊器仍使用代码覆盖率来引导模糊测试进化方向,首先在每轮测试之前选取感兴趣的状态,然后选择可以到达此状态的种子对目标进行测试,最后基于服务器反馈的状态序列来更新内部信息。 只有发现了新的代码覆盖率,模糊器才会用状态序列更新状态机,这在本质上忽略了各状态之间的潜在转移关系。
    • 在网络协议实现程序中,很多深层次代码的触发往往需要特定的前置状态,直接使用代码覆盖率更新状态机,可能导致模糊器忽略掉某些状态的转换关系,而漏洞和错误可能存在于这些转移中。
  • 本文在AFLNET的基础上提出了一种可感知协议状态间关系的灰盒协议模糊测试工具AFLNeTrans。针对AFLNET状态引导不够全面的问题,本文的AFLNeTrans在模糊测试过程中不仅记录每次测试得到的服务器状态序列,还能学习状态序列内状态之间的转移信息。在后续迭代过程中,这些状态转移信息将会在状态选择、 种子保留和能量调度3个方面引导模糊测试的方向。
    • 在状态选择阶段,为了解决每个状态测试的充分性问题, 本文将状态的选择构建为多臂老虎机问题,并使用Epsilon-Greedy算法结合状态转移信息的方案来解决。
    • 在种子保留阶段,那些被触发新状态覆盖的种子也会加入到种子队列中,继续参与后续模糊测试流程。
    • 在能量调度阶段,可以触发更多唯一状态转移的种子将会被分配更多的能量,能得到更多的变异机会。
  • 本文所作贡献如下。
    • 全面分析了当前最流行的协议灰盒模糊器AFLNET,并指出其设计缺陷以及影响模糊测试效率的原因。
    • 在代码覆盖率引导基础上,提出了一种状态覆盖率引导机制,定义了一个状态转移位图。该位图会在种子保留阶段与代码覆盖率位图一起决定种子去留, 在能量调度阶段更加合理地分配种子能量。
    • 在状态选择阶段,提出了状态激励的多臂老虎机算法方案,能够提升选择状态的效果。并在能量调度阶段考虑了状态转移的唯一性来对种子进行优先级控制。
    • 实现了一种基于状态间关系进行引导的灰盒协议模糊测试工具AFLNeTrans,并通过实验验证了其有效性,在转移数量、代码覆盖率、unique_crash数量上都要优于基准协议模糊器。

2、背景及动机

2.1、网络协议实现程序的模糊测试

  • 网络服务器的模糊测试一般以黑盒测试为主。黑盒模糊测试的有效性很大程度上由开发人员对协议的理解和编写模板的质量决定。此外,黑盒模糊测试无法获取程序内部的运行时信息,如代码覆盖和数据流信息等,不会保留那些可以发现协议模型未知状态的种子来提高生成消息的质量。
  • 近年来,许多研究员致力将灰盒模糊测试运用到网络协议服务器上。AFLNET将测试用例按照一定的规则拆分成消息序列,通过Socket的方式依次传输到待测服务器,同时收集并按照规格分析从服务器返回的响应包, 提取服务器的状态码来组成状态序列,然后根据每次测试的状态序列构建状态机,结合代码覆盖的信息来引导模糊测试的进化方向。AFLNET首先在每轮迭代时从状态集合中选出待测目标状态,然后从测试队列中选出可以到达目标状态的种子文件,按协议预定义将该种子的消息序列分为M1、M2、M3三部分,其中 M1用于到达目标状态;M2则用于变异产生新的数据包来测试目标状态;M3表示剩下的消息序列,用于结束本次交互。其次,对M2变异后,与M1和M3重组成新的测试用例发送到待测服务器。最后根据网络数据包的特性,AFLNET在AFL原有HAVOC变异的基础上增加了消息序列级别的变异策略,一定程度上提高了变异有效性。

2.2、现有问题分析

  • 现有的针对网络协议服务器的灰盒模糊器在状态引导层面只考虑到了状态表面的情况,而忽略了状态之间的潜在关系,本质上还是将代码覆盖率作为反馈来引导模糊测试。本文分析了AFLNET源代码实现,发现他现有的状态机粒度过于粗糙,导致其引导机制不完善,在提高测试充分性和发现有状态的缺陷等方面还有待完善。
    • 状态序列信息处理不恰当
      • AFLNET在每次迭代结束后,会对服务器反馈的状态序列进行哈希流运算,将得到的哈希值与状态机中已存在的序列哈希值比较。若该值不存在,则表示发现了一个新的状态序列,将其添加到状态机中并更新相关状态信息。这样做忽略了状态冗余的问题。
      • 如图1所示,由于这两个序列中的转移关系等价,可以认为这两个状态序列是等价的,但是第二个序列中多出了两个冗余的状态S1和S2。AFLNET使用流哈希算法来判断是否产生新序列,得到的结论是两个状态序列不相同,即仍然认为第二个序列是一个感兴趣的序列并将其加人到状态机中,同时也将此种子文件保存到种子队列中。正是由于没有考虑到状态之间转换的关系,才导致模糊器重复保存了一些冗余的种子。冗余种子中往往包含几个状态间的多次交替,若选取到这类种子不仅会使模糊测试速率降低,还会导致这些状态的权重降低,得不到充分的测试。
    • 状态引导过多依赖代码覆盖率
      • AFLNET使用状态机进行引导的核心是根据模糊测试过程中已保存的状态信息,采用一种粗粒度的进化算法来选择待测目标状态。该算法会优先选取那些可以发现新代码覆盖的状态对应的代码,这种做法在一定程度上过多的依赖代码覆盖,可能会忽略状态间的潜在关系。
      • 在种子保留阶段AFLNET同样也只会保留那些触发新代码覆盖的测试用例。虽然那些能够触发新的状态转移的种子不一定能够触发新的代码覆盖,如这两个状态对应的代码在先前都被触发过,但是不同状态对应的代码会改变一些全局变量,从而更有可能触发状态关系间的潜在错误。AFLNET没有考虑到这一层关系,这类测试用例会被直接丢弃,并且在状态选择阶段也完全依赖代码覆盖率。
    • 传统能量调度不适用于网络协议
      • 在种子能量调度方面,AFLNET沿用了传统AFL的方法,即执行速度快并且体积小的种子会被分配更多的能量,能量多的种子在测试中会经历更多轮变异并投喂给待测目标。在传统文件解析型模糊测试中,往往追求速度快且体积小的测试用例,这样能更快地覆盖到大多数解析代码。但这个思路在网络协议模糊测试中并不适用,由于网络协议实现程序的特殊性,深层次的代码只有当一定数量的数据包发送之后才能被新的数据包覆盖,这需要更长更合理的种子。传统的能量调度不能满足这一需求,会在一些触发浅层次代码的种子上浪费很多测试时间。

3、设计与实现

3.1、方法概述

  • AFLNeTrans是基于灰盒协议模糊器AFLNET提出的,在状态模型构建、状态选择、种子保留和能量调度4方面进行修改以提升性能。该工具架构如图2所示。
  • 该方案在构建状态模型时引入了状态间关系的概念,为每个状态进行建模,并使用一个状态转换移位图来记录状态间整体的转移情况。代码覆盖率位图和状态转移位图中的信息用于判断种子是否对代码覆盖率或者状态转移覆盖率有贡献,AFLNeTrans将保留有贡献的种子以探索深层次的代码空间。同时,方案优化了状态选择和种子选择,优先选择那些有较少转移的状态,以快速探索程序内部状态关系,并优先选择冗余程度低的种子。在能量调度方面,对有更多 唯一状态转移数的种子分配更多的能量,让这些种子得到更多的变异机会。

3.2、状态间关系反馈设计

  • 本文设计了一套轻量高效的方案来记录网络协议服务器模糊测试过程中的状态信息,将状态转移反馈作为后续种子保留、状态选择和能量调度3个改进方面的重要反馈指标。
  • 图3用一个状态序列的例子讲述了记录状态转移信息的过程。
    • 首先,本文沿用AFLNET的状态表示方法,即收集从服务器返回的状态码来表示服务器内部状态,这种状态码由协议规范中定义来表示各种处理的结果。通常情况下状态序列对应一组从0开始的一串整数,其中0默认为初始状态,其余为本次测试用例能够触发的一系列状态。本文提出的状态转移思路受传统模糊测试的边覆盖反馈的思想启发,即将CFG中代码的执行路径抽象成基本块间的转移,以记录代码覆盖率。
    • 如图3 a)所示,将从服务器收集到的状态序列① [S0, S1, S2, S1, S3]中所有状态间的转移情况T0, T1, T2, T3分别对应S0->S1, S1-> S2, S2->S1和 S1->S3,并映射到状态转移位图中,位图中每一位表示某个转移情况。同理,状态序列②中的状态转移T0, T1, T4, T5分别对应S0->S1, S1->S2, S2->S2, S2->S3,以相同的方式映射到状态位图中。状态转移位图中颜色深浅表示该转移在模糊测试过程中的命中次数。
    • 同时对每个状态关系进行记录,如图3 b)所示,使用一个全局结构体来维护每个状态的可达转移信息,用于模糊测试后续阶段。
  • 在实际实现的过程中,本文发现直接参考AFL代码覆盖率的计算方式来计算状态转移位图会导致大量的碰撞, 原因是服务器响应状态码数值往往比较集中。为了解决这个问题,算法设计了CalulateTransCOV函数,并通过测试验证了在一些通用的协议状态响应码中能完美区分每个状态转移关系在转移位图(trans_bits)中的位置,确保不会发生碰撞。

3.3、状态选择算法

  • 现有算法仅考虑了状态的覆盖率和活跃度,而忽略了其他重要的因素,如状态间的转移关系。此外,AFLNET的状态选择算法在探索与利用状态信息之间的权衡方面缺乏状态间关系的指导,会导致测试结果不充分。
  • 本文提出一种对状态间关系敏感的方案来合理选择待测目标状态。具体来说,将所有状态建模为多臂老虎机的优化问题,让模糊器在状态选择阶段根据状态的激励来动态地选择目标状态,以最大化探索待测服务器内部状态空间。
  • 本文设计了一个状态激励老虎机,将每个臂建模为当前状态在模糊测试中所探索到的可达下一状态的数量,可以理解为状态转移的数量。模糊器在选到这个臂(状态)并完成本轮模糊测试后,更新每个臂(状态)的激励来为后续测试提供更好的反馈。
  • 在考虑性能开销的前提下,本文方案采用比较经济的 Epsilon-Greedy 算法来解决建模的多臂老虎机问题。该算法原理是以ϵ概率随机选择一个臂进行操作,或者以概率为1− ϵ选择激励最高的臂进行操作,之后根据操作结果更新激励。该算法有效性已经在很多工作中得到验证。每个臂的激励定义如公式(1)所示。
    • 从中可以注意到,探索更多代码路径并且有更少状态转移的状态会被赋予更多的激励,但随着被选择次数和被触发的次数上升或者该状态转移数量接近设定的阈值,奖励会逐渐降低,可以避免一些状态出现饥饿的情况。
  • 在选定状态后,模糊器会选择可以达到该状态的种子,出于性能考虑,在种子选择阶段优先选择冗余程度低的种子。本文使用总的状态转移数量和唯一状态转移数量比值来定义当前状态的冗余程度,如公式(2)所示。比值高表示该种子唯一状态数在状态序列中数量少,重复的转移较多,这类种子被定义为冗余程度高 ;否则,认为该种子冗余程度低。算法会提高冗余程度低的种子在目标状态对应的种子队列中的优先级,实现优先选择这些种子。

3.4、模糊测试循环

  • 基于上述提出的方法,本文改进了AFLNET的模糊测试流程。AFLNeTrans模糊测试流程如算法2所示, 本文对AFLNET的状态机构建、种子保留、状态选择、 种子选择和能量调度5个方面进行优化升级。
  • 模糊测试起始阶段,AFLNeTrans将初始种子集T发送给待测服务器(SUT)来初始化一些信息(行1), 如状态信息、代码覆盖等。之后进入循环部分,首先根据构建的状态模型从状态集合中选择待测目标状态(行3),使用目标状态选择出对应的种子文件t(行 4),根据对应的能量调度算法为种子分配能量,确定该种子的测试次数(行5)。在种子能量调度方面,AFLNET在网络协议服务器测试中需要合理的长序列种子才能探索到服务器深层次的代码。本文对现有的能量调度方案进行优化,加入状态间关系指标,为拥有更多唯一状态转移数的种子分配更多的能量,使其能够获得更多的变异机会来更好地探索程序的状态空间。具体实现是,AFLNeTrans记录每个种子的状态转移数量,并维护一个全局变量来记录其平均值,若选择到的种子文件的状态转移数量大于该平均值则为其分配更多的能量 ;否则,分配较少能量。
  • 选定种子之后,模糊器将种子拆分为M1, M2, M3, 使用变异器对M2变异后得到M2',重组得到测试用例 t',并将其发送到待测服务器执行(行10)。随后利用反馈的状态序列来计算状态间转移关系覆盖。若新的测试用例导致服务器进程崩溃或者触发了sanitizers的警告,模糊器会记录对应的测试用例用作错误复现(行 12、13)。若没有触发崩溃或警告,则模糊器会根据服 务器的反馈的信息来判断测试用例t'是否为感兴趣的种子,判断是否保留该种子至种子队列并更新状态模 型(行14 ~16)。原始AFLNET的种子保留策略是将能够触发了新的代码覆盖的种子作为是感兴趣的种子, 添加到种子队列中。FLNeTrans的种子保留策略结合了状态转移覆盖的概念,将触发新的状态转移的种子也认为是感兴趣的种子,也加入到种子队列中。但是该操作可能会导致过多的种子加入种子队列中,本文提高状态冗余程度低的种子在队列中的优先级,以在模糊测试实际运行中能更快地选择到这些种子,保证测试效率。重复上述过程直到超时或者用户自行终止(行18)。

4、实验设计与评估

  • 为验证AFLNeTrans其有效性,本文从以下3个方面进行实验:
    • AFLNeTrans是否能有效发现状态转移。
    • AFLNeTrans测试结果的代码覆盖率。
    • AFLNeTrans发现漏洞的能力。

4.1、实验设计

  • 本文的实验方案基于Profuzzbench ,这是一款公开的网络协议模糊测试的基准,从中选取了11款有状态的网络协议服务器进行实验,它们分别是LightFTP、 Live555(RTSP)、Kamailio(SIP)、TinyDTLS (DTLS)、BFTPD(FTP)、Pure-Ftpd(FTP)、 OpenSSH(SSH)、Forked-Daapd(DAAP)、Dcmtk (DICOM)、Exim(SMTP) 和 Dnsmasq(DNS),具体如表1所示。这些服务器软件都被广泛用于现实场景,因此可以认为这些服务器的测试结果是有代表性的。为了使这些服务器能适用于模糊测试,本文对这些待测服务器进行了必要的修改和打补丁。
  • 本文使用目前较常用的3款协议模糊器AFLNET、 AFLNWE和StateAFL在这11款软件上与AFLNeTrans进行实验对比评估。
  • 每个实验的运行时间都设置为 24 h,并且重复4次来消除随机性。每个实验都在独立的Docker容器内运行,互不干扰。

4.2、状态转移数量

  • AFLNeTrans使用状态转移作为引导机制来引导模糊测试发现更多的状态空间。针对研究问题1),以AFLNET为代表的灰盒协议模糊器,使用粗粒度的状态序列来引导。为了能够验证AFLNeTrans的发现状 态空间的有效性,本文将状态转移的数量作为评估指标,使用AFLNeTrans和AFLNET分别在4款软件上进行24h的对比实验,实验结果如表2所示。从实验结果可以看出,AFLNeTrans在状态转移数量的表现上基本都要优于AFLNET,并且在Kamailio、Forked-Daapd、 Exim和Dnsmasq上有很大的提升。

4.3、代码覆盖率

  • 本文针对相比于之前的灰盒网络协议模糊器,AFLNeTrans测试结果的代码覆盖率如何这一问题,使用map_density作为评估指标,map_density是代码覆盖率的体现,其表示模糊测试中命中程序边的数量占总位图大小的百分比。图4反映了AFLNeTrans、AFLNWE、AFLNET和StateAFL 在24h模糊测试内不同待测目标的map_density随着时间的增长情况,实验每隔1h进行一次取样。

4.4、Crash发现

  • 为了检测模糊测试过程中待测程序触发的内存错误,本文在编译待测程序的时候启动了Address Sanitizer (ASAN)编译选项。ASAN在编译时会插入检测内存的相关代码,在遇到匹配内存错误时会抛出信号来中止待测程序。模糊器会将此类中止也视为程序崩溃, 并存储到Crash集合中。
  • 本文将24h内各模糊器发现的unique_crash数量作为评估指标。最终得到的实验结果如表3所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日AIGC最新进展(9):定制化多主题文本到视频的生成、3D动漫角色生成、具有多种几何形状和纹理细节的3D高斯引导服装合成

Diffusion Models专栏文章汇总:入门与实战 DisenStudio: Customized Multi-subject Text-to-Video Generation with Disentangled Spatial Control 本文提出了一个名为DisenStudio的框架,用于定制化多主题文本到视频的生成。该框架旨在解决现有文本到视频生成模型在处理多主题…

C++小病毒

C小病毒&#xff08;注&#xff1a;对电脑无过大伤害&#xff09; 短短行&#xff0c;创造奇迹&#xff01; 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…

Unity射击游戏开发教程:(24)创造不同的敌人

在这篇文章中,我们将讨论添加一个可以承受多次攻击的新敌人和一些动画来使事情变得栩栩如生。敌人没有任何移动或射击行为。这将有助于增强未来敌人的力量。 我们将声明一个 int 来存储敌人可以承受的攻击数量,并将其设置为 3。

PDF24 Creator v11.12.1软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; PDF24 Creator v11.12.1是一款免费、简便实用的多功能 PDF 工具。用户可通过直观拖放界面轻松组合、编辑和处理PDF文件。功能包括合并、分割、添加、…

Java开发工具类(JDK、Hutool、Guava)

目录 Java开发常用的工具类1、JDK自带程序读取控制台输入内容&#xff08;调试程序或者学习的时候比较有用&#xff09;Arrays工具类 数组转集合Collections 集合工具类 排序Collections 集合工具类 查找Lambda表达式 操作集合 收集、转map、分组 2、Apache 的 commons-lang3 和…

一文解读:OA中会议管理功能,帮助设计师看清楚门道

会议管理是OA系统中的重要功能之一&#xff0c;它涉及到会议的组织、安排、记录和跟进等方面。本文将从以下四个方面介绍会议管理在OA系统中的功能、流程、设计注意事项和所涉界面。 一、OA中会议管理的功能 OA中常用的会议功能如下&#xff1a; 会议预约&#xff1a;OA系统提…

RedisTemplate操作Redis, 看这一篇文章就够了

文章目录 1. String 命令1.1 添加缓存1.2 设置过期时间(单独设置)1.3 获取缓存值1.4 删除key1.5 顺序递增1.6 顺序递减1.7 常用的 2. Hash命令2.1 添加缓存2.2 设置过期时间(单独设置)2.3 添加一个Map集合2.4 提取所有的小key2.5 提取所有的value值2.6 根据key提取value值2.7 获…

1812 java二手汽车销售管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 二手汽车销售管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8…

【优选算法】模拟 {经验总结;相关编程题解析}

一、经验总结 模拟题型的算法原理相对简单&#xff0c;就是依葫芦画瓢&#xff1a;题目中怎样描述&#xff0c;算法就怎样执行。考验的主要是将实际问题转换为代码的能力。 但是模拟题型并不是只能傻乎乎的按步骤编码&#xff0c;也可以先将模拟算法的流程通过举例或绘图演示…

Excel插入多行VBA实现

我们还可以利用 VBA&#xff08;Visual Basic for Applications&#xff09;宏语言&#xff0c;在 Excel 中写一个 VBA 宏来自动插入多行数据。这种方法可以方便我们自定义需要插入的行数和插入位置。下面是编写 VBA 宏的步骤&#xff1a; 1、按下Alt F11快捷键&#xff0c;打…

VS QT 里头文件的<>和““的区别

今天在跑项目的时候遇到这么个问题&#xff0c;在添加api宏定义的时候&#xff0c;不加显示无法识别的外部错误&#xff0c;加了显示找不到文件。反正就是怎么都是错的&#xff0c;但是我检查了CmakeLists、模块所在文件夹、项目路径都是没有问题的。非常奇怪。 然后就开始尝试…

linux安装KubeSphere

linux安装KubeSphere 介绍 KubeSphere 是在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器平台&#xff0c;提供简单易用的操作界面以及向导式操作方式&#xff0c;在降低用户使用容器调度平台学习成本的同时&#xff0c;极大减轻开发、测试、运维的日常…

通联支付API集成(适用于SpringBoot)

目标&#xff1a; 学习如何使用Java与通联支付API进行交互 实现一个简单的支付下单和查询订单状态的示例 所需材料&#xff1a; 通联支付API文档 官方文档https://aipboss.allinpay.com/know/devhelp/main.php?pid38#mid313 通联支付加签代码SybUtil package com.allin…

【软考中级 软件设计师】计算机网络和安全

计算机网络和安全是软件设计师&#xff08;软考中级&#xff09;考试中的重要组成部分&#xff0c;它涵盖了网络基础、网络协议、网络架构、网络安全等多个方面。以下是一些核心概念和要点&#xff0c; 计算机网络基础 OSI七层模型&#xff1a;物理层、数据链路层、网络层、传…

LLM答案抽取|xFinder:针对大型语言模型的稳健且精确的答案提取

【摘要】大型语言模型&#xff08;LLM&#xff09;的不断进步使人们越来越关注开发公平可靠的方法来评估其性能的关键问题。特别是测试集泄漏、提示格式过拟合等主观或非主观作弊现象的出现&#xff0c;给法学硕士的可靠评估带来了重大挑战。由于评估框架通常利用正则表达式 (R…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-39-highlight() 方法之追踪定位

1.简介 在之前的文章中宏哥讲解和分享了&#xff0c;为了看清自动化测试的步骤&#xff0c;通过JavaScript添加高亮颜色&#xff0c;就可以清楚的看到执行步骤了。在学习和实践Playwright的过程中&#xff0c;偶然发现了使用Playwright中的highlight()方法也突出显示Web元素。…

eNSP-集线器(hub)连接局域网

一、拓扑结构搭建 二、主机配置 pc1、pc2、pc3 三、测试 Hub相当于大家共享一条线路(类似于电线搭电)&#xff0c;线路上的所有的设备都会接收同样的信息。

路由器不能端口映射什么原因?如何设置内网映射?

近期有小伙伴发来求助信息&#xff0c;他以前开游戏服务器和别人一起玩&#xff0c;那个时候端口映射还好&#xff0c;不知道哪一天开始突然不行了&#xff0c;已经是公网了&#xff0c;光猫是桥接的状态&#xff0c;连路由器都换了&#xff0c;就是不能端口映射开服务器&#…

VAE-变分自编码器(Variational Autoencoder,VAE)

变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;是一种生成模型&#xff0c;结合了概率图模型与神经网络技术&#xff0c;广泛应用于数据生成、表示学习和数据压缩等领域。以下是对VAE的详细解释和理解&#xff1a; 基本概念 1. 自编码器&#…

基于 Milvus Cloud + LlamaIndex 实现初级 RAG

初级 RAG 初级 RAG 的定义 初级 RAG 研究范式代表了最早的方法论,在 ChatGPT 广泛采用后不久就取得了重要地位。初级 RAG 遵循传统的流程,包括索引创建(Indexing)、检索(Retrieval)和生成(Generation),常常被描绘成一个“检索—读取”框架,其工作流包括三个关键步…