Page 207 - 《软件学报》2025年第10期
P. 207
4604 软件学报 2025 年第 36 卷第 10 期
3.1.2 变异算子序列优化测试
在对用于测试变异效果的代码切片进行变异之前, 首先需要得到一些最优变异算子序列. 这些最优变异算子
序列是无漏洞或仅含 UAF 漏洞的公开代码切片, 经过插入特征语句后形成的 CUAF 漏洞代码切片. 对同一切片
的两段代码进行抽象语法树变异至其变异样本覆盖了 CUAF 漏洞代码后, 对其变异过程进行多次回溯. 回溯过程
中通过对每次变异样本覆盖了 CUAF 漏洞代码时变异算子执行顺序的记录, 根据 MOPSG 算法调整各个变异算子
的权重. 除了第 2.3 节中由演化规律得到的 5 个变异算子外, 虽然其他变异算子不具有较强的针对 CUAF 漏洞演
化的导向性, 但是为了保证能覆盖可能出现的任何代码缺陷而触发的 CUAF 漏洞, 在本实验研究最优变异算子序
列时依然需要对这些普通变异算子的顺序进行调整.
由于本实验会对代码切片进行全排列的剪切操作, 为了初步得到有效的最优变异算子序列, 综合考虑了时间、
效率等因素, 从 CVE 中选取了代码切片规模合适且特征明显的 5 个 UAF 漏洞代码切片. 充分考虑并发执行相关
的资源分配、数据传递、数据同步和参数设置等因素 [37,38] , 依据相关研究 [39] 指出的并发缺陷的死锁、数据竞争、
原子性违背和顺序违背这 4 个特征, 运用对并发缺陷的检测和规避技术, 构造出尽可能接近真实缺陷代码的 CUAF
漏洞代码切片.
在对 CVE 的 5 个 UAF 漏洞代码切片进行 CUAF 漏洞植入时, 加入线程声明语句以提高并发执行的并发度,
选择在访问共享变量的某些线程上加入互斥锁与信号量以适当改变代码数据竞争关系, 进而改变代码原子性执行
顺序, 例如图 8 所示的以 CVE-2018-21008 代码为基础的缺陷植入切片, 通过蓝色语句的植入, 触发了基于多线程
的 UAF 缺陷.
样本: CVE-2018-21008 部分代码
1 pthread_mutex_t lock_t;
2 struct ieee80211_hw *hw = adapter->hw;
3 void rsi_mac80211_detach()
4 {
5 enum nl80211_band band;
6 if (hw) {
7 ieee80211_stop_queues(hw);
8 ieee80211_unregister_hw(hw);
9 sem.wait();
10 ieee80211_free_hw(hw);
11 }
12 ...
13 }
14 void rsi_indicate_tx_status(struct rsi_hw *adapter,struct sk_buff *skb,int status)
15 {
16 pthread_mutex_lock(&lock_t);
17 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
18 struct skb_info *tx_params;
19 ...
20 }
图 8 CVE-2018-21008 部分代码
首先对这些仅含有 UAF 漏洞的原始代码片段进行随机变异, 记录他们变异时变异算子执行结果, 并对所有变
异样本集合进行对比核验, 找到插入 CUAF 漏洞特征后的样本在所有变异样本集合中首次出现的位置. 如算法 2
所示, 根据变异算子执行时的位置向量, 计算出在一轮变异中每个变异算子的得分. 由于本实验代码切片规模较
小, 且参与权重调整的变异算子种类较少, 所以可以根据结果直接按照得分大小增减变异算子权重. 所有变异算子
对应新的权重将在下一轮测试中决定其新的执行情况.

