DL00210-重遍历式图神经网络GNN的漏洞检测完整实现python 将漏洞检测视为归纳文本分类问题,提出了一种简单的有效的基于图神经网络的模型来解决这个问题。 特别地,ReGVD将每个原始源代码视为平坦序列的标记来构建图,其中节点特征被初始化仅通过预训练编程的标记嵌入层语言(PL)模型。 然后ReGVD利用残差连接在GNN层之间,并检查图级和的混合和最大池化,以返回源代码的图嵌入。

在代码安全领域,将漏洞检测当作归纳文本分类问题来处理是个挺有意思的思路。今天咱就聊聊基于图神经网络(GNN)模型在这方面的应用,特别是DL00210中的重遍历式图神经网络GNN漏洞检测(ReGVD)实现。

构建图结构

ReGVD把每个原始源代码当作一个平坦序列的标记来构建图。这里可以想象成把代码像拆积木一样,拆分成一个个小标记。在Python中,借助一些工具库就可以实现对源代码的标记化处理。比如利用tokenize库:

import tokenize
from io import BytesIO

source_code = "def add(a, b): return a + b"
io_obj = BytesIO(source_code.encode('utf-8'))
tokens = list(tokenize.tokenize(io_obj.readline))
for token in tokens:
    print(token)

在这段代码里,tokenize库将输入的源代码按行读取并转化为一个个的标记。每个标记都有自己的类型、值等信息。这样就为构建图结构打下了基础。

节点特征初始化

节点特征的初始化只通过预训练编程的标记嵌入层语言(PL)模型来完成。在深度学习框架中,比如PyTorch,可以使用预训练的词嵌入模型,像torchtext中的预训练词向量:

import torch
from torchtext.vocab import GloVe

# 加载预训练的词向量
vectors = GloVe(name='6B', dim=100)

# 假设我们有一个标记列表
tokens = ['def', 'add', '(', 'a', ',', 'b', ')', ':', 'return', 'a', '+', 'b']
token_embeddings = []
for token in tokens:
    try:
        embedding = vectors[token]
        token_embeddings.append(embedding)
    except KeyError:
        # 如果标记不在预训练词向量中,可以用随机向量代替
        random_embedding = torch.randn(100)
        token_embeddings.append(random_embedding)
token_embeddings = torch.stack(token_embeddings)

这里我们利用GloVe预训练词向量来获取每个标记的嵌入表示,如果标记不在预训练词表中,就随机生成一个嵌入向量。这样就完成了节点特征的初始化。

残差连接与池化操作

ReGVD在GNN层之间利用残差连接。在PyTorch中实现一个简单的带有残差连接的GNN层:

import torch
import torch.nn as nn

class ResidualGNNLayer(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(ResidualGNNLayer, self).__init__()
        self.linear = nn.Linear(in_channels, out_channels)
        self.activation = nn.ReLU()

    def forward(self, x):
        identity = x
        out = self.linear(x)
        out = self.activation(out)
        out = out + identity
        return out

这里的ResidualGNNLayer类继承自nn.Module,在forward方法中,先对输入进行线性变换和激活,然后加上输入本身,实现了残差连接。

DL00210-重遍历式图神经网络GNN的漏洞检测完整实现python 将漏洞检测视为归纳文本分类问题,提出了一种简单的有效的基于图神经网络的模型来解决这个问题。 特别地,ReGVD将每个原始源代码视为平坦序列的标记来构建图,其中节点特征被初始化仅通过预训练编程的标记嵌入层语言(PL)模型。 然后ReGVD利用残差连接在GNN层之间,并检查图级和的混合和最大池化,以返回源代码的图嵌入。

在获取图嵌入时,ReGVD检查图级和的混合和最大池化。以PyTorch为例,简单实现一下这两种池化操作:

# 假设graph_embeddings是一个包含图中所有节点嵌入的张量
graph_embeddings = torch.randn(10, 100)  # 10个节点,每个节点100维嵌入

# 求和池化
sum_pooling = torch.sum(graph_embeddings, dim=0)

# 最大池化
max_pooling, _ = torch.max(graph_embeddings, dim=0)

求和池化通过torch.sum函数实现,将所有节点的嵌入按元素相加;最大池化则通过torch.max函数,取每个维度上的最大值,从而得到图嵌入。

通过以上一系列操作,ReGVD实现了基于图神经网络的漏洞检测。这种方法从全新的角度,将代码结构与深度学习结合,为漏洞检测提供了一种简单有效的解决方案。随着对代码安全要求的不断提高,这类技术在未来想必会有更广泛的应用和优化。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐