下面是题目原内容:
来源 :安全通论作业一:数值分析攻击信道容量
内容 :用matlab/python等作图工具,数值分析攻击信道容量。
要求 :形成分析报告,字数不限。以PDF附件形式上传~
本来说是不用算的,然后结果我就把攻击信道容量算出来了。。。但是解释起来着实有点牵强,最后的理解还是攻击方能够产生的最大威胁当量。不过这个作业也算给了我一些比较好的启发,尝试基于学过的一些理论的内容,构建模型。虽然说是人家好像在十几年前就利用乔姆斯基范式研究过了哈哈哈(LangSec)。但是过程挺好玩的,遂分享。
其实这个模型中间问题也挺多的,比如把系统抽象为 DFA 是否合理,资源函数也是存在一定定义问题。。然后把防御方也分开成了一个 PPT,攻击方也进行了分级别的抽象等等。
娱乐性质大于科学性。√
1. 基本建模
1.1 攻防双方的形式化建模
对于攻防双方,我们将其各自抽象为一个概率多项式图灵机:
【防守方】 考虑非动态变化的防守方,即防守方提前部署策略,它不知道哪个攻击方会进行什么攻击,它的机器为多项式时间图灵机 :
M D ( x ) → { 0 , 1 } \mathcal{M}_D(x) \to \{0, 1\}
M D ( x ) → { 0 , 1 }
其中 1 1 1 表示拦截,0 0 0 表示放行。
设 M D \mathcal{M}_D M D 能判定的语言是:
L D = M D − 1 ( 1 ) L_D = \mathcal{M}_D^{-1}(1)
L D = M D − 1 ( 1 )
同时定义防守资源函数 :
ψ ( L D ) = min M : L ( M ) = L D { max x ∈ Σ ∗ { T M ( x ) + S M ( x ) } } \psi(L_D) = \min_{M:L(M)=L_D} \left\{ \max_{x\in\Sigma^*} \left\{ T_M(x) + S_M(x) \right\} \right\}
ψ ( L D ) = M : L ( M ) = L D min { x ∈ Σ ∗ max { T M ( x ) + S M ( x ) } }
这里我们考虑 max \max max 是因为,在真实的工程防御中,攻击者可能采用一种称为算法复杂度攻击 的攻击方式。例如,防守方使用正则表达式引擎(一种判定图灵机)来匹配恶意特征。大部分正常的载荷在几毫秒内就能匹配完成,但攻击者可以精心构造一个引发 ReDoS 的特定载荷 x w o r s t x_{worst} x w o r s t 。在这个特定的 x w o r s t x_{worst} x w o r s t 上,机器的时空开销 T M ( x w o r s t ) + S M ( x w o r s t ) T_M(x_{worst}) + S_M(x_{worst}) T M ( x w o r s t ) + S M ( x w o r s t ) 会呈指数级飙升。
形式上定义防守方可以承载的资源最大值 为 R D \mathcal{R}_D R D ,这时即要求:
ψ ( L D ) ⩽ R D \psi(L_D) \leqslant \mathcal{R}_D
ψ ( L D ) ⩽ R D
【攻击方】 攻击方定义为两个阶段的图灵机 M A \mathcal{M}_A M A :
输入:环境资源描述 ⟨ S ⟩ , 随机数 r 运行: 1. w ∗ ← M A off ( ⟨ S ⟩ , r ) ; 2. x ← M A on ( ⟨ S ⟩ , w ∗ , r ) ; 输出: x \begin{aligned}
&\text{输入:环境资源描述 }\langle S \rangle, \text{随机数} r\\
&\text{运行:}\\
&\qquad 1.\quad w^*\leftarrow \mathcal{M}_A^{\text{off}}(\langle S \rangle, r);\\
&\qquad 2.\quad x\leftarrow \mathcal{M}_A^{\text{on}}(\langle S \rangle, w^*, r);\\
&\text{输出:}x
\end{aligned}
输入:环境资源描述 ⟨ S ⟩ , 随机数 r 运行: 1 . w ∗ ← M A off ( ⟨ S ⟩ , r ) ; 2 . x ← M A on ( ⟨ S ⟩ , w ∗ , r ) ; 输出: x
其中 ⟨ S ⟩ \langle S\rangle ⟨ S ⟩ 表示系统上下文包括系统公开的架构、版本、网络拓扑等资源;r r r 显然为概率多项式图灵机内部的随机数 ;对于 w w w ,这里这样定义是因为我们想要凸显出攻击方的核心资产:漏洞证据 。
若 w = ∅ w = \emptyset w = ∅ ,此时攻击者处于什么都不知道 的状态,它是盲打击的;
若 w = w CVE w = w_{\text{CVE}} w = w CVE ,此时漏洞处于 1-day 状态 ,攻防双方需要比拼谁先利用漏洞或者打上补丁;
若 w = w 0-day w = w_{\text{0-day}} w = w 0-day ,此时攻击者处于绝对优势,攻防双方信息绝对不对称。
同样定义攻击资源函数 :
Φ ( M A ) = max x ∈ Σ ∗ { T M A off ( x ) + S M A off ( x ) } + max x ∈ Σ ∗ { T M A on ( x ) + S M A on ( x ) } \Phi(\mathcal{M}_A) = \max_{x\in \Sigma^*} \left\{ T_{\mathcal{M}_A^{\text{off}}}(x) + S_{\mathcal{M}_A^{\text{off}}}(x) \right\} + \max_{x\in \Sigma^*} \left\{ T_{\mathcal{M}_A^{\text{on}}}(x) + S_{\mathcal{M}_A^{\text{on}}}(x) \right\}
Φ ( M A ) = x ∈ Σ ∗ max { T M A off ( x ) + S M A off ( x ) } + x ∈ Σ ∗ max { T M A on ( x ) + S M A on ( x ) }
类似地,形式上定义攻击方可以承载的资源最大值 为 R A \mathcal{R}_A R A ,这时即要求:
Φ ( M A ) ⩽ R A \Phi(\mathcal{M}_A) \leqslant \mathcal{R}_A
Φ ( M A ) ⩽ R A
记黑客生成的载荷子集为:
Supp ( M A ) = { x ∈ Σ ∗ ∣ Pr ( M A → x ) > 0 } \text{Supp}(\mathcal{M}_A) = \left\{ x \in \Sigma^* \mid \Pr(\mathcal{M}_A \to x) > 0 \right\}
Supp ( M A ) = { x ∈ Σ ∗ ∣ Pr ( M A → x ) > 0 }
我们还需要对防守方的业务相关内容进行建模。
根据防守方的 PPT 机器 M A \mathcal{M}_A M A ,设其对应的状态集合 为 S \mathbb{S} S 。
对于防守方来说,他自评地将状态集合划定成两个不交子集:
S S ⊆ S \mathcal{S}_S \subseteq \mathbb{S} S S ⊆ S :符合防守方期望的安全状态,满足机密性、完整性、可靠性等指定安全服务需求;
S U = S − S S \mathcal{S}_U = \mathbb{S} - \mathcal{S}_S S U = S − S S :非安全状态。
在单论攻防交互下,考虑防守方的业务 是一个概率状态转移的过程,即概率状态转移函数 δ \delta δ 定义如下:
δ : S × Σ ∗ × S → [ 0 , 1 ] \delta : \mathbb{S} \times \Sigma^* \times \mathbb{S} \to [0, 1]
δ : S × Σ ∗ × S → [ 0 , 1 ]
此时应当有要求,对于任意给定的当前状态 s s s 与输入载荷 x x x ,系统转移到所有下一个可能状态为 s ′ s' s ′ 的概率之和应当满足:
∑ s ′ ∈ S δ ( s , x , s ′ ) = 1 \sum_{s'\in \mathbb{S}} \delta(s, x, s') = 1
s ′ ∈ S ∑ δ ( s , x , s ′ ) = 1
单个字符的转移函数记为 δ 0 : S × Σ × S → [ 0 , 1 ] \delta_0: \mathbb{S} \times \Sigma \times \mathbb{S} \to [0, 1] δ 0 : S × Σ × S → [ 0 , 1 ] 。
对于单论攻防,设系统处于某个初始状态 s 0 s_0 s 0 ,则此时对于输入载荷 x x x ,系统单次执行后落入非安全状态的概率为:
p u ( s 0 , x ) = Pr x ∈ Σ ∗ ( from s 0 to unsafe ) = ∑ s ′ ∈ S U δ ( s 0 , x , s ′ ) p_u(s_0, x) = \Pr_{x\in\Sigma^*} (\text{from } s_0 \text{ to unsafe}) = \sum_{s'\in \mathcal{S}_U} \delta(s_0, x, s')
p u ( s 0 , x ) = x ∈ Σ ∗ Pr ( from s 0 to unsafe ) = s ′ ∈ S U ∑ δ ( s 0 , x , s ′ )
定义恶意载荷语言集合:
L mal ( s ) = { x ∈ Σ ∗ ∣ ∑ s ′ ∈ S U δ ( s , x , s ′ ) > 0 } \mathcal{L}_{\text{mal}}(s) = \left\{ x\in\Sigma^* \mid \sum_{s'\in \mathcal{S}_U} \delta(s, x, s') > 0 \right\}
L mal ( s ) = { x ∈ Σ ∗ ∣ s ′ ∈ S U ∑ δ ( s , x , s ′ ) > 0 }
对于一轮攻防,可以记:
L mal = L mal ( s 0 ) \mathcal{L}_{\text{mal}} = \mathcal{L}_{\text{mal}}(s_0)
L mal = L mal ( s 0 )
1.2 攻击动作
在前序的建模中,我们直接指定了黑客所使用的特定图灵机,而事实上由于攻防的不对称性,攻击者应当是在一族满足条件的黑客图灵机中进行选择 。下面考虑将攻击者定义为一个资源受限的概率多项式通用图灵机 U \mathcal{U} U ,攻击者在其中所做的战术选择形式化为一段多项式长度的策略描述 ⟨ π ⟩ \langle \pi\rangle ⟨ π ⟩ 。通用图灵机以环境 ⟨ S ⟩ \langle S \rangle ⟨ S ⟩ 、随机数 r r r 以及策略描述 ⟨ π ⟩ \langle \pi \rangle ⟨ π ⟩ 为输入,模拟执行该策略,即 x ← U ( ⟨ π ⟩ , ⟨ S ⟩ , r ) x \leftarrow \mathcal{U}(\langle \pi \rangle, \langle S \rangle, r) x ← U ( ⟨ π ⟩ , ⟨ S ⟩ , r ) 。
定义攻击者为一个受限于多项式时空资源的概率通用图灵机 U A \mathcal{U}_{\mathcal{A}} U A 。定义策略空间 Π \Pi Π ,其中任意策略 ⟨ π ⟩ ∈ Π \langle \pi \rangle \in \Pi ⟨ π ⟩ ∈ Π 是一段多项式长度的描述。
在单轮攻防中,攻击者基于当前观测到的环境上下文 ⟨ S ⟩ \langle S \rangle ⟨ S ⟩ ,选择某一种策略 ⟨ π ⟩ \langle \pi \rangle ⟨ π ⟩ ,并结合内部的随机数带 r r r ,通过通用图灵机模拟执行该策略,生成利用脚本 M A \mathcal{M}_A M A ,从而输出攻击载荷 x x x :
M A ← U A ( ⟨ π ⟩ , ⟨ S ⟩ , r ) \mathcal{M}_A \leftarrow \mathcal{U}_{\mathcal{A}}(\langle \pi \rangle, \langle S \rangle, r)
M A ← U A ( ⟨ π ⟩ , ⟨ S ⟩ , r )
通用图灵机生成的脚本的资源开销必须满足系统的物理上限:
Φ ( M A ) ⩽ R A \Phi(\mathcal{M}_A) \leqslant \mathcal{R}_{\mathcal{A}}
Φ ( M A ) ⩽ R A
在这一框架下,攻击者生成的载荷分布 D π \mathcal{D}_{\pi} D π 完全由其输入的策略描述 ⟨ π ⟩ \langle \pi \rangle ⟨ π ⟩ 决定。相应的,盲自评成功率 p p p 与联合概率 a a a 不再是固定值,而是依赖于策略 ⟨ π ⟩ \langle \pi \rangle ⟨ π ⟩ 的动态函数:
p ( π ) = Pr x ← D π ( x ∈ L mal ) p(\pi) = \Pr_{x \gets \mathcal{D}_{\pi}} (x \in \mathcal{L}_{\text{mal}})
p ( π ) = x ← D π Pr ( x ∈ L mal )
a ( π ) = Pr x ← D π ( x ∈ L D ∩ L mal ) a(\pi) = \Pr_{x \gets \mathcal{D}_{\pi}} (x \in L_D \cap \mathcal{L}_{\text{mal}})
a ( π ) = x ← D π Pr ( x ∈ L D ∩ L mal )
下面我们关注两个语言类 L D L_D L D 与 L mal \mathcal{L}_{\text{mal}} L mal ,针对这两个语言类的分析相当于就是在分析防守方是否真的防守成功。
L D ∩ L mal L_D \cap \mathcal{L}_{\text{mal}} L D ∩ L mal :防御方成功检测并拦截的能够攻击防御方的载荷的语言集合;
L D − L mal L_D - \mathcal{L}_{\text{mal}} L D − L mal :防御方检测出来并拦截但是无危害的载荷的语言集合;
L mal − L D \mathcal{L}_{\text{mal}} - L_D L mal − L D :防御方并没有检测出来但能够成功攻击防御方的载荷的语言集合。
下面其实就可以走杨义先《安全通论》里面的那套说法,但是我还是觉得有点牵强,就不放上来了。
1.3 资源分析
在攻击方生成并投递载荷 x x x 后,防守方机器 M D \mathcal{M}_D M D 被动接收该载荷并启动判定过程。由于 M D \mathcal{M}_D M D 为概率多项式图灵机,其内部存在随机数带 r D r_{\mathcal{D}} r D 。形式化地,对于任意输入的具体载荷 x x x ,定义 M D \mathcal{M}_D M D 的单次执行为一个位形序列的演化路径 C 0 , C 1 , … , C k C_0, C_1, \dots, C_k C 0 , C 1 , … , C k 。定义在此确定的 ( x , r D ) (x, r_{\mathcal{D}}) ( x , r D ) 下:
实际时间消耗 t ( x , r D ) = k t(x, r_{\mathcal{D}}) = k t ( x , r D ) = k (状态转移的总步数);
实际空间消耗 s ( x , r D ) = max { ∣ C i ∣ ∣ 0 ⩽ i ⩽ k } s(x, r_{\mathcal{D}}) = \max\{|C_i| \mid 0 \leqslant i \leqslant k\} s ( x , r D ) = max { ∣ C i ∣ ∣ 0 ⩽ i ⩽ k } (读写头访问过的最大纸带元胞数)。
由此,定义防守方针对于特定载荷 x x x 的资源消耗函数 W M D ( x ) W_{\mathcal{M}_D}(x) W M D ( x ) 为基于内部随机空间的数学期望:
W M D ( x ) = E r D [ t ( x , r D ) + s ( x , r D ) ] W_{\mathcal{M}_D}(x) = \mathbb{E}_{r_{\mathcal{D}}} \left[ t(x, r_{\mathcal{D}}) + s(x, r_{\mathcal{D}}) \right]
W M D ( x ) = E r D [ t ( x , r D ) + s ( x , r D ) ]
当攻击者以策略 ⟨ π ⟩ \langle \pi \rangle ⟨ π ⟩ 生成载荷分布 D π \mathcal{D}_{\pi} D π 时,防守方接收一次该策略下投递的载荷,其被迫产生的预期资源消耗代价 为:
C M D ( π ) = E x ← D π [ W M D ( x ) ] C_{\mathcal{M}_D}(\pi) = \mathbb{E}_{x \gets \mathcal{D}_{\pi}} \left[ W_{\mathcal{M}_D}(x) \right]
C M D ( π ) = E x ← D π [ W M D ( x ) ]
对于防守方物理资源上限 R D \mathcal{R}_D R D ,定义指示函数 I D o S ( x ) = 1 ⟺ W M D ( x ) > R D \mathbb{I}_{DoS}(x) = 1 \iff W_{\mathcal{M}_D}(x) > \mathcal{R}_D I D o S ( x ) = 1 ⟺ W M D ( x ) > R D 。在单轮交互中,载荷 x x x 的恶意语义即为:引发的计算开销击穿物理上限。此时,系统以概率 1 1 1 强制坍缩至非安全状态 S U \mathcal{S}_U S U :
若 W M D ( x ) > R D , 则 ∀ s ∈ S , ∑ s ′ ∈ S U δ ( s , x , s ′ ) = 1 \text{若}\ W_{\mathcal{M}_D}(x) > \mathcal{R}_D, \text{ 则 }\ \forall s \in \mathbb{S}, \sum_{s' \in \mathcal{S}_U} \delta(s, x, s') = 1
若 W M D ( x ) > R D , 则 ∀ s ∈ S , s ′ ∈ S U ∑ δ ( s , x , s ′ ) = 1
此时攻击者通过算法复杂度攻击(如 ReDoS)在物理维度上造成了拒绝服务(DoS)。
2. 受限资源下的绝对防御
在单轮对抗中,若对于任意满足资源约束 Φ ( M A ) ⩽ R A \Phi(\mathcal{M}_A)\leqslant \mathcal{R}_A Φ ( M A ) ⩽ R A 的黑客 M A \mathcal{M}_A M A ,在满足 ψ ( L D ) ⩽ R D \psi(L_D)\leqslant \mathcal{R}_D ψ ( L D ) ⩽ R D 的图灵机 M D \mathcal{M}_D M D 下的优势严格为 0 0 0 则称 M D \mathcal{M}_D M D 为 ( R A , R D ) (\mathcal{R}_A, \mathcal{R}_D) ( R A , R D ) -绝对防御 的,即:
Adv A ( R A , R D ) = max M A : Φ ( M A ) ⩽ R A { E x ← M A [ ( 1 − r R D ( M A ) ) ⋅ p u ( s 0 , x ) ] } = 0 \text{Adv}_{\mathcal{A}}(\mathcal{R}_A, \mathcal{R}_D) = \max_{\mathcal{M}_A:\Phi(\mathcal{M}_A)\leqslant \mathcal{R}_A} \left\{ \mathbb{E}_{x\gets\mathcal{M}_A} \left[ (1-r^{\mathcal{R}_D}(\mathcal{M}_A)) \cdot p_u(s_0, x) \right] \right\} = 0
Adv A ( R A , R D ) = M A : Φ ( M A ) ⩽ R A max { E x ← M A [ ( 1 − r R D ( M A ) ) ⋅ p u ( s 0 , x ) ] } = 0
这里把一次成功的攻击拆解为三个独立的概率事件:
攻击者生成载荷 x x x 的概率(隐藏在期望的分布 x ← M A x \leftarrow \mathcal{M}_A x ← M A 中);
防守方未能拦截的概率 ( 1 − r R D ( M A ) ) (1 - r^{\mathcal{R}_D}(\mathcal{M}_A)) ( 1 − r R D ( M A ) ) ,其中 r R D ( M A ) = Pr x ← M A ( x ∈ L D ∣ ψ ( L D ) ⩽ R D ) r^{\mathcal{R}_D}(\mathcal{M}_A) = \Pr_{x\gets \mathcal{M}_A}(x\in L_D \mid \psi(L_D) \leqslant \mathcal{R}_D) r R D ( M A ) = Pr x ← M A ( x ∈ L D ∣ ψ ( L D ) ⩽ R D ) 表示真实拦截概率;
载荷触发系统非安全状态转移的概率 p u ( s 0 , x ) p_u(s_0, x) p u ( s 0 , x ) 。
要构建 ( R A , R D ) (\mathcal{R}_A, \mathcal{R}_D) ( R A , R D ) -绝对防御的 M D \mathcal{M}_D M D 的条件是什么?
由概率的非负性可得,要么 r R D = 1 r^{\mathcal{R}_D} = 1 r R D = 1 ,要么 ∀ x ∈ Supp ( M A ) \forall x\in \text{Supp}(\mathcal{M}_A) ∀ x ∈ Supp ( M A ) ,p u ( s 0 , x ) = 0 p_u(s_0, x) = 0 p u ( s 0 , x ) = 0 。对于 r R D = 1 r^{\mathcal{R}_D} = 1 r R D = 1 ,它等价于 ∀ x ∈ Supp ( M A ) \forall x\in \text{Supp}(\mathcal{M}_A) ∀ x ∈ Supp ( M A ) ,x ∈ L D x\in L_D x ∈ L D ,即等价于 Supp ( M A ) ⊆ L D \text{Supp}(\mathcal{M}_A) \subseteq L_D Supp ( M A ) ⊆ L D 。对于 ∀ x ∈ Supp ( M A ) \forall x\in \text{Supp}(\mathcal{M}_A) ∀ x ∈ Supp ( M A ) ,p u ( s 0 , x ) = 0 p_u(s_0, x) = 0 p u ( s 0 , x ) = 0 ,它等价于 ∀ x ∈ Supp ( M A ) , ∀ s ′ ∈ S U \forall x\in \text{Supp}(\mathcal{M}_A),\ \forall s'\in\mathcal{S}_U ∀ x ∈ Supp ( M A ) , ∀ s ′ ∈ S U ,δ ( s 0 , x , s ′ ) = 0 \delta(s_0, x, s') = 0 δ ( s 0 , x , s ′ ) = 0 ,即等价于 Supp ( M A ) ∩ L mal = ∅ \text{Supp}(\mathcal{M}_A)\cap \mathcal{L}_{\text{mal}} = \emptyset Supp ( M A ) ∩ L mal = ∅ 。综上所述,( R A , R D ) (\mathcal{R}_A, \mathcal{R}_D) ( R A , R D ) -绝对防御的 M D \mathcal{M}_D M D 存在等价于存在 M D \mathcal{M}_D M D 使得 Supp ( M A ) ∩ ( L mal − L D ) = ∅ \text{Supp}(\mathcal{M}_A)\cap(\mathcal{L}_{\text{mal}} - L_D) = \emptyset Supp ( M A ) ∩ ( L mal − L D ) = ∅ 。
下面应当研究:L mal − L D \mathcal{L}_{\text{mal}} - L_D L mal − L D 应当有多大。
注意到防守方受到资源 R D \mathcal{R}_D R D 的约束,因此考虑防守方可接受输入最大为 N = log R D N = \log \mathcal{R}_D N = log R D ,据此我们对攻击方也做同等约束。
要计算长度为 N N N 的载荷中,既能造成破坏又不会被拦截的载荷数量。定义语言集合:
L gap = ( L mal ∖ L D ) ∩ Σ N L_{\text{gap}} = (\mathcal{L}_{\text{mal}} \setminus L_D) \cap \Sigma^N
L gap = ( L mal ∖ L D ) ∩ Σ N
为了计算 ∣ L gap ∣ ( N ) |L_{\text{gap}}|^{(N)} ∣ L gap ∣ ( N ) ,我们需要在有限状态机上进行路径计数:
G mal = ( S , E sys ) G_{\text{mal}} = (\mathbb{S}, E_{\text{sys}}) G mal = ( S , E sys ) :系统业务逻辑的状态转移图,目标状态集为 S U \mathcal{S}_U S U 。
G D − = ( V D , E D − ) G_{\mathcal{D}}^- = (V_{\mathcal{D}}, E_{\mathcal{D}}^-) G D − = ( V D , E D − ) :假设在给定的资源约束下,防守方的判定逻辑可以等效或近似为一个 DFA。我们取其补语言的自动机,即将输出 0 0 0 (放行)的状态设为接受状态集 F D − F_{\mathcal{D}}^- F D − 。
构建乘积自动机图 G mix = G mal × G D − G_{\text{mix}} = G_{\text{mal}} \times G_{\mathcal{D}}^- G mix = G mal × G D − ,其中:
顶点集:V mix = S × V D V_{\text{mix}} = \mathbb{S} \times V_{\mathcal{D}} V mix = S × V D ;
边集:如果在给定字符 c ∈ Σ c \in \Sigma c ∈ Σ 下,系统转移有效且防守方放行,则存在有向边。
邻接矩阵:设 A A A 为图 G mix G_{\text{mix}} G mix 的邻接矩阵,矩阵元素 A i , j A_{i,j} A i , j 表示状态 i i i 到状态 j j j 的合法字符转移数。
设指示向量 u T u^T u T 为初始状态 ( s 0 , q 0 ) (s_0, q_0) ( s 0 , q 0 ) ,向量 v v v 为目标状态集 S U × F D − \mathcal{S}_U \times F_{\mathcal{D}}^- S U × F D − 。那么长度为 N N N 的恶意漏报载荷总数,在图论上严格等价于从起点到终点长度为 N N N 的路径总数:
∣ L gap ∣ ( N ) = u T A N v |L_{\text{gap}}|^{(N)} = u^T A^N v
∣ L gap ∣ ( N ) = u T A N v
就接下来采用 Perron-Frobenius 定理和 Jordan 分解来求 A N A^N A N 的渐进界。
对邻接矩阵 A A A 进行 Jordan 分解:
A = P J P − 1 A = P J P^{-1}
A = P J P − 1
其中,P P P 是可逆矩阵,J J J 是 Jordan 标准型矩阵。J J J 是一个分块对角矩阵,形如 J = diag ( J 1 , J 2 , … , J k ) J = \text{diag}(J_1, J_2, \dots, J_k) J = diag ( J 1 , J 2 , … , J k ) 。对于其中任意一个特征值为 λ i \lambda_i λ i 、阶数为 m i m_i m i 的 Jordan 块 J i J_i J i ,它可以被分解为一个对角矩阵和一个幂零矩阵 N i N_i N i 的和:
J i = λ i I + N i J_i = \lambda_i I + N_i
J i = λ i I + N i
其中 N i N_i N i 是主对角线上方全为 1 1 1 ,其余全为 0 0 0 的矩阵。
对于单个 Jordan 块,由于 λ i I \lambda_i I λ i I 与 N i N_i N i 乘法可交换,我们直接应用二项式定理:
J i N = ( λ i I + N i ) N = ∑ j = 0 N ( N j ) λ i N − j N i j J_i^N = (\lambda_i I + N_i)^N = \sum_{j=0}^N \binom{N}{j} \lambda_i^{N-j} N_i^j
J i N = ( λ i I + N i ) N = j = 0 ∑ N ( j N ) λ i N − j N i j
因为当 j ⩾ m i j \geqslant m_i j ⩾ m i 时,N i j = 0 N_i^j = \mathbf{0} N i j = 0 ,所以上述级数被严格截断:
J i N = ∑ j = 0 min ( N , m i − 1 ) ( N j ) λ i N − j N i j J_i^N = \sum_{j=0}^{\min(N, m_i-1)} \binom{N}{j} \lambda_i^{N-j} N_i^j
J i N = j = 0 ∑ m i n ( N , m i − 1 ) ( j N ) λ i N − j N i j
当 N N N 足够大时,在矩阵 J i N J_i^N J i N 的元素中,多项式系数最大的项出现在 j = m i − 1 j = m_i-1 j = m i − 1 时。此时该项的值严格为:
( N m i − 1 ) λ i N − ( m i − 1 ) \binom{N}{m_i-1} \lambda_i^{N-(m_i-1)}
( m i − 1 N ) λ i N − ( m i − 1 )
此时回到总路径数公式:
∣ L gap ∣ ( N ) = u T ( P J N P − 1 ) v |L_{\text{gap}}|^{(N)} = u^T (P J^N P^{-1}) v
∣ L gap ∣ ( N ) = u T ( P J N P − 1 ) v
令行向量 c T = u T P c^T = u^T P c T = u T P ,列向量 d = P − 1 v d = P^{-1} v d = P − 1 v ,则总路径数是 J N J^N J N 中各个元素的线性组合。当 N → ∞ N \to \infty N → ∞ ,即 N N N 足够大时,A N A^N A N 的增长速度完全由矩阵 A A A 的最大特征值 λ max \lambda_{\max} λ m a x (谱半径)主导。
在渐近复杂度下,常数系数与低阶项被忽略。组合数 ( N m − 1 ) ≈ N m − 1 ( m − 1 ) ! \binom{N}{m-1} \approx \frac{N^{m-1}}{(m-1)!} ( m − 1 N ) ≈ ( m − 1 ) ! N m − 1 ,其关于 N N N 的渐近阶为 N m − 1 N^{m-1} N m − 1 。因此,漏报的载荷总数随着长度 N N N 的增长严格满足渐近关系:
∣ L gap ∣ ( N ) = Θ ( N m − 1 λ max N − m + 1 ) ∼ Θ ( log ( R D ) m − 1 ⋅ R D log ( λ max ) ) |L_{\text{gap}}|^{(N)} = \Theta \left( N^{m-1} \lambda_{\max}^{N - m + 1} \right) \sim \Theta \left( \log(\mathcal{R}_D)^{m-1} \cdot \mathcal{R}_D^{\log(\lambda_{\max})} \right)
∣ L gap ∣ ( N ) = Θ ( N m − 1 λ m a x N − m + 1 ) ∼ Θ ( log ( R D ) m − 1 ⋅ R D l o g ( λ m a x ) )
此时,我们可以看到:
若 λ max = 0 \lambda_{\max} = 0 λ m a x = 0 :图 G mix G_{\text{mix}} G mix 中不存在环,漏报载荷数量有限,防守方在足够长的输入下实现了绝对防御;
若 λ max = 1 \lambda_{\max} = 1 λ m a x = 1 :存在漏洞,但恶意载荷数量呈多项式 Θ ( N m − 1 ) \Theta(N^{m-1}) Θ ( N m − 1 ) 增长;
若 λ max > 1 \lambda_{\max} > 1 λ m a x > 1 :恶意载荷数量随着长度 N N N 呈指数级 Θ ( λ max N ) \Theta(\lambda_{\max}^N) Θ ( λ m a x N ) 爆发。
这里 λ max \lambda_{\max} λ m a x 基本反映了这个系统的漏洞数。
3. 灰盒模型
**现实中肯定不是在 Σ N \Sigma^N Σ N 中进行 ∣ Σ ∣ − N |\Sigma|^{-N} ∣ Σ ∣ − N 的纯随机攻击的。这里我们尝试讨论灰盒攻击的攻击策略。**攻击者虽然初始时没有完整的图 G mix G_{\text{mix}} G mix (即 w 0 = ∅ w_0 = \emptyset w 0 = ∅ ),但系统在每次处理载荷后,客观上会泄漏侧信道信息(如 CPU 分支覆盖率、执行时间、内存消耗)。这时,证据 w w w 不再是静态的,而是一个随时间 t t t 递增的已观测子图 G obs ( t ) ⊆ G mix G_{\text{obs}}^{(t)} \subseteq G_{\text{mix}} G obs ( t ) ⊆ G mix 。(按理来说这里我们应该对黑客模型重新构建,但事实上并不太必要)。
当黑客投递载荷 x x x 时,他能够观测到该载荷在系统内部触发的执行路径 τ ( x ) \tau(x) τ ( x ) ,即一条状态转移边序列。这时知识库的更新过程为:
G obs ( t ) = G obs ( t − 1 ) ∪ τ ( x t ) G_{\text{obs}}^{(t)} = G_{\text{obs}}^{(t-1)} \cup \tau(x_t)
G obs ( t ) = G obs ( t − 1 ) ∪ τ ( x t )
灰盒攻击者投递的分布是一个随着知识库动态更新的条件概率分布:
D fuzz ( ⋅ ∣ G obs ( t ) ) \mathcal{D}_{\text{fuzz}}(\cdot \mid G_{\text{obs}}^{(t)})
D fuzz ( ⋅ ∣ G obs ( t ) )
啊这里定义了后面其实就没有用这个定义。
3.1 灰盒攻击策略
设 G mix = ( V , E ) G_{\text{mix}} = (V, E) G mix = ( V , E ) ,设定我们攻击的目标是找到一条从初始状态 s 0 s_0 s 0 到非安全状态 s k ∈ S U s_k \in \mathcal{S}_U s k ∈ S U 的特定路径 ρ = ( s 0 , ⋯ , s k ) \rho = (s_0, \cdots, s_k) ρ = ( s 0 , ⋯ , s k ) 。
定义一个随机化 Fuzzer :
种子队列 Q \mathbb{Q} Q :Fuzzer 维护所有已发现状态对应的输入载荷。设系统可达状态总数的上限为 ∣ S ∣ |\mathbb{S}| ∣ S ∣ ,因此任何时刻队列的大小 ∣ Q ∣ ⩽ ∣ S ∣ |\mathbb{Q}| \leqslant |\mathbb{S}| ∣ Q ∣ ⩽ ∣ S ∣ ;
纯随机调度 :在每一轮测试 t t t 中,Fuzzer 以均匀分布从 Q \mathbb{Q} Q 中随机抽取一个种子进行变异。因此,选中目标路径上当前前沿状态 s i s_i s i 的概率严格满足:P select ( s i ) = 1 / ∣ Q ∣ ⩾ 1 / ∣ S ∣ P_{\text{select}}(s_i) = 1/|\mathbb{Q}| \geqslant 1/|\mathbb{S}| P select ( s i ) = 1 / ∣ Q ∣ ⩾ 1 / ∣ S ∣ ;
纯随机变异 :假设从 s i s_i s i 转移到 s i + 1 s_{i+1} s i + 1 需要正确变异 c i c_i c i 个字节。Fuzzer 在这 c i c_i c i 个字节上进行均匀随机替换。单次变异命中的概率为 P mutate = ∣ Σ ∣ − c i P_{\text{mutate}} = |\Sigma|^{-c_i} P mutate = ∣ Σ ∣ − c i 。(这里忽略了多项式级别的,找到这 c i c_i c i 个字节的位置的多项式概率 ( N − c i k − c i ) / ( N k ) \binom{N-c_i}{k-c_i}/\binom{N}{k} ( k − c i N − c i ) / ( k N ) )
容易指出 :在任意一轮 t t t 中,如果 Fuzzer 当前已经探索到了状态 s i s_i s i ,那么它在这一轮中成功突破到 s i + 1 s_{i+1} s i + 1 的联合概率 p i p_i p i 严格下界为:
p i = P select ( s i ) ⋅ P mutate ⩾ 1 ∣ S ∣ ⋅ ∣ Σ ∣ c i p_i = P_{\text{select}}(s_i) \cdot P_{\text{mutate}} \geqslant \frac{1}{|\mathbb{S}| \cdot |\Sigma|^{c_i}}
p i = P select ( s i ) ⋅ P mutate ⩾ ∣ S ∣ ⋅ ∣ Σ ∣ c i 1
设随机变量 X i X_i X i 为 Fuzzer 从已经到达 s i s_i s i 的状态开始,直到首次成功触发到达 s i + 1 s_{i+1} s i + 1 所需要的总变异轮数。由于每一轮变异是独立的伯努利试验 ,X i X_i X i 严格服从参数为 p i p_i p i 的几何分布 :
X i ∼ Geo ( p i ) X_i \sim \text{Geo}(p_i)
X i ∼ Geo ( p i )
几何分布的数学期望 为:
E [ X i ] = 1 p i ⩽ ∣ S ∣ ⋅ ∣ Σ ∣ c i \mathbb{E}[X_i] = \frac{1}{p_i} \leqslant |\mathbb{S}| \cdot |\Sigma|^{c_i}
E [ X i ] = p i 1 ⩽ ∣ S ∣ ⋅ ∣ Σ ∣ c i
设突破整条长度为 k k k 的漏洞路径所需的总时间为 T hit T_{\text{hit}} T hit 。显然 T hit = ∑ i = 0 k − 1 X i T_{\text{hit}} = \sum_{i=0}^{k-1} X_i T hit = ∑ i = 0 k − 1 X i 。(事实上这是因为系统会向后续步骤泄露侧信道信息,求和意味着各个阶段相互独立且状态不会回退。)此时,总期望时间 为:
E [ T hit ] = ∑ i = 0 k − 1 E [ X i ] ≤ ∣ S ∣ ∑ i = 0 k − 1 ∣ Σ ∣ c i \mathbb{E}[T_{\text{hit}}] = \sum_{i=0}^{k-1} \mathbb{E}[X_i] \le |\mathbb{S}| \sum_{i=0}^{k-1} |\Sigma|^{c_i}
E [ T hit ] = i = 0 ∑ k − 1 E [ X i ] ≤ ∣ S ∣ i = 0 ∑ k − 1 ∣ Σ ∣ c i
设所有局部突破中最难的一步对应的成功率 为:
p min = min i ( p i ) = 1 ∣ S ∣ ∣ Σ ∣ c max p_{\min} = \min_i (p_i) = \frac{1}{|\mathbb{S}| |\Sigma|^{c_{\max}}}
p m i n = i min ( p i ) = ∣ S ∣ ∣ Σ ∣ c m a x 1
那么 T hit T_{\text{hit}} T hit 随机占优于负二项分布 NB ( k , p min ) \text{NB}(k, p_{\min}) NB ( k , p m i n ) (即 k k k 个 i.i.d. 的分布 Geo ( p min ) \text{Geo}(p_{\min}) Geo ( p m i n ) 之和),从而根据 Chernoff 不等式 ,有 ∀ δ > 0 \forall \delta > 0 ∀ δ > 0 :
Pr ( T hit > ( 1 + δ ) k p min ) ⩽ exp ( − δ 2 2 ( 1 + δ ) k ) \Pr \left( T_{\text{hit}} > (1+\delta) \frac{k}{p_{\min}} \right) \leqslant \exp\left( - \frac{\delta^2}{2(1+\delta)} k \right)
Pr ( T hit > ( 1 + δ ) p m i n k ) ⩽ exp ( − 2 ( 1 + δ ) δ 2 k )
设分配给灰盒攻击者的资源为 R A grey = ( 1 + δ ) k p min \mathcal{R}_A^{\text{grey}} = (1+\delta)\frac{k}{p_{\min}} R A grey = ( 1 + δ ) p m i n k 。若要保证随机化 Fuzzer 能够以概率 ( 1 − ε ) (1-\varepsilon) ( 1 − ε ) 挖出 0-day 漏洞,那么只要:
ε = exp ( − δ 2 2 ( 1 + δ ) k ) \varepsilon = \exp\left( - \frac{\delta^2}{2(1+\delta)} k \right)
ε = exp ( − 2 ( 1 + δ ) δ 2 k )
即:
δ ≈ 2 ln ( 1 / ε ) k \delta \approx \sqrt{\frac{2\ln(1/\varepsilon)}{k}}
δ ≈ k 2 ln ( 1 / ε )
最后我们得到下述结论:
对任意状态空间为 S \mathbb{S} S ,漏洞路径长度 k k k ,最大分支判定长度为 c max c_{\max} c m a x 的防守方保护的系统,在纯随机灰盒 Fuzzing 模型下,以 ( 1 − ε ) (1 - \varepsilon) ( 1 − ε ) 的概率挖出 0-day 漏洞的攻击者理论算力最多只需要:
R A grey ⩽ O ( k ⋅ ∣ S ∣ ⋅ ∣ Σ ∣ c max ⋅ ln ( 1 / ε ) ) \mathcal{R}_A^{\text{grey}} \leqslant O\left( k \cdot |\mathbb{S}| \cdot |\Sigma|^{c_{\max}} \cdot \ln(1/\varepsilon) \right)
R A grey ⩽ O ( k ⋅ ∣ S ∣ ⋅ ∣ Σ ∣ c m a x ⋅ ln ( 1 / ε ) )
反过来,只要灰盒攻击者的资源满足 R A grey > k ⋅ ∣ S ∣ ⋅ ∣ Σ ∣ c max \mathcal{R}_A^{\text{grey}} > k \cdot |\mathbb{S}| \cdot |\Sigma|^{c_{\max}} R A grey > k ⋅ ∣ S ∣ ⋅ ∣ Σ ∣ c m a x ,它在算力耗尽前成功找到漏洞的概率满足:
Pr ( succeed ) ⩾ 1 − exp ( − ( R A ∣ S ∣ ⋅ ∣ Σ ∣ c max ⋅ k − 1 ) 2 2 ⋅ R A ∣ S ∣ ⋅ ∣ Σ ∣ c max ⋅ k ⋅ k ) \Pr(\text{succeed}) \geqslant 1 - \exp\left( - \frac{ \left( \frac{\mathcal{R}_A}{|\mathbb{S}| \cdot |\Sigma|^{c_{\max}} \cdot k} - 1 \right)^2 }{ 2 \cdot \frac{\mathcal{R}_A}{|\mathbb{S}| \cdot |\Sigma|^{c_{\max}} \cdot k} } \cdot k \right)
Pr ( succeed ) ⩾ 1 − exp ⎝ ⎜ ⎜ ⎛ − 2 ⋅ ∣ S ∣ ⋅ ∣ Σ ∣ c m a x ⋅ k R A ( ∣ S ∣ ⋅ ∣ Σ ∣ c m a x ⋅ k R A − 1 ) 2 ⋅ k ⎠ ⎟ ⎟ ⎞
3.2 受限资源防御下攻击导向的随机化灰盒分析
我们把我们的视角从整个图 G mix G_{\text{mix}} G mix 转移到考虑找到集合 L gap ( N ) L_{\text{gap}}^{(N)} L gap ( N ) 中的任意一条路径 。这时资源约束仍然为 N = log R D N = \log \mathcal{R}_D N = log R D ,此时也有渐进关系 ∣ L gap ∣ ( N ) = Θ ( N m − 1 λ max N − m + 1 ) |L_{\text{gap}}|^{(N)} = \Theta(N^{m-1}\lambda_{\max}^{N-m+1}) ∣ L gap ∣ ( N ) = Θ ( N m − 1 λ m a x N − m + 1 ) 。
设 Fuzzer 突破整个 L gap L_{\text{gap}} L gap 路径需要经过 k k k 个节点,且在第 i i i 个节点 s i s_i s i 攻击者需要变异长度为 c i c_i c i 的字符。此时,由于 L gap L_{\text{gap}} L gap 是一个大的目标集合,所以有效分支会增加为 d i d_i d i 个,此时单步随机变异命中的客观概率为:
P mutate , i = d i ⋅ ∣ Σ ∣ − c i P_{\text{mutate}, i} = d_i \cdot |\Sigma|^{-c_i}
P mutate , i = d i ⋅ ∣ Σ ∣ − c i
同时注意到 :
∏ i = 1 k d i = ∣ L gap ∣ ( N ) = Θ ( N m − 1 λ max N ) \prod_{i=1}^k d_i = |L_{\text{gap}}|^{(N)} = \Theta(N^{m-1}\lambda_{\max}^N)
i = 1 ∏ k d i = ∣ L gap ∣ ( N ) = Θ ( N m − 1 λ m a x N )
以及同时,载荷总长度守恒 :
∑ i = 1 k c i = N \sum_{i=1}^k c_i = N
i = 1 ∑ k c i = N
Fuzzer 在第 i i i 步的单次联合成功概率为 p i = 1 ∣ Q ∣ ⋅ d i ∣ Σ ∣ − c i p_i = \frac{1}{|\mathbb{Q}|} \cdot d_i |\Sigma|^{-c_i} p i = ∣ Q ∣ 1 ⋅ d i ∣ Σ ∣ − c i 。保守估计 ∣ Q ∣ ≤ ∣ S ∣ |\mathbb{Q}| \le |\mathbb{S}| ∣ Q ∣ ≤ ∣ S ∣ 。完成该步突破的期望时间(几何分布期望)为:
E [ X i ] = 1 p i ⩽ ∣ S ∣ ⋅ ∣ Σ ∣ c i d i \mathbb{E}[X_i] = \frac{1}{p_i} \leqslant |\mathbb{S}| \cdot \frac{|\Sigma|^{c_i}}{d_i}
E [ X i ] = p i 1 ⩽ ∣ S ∣ ⋅ d i ∣ Σ ∣ c i
完成整个 L gap L_{\text{gap}} L gap 路径搜索的总期望时间 μ \mu μ 为各独立阶段期望之和 :
μ = ∑ i = 1 k E [ X i ] ≤ ∣ S ∣ ∑ i = 1 k ∣ Σ ∣ c i d i \mu = \sum_{i=1}^k \mathbb{E}[X_i] \le |\mathbb{S}| \sum_{i=1}^k \frac{|\Sigma|^{c_i}}{d_i}
μ = i = 1 ∑ k E [ X i ] ≤ ∣ S ∣ i = 1 ∑ k d i ∣ Σ ∣ c i
总和往往被瓶颈控制 ,设对于 b b b 恰有:
∣ Σ ∣ c b d b = max 1 ≤ i ≤ k ( ∣ Σ ∣ c i d i ) \frac{|\Sigma|^{c_b}}{d_b} = \max_{1 \le i \le k} \left( \frac{|\Sigma|^{c_i}}{d_i} \right)
d b ∣ Σ ∣ c b = 1 ≤ i ≤ k max ( d i ∣ Σ ∣ c i )
即:
μ = Θ ( ∣ S ∣ ⋅ ∣ Σ ∣ c b d b ) \mu = \Theta \left( |\mathbb{S}| \cdot \frac{|\Sigma|^{c_b}}{d_b} \right)
μ = Θ ( ∣ S ∣ ⋅ d b ∣ Σ ∣ c b )
同理可得:
Pr ( success ) ⩾ 1 − exp ( − ( R A − μ ) 2 2 ⋅ R A ⋅ μ ⋅ k ) \Pr(\text{success}) \geqslant 1 - \exp\left( - \frac{ ( \mathcal{R}_A - \mu )^2 }{ 2 \cdot \mathcal{R}_A \cdot \mu } \cdot k \right)
Pr ( success ) ⩾ 1 − exp ( − 2 ⋅ R A ⋅ μ ( R A − μ ) 2 ⋅ k )
中间尝试引入 λ max \lambda_{\max} λ m a x 但失败了,因为我们这里将 Fuzzer 完全随机化了,并不能看到 λ max \lambda_{\max} λ m a x 大小对 Fuzzing 能力的影响。这也印证了一句话:系统有多危险,从来不取决于它包含了多少个高危漏洞,而仅仅取决于通往这些漏洞的最短路径上,最容易被绕过的那道门槛有多低。 额,当然你硬要说瓶颈间接依赖于 λ max \lambda_{\max} λ m a x 也行,毕竟我们也是有相关约束在的。