前言
DGA可谓是网络安全领域的一个绕不过的话题,针对DGA的检测通常分为两类:一类是通过域名相关字符特征判断一个域名是否为DGA域名,另一类是对DGA所属家族的判别和划分。因为根据域名的字符特征进行DGA的检测可以抽象为NLP领域的二分类问题,NLP二分类问题目前已经有很多成熟的解决方案,本次实验尝试使用LSTM对DGA域名做检测,使用的数据集是360lab每日发布的DGA域名集合,将此数据集作为黑样本;白样本选择Alexa的域名集合。
实现
1、使用字符序列模型,将域名以单字符形式拆分,转换为对应的ASCII码。
2、设定最大域名长度,对长度不足的域名在前面填充0,对长度超过最大域名长度的直接截断。
3、对填充后的字符序列经过embedding层编码。
4、直接输入LSTM层
5、使用softmax做分类任务。
网络层级如下:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 60)] 0
embedding_1 (Embedding) (None, 60, 128) 1280000
lstm_1 (LSTM) (None, 10) 5560
dense_1 (Dense) (None, 2) 22
=================================================================
主要代码如下:
def char2num(domain_list):
"""使用字符序列模型
@param domain_list:
"""
t = []
for i in domain_list:
v = []
for j in range(0, len(i)):
v.append(ord(i[j]))
t.append(v)
return t
def do_lstm(x_train, x_test, y_train, y_test):
"""训练并保存LSTM模型
"""
x_train = char2num(x_train)
x_test = char2num(x_test)
train_x = pad_sequences(x_train, maxlen=max_domain_length)
test_x = pad_sequences(x_test, maxlen=max_domain_length)
# 定义模型 size = (batch, 10)
sequence_input = Input(shape=(max_domain_length,))
embedding_layer = Embedding(input_dim=10000, output_dim=128, input_length=max_domain_length)
embedding_sequences = embedding_layer(sequence_input)
lstm1 = LSTM(10, dropout=0.2)(embedding_sequences)
# 输出层
preds = Dense(2, activation='softmax')(lstm1)
model = Model(sequence_input, preds)
# 训练模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_x, y_train, batch_size=100, epochs=epochs, validation_data=(test_x, y_test))
model.save('lstm.h5')
def do_predict(domain_list, model):
"""实现预测结果输出
@param domain_list:
@param model:
"""
t = []
for d in domain_list:
v = []
for i in d:
v.append(ord(i))
t.append(v)
seq = pad_sequences(t, maxlen=max_domain_length)
probs = model.predict(seq)
for i in range(len(domain_list)):
if np.argmax(probs[i]) == 0:
print("{} is dga".format(domain_list[i]))
elif np.argmax(probs[i]) == 1:
print("{} is legit".format(domain_list[i]))
return probs
总结
- 基于传统机器学习的DGA检测算法可解释性强,引入了安全专家选择的特征。LSTM等深度学习算法可解释性较差。
- 目前97%的准确率在真实环境的海量DNS数据下误报率巨大,运营成本高,而且该算法仅在测试数据集表现良好,真实环境堪忧。
- 对此类算法的黑盒攻击和白盒攻击技术都较为成熟,安全性堪忧,健壮性不足。
- 在中文环境下,此类域名与拼音组成的域名,运营商随机域名的碰撞严重。
- 有多种DGA算法的本质是异或操作,位移操作,此类算法很难学到位的运算这类特征,可能会强化一些随机性字符在判断域名时的比重。
总的来说不看好此类算法在实际工程环境中的作用,但是作为一个Demo来玩一玩还是很有意思的。
网友评论