首页
社区
课程
招聘
[原创] 闻声识人 - 声纹欺骗研究 (下)
2022-3-1 11:08 19111

[原创] 闻声识人 - 声纹欺骗研究 (下)

2022-3-1 11:08
19111

大家好, 我是星舆车联网实验室李四伟。团队成员在漏洞挖掘, 硬件逆向与AI大数据方面有着丰富经验, 连续在GeekPwn等破解赛事中斩获奖项。发现众多产品高危漏洞,并获相关厂商致谢。团队研究成果多次发表于DEFCON等国内外顶级安全会议, 成功入选2021特斯拉漏洞名人堂。星舆实验室拥有特斯拉等诸多靶车供研究使用, 期待更多志同道合的小伙伴加入我们。

 

本篇为声纹识别欺骗的下篇,本篇为实践环节,通过在常见的带有声纹识别的设备上实践各种声纹识别欺骗的方法,来验证声纹识别欺骗的可行性,分析声纹识别的漏洞,并提出改善声纹识别效果,提升鲁棒性的方案。

 

一.声纹识别欺骗的目标

 

1.声纹识别认证方法

 

日常中常见的常见包含如下几种:

 

固定语音声纹识别

1
2
使用固定语音作为识别内容,通过目标人物述说固定内容的语句来进行身份认证,例如最常见的‘hey,siri’,就是使用该方法进行声纹识别来实现身份认证的,iPhone手机通过对固定的语音进行采集,生成声纹特征,作为特征库用于后续声纹匹配识别。后续语音识别‘hey, siri’关键语句时会触发声纹识别,唤醒siri,然后进行交互,执行智能快捷指令。这是一个完整的基于固定内容的声纹识别的流程,其他声纹识别系统的声纹识别流程也与该系统相似。该方法在智能家具,智能车载系统等等领域有着广泛的应用。
固定语音的声纹识别系统是一种广泛应用的方法,最开始实现方法是基于模板匹配等方法实现,来统计相识度,识别精度较低,同时对语音输入有着较高的限制。后续演变为通过机器学习,深度学习的方法提取声纹特征,通过特征匹配来进行声纹识别,拥有更高的识别精度,对输入语音的限制更少,同时算法迭代应用中,引入新的攻击方法。对于当前的主流的基于固定语音的声纹识别的欺骗方法主要包括:语音重发,语音合成,语音对抗样本攻击。

固定语音+随机内容声纹识别
固定语音+随机内容声纹识别指的是,固定的关键词语来触发声纹识别,同时关键词语+随机的内容共同组成声纹识别认证的输入,来进行身为识别认证。例如,‘你好,小智1137’,其中‘你好,小智’是关键词语对声纹识别进行触发,然后1137是由目标系统随机生成的关键字,两个一起组合成声纹识别认证的输入。
相较于固定语音识别,固定语音+随机内容一起来进行声纹识别拥有更高的安全性,但是对用户的要求更高的配合度,需要用户每次读出随机生成的指定内容。该方法对重放攻击有着天然的抵御能力,有更高的安全性,因而被广泛的应用于声纹支付等对安全性有较高要求的系统。常用的攻击方法:语音合成,语音对抗样本攻击。

 

固定语音+随机内容声纹识别

1
该方法为声纹识别的理想场景,通过任意语音输入来进行声纹识别。该方法对声纹识别算法有较高的要求,同时需要对不同发音,不同说话人状态,不同的干扰的鲁棒性,因为未有特别广泛的应用,但是是未来声纹识别的一个发展方向,由于输入的任意性,被攻击的方法也更多。可行的攻击方法:语音模拟,语音重放,语音合成,语音对抗样本攻击。

2.声纹识别欺骗的目标设备

1
2
3
4
5
6
7
8
某些智能家居设备的声纹识别系统
 使用固定语音+随机内容的声纹识别系统,声纹识别的内容为:你好,小x+随机n位数字。
iphone 12 mini 的siri模块
使用固定语音声纹识别系统,触发的关键词为:Hey siri。
商用的两款声纹识别系统
使用随机的语音进行过声纹识别,声纹识别的内容为:随机的n位数字。
某款声纹识别的车机系统(由于测试条件限制,导致该设备未完成测试)
使用固定语音的声纹识别系统,声纹识别的内容为:你好,小X。

二. 声纹识别欺骗的方法

 

对于大部分声纹系统,我们无法获取到所使用的算法结构,算法参数等等详细的信息。测试中的目标声纹识别系统都是黑盒的,因而整个分析过程使用的欺骗方法都是黑盒声纹欺骗的方法。整个分析过程使用重放攻击,语音合成,语音对抗样本攻击的方法对目标声纹识别系统进行验证,验证声纹识别欺骗方法的可行性。声纹识别欺骗的流程如下:

 

1.重放攻击

 

1.1语音重放攻击的流程

 

重放攻击是一种通用的,简单也是最有效的欺骗方法。整个过程如下

 

① 声纹识别系统将原始的声纹录入,将语音X录入系统,提取声纹特征Y
② 将目标人员唤醒声纹的语音进行录制,保存为语音文件
③ 语音文件到对应声纹识别系统附近进行播放,声纹识别系统将重放的语音X’录入系统,提取声纹特征Y’
④ 声纹识别系统比较声纹库中的声纹特征Y与重放的声纹特征Y’进行相似度计算。
⑤ 声纹识别系统通过相似度计算的结果通过了声纹认证

 

1.2 语音重放攻击的原理

 

由于重放的语音和目标语音为同一音源,主要区别为重放的声音包含经过一次重采样,一种设备播放导致的噪声与损失。因而存在较大的概率欺骗声纹识别系统,这一层面的欺骗主要让声纹识别系统错误的将设备播放的语音识别为真人发出的,进而绕过认证。下图为整个流程的损失:

 

整个方法优化的点主要在采集和播放设备上面,采用高保真的设备,能获得更好的效果。

 

声源的mel spectrogram

 

重放攻击的mel spectrogram

可以看到声源和录制后的音频数据的mel spectrogram有很高的相似性,但是由于设备采集等等原因造成的损失也是可以肉眼查看到的。

 

1.3 重放攻击的实践
1.3.1 实践过程
使用重放攻击在iphone 12 mini以及智能音箱上进行实践验证。以siri为例,首先在iphone上进行siri注册,然后使用录音设备(实验中使用的mate20 pro)对‘hey ,siri‘进行录制。然后使用该设备上的播放器,在iphone熄屏状态下播放该语音片段。

 

 

1.3.2 实践结果

 

iphone siri声纹识别系统欺骗成功

 

成功唤醒iphone的siri,并通过siri的快捷指令系统,调用了siri的快捷指令,siri的快捷指令被执行。但是由于siri涉及权限较高的操作都需要在解锁情况下才能正常执行,仅能通过该方法调用在未解锁情况下能被执行的快捷指令。如图为在锁屏状态下,欺骗siri,调用快捷指令,快捷指令执行后特斯拉充电口被打开:(https://www.youtube.com/watch?v=XpSRCQC2rxY)

 

某些智能家居的声纹识别系统全部欺骗成功
通过重放攻击成功唤醒某些智能家居设备的智能语音助手后,通过‘我是谁‘的指令来验证声纹识别结果,验证声纹识别欺骗成功。可向语音助 手咨询相关用户信息,调整常用配置,存在数据泄露风险
2.语音合成
2.1 语音合成攻击的流程
语音合成是将任意文字信息转化为语音输出的一种方法。通过语音合成算法来生成声纹识别系统需要验证的语音数据,该语音数据是具有目标人物的音色特征,声纹特征的,能够被声纹识别系统误认为目标人物发出的。整个过程如下:
① 注册声纹,声纹特征Y存储在声纹识别系统的声纹库
② 通过大量的语音数据训练语音合成算法,输出语音合成模型model
③ 手机目标人物的语音数据,按照一个的数据格式,对数据进行标注,最后生成一个新的数据集
④ 使用目标人物的数据集对模型model进行fine-tuning,训练后得到新的模型model’
⑤ 使用模型model’生成声纹识别系统需要验证的语音数据,并进行播放
⑥ 声纹识别系统将播放的语音X‘录入系统,提取声纹特征Y’
⑦ 声纹识别系统比较声纹库中的声纹特征Y与重放的声纹特征Y’进行相似度计算。
⑧ 声纹识别系统通过相似度计算的结果通过了声纹认证
2.2 语音合成的原理
通过语音合成来拟合目标人物的声纹特征。Mel 频谱,能量场等等都可以作为声纹特征的一种标注。以实践部分使用的google的SV2TTS为例,来阐述声纹识别的原理。
可以将整个语音合成分为三部分:speaker encoder, synthesizer, vocoder.

speaker encoder模块负责从短句中提取说话人的特征向量
该网络将从任意长度的语音中计算出的log-mel spectrogram帧序列映射为一个固定维的embedding向量。通过对端到端说话人验证的损失进行优化,使来自同一说话人的话语embedding 具有较高的余弦相似度,而来自不同说话人的话语在embedding空间相差很远,看到这里就想到了人脸识别任务中的Triplet loss。本网络使用的损失函数为GE2E loss,通过多个人多条话语的embedding计算出一个相似矩阵,带入到损失函数中,计算出损失,更新梯度。GE2E loss分为两部分:
Softmax损失函数:

contrast损失函数:

synthesizer模块负责用文本结合上面的特征向量,产生将指定说话人特征融入指定文本对应的语音的频谱
一个典型的encoder-decoder结构,中间加了attention。Encoder部分由char embedding,Conv layer和BiLSTM组成。中间是一个Attention,注意这里是local sensitive attention,并不是我们现在用到的self-attention。Decoder部分是一个自回归RNN,用来预测Mel-spectrogram,而每一步的预测结果prediction会进入prenet层,然后和attention的结果一起进入LSTM层,LSTM层的结果和attention的向量再做concat然后通过linear projection预测目标的spectrogram,然后这个预测的结果进入post-net层来预测一个残差,加到prediction上我们就得到了最后的mel-spectrogram。
vocoder模块负责用频谱生成语音数据
将生成的mel-spectrogram转换成目标音频数据
synthesizer + vocoder共同完成text-to-speech任务,结构如下图所示:

2.3 语音合成的实践
我们收集整理相关数据集对语音合成算法进行训练,最后使用合成的语音进行实验。
2.3.1 数据集
在github中作者建议提供两个数据集进行训练:
一个大的无标注数据集用来训练Speaker encoder,这里的无标注指的是,无语音内容的标签,但是有语音所属的身份ID。最好1000人/1000小时以上,可以是有噪声的增强鲁棒性。
一个相对小的有标注数据集,300-500小时,用来训练Synthesizer和Vocoder。

实际训练使用数据集
英文场景使用了LibriSpeech,LibriTTS两个数据集进行训练。
中文场景使用了aidatatang_200zh,aishell3两个数据集进行训练。
对于最后的优化微调,使用了采集目标人物的语音数据标注后,制作的私有数据集

 

2.3.2 模型训练
对于英文合成使用Real-Time-Voice-Cloning, 对于中文合成使用MockingBird。以英文合成为例,阐述整个训练流程。整体包括encoder预处理,encoder 训练,synthesizer 预处理,synthesizer 训练,vocoder预处理,vocoder训练这几个步骤。
1)encoder数据预处理
执行文件:encoder_preprocess.py
目的:调整数据集的格式,适应于训练
支持的开源数据集,其他数据集处理,需要修改encoder目录下的preprocess.py适配

 

预处理完成的目录结构如下

_sources.txt存储了生成的npy文件及对应的音频数据路径

 

2)encoder训练

 

执行文件:encoder_train.py
目的:训练将模型,对不定长的语音输入进行映射特征编码,生成固定维度的embedding,用于后续Synthesizer进行合成时使用
训练命令:

 

训练结果如下:

UMAP理想的效果应该是相同颜色的同一个说话人聚类到一起,实际训练UMAP:

3) synthesizer数据预处理
执行文件:synthesizer_preprocess_audio.py synthesizer_preprocess_embeds.py
目的:调整数据集结构,通过训练好的encoder模型对数据进行处理,提取esynthesizer
结果:

 

train.txt存储标签信息

4) synthesizer训练
执行文件:synthesizer_train.py
目的:训练合成器,将encoder提取的embedding和输入文本融合,生成对应文本的mel-spectrogram,结构是一个不带wavenet的Tacotron2
命令:

 

训练结果

 

模型评估靠人工,成本比较高,代替的方法是验证attention模块产生的alignment结果.

 

5) vocoder预处理与训练
使用了预训练的声码器,未单独进行训练,后续补充训练的相关细节。

 

2.3.3 语音合成
采集目标人物的音频数据,转化成wav格式
到工程路径下执行python demo_cli.py

选择音频数据,模型,生成目标语音数据
2.4 实践结果

 

iphone siri声纹识别系统欺骗成功
与重放结果相同
某些智能家居的声纹识别系统全部欺骗成功
与重放结果相同
商用声纹识别系统d
只有一款能够进行购物支付的声纹系统欺骗成功,其他全部失败,且成功的案例对支付功能有严苛的限制,只能够进行支付,无法修改地址。
微信登陆
声纹欺骗失败
2.5 中文语音合成
MockingBird是基于Real-Time-Voice-Cloning实现的支持中文的语音合成项目。核心算法保持不变,适配了中文普通话语音合成,同时也提供了部分中文 语音数据集的信息。整个训练过程和Real-Time-Voice-Cloning基本一致,作者在其基础上优化整合了各个训练模块的调用,可按照相同方式进行数据处 理及训练。
2.6 一些技巧
在同一个数据集中大概训练了100k step之后,如果loss一直反复围绕一个值波动,同时发现生成效果不升反降,很可能是整个训练overfitting过拟合了,及时中断训练,采用一些方法进行优化,如:替换或新增更大数据集;优化hparam.py中的超参数,如batch size, lr等,然后用同一或者新的数据集进行短暂的训练,验证训练效果,效果不理想,回退模型。
中断训练时,可以加载最好效果的更初版本进行以上操作,例如你在150k发现过拟合,但是110k的模型效果优于150k的,就将110k的模型文件直接改名后,基于110k的模型继续进行他训练。
和其他深度学习模型相同,更大的数据集,更多的样本,对于说话人的音色覆盖更广,训练效果就越好,所以综合多个数据集对提升训练效果是有帮助的。
2.7 其他方法
我们在对声纹识别的欺骗的实验过程中同样使用了对抗样本攻击,但是由于最终的效果较差以及文章篇幅原因,就不过多展开了,有兴趣的可以查阅相关的资料。推荐阅读FAKEBOB这篇论文进行深入研究。

  1. 语音合成在声纹识别欺骗中的应用
    使用语音合成,合成‘hey, siri’语句,唤醒siri,然后向siri询问’我是谁’,siri会报告用户信息。 (https://www.youtube.com/watch?v=_9FnGKl9QBY)
    图片描述
  2. 声纹识别欺骗在其他领域应用
    在智能家居中,使用上述方法测试 了几款设备,都成功绕过。大部分声纹实现的功能都是用户体验相关的,仅涉及用户信息泄露,部分包含声纹购物支付,虽然绕过了,但是逻辑都比较严格,仅能下单支付,无法修改地址。
    使用上述方法对微信声纹登陆,TalentedSoft系统进行验证,均为成功,分析失败原因为这两个系统包含声纹活体检测算法,检测声源是否为活体。通过活体检测对输入语音数据进行检测,判断是由真人发出的还是由设备播放的。对于该系统进一步尝试的方法是使用高保真设备进行录制和播放,来欺骗活体检测。

四.总结

  1. 声纹识别存在的漏洞总结
    通过整个研究发现广泛应用的声纹识别系统,普遍存在着鲁棒性差,容易被欺骗攻击的问题,除了商用的声纹识别系统,普通的声纹识别系统很容易被一些简单的方法欺骗,例如重放攻击。虽然本身和人脸识别同为生物指纹识别的一种,但本身的安全性的研究,远不如人脸更加深入,更加收到重视。
  2. 声纹识别化方法
    1
    2
    对于固定语句进行声纹验证的系统,调整为固定语句+随机内容,即可增加安全性,可导致重放攻击无效。对于语音合成,实际场景中,训练一个特化的语音合成模型需要收集大量的目标人语音数据,然后进行清洗,标注,训练,代价成本提高很多。
    在不调整验证逻辑的情况下,整个系统添加声纹活体检测,或者语音活体检测模块,来区分活体/非活体,是一种安全性很高的方法。相关的基于设备播放音频的攻击欺骗方法基本都可以被防御。
  3. 后续研究的方向
    在整个声纹识别欺骗的研究过程中,针对于声纹识别算法,我们采用了对抗样本来进行攻击测试,但是整体效果较差,识别的结果未达到目标的期望。上述的重放和合成在实际应用中,特征比较明显,重放的语音和合成的语音能够被轻易感知发现,为了使声纹识别欺骗有更强的隐蔽性,更好的欺骗效果,对抗样本攻击是一个很好的研究方向。后续我们的主要研究方向会继续在对抗样本算法的优化上,以获取更加有效隐蔽的声纹识别欺骗模型。

References

 

https://zhuanlan.zhihu.com/p/92640465
https://github.com/CorentinJ/Real-Time-Voice-Cloning/issues/30
https://zhuanlan.zhihu.com/p/112627134
GENERALIZED END-TO-END LOSS FOR SPEAKER VERIFICATION.
Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions.
https://github.com/babysor/MockingBird
https://github.com/CorentinJ/Real-Time-Voice-Cloning

 

欢迎加入星球

 


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2022-3-15 11:07 被星舆实验室编辑 ,原因:
收藏
点赞5
打赏
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  orz1ruo   +2.00 2022/03/02 原创内容~
最新回复 (1)
雪    币: 1542
活跃值: (300)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
木羊 2022-3-3 14:42
2
0
seq2seq不如换成Transformer试试?
游客
登录 | 注册 方可回帖
返回