AI安全初探——利用深度学习检测DNS隐蔽通道

本文介绍了利用深度学习中的卷积神经网络(CNN)对DNS隐蔽通道进行检测的方法,详细阐述了数据采集、算法流程以及通过XShell实例验证检测效果的过程,展示了初步的99.53%检测精度,强调了AI在安全领域的应用潜力和潜在的过拟合风险。
摘要由CSDN通过智能技术生成

目录

AI安全初探——利用深度学习检测DNS隐蔽通道

1、DNS 隐蔽通道简介

2、 算法前的准备工作——数据采集

3、 利用深度学习进行DNS隐蔽通道检测

4、 验证XShell的检测效果

5、 结语

1、DNS 隐蔽通道简介

DNS 通道是隐蔽通道的一种,通过将其他协议封装在DNS协议中进行数据传输。由于大部分防火墙和入侵检测设备很少会过滤DNS流量,这就给DNS作为隐蔽通道提供了条件,从而可以利用它实现诸如远程控制、文件传输等操作,DNS隐蔽通道也经常在僵尸网络和APT攻击中扮演着重要的角色。

DNS隐蔽通道可以分为直连和中继两种模式。直连也就是Client直接和指定的目标DNS Server(授权的NS 服务器)连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度快,但是限制比较多,很多场景不允许用户指定DNS Server。而中继模式的DNS通道则更为隐蔽,但同时也因为数据包到达目标DNS Server前需要经过多个DNS查询服务器,所以速度上较直连模式慢很多。中继模式的DNS通道原理如图1所示。

图1 中继模式下的DNS隐蔽通道原理

例如,前段时间著名的XShell DNS通道攻击,黑客在Xshell中植入恶意代码,通过DNS隐蔽通道外发用户敏感数据的示例如图2 所示,黑客将外发数据藏在nylalobghyhirgh.com子域名中。

图2 Xshell DNS隐蔽通道,黑客将外发数据藏在nylalobghyhirgh.com子域名中

DNS 隐蔽通道从提出到现在已经有了很多实现工具,历史比较早的有NSTX、Ozymandns,目前比较活跃的有iodine、dnscat2、dns2tcp,其他不太常见的还有DeNise、Heyoka等。不同工具的核心原理相似,但在编码、实现细节和应用场景方面存在一定的差异。

本文使用卷积神经网络(CNN)来检测DNS隐蔽通道。第一步工作是样本数据采集。

2、算法前的准备工作——数据采集

利用上述DNS隐蔽通道工具进行“黑”样本采集工作见另一篇博文《DNS隐蔽通道检测——数据收集,利用iodine进行DNS隐蔽通道样本收集》,其流程是先抓取DNS隐蔽通道工具攻击过程中的网络流量pcap包,然后利用wireshark工具将pcap包转换为机器学习算法能够识别文本文件。这是一个体力活,我收集到的业界流行的DNS 隐蔽通道工具的数据样本如图3所示。

图3 收集的DNS隐蔽通道工具示意样本

以dnscat2工具为例,其生成的一个样本见图4,可以看到DNS报文里包含了大量的较长子域名,而外发数据便藏在这些子域名中(我使用的主域名是friendsakka.xyz)。

图4 dnscat2工具生成的示意样本

至于“白”样本收集,我们使用的是某高校的校园网络流量。黑白样本收集好以后,就可以进入检测算法环节了。

3、利用深度学习进行DNS隐蔽通道检测

本文使用CNN(卷积神经网络)来检测DNS隐蔽通道,在介绍算法前,先简单介绍下CNN。

CNN(卷积神经网络)常用于图像识别并取得了极佳的效果。图5展示的是一个典型的卷积神经网络结构。该网络包含两个卷积层(convolution layer),两个池化层(pooling layer)和一个全连接层(fully connected layer)。

图5 典型的卷积神经网络结构

卷积神经网络的基本思想和我们人类大脑识别图像的机制是一致的。例如,当看到一张“喵星人”图像时,我们之所以认为它是“喵星人”,是因为我们看到它有萌萌的头、长长的尾巴、柔软光滑的皮毛等明显特征,通过组合(更高层次的抽象)这些特征,我们的大脑最终便可做出准确的判断。卷积神经网络的基本思想也是类似,核心理念包括:

  • 局部感受野 这是通过卷积层来完成的,形象地说,就是模仿你的眼睛,想想看,你在看东西的时候,目光是聚焦在一个相对较小的局部吧?比如喵星人的图像上有爪子或者萌头等明显的局部特征。而在卷积神经网络中,每个隐层节点只连接到图像的某些局部像素点上。
  • 池化:形象地说,当你看向远方,然后闭上眼睛,你仍然记得看到了些什么,但是你能完全记住你刚刚看到的每一个细节吗?答案是不能。同样,在卷积神经网络中,没有必要对原图像所有细节做处理,而是使用某种“压缩”方法,这就是池化,也就是每次将原图像卷积后,都通过一个采样的过程,来减小图像的规模。
  • 权值共享:在卷积神经网中,同一个卷积核内,所有的神经元的权值是相同的,从而大大减少需要训练的参数。之所以如此设计,就如同人类大脑的某个神经中枢中的神经细胞,它们的结构、功能是相同的,甚至可以互相替代。

如果你还没有理解的话,我们再看下面这个例子,专家们设计了包含10个卷积层,4个池化层和2个全连接层的卷积神经网络,见图6所示,该网络主要用于图像识别。专家们发现,在比较低的层,神经元倾向于学习一些简单的模式,比如图像边缘、颜色、条带灯;而在比较高的层,神经元能够检测到一些更为高层次的抽象特征,比如整辆轿车等。

图6 专家构建的用于图像识别的卷积神经网络

CNN的诞生是为了解决图像处理问题。在安全界,瀚思科技开发出了基于深度学习的二进制病毒样本检测技术,可以做到沙箱同等水平的 99% 的检测准确率,而误报率低于 1/1000。

CNN检测的图像通常是二维数据,而作为DNS隐蔽通道传输的子域名虽是一维的文本数据,但同样可以用CNN进行处理。在本文的DNS隐蔽通道检测中,我们使用一维的卷积函数处理DNS子域名片段,以提炼高级特征进一步分析。

利用CNN进行DNS隐蔽通道检测的代码框架如下:

def run():
    X, Y, max_len, volcab_size = get_data()
    trainX, testX, trainY, testY = train_test_split(X, Y, test_size=0.2, random_state=42)
    model = get_cnn_model(max_len, volcab_size)
    model.fit(trainX, trainY, validation_set=(testX, testY), show_metric=True, batch_size=32)

大致流程是先获取黑白样本数据,然后将80%的数据用于训练,剩下20%的数据用于CNN模型验证。

其中,get_cnn_model使用了python的TensorFlow库tflearn,其代码如下:

def get_cnn_model(max_len, volcab_size):
    # 构建CNN模型
    network = tflearn.input_data(shape=[None, max_len], name='input')
    # 为了进行数据降维加入了embedding层
    network = tflearn.embedding(network, input_dim=volcab_size, output_dim=64)
    # 卷积层使用了一维的卷积函数
    branch1 = conv_1d(network, 128, 3, padding='valid', activation='relu', regularizer="L2")
    branch2 = conv_1d(network, 128, 4, padding='valid', activation='relu', regularizer="L2")
    branch3 = conv_1d(network, 128, 5, padding='valid', activation='relu', regularizer="L2")
    network = merge([branch1, branch2, branch3], mode='concat', axis=1)
    network = tf.expand_dims(network, 2)
    # 最大池化操作  
    network = global_max_pool(network)
    # 加入dropout防止过拟合  
    network = dropout(network, 0.5)
    # 全连接
    network = fully_connected(network, 2, activation='softmax')
    # 回归操作  
    network = regression(network, optimizer='adam', learning_rate=0.001,
                         loss='categorical_crossentropy', name='target')
    # 构建深度神经网络模型  
    model = tflearn.DNN(network, tensorboard_verbose=0)
    return model

在上述模型中,为了进行数据降维先加入了embedding层,其本质和word2vec一样,因为在DNS 隐蔽通道的子域名中包含了大量的字符而导致数据输入维度过高,代码中output_dim=64表示将数据输入降低维度到64维。接下来我们使用一维的卷积函数conv_1d处理DNS子域名片段,提炼高级特征进一步分析。由于典型的一维卷积函数处理文字片段的大小通常为3、4、5,我们也使用这些典型参数。此外,模型中加入了dropout,用于防止过拟合。

获取黑白样本数据的代码如下,其中包括对原始的子域名字符进行字典编码(先得到黑白样本所有子域名字符集合),并使用pad_sequences函数按照固定长度进行子域名长度对齐操作(因CNN要求各样本数据输入维度一致,而某些子域名很短,某些子域名很长,pad_sequences将短的子域名采用特殊数字进行填充补齐,使它们长度一致):

def get_data():
    black_x, white_x = get_local_data()
    black_y, white_y = [LABEL.black]*len(black_x), [LABEL.white]*len(white_x)
    X = black_x + white_x
    labels = black_y + white_y

    # Generate a dictionary of valid characters
    valid_chars = {x:idx+1 for idx, x in enumerate(set(''.join(X)))}

    max_features = len(valid_chars) + 1
    maxlen = np.max([len(x) for x in X])

    # Convert characters to int and pad
    X = [[valid_chars[y] for y in x] for x in X]
    X = pad_sequences(X, maxlen=maxlen, value=0.)
 
    # Convert labels to 0-1
    Y = to_categorical(labels, nb_classes=2)

    return X, Y, maxlen, max_features

其中,get_local_data主要是从样本文件中提取DNS子域名。

def get_local_data(tag="labeled"):
    data_path = "latest_metadata_sample"
    black_data, white_data = [], []  
    for dir_name in ("black", "white_like"):
        dir_path = "%s/%s_%s" % (data_path, tag, dir_name)
        for path in iterbrowse(dir_path):
            with open(path) as f:
                for line in f:
                    _, subdomain = extract_subdomain(line)
                    if subdomain is not None:
                        if "white_like" in path:
                           white_data.append(subdomain)
                        elif "black" in path:
                            black_data.append(subdomain)
    return black_data, white_data

核心代码讲解完毕,开始进行模型训练。在我的个人电脑上,算法运行时间大概17小时,最后的结果如下:

Run id: 6U1KPD

Log directory: /tmp/tflearn_logs/

--

Training Step: 5131  | total loss: 0.03967 | time: 6406.696s

| Adam | epoch: 001 | loss: 0.03967 - acc: 0.9888 | val_loss: 0.02546 - val_acc: 0.9926 -- iter: 164165/164165

--

Training Step: 10262  | total loss: 0.03562 | time: 6422.500s5776/164165

| Adam | epoch: 002 | loss: 0.03562 - acc: 0.9917 | val_loss: 0.01793 - val_acc: 0.9948 -- iter: 164165/164165

--

Training Step: 15393  | total loss: 0.03433 | time: 6357.422s

| Adam | epoch: 003 | loss: 0.03433 - acc: 0.9888 | val_loss: 0.01432 - val_acc: 0.9962 -- iter: 164165/164165

--

Training Step: 20524  | total loss: 0.02852 | time: 6312.083s

| Adam | epoch: 004 | loss: 0.02852 - acc: 0.9892 | val_loss: 0.01186 - val_acc: 0.9972 -- iter: 164165/164165

--

Training Step: 25655  | total loss: 0.02441 | time: 6292.232s

| Adam | epoch: 005 | loss: 0.02441 - acc: 0.9947 | val_loss: 0.01398 - val_acc: 0.9960 -- iter: 164165/164165

--

Training Step: 30786  | total loss: 0.01890 | time: 6286.252s

| Adam | epoch: 006 | loss: 0.01890 - acc: 0.9930 | val_loss: 0.01373 - val_acc: 0.9963 -- iter: 164165/164165

--

Training Step: 35917  | total loss: 0.00921 | time: 6261.734s

| Adam | epoch: 007 | loss: 0.00921 - acc: 0.9984 | val_loss: 0.01290 - val_acc: 0.9966 -- iter: 164165/164165

--

Training Step: 41048  | total loss: 0.00780 | time: 6266.017s

| Adam | epoch: 008 | loss: 0.00780 - acc: 0.9994 | val_loss: 0.01177 - val_acc: 0.9970 -- iter: 164165/164165

--

Training Step: 46179  | total loss: 0.01850 | time: 6257.918s

| Adam | epoch: 009 | loss: 0.01850 - acc: 0.9951 | val_loss: 0.01109 - val_acc: 0.9971 -- iter: 164165/164165

--

Training Step: 51310  | total loss: 0.02062 | time: 6258.476s

| Adam | epoch: 010 | loss: 0.02062 - acc: 0.9953 | val_loss: 0.00966 - val_acc: 0.9974 -- iter: 164165/164165

可以看到算法迭代了10次,每次训练时间一个多小时,最终的检测精度在99.53%,使用CNN进行DNS隐蔽通道的检测效果初步看来还不错。但是,因为训练样本和测试样本的内在数据分布规律是相同的,该精度再高也可能存在一定的过拟合风险。下面我们利用前段时间著名的XShell DNS隐蔽通道攻击来评估算法的检测能力。

4、验证XShell的检测效果

我们尝试用训练出的算法检测前段时间著名的XShell隐蔽通道攻击,其进行攻击的域名为nylalobghyhirgh.com,将包含该攻击的DNS样本加入到模型预测中:

def predict():
    testX, testY = get_xshell_data()
    model = get_cnn_model()
    ....  
    predictions = model.predict(testX)    
    cnt = 0
    for i,p in enumerate(predictions):

        if abs(p[2]-testY[i][2]) < 0.1:

            cnt += 1
    print cnt/(len(predictions)+.0)

代码运行后得到的检测准确率为97.3%,也就意味着nylalobghyhirgh.com下97.3%的子域名都可能是在利用DNS隐蔽通道传输数据。

上述验证表明,使用CNN可以有效地检测DNS隐蔽通道。当然,最终的检测准确率还需在真实而复杂的网络环境中长期运行观察而定。

5、结语

本文只是AI安全初探的一次尝试,大致说明了使用深度学习算法CNN进行安全检测的基本流程,文中有写得不明白的地方,欢迎大家留言一起探讨。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取==🆓

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值