提交 6d35f2dd 编写于 作者: Z ZhidanLiu

add fuzzer design

上级 decf4146
......@@ -11,3 +11,4 @@
design/mindinsight/graph_visual_design
design/mindinsight/tensor_visual_design
design/mindarmour/differential_privacy_design
design/mindarmour/fuzzer_design
# AI模型安全测试
<!-- TOC -->
- [AI模型安全测试](#ai模型安全测试)
- [背景](#背景)
- [Fuzzer设计图](#Fuzzer设计图)
- [Fuzzer流程](#Fuzzer流程)
- [代码实现](#代码实现)
- [参考文献](#参考文献)
<!-- /TOC -->
<a href="https://gitee.com/mindspore/docs/blob/master/docs/source_zh_cn/design/mindarmour/fuzzer_design.md" target="_blank"><img src="../../_static/logo_source.png"></a>
## 背景
不同于[传统程序的Fuzz安全测试](https://zhuanlan.zhihu.com/p/43432370),MindArmour针对深度神经网络,提供AI模型安全测试模块Fuzzer。根据神经网络的特点,引入神经元覆盖率[1]的概念,作为Fuzz的测试指导,引导Fuzz朝神经元覆盖率增加的方向生成样本,让输入能够激活更多的神经元,神经元值的分布范围更广,以充分测试DNN,探索不同类型的模型输出结果、模型错误行为。
## Fuzzer设计图
AI模型安全测试设计图如下。
![fuzz_architecture](./images/fuzz_architecture.png)
在用户接口层,需要用户提供原始数据集`DataSet`、被测试模型`Model`和配置Fuzzer参数`Fuzzer configuration`。Fuzzer模块对模型和数据进行Fuzz测试后,返回安全评估报告`Security Report`
Fuzzer架构主要包括三个模块:
1. Natural Threat/Adversarial Example Generator(数据变异模块):
随机选择变异方法对种子数据变异生成多个变种。支持多种样本的变异策略, 包括:
- 图像仿射变换方法如:平移、旋转、缩放、错切。
- 基于图像像素值变化的方法如:改变对比度、亮度、模糊、加噪。
- 基于对抗攻击的白盒、黑盒对抗样本生成方法,如FGSM、PGD、MDIIM。
2. Fuzzer moduler(变异指导模块):
对变异生成的数据进行fuzz测试,观察神经元覆盖率的变化情况,如果生成的数据使得神经元覆盖率增加,则加入变异的种子队列,用于下一轮的数据变异。目前支持的神经元覆盖率指标包括KMNC、NBC、SNAC[2]。
3. Evaluation(评估模块):
评估Fuzzer效果,生成数据的质量,变异方法的强度。支持3个类型5种指标,包括通用评价指标:accuracy,神经元覆盖率指标:kmnc, nbc,snac,对抗攻击评价指标:attack_success_rate。
## Fuzzer流程
![fuzz_process](./images/fuzz_process.png)
具体的Fuzzer流程如下:
1. 根据策略从种子队列中选择一个种子A。
2. 随机选择变异策略,对种子A进行变异,生成多个变种数据A1,A2...
3. 用目标模型对变种A1,A2...进行预测,如果变种使得目标模型预测错误,则改变种进入Failed tests。
4. 若目标模型对于变种的预测结果是正确的,用神经元覆盖率指标进行分析。
5. 如果变种使得覆盖率增加,那么将该变种放入种子队列,用于下一轮变异。
通过多轮循环,我们获得一系列变异数据Fuzzed Tests,并进一步分析,从多个角度给出安全报告。可以用于深入分析神经网络模型的缺陷,从而针对这些缺陷,进行模型增强等,改善提升模型的通用性、鲁棒性。
## 代码实现
1. [fuzzing.py](https://gitee.com/mindspore/mindarmour/blob/master/mindarmour/fuzzing/fuzzing.py):Fuzzer总体流程。
2. [model_coverage_metrics.py](https://gitee.com/mindspore/mindarmour/blob/master/mindarmour/fuzzing/model_coverage_metrics.py):神经元覆盖率指标,包括KMNC,NBC,SNAC。
3. [image_transform.py](https://gitee.com/mindspore/mindarmour/blob/master/mindarmour/fuzzing/image_transform.py):图像变异方法,包括基于像素值的变化方法和仿射变化方法。
4. [adversarial attacks](https://gitee.com/mindspore/mindarmour/tree/master/mindarmour/attacks):对抗样本攻击方法,包含多种黑盒、白盒攻击方法。
## 参考文献
[1] Pei K, Cao Y, Yang J, et al. Deepxplore: Automated whitebox testing of deep learning systems[C]//Proceedings of the 26th Symposium on Operating Systems Principles. ACM, 2017: 1-18.
[2]Ma L, Juefei-Xu F, Zhang F, et al. Deepgauge: Multi-granularity testing criteria for deep learning systems[C]//Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering. ACM, 2018: 120-131.
\ No newline at end of file
......@@ -18,7 +18,7 @@
传统软件的决策逻辑由代码逻辑决定,传统软件通过代码行覆盖率来判断当前测试是否充分,理想情况下覆盖率越高,代码测试越充分。然而,对于深度神经网络而言,程序的决策逻辑由训练数据、网络模型结构和参数通过某种黑盒机制决定,代码行覆盖率已不足以评估测试的充分性。需要根据深度网络的特点选择更为适合的测试评价准则,指导神经网络进行更为充分的测试,发现更多的边缘错误用例,从而确保模型的通用性、鲁棒性。
MindArmourd的Fuzzer模块以神经元覆盖率作为测试评价准则。神经元覆盖率,是指通过一组输入观察到的、激活的神经元数量和神经元输出值的范围。我们通过神经元覆盖率来指导输入变异,让输入能够激活更多的神经元,神经元值的分布范围更广,从而探索不同类型的模型输出结果、错误行为。
MindArmour的Fuzzer模块以神经元覆盖率作为测试评价准则。神经元覆盖率,是指通过一组输入观察到的、激活的神经元数量和神经元输出值的范围。我们通过神经元覆盖率来指导输入变异,让输入能够激活更多的神经元,神经元值的分布范围更广,从而探索不同类型的模型输出结果、错误行为。
这里以LeNet模型,MNIST数据集为例,说明如何使用Fuzzer。
......@@ -135,13 +135,13 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target)
eval_metrics =['accuracy', 'kmnc', 'attack_success_rate']
```
3. 初始化种子队列,种子队列中的每个种子,包含3个值:原始图片、图片标签、变异标记。变异标记初始化时均为0
3. 初始化种子队列,种子队列中的每个种子,包含3个值:原始图片、图片标签。
```python
# make initial seeds
initial_seeds = []
for img, label in zip(test_images, test_labels):
initial_seeds.append([img, label, 0])
initial_seeds.append([img, label])
initial_seeds = initial_seeds[:100]
```
......@@ -184,7 +184,7 @@ context.set_context(mode=context.GRAPH_MODE, device_target=cfg.device_target)
Neural_coverage_KMNC: 0.4797
```
Fuzz测试前种子的KMNC神经元覆盖率为8.5%,Fuzz后,KMNC神经元覆盖率为47.97%,神经元覆盖率提升,样本的多样性提升。Fuzz后,模型对于Fuzz生成样本的准确率为96.8%,使用了对抗攻击方法的样本,攻击成功率为79.29%。由于初始化种子、变异方法和相应的参数均为随机选择的,结果有一定的浮动是正常的。
Fuzz测试前种子的KMNC神经元覆盖率为8.5%,Fuzz后,KMNC神经元覆盖率为47.97%,神经元覆盖率提升,样本的多样性提升。Fuzz后,模型对于Fuzz生成样本的准确率为79.29%,使用了对抗攻击方法的样本,攻击成功率为47.97%。由于初始化种子、变异方法和相应的参数均为随机选择的,结果有一定的浮动是正常的。
原始图片:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册