2018 Geekpwn Adversarial Attacks on Face Recognition

安全比赛 Geekpwn 今年开始强调 "人工智能安全", 办了一个 CAAD 对抗样本攻防赛. 这让我在多年没碰 CTF 之后又有了一个 CTF 的机会, 只是这次攻击的是 ImageNet 分类器..

整个 CAAD 比赛分为 online 和 live CTF 两部分. online 部分使用了 NIPS17 的 CAAD 比赛的形式: defenser 提交自己的 ImageNet 分类器, attacker 提交自己的黑盒攻击代码. 主办方把所有的 attacker 和 defenser 搞在一起互相打, 然后对 attacker 和 defenser 分别排名.

今年暑假, Cihang 同学来 FAIR 当 Kaiming 的 intern, 我们一起搞了一些巨牛的 defense 模型, 于是参加了 online 的比赛拿到了 defenser 第一名, 同时我们也获得了参加 CAAD CTF 的机会.

Geekpwn CAAD CTF 今年十月在上海举行, 比赛主要分为两部分:

  1. 上半场类似于传统 CTF 中的 jeopardy 解题. 在这一部分我们的任务就是在半小时内完成主办方设定好的几种攻击场景, 包括一个 ImageNet target attack, 一个 ImageNet untarget attack, 和一个人脸识别 target attack. attack 时对原始图片的扰动越小, 分数越高. 这一部分的现场直播被传到了 B 站上.. 我们在这一阶段的比赛中做出了全部三道题拿到冠军. 赛后, 机器之心对这场比赛有详细的报道.

  2. 比赛的下半场是攻防: 所有队伍事先提交防御模型 (也即一个 ImageNet 分类器), 在比赛的一个多小时中, 主办方向我们提供原始图片和 target, 我们利用 target attack 手段生成 adversarial examples, 再通过主办方的 API 发送给别的队伍. 对抗样本成功骗过别的队伍, 便可抢夺对方一定的分数, 扰动越小分数越高.

在防御上我们有巨牛的防御模型所以不虚. 我们的攻击, 在比赛一开始效率很低, 因此分数落后一些. 在比赛进行了一段时间之后, 我开始根据各个队伍的强弱, 对每个队伍使用不同的扰动大小, 因此得以后来居上, 最后也拿到了冠军.

这篇文章简单介绍我们对人脸识别的攻击, 攻击的代码已经放到了 github 上. 比赛中其他类型的攻击, 我们使用的也是类似的算法, 只是换了不同的 CNN. 防御相关的内容, paper 在 arxiv 上, 代码和模型开源在这里.

这两个比赛总共拿了十几万的奖金. 其实也可以再去参加一下 NIPS18 的比赛的, 但是 NIPS18 今年把难度降低了: 做的是 100 类小图片的 tiny-imagenet, 也没什么奖金, 所以我们觉得没什么意思就忙着写 paper 去了..

Face Attack

Problem

在赛前一周我们得知要黑盒攻击一个未知的人脸识别模型 . 对一个现场临时给定的不是施瓦辛格的图片 , 在 附近 范围内构造图片 , 使得 施瓦辛格. 比赛中, 我们拿到了比赛主持人, 最强大脑蒋昌建的照片. 赛后, 主办方才告诉大家被攻击的模型是 Amazon 的 Celebrity Recognition API.

由于人脸识别和图片分类不同, 学的是每张脸的 embedding 及他们之间的 distance. 因此我们并不确定 adversarial examples 是不是容易 generalize 到未知模型上. 其中最主要是担心, 模型训练时用的数据集, loss function, 都可能对学出的 embedding 的结构有影响.

Attack Method

虽然最近陆续出现了一些高级的攻击算法, 我们的黑盒攻击还是很传统的, 就是拿已知模型做梯度下降.

  1. Model:

    搜了搜 github 上的人脸识别代码, 找了个 5 分钟内能跑起来的 facenet. 毕竟 github 上大部分代码质量堪忧, 有不少项目完全是靠 README 骗 star 的. 能否短时间内复现 evaluation 结果是评判质量的重要 metric. 更何况, 我这次只需要能 evaluation 就够了.

    facenet 的人脸识别流程很标准: 对每张脸 输出一个 vector , 然后通过比较不同脸的 之间的 cosine distance 进行人脸识别.

  2. Objective:

    对于分类器的 target/untarget attack, 没什么好说的, 就是 minimize/maximize 一个 cross entropy loss. 而对于人脸, 我们首先收集 target 人物的 N 张人脸图片, 运行模型得到 N 个 embedding vector . 我们的 objective 就是 minimize 输入图片的 embedding 到这 N 个 embedding 的平均距离:

  3. Attack:

    我们在最原始的 PGD (Projected Gradient Descent) 攻击上加了点 trick. 原始的 PGD 就是

    1. 算 objective 对输入图片的梯度
    2. 更新输入
    3. clip 以免输入超出允许范围:
    4. 回第一步循环

    这里有不少 trick 可以提高黑盒攻击的 generalization 能力:

    1. 对梯度 normalize 一下, 然后更新时用 0.9 的 momentum
    2. 在循环每一步给图片随机加点小 noise
    3. 在循环每一步对输入图片做些乱七八糟的随机 resize 变换
    4. 对梯度做 spatial smoothing

    这些 trick 从去年的 NIPS 比赛之后就陆续被大家用了. 这次的人脸攻击用了 1,2,3. 第三条是我比赛时发现代码不 work 临时加上的. 事后验证发现, 这一点尤其重要. 如果不加的话攻击很难成功.

Results

回家后应主办方要求整理了一下代码, 也对着 AWS 的 API 调了调更好的参数. 现在这份开源的代码,  以 (像素范围 0~255) 攻击 "蒋昌建 - 施瓦辛格",在 AWS 上成功率极高:

用同样的参数试了试 "川普 - 希拉里", 成功率低了不少, 而且换了一次原始图片才找到比较容易成功的. 毕竟两个人 Amazon 都认识, 又跨性别, 难度肯定大一些.

拿这些图片又试了试 Microsoft Azure Vision API Clarifai Celebrity Recognition API, 也都有一些成功的例子. 在 github 上可以看到.

In general, 黑盒攻击能够成立, 也即 adversarial examples 能够 generalize/transfer 到其他模型上这件事, 我一直都是觉得很神奇的.. 事实证明, 对于人脸识别模型, 这种黑盒攻击仍然成立, 这个结果还是让我们挺吃惊的.

最近, NIPS18 有一篇号称 adversarial examples 还能 generalize 到 human vision 的文章: Adversarial Examples that Fool both Computer Vision and Time-Limited Humans. 文章的实验挺有意思的, 大意就是不给人类足够的时间看图的话, adversarial examples 能够对人类有一定的效果. 而其中最神奇的还是文中的这两张图:

即使给足够的时间看, 人也会觉得左边是狗右边是猫吧.

Comments