EPIC: Every packet is checked in the data plane of a path-aware internet

Contents

这是一篇最近NSDI上路径验证相关的论文.看了好几遍但还是没进脑子,因此在此总结一遍.

终端主机如何根据AS的信息构造包的传输: 终端主机HSH_S首先从路径服务器中找到路径path(文中有个beacon的词,翻译为信标,估计跟路径差不多), 并将路径嵌入到数据包中,如下:

PACKET:=(PATHVALHDP)(1)PACKET := (PATH || VALHD || P) \tag{1}

PATH:=(TSpathSRCDESTHI1HIl)PATH := (TS_{path} || SRC || DEST || HI_1 || … || HI_l)

VALHD:=(tspktS1V1SlVlVSD)VALHD := (ts_{pkt} || S_1 || V_1 || … || S_l || V_l || V_{SD})

其中P表示数据包的负载, SRC:=(A1:HS),DEST:=(Al:HD)SRC := (A_1 : H_S), DEST:=(A_l: H_D). VALHD中为验证数据包所需要的一些域, tspktts_{pkt}为时间戳, SiS_i 为每一跳的验证加密码. ViV_i (HVF)为由源填充的加密标签,用于让中间路径验证数据包.

术语 hop field 指由跳信息 HI, 段识别 S 和跳验证域组成的三元组. 术语packet origin为h同源,路径时间戳,数据包时间戳组成的三元组:

PO:=(SRC,TSpath,tspkt)PO:=(SRC, TS_{path}, ts_{pkt})

每个AS怎么分配密钥的.

分为1-3级,安全性依次升高. 并使用0级作为最基础的方法.

L0阶段使用静态消息验证码MAC作为跳验证HVF. 在路径探索阶段, AS A 首先计算跳验证器σ(0)\sigma^{(0)}作为MAC. 当前跳验证器与前一跳验证器σ(0)\sigma^{(0)’}的关系为(截断到lvall_{val}位):

σA(0):=MACKA(TSpathHIAσ(0))[0:lval](5)\sigma_A ^{(0)} := MAC_{K_A}(TS_{path} || HI_A || \sigma^{(0)’})[0:l_{val}] \tag{5}

这个跳验证器直接用作HVF, 即Vi(0)=σi(0)V_i^{(0)} = \sigma_i^{(0)}, 初始化时没有前一跳,因此式中就不包函σ(0)\sigma^{(0)’}.

数据包的创建与交付过程为:

源: HS 获得 path后, 按式(1) 构造包.

传输: 每一个AiA_i, 它的边缘路由节点先检查HIi检查是否来自正确的接口并检查hop域是否过期,然后再重新计Vi并检查它是否与数据包头HVF中的相同。

L0的不安全性分析: 假设每一跳的验证位长度为3字节, 则攻击者最多要发送 2241.61072^{24} \approx 1.6 \cdot 10^7 个数据包就可以找到这一跳的一个正确的MAC,这在一个Gb链路上大概要10s即可. 这种静态的MAC一旦被猜到后就可被利用来发送额外的数据包.

L1中将静态跳验证替换为 per-packet HVFs, 这样它就无法被其他数据包重用了. 这时跳验证器的计算公式为:

σA(1):=MACKA(TSpathHIAS(1))(6)\sigma_A^{(1)}:=MAC_{K_A}(TS_{path}||HI_A||S^{(1)’}) \tag{6}

其中, S(1)S^{(1)’}为前一跳的段识别器, 通过截断跳验器来获得:

S(1):=σ(1)[0:lset](7)S^{(1)}:=\sigma^{(1)}[0:l_{set}] \tag{7}

跳验证器会被源主机用于计算每个数据包的HVF:

Vi(1):=MACσi(1)(tspktSRC)[0:lval](8)V_i^{(1)} :=MAC_{\sigma_i^{(1)}}(ts_{pkt}||SRC)[0:l_{val}] \tag{8}

HVF通过式(8)计算,这使得每个包的HVF都是不相同的。S首先根据式(7)和式(8)计算构造HVF。当中间路由节点接收到包时先和L0一样验首接口和过期时间,它首先用式(6)计算跳数authenticator,再用式(7)计算它自己的段识别,再使用式(8)计算HVF,将算得的结果与包中的对比相同则交付包。

这里与L0不同的: L0中 每个数据包的HVF都是σ\sigma, 是相同的, 而这里的HVF在计算时使用了每个数据包的时间戳, 所以每个数据包验证时HVF都是不同的.

虽然每个HVF只能被一个包使用,但攻击者仍可利用它所知道的一些PVF或重用时间戳进行DoS攻击,但可以使用[29]中的方法解决这个问题。

相较于L1添加了由中间路由验证数据包的源和目的机制. 提出了主机密钥机制,计算方法为:

主机密钥: KiS:=KAiA1:HSK_i ^S:=K_{A_i \rightarrow A_1:H_S} 每一个中间AS AiA_i的额外密钥: KSD:=KAl:HDA1:HSK_{SD}:=K_{A_l:H_D \rightarrow A_1 : H_S}

上面这两个密钥可以被用于计算带有源验证的HVF:

Vi(2):=MACKiS(tspktSRCσi)[0:lval](10)V_i^{(2)}:=MAC_{K_i^S}(ts_{pkt}||SRC||\sigma_i)[0:l_{val}] \tag{10}

目的主机可授权数据包的源并对数据包的路径和负载的验证域:

VSD(2):=MACKSD(tspktPATHP)(11)V_{SD}^{(2)}:=MAC_{K_{SD}}(ts_{pkt}||PATH||P) \tag{11}

源需要获取所有host的key,在计算HVF时与L0和L1不同的是,它使用了主机key,见式(10),另外还计算了Vsd见式(11)。中间路由节点除要验证L1中验证的外,还需计算主机key并验证包头中的HVF是否与式(10)中的相符。目的主机获得Ksd并验证Vsd是否符合式(11)。

(这个L2相较于L1添加了源和目的验证, 本质上与L1区别不大,就是在验证域HVF的计算过程中添加了源和目的主机的key)

相较于L2: 允许数据包的源和目的进行路径验证.

每个中间AS接收到数据包后都对数据包的HVF进行了修改,当目的接收到包后便可基于验证域内容进行验证. 定义(其实就是未截断的式(10)):

Ci:=MACKiS(tspktSRCσi)(12)C_i := MAC_{K_i^S}(ts_{pkt}||SRC||\sigma_i) \tag{12}

我们可以将这个分成多块:

Ci[1]:=Ci[0:lval],Ci[2]:=Ci[lval:2lval](13)C_i^{[1]}:=C_i[0:l_{val}], C_i^{[2]}:=C_i[l_{val}:2l_{val}] \tag{13}

源为每个数据包的HVF设定:Vi;0(3):=Ci[1]V_{i;0}^{(3)}:=C_i^{[1]}.

当中间交换机AiA_i收到数据包后先计算CiC_i,并验证HVF对不对,然后再更新HVF的验证域: Vi;i(3):=Ci[2]V_{i;i}^{(3)}:=C_i^{[2]}.

为使目的主机也能参与验证, 作者将最终值Vi;l(3)V_{i;l}^{(3)}放到目的验证域:

VSD(3):=MACKSD(tspktPATHV1;l(3)Vl;l(3)P)(14)V_{SD}^{(3)}:=MAC_{K_{SD}}(ts_{pkt}||PATH||V_{1;l}^{(3)}||\cdots ||V_{l;l}^{(3)}||P) \tag{14}

在附录部分加了个L4.

  • basic-attacker model:

  • Strong-Attacker Model: 定义一个神喻函数O(l)\mathcal{O}^{(l)}, 它可以从给定的PO和HI中产出有效的HVF ViV_i有段识别SiS_i: O(PO,HI1,,HIl)=(V1(l),,Vl(l),s1(l),,Sl(l)\mathcal{O}(PO,HI_1,…,HI_l)=(V_1^{(l)},…,V_l^{(l)}, s_1^{(l)},…,S_l^{(l)} 攻击者可以查询这个神喻函数并学习到Vi,SiV_i,S_i.(σi,VSD\sigma_i,V_{SD}不行). 这使得攻击者可以构造已有的数据包(无法构造不同的数据包). 这么作的攻击效果有限.

对前面攻击危害性不强一顿解释.

P1: 路径授权: 数据包在网络中传输只会沿着被路径上的诚实AS授权的路径进行.

P2: Freshness: 数据包被独一无二的识别, 无法被重放.

P3: Packet authentication for HDH_D: 目的主机与源对数据包的源,路径,负载达成一致.

P4: Source authenticaiton for router: 路径上的AS与源对packet origin达到一致.

这个先不管了, 这些分析不知道到底有啥用.

吞吐量:

图1:单核,不同负载尺寸下,源的吞吐量与路径长度的关系;

图7:不同的包负载尺寸,不同的核数时,源的性能(吞吐量,产量)

图8:单核,不同的包负载尺寸,不同的路径长度,源的处理时间.

图2: 路径长度为8时,不同的核心数的交付性能,可见当负载尺寸>=500B时,4核,可以使40Gbps的链路饱和. 使用16核时可在负载尺寸为100B时使链路饱和.

图4:不同的交付任务,在不同的跳数情况下,路由的处理时间

图5: 在不同的跳数时,负载尺寸增加时路由的处理时间

图6:交付性能随核数的变化(由图4,5知交付性能与跳数和尺寸无关).

图3: 不同协议,不同的路径长度下,goodput ratio的变化;

表4: 不同协议 以及本方法不同等级时,所需要的额外不同头域大小.