草庐IT

火出圈的ChatGPT,如何让安全检测更智能

olga5abl 2023-11-27 原文

ChatGPT是什么

ChatGPT(Chat Generative Pre-trained Transformer)是一款美国OpenAI研发的聊天机器人程序,能够通过理解和学习人类语言来进行对话,根据聊天的上下文与使用者互动,真正像人类一样聊天交流。它甚至能完成撰写邮件、视频脚本、文案、代码、论文等任务。

ChatGPT的算法基于Transformer架构,这是一种使用自注意力机制处理输入数据的深度神经网络。Transformer架构广泛应用于语言翻译、文本摘要、问答等自然语言处理任务。ChatGPT使用了GPT-3.5大规模语言模型(LLM Large Language Model),并在该模型的基础上,引入强化学习来微调预训练的语言模型。这里的强化学习采用的是RLHF(Reinforcement Learning from Human Feedback),即人工标注方式。目的是通过其奖励惩罚机制,让LLM模型学会理解各种自然语言处理任务,并学会从helpfulness、honest、harmless三个维度判断什么样的答案是优质的。

ChatGPT模型的主要训练流程如下:

1、首先利用一系列问答对模型进行监督训练(也叫监督指令微调)。

2、利用强化学习对模型进一步指令微调,即模型在给定环境中,不断根据环境的奖励和惩罚,拟合到一个最适应环境的状态。具体来说,就是在人类的参与下训练一个奖赏网络,这个奖赏网络具有对多个聊天回复进行好坏排序的能力。

3、利用这个奖赏网络,进一步通过强化学习不断优化模型。

安全检测怎么做

在安全检测领域,越来越多的企业组织开始使用人工智能技术,来帮助检测网络流量中的潜在威胁。人工智能的优势在于,它可以处理大量的数据,快速准确地识别并分类异常流量。通过训练神经网络模型,人工智能可以自动化检测识别网络攻击、漏洞利用和恶意软件等行为,减少人工干预和误报,提高检测的准确性与效率。

当前主流的网络攻击检测,核心是基于DPI技术,发展出的针对HTTP访问的检测(WAF),以及针对操作系统的入侵防御检测(IPS)。即部署在应用前,在用户请求到达服务端之前对其进行扫描和过滤,分析校验每个用户请求的网络包,确保每个请求的安全有效,对无效或有攻击行为的请求进行拦截或隔离。目前,常用的攻击检测方式如下:

1、签名检测技术。基于事先编写的特定规则或模式(正则表达式)检测网络流量中的威胁,如病毒、恶意软件、入侵行为等。但是由于攻击手段多样化,有经验的黑客可以通过一些语句变化绕过检测。正则表达式是由关键字发展而来的,虽然在一定程度上降低了误报率,但由于正则表达式是基于字符串的过滤,只能检测预定好的攻击行为;针对一些比较复杂的注入方法,同样存在漏报率高的问题。

2、流量分析技术。通过对同类流量的来源IP、协议类型比例、流量上下行趋势等基础元素的建模分析,得到一些异常事件的分析结论。但是流量分析需要对网络流量进行捕获分析,所以需要较高的计算资源和存储资源,会使得整个系统比较庞大。

3、行为分析技术。通过监视网络流量的行为,检测出异常活动。例如,检测出某Web应用服务器访问非业务数据库、突发大量数据流、频繁访问尝试等,进而发现潜在的网络威胁。在这一过程中,会误报一些合法活动(例如临时下载等),且成熟的行为分析模型需要较长时间来训练和学习,因此防护效率可能较低。

4、基于语义的规则匹配。将检测引擎设计成SQL语义解释器或命令行终端,尝试理解用户输入的内容,判断是否有可能构成攻击。目前主要针对SQL注入,使用场景有限。

基于DPI引擎的检测方式,除了有这些使用限制外,还存在多种绕过流量解析引擎进行入侵的方法。例如,利用DPI引擎可能存在的HTTP协议解析缺陷,只识别80端口为HTTP流量,而Web应用端口在8080上,其HTTP流量会被DPI引擎解析为非HTTP,从而绕过应用层攻击检测。

哪些环节可以应用ChatGTP

我们按照DPI引擎的解包流程,将原始流量解析出关键字段数据,进行规则匹配。如果能匹配到规则,则说明报文存在攻击行为;如果不能匹配,则说明报文风险较低。DPI引擎收到的流量如下图:

DPI引擎会按照会话对流量进行分组,在同一个组中的报文,一般为同一五元组的请求响应报文:

DPI引擎会将流量按照协议层级进行拆解,直到解析出所有的字段。

DPI引擎会提取其中应用层的明文请求,作为待检测内容:

ChatGPT作为一种大型自然语言处理模型,可以理解HTTP原始报文信息,这样无论攻击出现在URL、Cookies还是Referer中,都能顺利检测到。

ChatGPT流量检测实践

ChatGPT、New Bing等攻击判断模块,会调用OpenAI相关API接口,使用提问的方式让ChatGPT、New Bing等进行攻击判断,示意代码如下:

import openai
openai.api_key = "sk-Bew1dsFo3YXoY2***********81AkBHmY48ijxu"	# api token 用来认证
def get_answer(prompt, max_tokens): # 定义一个获取答案的函数
    try:
        response = openai.Completion.create(
            model = "text-davinci-003",     # 模型名称
            prompt = prompt,                # 问题
            temperature = 0.7,              
            max_tokens = max_tokens,        # 返回内容的长度限制
            stream = False,                 # False就是一次性返回, True 就是一个个打出来像打字机, 返回的是迭代器, 需要后面代码处理. 此处没有处理 所以用False
            top_p = 1,                     
            frequency_penalty = 0,          
            presence_penalty = 0           
        )
        return 0, response['choices'][0]['text'].strip()    # 获取返回值关键返回内容
    except Exception as e:                  # 异常处理
        return str(e), None

通过上述函数,就可以达到类似向ChatGPT提问的效果(使用模型为text-davinci-003),如下图:

ChatGPT会返回明确的是否存在攻击行为的结论以及行为描述,这样就完成了一次攻击判断。

如上图,可以将流量中大量需要判断的请求,分别存入不同的文件,由ChatGPT进行攻击判读,示例代码如下:

def main(read_dir = 'detect'):	# 定义main函数
    args = []					# 缓存列表
    global sign_req, all_req	# 识别计数
    for rf in walk_dir(read_dir, ['.txt']):		# 遍历待检测目录
        all_req += 1							# 总数据包数自增1
        content = read_fileA(rf, 'str')[:2048]	# 提取报文文件前2048个字符
        key_content = content.split('\r\n\r\n\r\n')[0][:1024]	# 提取http请求
        if len(key_content) < 10: continue						# 如果长度太小就不检测
        err, sign, disc = judge_attack(key_content, rf_rst)	# 调用ChatGPT接口进行攻击检测
        if sign: sign_req += 1								# 如果检测到攻击, 攻击计数自增1

        print('\r' + f' 已检测 {all_req: 4} 个报文, 识别到攻击 {sign_req} 个, 检出率: {sign_req/all_req:0.2%}', end='', flush=True) # 打印结论

如此就可以做到批量报文攻击检测。

攻击样本来自Nuclei对靶机的扫描和全PoC检测,因为有一些请求从单个报文中确实看不出来是否存在威胁。

上述情况可能需要更多上下文才能判断,此次已去除此类无法准确判断的请求例,尽量给一些人工条件下能够准确判断的样例,总体检测结果如下图:

可见ChatGPT对流量检测的准确率是非常高的,基本上相当于一个安全专家进行快速判断,其安全检测能力值得期待。

有兴趣的读者可以查看完整的项目源码,链接为:https://github.com/VitoYane/PcapSplit

未来展望

未来,ChatGPT在网络安全中将扮演什么角色、有什么影响,我们很难进行准确预测,这取决于它的使用方式和使用意图。来自人工智能的威胁并不是一个新问题,对网络安全从业者来说,重要的是及时意识到ChatGPT的潜在风险并采取适当的措施来应对。

安全专家预测,国家背景的黑客将率先在网络攻击中利用ChatGPT,而该技术最终会在更多的攻击组织中得到大规模的使用,防守方需要开始研发能够抵御此类攻击的系统。

从网络安全防护的角度来看,企业机构可以采取针对性的应对措施,对ChatGPT等类似模型进行培训,标记恶意活动和恶意代码,同时对其设置难以绕过的护栏。对于ChatGPT引发的威胁,可以向员工提供新型的网络意识培训,掌握识别社会工程攻击的知识,以便识别ChatGPT等人工智能工具创造的钓鱼攻击。

当然仅仅是这样还不够。ChatGPT等人工智能工具会以比人类罪犯更快的速度制造出新的威胁,传播威胁的速度也将超过网络安全人员的反应速度。企业机构跟上这一变化速度的唯一方法,是使用人工智能来应对人工智能。

总的来说:一方面,网络安全行业的研究人员、从业者、学术机构和企业组织可以利用ChatGPT的力量进行创新和协作,包括漏洞发现、事件响应和钓鱼检测;另一方面,随着ChatGPT等工具的发展,未来开发新的网络安全工具更加重要。安全厂商应更积极地开发和部署基于行为(而非规则)的AI安全工具,来检测人工智能生成的攻击。

有关火出圈的ChatGPT,如何让安全检测更智能的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐