《Web安全之机器学习入门》笔记:第八章 8.3 逻辑回归算法检测Java溢出攻击

博客介绍了逻辑回归,它是广义线性回归分析模型,常用于多领域。基于ADFA - LD数据集,使用逻辑回归算法检测JAVA溢出攻击,对数据集中的白样本、黑样本进行处理和特征化,经逻辑回归训练后给出完整代码,运行结果准确率达93%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列目录

《Web安全之机器学习入门》笔记:第八章 8.2 逻辑回归hello world

《Web安全之机器学习入门》笔记:第八章 8.3 逻辑回归算法检测Java溢出攻击

《Web安全之机器学习入门》笔记:第八章 8.4 逻辑回归算法识别mnist验证码

目录

一、逻辑回归

二、ADFA-LD数据集

三、数据集处理

1、白样本

2、黑样本

3、数据集处理

4、特征化处理

四、逻辑回归模型

1、逻辑回归训练

2、完整代码

3、运行结果


本系列是《Web安全之机器学习入门》的笔记集合,包含书中第五章-第十七章的内容。本文这一小节主要内容是讲解第8章使用逻辑回归算法的基本用法,本小节主要内容是用ADFA-LD数据集来作为实验数据集讲解逻辑回归检测JAVA溢出攻击基本用法。

一、逻辑回归

逻辑回归一般指logistic回归。 logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。

项目详情
算法类型有监督,用于分类(二、多分类)
原理基于线性回归,用逻辑函数转线性结果为概率
目标函数常基于极大似然估计,二分类用对数似然损失
参数估计梯度下降法、牛顿法等
优点计算快,模型简单易解释,对数据要求低
缺点难处理非线性数据,易欠拟合,对异常值敏感
应用信用评估、医学诊断、垃圾邮件过滤、文本分类

二、ADFA-LD数据集

本小节是基于ADFA-LD数据集使用逻辑回归算法检测JAVA溢出攻击。ADFA-LD数据集中记录了系统调用序列,使用系统调用号标识每一个系统调用,这样就将一连串的系统调用转换成一连串的系统调用号了。

ADFA-LD数据集概览如下所示。

属性描述
全称Australian Defence Force Academy - Linux Dataset
类型主机级入侵检测系统(HIDS)数据集
数据内容Linux系统调用(system call)序列
攻击类型提权攻击、远程代码执行(RCE)、Web攻击等
数据格式文本文件(每行记录系统调用号)
数据量训练集(正常) + 验证集(正常) + 攻击集

三、数据集处理

1、白样本

正常样本共有833个,定义加载白样本数据的load_adfa_training_files函数,遍历指定目录文件,调用load_one_flle加载每个文件内容存入列表 x,同时生成标签列表 y(全为 0),最后从训练数据目录加载数据到 x1、y1,用于获取正常样本数据及标签。

  • 定义函数:创建加载 ADFA 训练文件的函数。
  • 初始化列表:创建 x 存储文件内容,y 存储标签。
  • 遍历目录:获取目录文件列表,循环处理每个文件。
  • 加载文件:调用函数加载文件内容到 x,打印路径。
  • 生成标签:为每个文件添加标签 0 到 y。
  • 返回数据:返回文件内容列表 x 和标签列表 y。
  • 调用函数:从训练数据目录加载数据到 x1 和 y1。
def load_adfa_training_files(rootdir):
    x=[]
    y=[]
    list = os.listdir(rootdir)
    for i in range(0, len(list)):
        path = os.path.join(rootdir, list[i])
        if os.path.isfile(path):
            x.append(load_one_flle(path))
            print("Load file(%s)" % path)
            y.append(0)
    return x,y

x1,y1=load_adfa_training_files("../data/ADFA-LD/Training_Data_Master/")

2、黑样本

黑样本共124个样本,先定义dirlist函数递归获取指定路径下所有文件路径,再定义load_adfa_java_files函数,筛选出路径含特定前缀的文件,调用load_one_flle加载内容到 x,标签设为 1,最后从攻击数据目录加载 Java 攻击样本到 x2、y2。具体代码如下所示:

  • 递归列文件dirlist函数递归获取路径下所有文件路径。
  • 定义前缀:设定 Java 攻击文件的路径前缀。
  • 初始化列表:创建 x 存文件内容,y 存标签。
  • 筛选文件:用前缀匹配筛选目标攻击文件。
  • 加载内容:调用函数加载文件内容到 x,打印路径。
  • 设置标签:为每个文件添加标签 1 到 y。
  • 加载数据:从攻击目录加载 Java 攻击样本到 x2、y2。
def dirlist(path, allfile):
    filelist = os.listdir(path)

    for filename in filelist:
        filepath = os.path.join(path, filename)
        if os.path.isdir(filepath):
            dirlist(filepath, allfile)
        else:
            allfile.append(filepath)
    return allfile

file_prefix = r"../data/ADFA-LD/Attack_Data_Master/Java_Meterpreter_"
def load_adfa_java_files(rootdir):
    x=[]
    y=[]
    allfile=dirlist(rootdir,[])
    for file in allfile:
        if re.match(file_prefix,file):
            print("Load file(%s)" % file)
            x.append(load_one_flle(file))
            y.append(1)
    return x,y

x2,y2=load_adfa_java_files("../data/ADFA-LD/Attack_Data_Master/")

3、数据集处理

if __name__ == '__main__':

    x1,y1=load_adfa_training_files("../data/ADFA-LD/Training_Data_Master/")
    x2,y2=load_adfa_java_files("../data/ADFA-LD/Attack_Data_Master/")
    
    x=x1+x2
    y=y1+y2
    print(len(x1), len(x2), len(x))

数据集中黑样本124,白样本833,总数据处理数量为957:

833 124 957

4、特征化处理

对数据进行特征处理,配置min_df=1 ,这表示当一个词(或系统调用)至少在1个文档(样本)中出现时,就会被保留作为特征。

# 初始化词袋模型向量化器,设置最小词频阈值为1(保留所有出现过的词)
# min_df=1表示只要词在至少1个文档中出现就会被保留
vectorizer = CountVectorizer(min_df=1)

# 对输入文本数据x执行拟合(fit)和转换(transform)操作:
# - 拟合:分析文本数据,构建词汇表(统计所有出现的唯一词)
# - 转换:将原始文本转换为词频矩阵(每行代表一个文档,每列代表一个词,值为词在文档中出现的次数)
x = vectorizer.fit_transform(x)

# 将稀疏矩阵转换为密集数组表示
# 稀疏矩阵只存储非零元素以节省内存,密集数组则填充所有位置(含大量零值)
# 注意:对于大规模数据集,密集数组可能占用极高内存
x = x.toarray()

min_df设置不同值的对比如下表所示。

参数设置效果适用场景
min_df=1保留所有出现过的调用需要检测罕见攻击模式
min_df=2过滤掉只出现1次的调用减少特征维度
min_df=0.1过滤掉在<10%样本中出现的调用大型数据集降维

四、逻辑回归模型

1、逻辑回归训练

构建多层感知器 (MLP) 和逻辑回归两个分类模型,其中 MLP 设置了两层隐藏层(150 和 50 个神经元)等参数,逻辑回归设置正则化参数。随后用 10 折交叉验证评估逻辑回归在特征数据 x 和标签 y 上的性能,输出平均得分,用于评估模型泛化能力。

    mlp = MLPClassifier(hidden_layer_sizes=(150,50), max_iter=10, alpha=1e-4,
                        solver='sgd', verbose=10, tol=1e-4, random_state=1,
                        learning_rate_init=.1)

    logreg = linear_model.LogisticRegression(C=1e5)

    score = model_selection.cross_val_score(logreg, x, y, n_jobs=1, cv=10)
    print(np.mean(score))

(1)报警

FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.

(2)报警

ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.   "the number of iterations.", ConvergenceWarning)

修改后如下所示。

    logreg = linear_model.LogisticRegression(C=1e5, solver='liblinear', max_iter=10000)

2、完整代码

本文使用逻辑回归和 MLP 分类器检测 ADFA-LD 数据集的攻击。加载正常训练文件(标 0)和 Java Meterpreter 攻击文件(标 1),合并数据后用 CountVectorizer 提取文本特征,通过 10 折交叉验证评估逻辑回归模型,输出平均准确率,用于区分正常与攻击行为。

  • 单文件读取:读取单个文件内容,返回去除换行符的文本
  • 正常数据加载:加载训练集正常文件,标签设为 0
  • 攻击数据加载:递归遍历目录,加载 Java Meterpreter 攻击文件,标签设为 1
  • 数据合并:合并正常与攻击数据的特征和标签
  • 特征提取:用 CountVectorizer 将文本转换为特征矩阵
  • 模型定义:初始化 MLP 神经网络和逻辑回归模型
  • 模型评估:10 折交叉验证逻辑回归,输出平均准确率
# -*- coding:utf-8 -*-

import re
import os
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import model_selection
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn import linear_model, datasets


def load_one_flle(filename):
    x=[]
    with open(filename) as f:
        line=f.readline()
        line=line.strip('\n')
    return line

def load_adfa_training_files(rootdir):
    x=[]
    y=[]
    list = os.listdir(rootdir)
    for i in range(0, len(list)):
        path = os.path.join(rootdir, list[i])
        if os.path.isfile(path):
            x.append(load_one_flle(path))
            #print("Load file(%s)" % path)
            y.append(0)
    return x,y

def dirlist(path, allfile):
    filelist = os.listdir(path)

    for filename in filelist:
        filepath = os.path.join(path, filename)
        if os.path.isdir(filepath):
            dirlist(filepath, allfile)
        else:
            allfile.append(filepath)
    return allfile

file_prefix = r"../data/ADFA-LD/Attack_Data_Master/Java_Meterpreter_"
def load_adfa_java_files(rootdir):
    x=[]
    y=[]
    allfile=dirlist(rootdir,[])
    for file in allfile:
        if re.match(file_prefix,file):
            #print("Load file(%s)" % file)
            x.append(load_one_flle(file))
            y.append(1)
    return x,y



if __name__ == '__main__':

    x1,y1=load_adfa_training_files("../data/ADFA-LD/Training_Data_Master/")
    x2,y2=load_adfa_java_files("../data/ADFA-LD/Attack_Data_Master/")

    x=x1+x2
    y=y1+y2
    print(len(x1), len(x2), len(x))
    vectorizer = CountVectorizer(min_df=1)
    x=vectorizer.fit_transform(x)
    x=x.toarray()

    mlp = MLPClassifier(hidden_layer_sizes=(150,50), max_iter=10, alpha=1e-4,
                        solver='sgd', verbose=10, tol=1e-4, random_state=1,
                        learning_rate_init=.1)

    logreg = linear_model.LogisticRegression(C=1e5, solver='liblinear', max_iter=10000)

    score = model_selection.cross_val_score(logreg, x, y, n_jobs=1, cv=10)
    print(np.mean(score))

3、运行结果

运行结果如下所示,逻辑回归模型在 ADFA-LD 数据集的 10 折交叉验证中,准确率介于 77.89%~98.97% 之间,平均准确率约 93.82%。整体表现良好,说明模型能有效区分正常行为与 Java Meterpreter 攻击。第 6 折准确率较低(77.89%),可能受该子集数据分布影响,其余折均在 91% 以上,稳定性较强,适用于基础的攻击检测场景。

[0.93814433 0.98969072 0.93814433 0.95833333 0.93684211 0.77894737
 0.91578947 0.96842105 0.97894737 0.97894737]
0.938220745161874
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值