【翻译】Poison Frogs! Targeted Clean-Label Poisoning Attacks on Neural Networks

安全 同时被 3 个专栏收录
9 篇文章 0 订阅
15 篇文章 0 订阅
7 篇文章 0 订阅

文章标题:毒蛙!针对神经网络的干净标签的中毒攻击-NeurIPS 2018

摘要

数据中毒是对机器学习模型的攻击,攻击者将样本添加到训练集中,以便在测试时操纵模型的表现。本文探讨了对神经网络的中毒攻击。提出的攻击使用“干净的标签”;它们不要求攻击者对训练数据的标签有任何控制。它们也是有目的的;它们控制特定测试实例上分类器的表现,而不会降低整个分类器的性能。例如,攻击者可以在人脸识别引擎的训练集中添加一个看似无害的图像(这是被正确标记的),并在测试时控制被选中的人的身份。由于攻击者不需要控制标签功能,因此只需将毒物留在网络上,等待它们被数据收集机器人(爬虫)抓取,就可以将毒物输入到训练集中。
提出了一种基于优化的毒物生成方法,并证明了在迁移学习的情况下,单幅毒物图像就能控制分类器的行为。对于完整的端到端训练,我们提出了一种”水印”策略,使用多个(≈50)中毒的训练样本来保证毒害的可靠性。我们通过从CIFAR数据集生成中毒的青蛙图像并使用它们来操纵图像分类器来论证我们的方法。

1. 引言

在将深度学习算法部署到高风险、安全关键的应用程序中之前,必须测试它们对对抗性攻击的鲁棒性。深层神经网络(DNNs)中存在对抗样本,引发了关于这些分类器的安全性的辩论[Szegedy等人,2013年;GoodFelet al.,2015年;Biggio等人,2013年]。对抗性的例子属于一类被称为逃避攻击(evasion attacks)的攻击。逃避攻击发生在测试时——修改干净的目标实例以逃避分类器的检测,或导致错误分类。但是,这些攻击并不能映射到特定的现实场景,在这些场景中攻击者无法控制测试时的数据。例如,假设零售商通过基于ML的垃圾邮件过滤器将竞争对手的电子邮件标记为垃圾邮件。逃逸攻击不适用,因为攻击者无法修改受害者的电子邮件。同样,敌人可能无法改变在监督条件下工作的人脸识别引擎的输入,如安检台或大楼入口处。这类系统仍然容易受到数据中毒攻击。这些攻击发生在训练时间;他们的目的是通过在训练数据中插入精心构造的毒物样本来操纵系统的性能。

本文研究了针对神经网络的中毒攻击,这意味着它们的目标是在一个特定的测试实例上控制分类器的行为。例如,他们操纵人脸识别引擎来更改特定人员的身份,或者操纵垃圾邮件过滤器来允许/拒绝攻击者选择的特定电子邮件。我们提出了不需要控制标签功能的干净标签攻击;据一位专家观察者说,中毒的训练数据似乎被正确地贴上了标签。这不仅使攻击难以检测,而且为攻击者打开了成功的大门,而无需访问任何内部数据收集/标记过程。例如,对手可以将中毒的图像放到网上,然后等待一个从网络收集数据的机器人对它们进行抓取。上面描述的零售商可以通过给组织中的人员发电子邮件来给垃圾邮件过滤贡献数据集。

1.1 相关工作

经典的中毒攻击不加区别地降低了测试的准确性,而不是针对特定的例子,使它们更容易被发现。虽然有关于支持向量机上的中毒攻击的研究[Biggio等人,2012年]或Bayes分类器[Nelson等人,2008年],但对深层神经网络的中毒攻击(DNN)很少被研究。在现有的少数研究中,DNN已被证明对数据中毒攻击具有灾难性的失效。Steinhardt等人[2017]报告说,即使在强大的防御下,当攻击者被允许对训练集进行3%的修改时,测试的准确性也会降低11%。Muoz-González等人[2017]提出了一种基于后梯度的产生毒物的方法。为了加快产生中毒事例的过程,Yang等人[2017]研制一种产生毒物的发生器。

更危险的方法是攻击者瞄准特定的测试实例。例如,上面提到的零售商,除了达到她的目标之外,不想让垃圾邮件过滤器失效,也不想让受害者知道她的攻击存在。有针对性的后门攻击(Chen等人,2017)使用有限的资源(∼50训练示例),最近被证明导致分类器在特殊测试示例中失败。顾等[2017]使用带有特殊图案标记的错误标签标记图像训练网络,使分类器了解图案和类标签之间的关联。在刘等人[2017]对网络进行了应对特洛伊木马触发器的训练。

**这些攻击与逃避攻击具有相同的缺点;它们需要修改测试时实例以触发预测失误。**此外,在大多数先前的工作中,攻击者被假定对训练集中的样本的标记过程有某种程度的控制。这无意中排除了真实的场景,即训练集由人工审核人员审核,审核人员会在每个示例出现时为其贴上标签,或者标签由外部进程分配(例如经常收集由第三方反病毒标记的ground-truth的恶意软件检测程序)。假设对标签功能的控制导致了一次简单的一次性攻击,其中带有翻转标签的目标实例被作为毒物添加。对毒物的过拟合将确保目标实例在推理时被错误分类。与我们最密切相关的工作是Suciu等人做的[2018],研究了针对神经网络的攻击。然而,这种攻击要求毒药在每一小批中至少占12.5%(最大100%),这在实际中可能是不现实的。相反,我们的攻击不需要对小型批次过程进行任何控制,并且假设中毒预算要小得多(<0.1%比>12.5%)。

最后,我们注意到有几部文献从理论的角度探讨了中毒问题。Mahloujifar和Mahmoody[2017],Mahloujifar等人[2017]从理论的角度研究中毒威胁模型,在Diakonikolas等人案中[2016年]考虑了分类器对训练数据扰动的鲁棒性。

1.2 贡献

在这项工作中,我们研究了一种新的攻击类型,从此以后称为干净标签攻击,攻击者注入的训练示例被认证机构清晰地标记,而不是被攻击者自己恶意地贴上标签。我们的策略假设攻击者不了解训练数据,而是了解模型及其参数。这是一个合理的假设,因为许多在标准数据集上预先培训过的经典网络,例如在Imagenet上培训过的Resnet[He et al.,2015]或Inception[Szegedy et al.,2014]经常被用作特征提取器。攻击者的目标是当网络在包含中毒实例的增强数据集上进行重新训练后,使重新训练的网络将一个特定测试实例从一个类(例如一个恶意软件)错误地分类为她选择的另一个类(例如良性应用程序)。除了目标的预期预测错误之外,受害的分类器的性能下降并不明显。这使得最先进的衡量训练实例(如Barreno等人,[2010])的性能影响的中毒防御措施无效。

使用影响函数(Koh和梁[2017])演示了类似类型的攻击,在这种情况下,只有网络的最后全连接层在中毒数据集上被重新训练,成功率为57%。在Koh和梁(2017)研究的迁移学习场景下,我们演示了一种基于优化的干净标签攻击,但是在相同的狗和鱼分类任务上,我们获得了100%的攻击成功率。此外,我们第一次研究了干净标签中毒在端到端训练场景中的作用,在这种情况下,网络的所有层都进行了再训练。通过可视化,我们揭示了为什么由于深层网络的表现力,这个场景要困难得多。在这些可视化的指导下,我们在一个深网络上进行了一个50个中毒实例的攻击,在端到端的训练场景中达到了高达60%的成功率。

2. 一种简单的干净标签攻击

我们现在提出了一种基于优化的过程,用于制作毒物实例,当添加到训练数据中时,操纵分类器的测试时的表现。稍后,我们将讨论如何提高这种简单攻击的威力。

攻击者首先从测试集中选择一个目标实例;一次成功的中毒攻击将导致此目标实例在测试期间被错误分类。接下来,攻击者从基类中采样一个基本实例,并对其进行潜移默化的更改,以创建一个中毒实例;为了欺骗模型,在测试时将目标实例标记为基本标签。最后,对模型进行中毒数据集(干净数据集+物实例)的训练。如果在测试时,模型将目标实例错误地定位在基类中,那么中毒攻击就被认为是成功的。

2.1 通过特征碰撞生成有害数据

让f(x)表示将输入x通过网络传播到倒数第二层(SoftMax层之前)的函数。我们将这一层的激活称为输入的特征空间表示,因为它编码了高级语义特征。由于f的高度复杂性和非线性,可以在特征空间中找到与目标“碰撞”的例子x。同时,在输入空间中同时接近基实例b,通过计算:
p = a r g m i n x ∣ ∣ f ( x ) − f ( t ) ∣ ∣ 2 2 + β ∣ ∣ x − b ∣ ∣ 2 2      式 ( 1 ) p = \underset{x}{argmin} || f(x) - f(t)||^2_2 + \beta || x - b ||_2 ^2 \space \space \space \space 式(1) p=xargminf(x)f(t)22+βxb22    (1)

方程1最右面一项使中毒实例p对于一个人类标记人员来说显得像是一个基础类别实例,(β参数化了这一点的程度),因此它会被这样标记。同时,方程1的第一项使毒实例在特征空间中移向目标实例,并嵌入目标类分布中。在一个干净的模型上,这个毒物实例将被错误分类为目标。但是,如果模型在干净的数据+毒物实例上重训练,那么特征空间中的线性决策边界将被旋转,将毒实例标记为基类。由于目标实例在附近,所以决策边界旋转可能会无意中包含基类中的目标实例以及毒物实例(注意,训练是为了正确地分类毒物实例,而不是目标,因为后者不是训练集的一部分)。这允许未受干扰的目标实例(随后在测试时被错误地分类到基类中)获取到进入基类中的“后门”。

2.2 优化过程

我们在算法1中展示在等式1中执行优化的过程,以获得p。该算法采用前向后分裂迭代法[Goldstein等人,2014]。第一步(向前)只是一个梯度下降更新,以在特征空间最小化到目标实例的L2距离。第二步(反向)是在输入空间中将Frobenius与基实例之间的距离最小化的近端更新。在输入空间中,调整系数β 以使得毒物实例在输入空间看起来真实,足以欺骗毫无戒心的人类观察者认为攻击矢量图像没有被篡改。
算法1

3. 迁移学习中的中毒攻击

我们首先研究迁移学习的情况,在这种情况下,使用预先训练的特征提取网络,只有最终的网络(Softmax)层被训练,以使网络适应特定的任务。这个过程在工业中很常见,我们希望在有限的数据上训练一个健壮的分类器。在这种情况下,中毒攻击是非常有效的。在第四节中,我们将这些攻击概括为端到端训练的情况。

我们做了两次中毒实验。首先,我们攻击预先训练的Inception V3 [Szegedy等人,2016]网络,在不包括最后一层的所有层的权重被冻结的情况下。我们的网络和数据集(ImageNet [Russakovsky等人,2015] dog-VS-fish)与Koh和梁[2017]的网络和数据集相同。其次,我们攻击了krizhevsky和Hinton[2009]为CIFAR-10数据集修改的AlexNet体系结构,在这种情况下,所有层都经过了训练。1

3.1 一个一击必杀的攻击

我们现在提出了一个简单的在转移学习网络中的中毒攻击。在这种情况下,“一枪杀死”攻击是可能的;通过在训练集中添加一个毒物实例(即由可靠的专家标记),我们就能以100%的成功率对目标进行错误分类。就像在Koh和梁[2017]一样,我们基本上利用Inception V3作为一个特征提取器,并重新训练它最终全连接层的权重,以便在狗和鱼之间进行分类。我们从ImageNet中的每个类中选择900个实例作为训练数据,并从训练数据中删除测试数据中的重复项作为预处理步骤。

之后,我们将保留1099个测试实例(针对狗类的698个测试实例和401个鱼类类别的测试实例)。我们从测试集中选择目标实例和基本实例,并使用maxIters=1000的算法1创建一个毒实例。由于ImageNet中的图像具有不同的维数,所以我们用 β = β 0 ∗ 204 8 2 / ( d i m b ) 2 \beta = \beta_0 * 2048^2 / (dim_b)^2 β=β020482/(dimb)2来计算式1的β,它采用了基实例( d i m b dim_b dimb)的维数和Inception V3的特征空间表现层(2048)的维数考虑在内。我们在实验中使用 β 0 = 0.25 β_0=0.25 β0=0.25。然后,我们将毒实例添加到训练数据中,并执行冷启动训练(所有未冻结的权值初始化为随机值)。我们使用具有0.01的学习速率的ADAM优化器对100个epochs的网络进行训练。

实验进行了1099次-每次以不同的测试集图片作为目标实例-获得了100%的攻击成功率。作为比较,KOH和梁[2017]研究的影响函数法的成功率为57%。中位错误分类置信度为99.6%(图1b)。此外,总体试验准确度几乎不受中毒影响,平均下降0.2%,最差情况为0.4%,在所有试验中从原来的99.5%。一些样本目标实例及其相应的中毒实例如图1a所示。

请注意,在迁移学习任务上获得100%的成功率通常是不可能的。我们之所以能够在dog-VS-fish任务上使用inception v3获得如此高的成功率,是因为有更多的可训练权重(2048)相比于比训练例子(1801)。只要数据矩阵不包含重复图像,则需要求解以找到权重向量的方程组,并对所有训练数据进行过度拟合。则需要求解的方程组对于所有的训练数据都是欠确定的,对所有训练数据的过度拟合是肯定会发生的。

在这里插入图片描述
在这里插入图片描述
(b)不正确的类别概率直方图预测的目标图像清洁(暗红色)和中毒(深蓝色)模型。当在中毒的数据集上进行训练时,目标实例不仅被错误分类了,还具有很高的置信度。

图1:迁移学习中毒攻击。(a)顶部行包含5个随机目标实例(来自“FISH”类)。第二行包含与这些目标中的每一个对应的构造的毒物实例。我们使用相同的基本实例(第二行,最左边的图像)来构建每个有害实例。这种攻击对任何基础都是有效的,但是如果基图像具有较高的分辨率,则需要更少的迭代。当满足最大迭代或目标和毒实例的特征表示小于3个单元时(以欧氏范数表示),我们停止了毒物生成算法。停止阈值“3”由各训练点之间的最小距离决定。可以看到,有毒实例在视觉上与基本实例(以及彼此之间)是无法区分的。第3行和第4行显示来自类似实验的样本,其中目标(鱼)和基类(狗)被交换。

为了更好地理解是什么导致攻击成功,我们绘制了干净的和中毒的网络的决策边界之间的角度偏差(即权重向量之间的角度差)。如图2所示(蓝色条形和线条)。角偏差是对中毒实例的再训练使决策边界旋转到包含基本区域内的中毒实例的程度。这种偏差主要发生在如图2b所示的第一个epoch中,这表明即使使用次优再训练超参数,攻击也可能成功。平均23度的最终偏差(图2a)表明,毒物实例对最终层的决策边界进行了实质性更改。这些结果验证了我们的直觉,即目标的错误分类是由于决策边界的变化造成的。

而我们的主要公式1通过“L2度量”促进毒物和基本图像之间的相似性,当我们通过L∞界为2(从动态范围255)促进相似性时,获得的成功率为100%,就像在Koh和梁[2017]中所做的那样。实验的细节在补充材料中作了介绍。

这里的实验是在一个二元分类任务上进行的(“狗”和“鱼”)。然而,对许多类别的问题没有施加相同的中毒程序的限制。在补充材料中,我们提出了额外的实验,其中引入了一种新的类“cat”,并且我们表明,在保持干净测试图像上96.4%的准确率的同时,在3向任务上仍然达到了100%的中毒成功率。

在这里插入图片描述

图2:使用干净的数据集+毒物实例训练的特征空间决策边界的角度偏差与单独使用干净数据集训练时的角度偏差。(a)所有实验的最终(最后一个epoch)角偏差的直方图。在迁移学习(蓝色)中,特征空间决策边界存在显著的旋转(平均23度)。相反,在端到端训练(RED)中,我们注入50个毒物实例,决策边界的旋转是可以忽略不计的。(b)大部分参数调整是在第一个epoch进行的。对于端到端的训练实验,决策边界几乎没有变化。

4. 对端到端训练的中毒攻击

我们在第三节中看到,中毒攻击对迁移学习是非常有效的。当所有层都可以训练时,这些攻击就变得更加困难。然而,使用“水印”技巧和多个毒实例,我们仍然可以有效地毒害端到端网络。

我们的端到端实验集中于cifar-10数据集的缩小的alexnet体系结构(详见附录)。先用预训练权值初始化(热启动),再用ADAM学习率为1.85×10−5,在批数为128个的10个epoch内进行优化。
由于热启动,在网络调整以正确分类毒物后的最后几个epochs,损失是恒定的。

4.1 单毒实例攻击

我们从一个说明性的示例开始,该示例说明了使用单个毒物实例攻击网络。我们的目标是构思毒药对网络行为的影响,并解释为什么端到端训练下的中毒攻击比迁移学习更难。实验中,我们随机选择“飞机”作为目标类,“青蛙”作为基类。对于创建有害实例,我们使用的β值为0.1,迭代次数为12000。图3a显示了通过将193维深特征向量投影到二维平面上而可视化的目标、基和毒特征空间表示。第一维是沿着加入基类和目标类的质心的向量( u = µ b a s e − µ t a r g e t u = µ_{base} - µ_{target} u=µbaseµtarget),而第二维则是沿u正交的向量,在u和θ所覆盖的平面上(倒数第二层的权重向量,即对决策边界的法向)。这个投影允许我们从一个最好地表示两个类(目标和基)分离的观点来可视化数据分布。

然后,通过使用干净数据+单个毒物实例来训练模型来评估中毒攻击。图3a显示了目标、基和毒实例的特征空间表示,以及在干净(未填充标记)和中毒(填充标记)模型下的训练数据。在它们干净的模型特征空间表示中,目标实例和毒实例是重叠的,这表明我们的毒工艺优化过程(算法1)是可行的。奇怪的是,与迁移学习场景不同的是,最后一层决策边界旋转以适应基区域内的毒实例,端到端训练场景中的决策边界在经过中毒数据集再训练后保持不变,如图2中的红色条形图和线所示。

据此,我们提出以下重要意见:在使用毒数据进行再训练期间,网络修改其浅层中的低级特征提取卷积核,以便将毒实例返回到深层中的基类分布中。

在这里插入图片描述

图3:端到端训练中毒攻击的特征空间可视化。(a)单个毒物实例无法成功攻击分类器。CLEAN模型下毒物实例的特征空间位置与目标实例的特征空间位置重叠。然而,当模型被训练在干净+中毒数据(即中毒模型)上时,中毒实例的特征空间位置返回给基类分布,而目标保留在目标类分布中。(b)为了使攻击成功,我们从50个具有30%不透明度目标实例的“水印”随机基实例中构造了50个有毒实例。这将导致目标实例从目标类分布(在特征空间中)中提取到基类分布中,并被错误地归类为基类。

换句话说,毒实例生成利用了早期层中的特征提取卷积核中的缺陷,从而在特征空间中将毒实例放置在目标旁边。当网络被重新训练到这个有害的实例上,因为它被标记为一个基,那么那些早期的特性卷积核缺陷就会被纠正,并且将毒实例返回给基类分发。这一结果表明,毒物实例生成和网络训练的目标是相互对立的,因此,一个单一的毒物可能不足以损害甚至极端的外部目标的例子。为了使攻击成功,我们必须找到一种方法,以确保目标和毒实例在再培训时不会在特征空间中分离。

4.2 水印:一种增强中毒攻击威力的方法

为了防止训练中的毒物和目标分离,我们使用了一个简单而有效的技巧:将目标实例的低不透明度水印添加到中毒实例中,以允许某些不可分割的特性重叠,同时保持视觉上的不同。这会将目标实例的某些特性混合到毒实例中,并且即使经过再训练,也会使毒实例保持在目标实例的特征空间附近。水印技术在Chen等人中有广泛的应用[2017],但他们的工作需要在推理时间内应用水印,在攻击者无法控制目标实例的情况下,这是不现实的。
在这里插入图片描述
在60次随机中毒案例中,有12次成功地导致鸟类目标实例在端到端训练场景中被错误地归类为狗。在制造毒物时,将目标鸟实例的对抗水印(不透明度30%)应用于基本实例。
在这里插入图片描述
(a)攻击最离群的目标飞机。条形图表示攻击前目标实例的概率(使用预先训练的网络计算)。着色,表示攻击是成功的还是失败的。每个实验使用30%的水印不透明度和50种毒药。在这50个异常点中,70%的攻击成功(而随机目标的攻击成功率为53%)。

在这里插入图片描述
(b)对来自不同基的不同目标的攻击成功率取决于所使用的毒物数量和基础实例中增加的不同目标不透明度。

图5:攻击异常值和随机目标的成功率。虽然攻击非孤立点仍然是可能的,但攻击异常值可以增加成功的机会。

采用基b和目标图像t: b ← γ ∗ t + ( 1 − γ ) ∗ b b←γ*t + (1 - γ) * b bγt+(1γ)b的加权组合,形成具有目标不透明度γ的基水印图像。补充材料中显示了一些随机选择的毒物实例。对于某些目标实例,水印甚至高达30%的不透明性在视觉上并不明显。图4示出了用于成功攻击“鸟”目标实例的60个中毒实例。

4.2.1 多中毒实例攻击

在端到端的训练场景中,中毒是很困难的,因为网络学习的特性嵌入最优地区分目标和毒物。但是,如果我们将来自不同基本实例的多个有害实例引入训练集,又会如何呢?

为了使分类器抵抗多个毒物,它必须学习一个将所有毒实例与目标分离的特征嵌入,同时确保目标实例保持在目标分布中。我们在实验中表明,使用高度多样性的基可以防止中等规模的网络学习不同于基础的目标的特征。因此,当网络被重新训练时,目标实例与毒实例一起被拉向基本分布,并且攻击通常是成功的。这些动力学如图3b所示。

在图2中,我们观察到,即使在多次毒性实验中,最终层的判定边界也保持不变。这表明,在迁移学习和端到端的训练场景中,中毒的成功有一个根本不同的机制。迁移学习通过旋转决策边界来包含目标,从而对毒物产生反应,而端到端训练通过将目标拉到基本分布中(在特征空间中)做出反应。在对中毒数据集进行再训练时,端到端场景中的决策边界仍然保持平稳(按某一程度的分数变化),如图2所示。

为了量化中毒实例的数量对成功率的影响,我们对1到70之间的每个中毒实例进行了实验(增量为5)。实验使用了从测试集中随机选择的目标实例。每种毒物都是由测试集中的随机基产生的(导致毒物之间的特征多样性很大)。水印的不透明度为30%或20%,用于增强毒物与目标之间的特征重叠。攻击成功率(超过30次随机试验)如图5b所示。在CIFAR-10中对一个不同的目标基类对重复了30个实验,以验证成功率不依赖于类。我们还试了一个更低的不透明度,观察到成功率下降。成功率随中毒实例数的增加而单调增加。50次投毒后,鸟对狗任务的成功率约为60%。注意,只有当目标被归类为基时,我们才认为成功;即使目标实例被错误分类为基以外的类,攻击也被认为是不成功的。

我们可以通过瞄准数据离群点来提高这一攻击的成功率。这些目标远离他们类中的其他训练样本,因此应该更容易翻转他们的类标签。我们的目标是50架“飞机”,它们的分类置信度最低(但仍然正确),每次攻击使用50只毒蛙。这次攻击的成功率为70%(图5a),比随机选择的目标高出17%。

总之,端到端方案下的干净标签攻击需要多种技术才能工作:
(1)算法1的优化;(2)毒物实例的多样性;(3)水印。在补充材料中,我们提供了50种毒物的留单消融研究,证实这三种技术都是成功中毒的必要条件。

5. 结论

我们研究了有针对性的清洁标签中毒方法,在训练时攻击网络,目的是操纵测试时间行为。这些攻击很难检测,因为它们涉及非可疑(正确标记的)训练数据,也不会在非针对性的例子上降低性能。所提出的攻击工艺在特征空间中与目标图像碰撞,从而使得网络难以分辨两个目标图像。这些攻击在迁移学习场景中是非常强大的,并且可以通过使用多个有毒图像和水印技巧在更一般的上下文中变得强大。

使用毒物的训练类似于对抗训练技术,以防止逃避攻击(Goodfeler等人,2015年)。毒物实例在这里可以看作是基类的对抗性示例。虽然我们的中毒数据集训练确实使网络对设计好的错误分类为目标的基类对抗样本更加健壮,它还会导致未更改的目标实例被错误地归类为基。本文对这种对抗性训练的副作用进行了探讨,值得进一步研究。

许多神经网络使用容易被对手操纵的数据源进行训练。我们希望这项工作将引起对数据可靠性和来源这一重要问题的关注。

6. 致谢

略。

参考文献

略。


  1. The code is available at: ↩︎

  • 6
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值