五分钟简介安全多方计算

简析安全多方计算 source: 安全多方计算(Secure Multi-Party Computation, MPC)技术,亦称安全计算(Secure Computation)和隐私保护计算(Privacy-Preserving Computation)。安全多方计算是当今密码学的一个重要分支,是继成熟解决数据加密存储、传输之后的重要尝试,在密文数据上直接构建运算。 具体而言,安全多方计算由 n 个互相不信任的参与方进行,联合对一个协商确定的函数进行计算,能够保证参与方的隐私输入数据 x1,x2,···,xn 无法被其他参与方获得。姚期智院士 (Andrew C.Yao) 于 1982 年发表的文章「 Protocols for Secure Computation」首次提出姚氏百万富翁问题和安全多方计算的概念。这个有趣的问题是, 两个百万富翁希望知道谁更富有,但是不希望对方或第三方知道自己的财富值。之后 Goldreich,Micali 和 Widgerson 等密码学家将这个问题一般化成为现在的安全多方计算问题。此后该领域内学术研究和商业应用蓬勃发展,如今安全多方计算协议是多种密码协议的组合, 如同态加密、零知识证明、秘密分享等。近 10 年来,密码学界对安全多方计算的探索有了长足的发展,笔者在实践中发现一些特定协议的计算效率已经达到商用程度。与区块链类似,安全多方计算同样存在「不可能三角」,需要在安全性,通用性,计算效率这三点之间权衡。 当今使用的安全多方计算技术按底层技术分为两个分支,基于混淆电路(Garbled Circuit)的与基于秘密分享(Secret Sharing)。 混淆电路与不经意传输(Oblivious Transfer)为姚期智院士提出的安全计算技术路径 。简单来讲,基于混淆电路的协议更适用于两方逻辑运算,通讯轮数固定,但是拓展性稍差。 另一类基于秘密分享的安全多方计算中,数据输入和计算中间值都会以「密文分片」的方式存在。 秘密分享技术可以把隐私数据切割为 2 份或更多份后,将随机分片分发给计算参与方,这个过程保护了数据隐私又允许多方联合对数据进行计算。 之后,就可以利用分片间存在的同态计算性质来实现在分片上计算并重建得到隐私数据计算结果。基于秘密分享的安全多方计算目前主要由欧洲密码学界主导,如 Smart, Damgard 等密码学家,其拓展性较强, 理论上支持无限多方参与计算,计算效率高,但通讯负载较大。 隐私计算正在逐步被应用于金融和保险风控、OTC 交易、资产管理、互联网营销等领域。同时作为一项前沿技术,隐私计算的从业者在积极推动技术的标准化工作。2019 年 6 月,工信部直属单位中国信息通信研究院正式发布《基于安全多方计算的数据流通产品技术要求与测试方法》行业标准, ARPA、阿里巴巴、蚂蚁金服、百度等企业参与制定。国际上,IEEE 安全多方计算国际标准的制定和 MPC Alliance 企业联盟的建立也预示着隐私计算从学术界向工业界的拓展。 […]

特斯拉手机远程启动安全风险

来源:蜚语安全特斯拉又双叒出问题了?这一次可是手机远程启动的安全风险! 最近几天特斯拉有点热,先是遭遇上海车展“车顶维权”事件,然后又因为设置车内摄像头拍摄高清画面的的事件引发关于用户隐私的热议。今天我们要给大家继续深入分析的是另一项可能更为关键的安全特性——特斯拉手机远程车辆启动功能中存在的安全风险。首先要声明的是,作为负责的安全研究团队,蜚语安全在2020年就发现了相关问题并第一时间通知了特斯拉安全部门,然而得到的回复却和维权无门的消费者类似。依照国际惯例,我们在经过长时间等待后,现在对该问题的细节进行披露。 蜚语安全在研究中发现,特斯拉用于远程启动车辆的移动APP在对用户身份进行认证时存在严重的安全疏漏,使用的认证协议极其初等,在很多并不苛刻的场景下,攻击者都可以轻易绕过相关防护,在不提供正确用户凭据(例如指纹等用户生物识别特征)甚至无需接触手机的情况下非法解锁启动车辆,导致特斯拉智能汽车的门锁功能失去应有的安全强度。

SM3碰撞漏洞

微信小程序国密算法SM3碰撞原理揭秘2021.3.10 2021年2月,蜚语安全在对客户产品进行安全代码审计时,发现其依赖的微信小程序sm-crypto 开源NodeJS国密算法库中的SM3算法实现(该算法库使用NodeJS对国密算法中的SM2,SM3和SM4三个算法进行了实现,并封装成接口提供给开发者使用。该国密算法库的具体实现在GitHub上开源:https://github.com/wechat-miniprogram/sm-crypto,其中sm3的实现在文件src/sm3/index.js中,微信小程序官方的参考文档链接为 https://developers.weixin.qq.com/miniprogram/dev/extended/utils/sm-crypto.html )存在重大的实现错误,导致不同的输入可被编码为相同的bitstring,进而进行SM3计算后产生“伪”hash碰撞效果。 影响 该问题影响sm-crypto的0.2.2及之前版本。由于该国密库为微信小程序官方提供的国密库,因此使用该库的都会受该碰撞的影响。根据GitHub上的信息,我们发现该作者的另一个NodeJS的库sm-crypto(https://github.com/JuneAndGreen/sm-crypto)也受该问题的影响。 问题分析 该SM3碰撞问题来源于sm3算法的实现文件src/sm3/index.js中。该SM3算法直接接收字符串作为输入,并通过以下函数将字符串转成二进制流: 再进行后续的填充以及SM3的变换等。而str2binary函数的具体实现如下: 该函数使用codePointAt函数对字符串中的每一个字符,获取其编码点值,并通过toString(2)转成二进制形式后,再使用自己实现的leftPad函数对二进制串进行高位补0的操作,leftPad函数实现如下: 可以看到,leftPad的逻辑是:如果input的长度大于等于num,则直接返回,否则根据num的值对input的高位补0。我们注意到在str2binary函数中,调用leftPad函数时,num参数被设置为8。所以当传入的input的二进制长度是低于8比特的时候,是没有问题的,但是一旦input长度大于8,则leftPad函数就不会对其高位补0,而是直接返回。而我们知道所有的中文字符码点值都是超过1字节、也就是8比特的,因此中文字符在转成二进制形式后,并没有高位补0。一旦有这些中文字符在字符串中被拼接后,会导致最终进行SM3计算的二进制数据很可能不是8比特对齐的! Proof-of-Concept 由于在这个转换过程中,没有对超过1字节字符的二进制表示进行8比特对齐,导致我们只要精心构造,就可能找到两个不同的字符串,使得这两个字符串在转换后最终得到相同的二进制表示。例如8个16比特的字符(UTF-16编码),如果最高比特位都为0,则通过该算法库中实现的二进制转换函数最终得到的二进制串是8*15=120比特,而这120比特的二进制串,同时也可以表示成多种形式,例如7个16比特的字符(最高比特位是1)拼上任意一个8比特的字符,或6个16比特的字符(最高比特位是1)拼上任意2个8比特的字符等,总共有数种组合,如下所示:8*15 = 120 = 7*16+1*8 = 5*16+3*8 = 4*16+5*8 = 3*16+7*8 = … 因此只要仔细研究相应的编码,让8个15比特编码的字符和最终变换后的字符都是可见字符,就可以构造出两个完全不同的字符串输入,在经过微信小程序官方NodeJS国密算法库的初始化变换后,会变成同样的二进制串输入到SM3核心变换函数中,并最终得到同样的SM3哈希值! JS的codePointAt函数返回的就是UTF16的码点值,利用上述方法,将任选的8个中文字符的二进制串(最高比特位为0)重新分割,使其也能够表示成其他中文字符(最高比特位需为1)与常见8比特可见字符的组合即可。这里我们随意构造了一组,其二进制串为: 使用该函数的字符到二进制转换方式,原始字符串为:丧丙上䠉䰋不亐乑,重新对其二进制进行分割,如下: 同样以该函数的二进制转换方式,字符串为:鱏8fpT肙腳荧HNQ。 将这两个字符串传入该国密算法库的SM3函数,即可获得本文开头的碰撞结果。由此可知诸如这类的碰撞还可以构造很多。完整的POC.js代码如下: 安装好nodejs环境后,可直接使用如下命令验证: 使用该方法可以构造多组能够实现碰撞的字符串输入,甚至可能能够构造出两组有意义的字符串并形成SM3的碰撞! 修复方案 目前sm-crypto已经修复了该问题,需要将版本升级至目前最新的0.2.4。其修复思路是将输入的字符全部转成UTF-8编码的二进制串,再进行SM3计算。        事实上,国密SM3的规范仅仅约定了输入应当是二进制串或字节流,而非字符串。字符串如何转换成二进制串则需要依赖开发者选择不同的编码方式(如UTF-8,UTF-16等)。而该库SM3碰撞的本质原因正是由于其对字符串编码转换实现的错误导致。目前该库的修复方案是统一将字符转成UTF-8编码。这的确是一种方法但也对开发者失去了一些自由度,其实可以将SM3算法以二进制或字节数组为输入,同时提供不同编码方式的字符转字节数组的接口,供开发者使用,或由开发者自行实现字符转字节数组的方式。

蜚语代码安全增强平台

2020年12月22日,上海交通大学“谷歌杯”创业大赛圆满落幕。蜚语安全负责人束骏亮博士代表公司参加了决赛路演,蜚语安全凭借项目“蜚语代码安全增强平台”在12支决赛队伍中脱颖而出,以第一名的成绩荣获大赛金奖。 上海交通大学“谷歌杯”第二十一届学生创业计划大赛决赛在唐仲英楼举行。校党委常委、副校长、创业学院院长王伟明,谷歌中国教育合作部高级项目经理万泽春,大赛组委会单位、决赛项目院系相关负责老师等出席决赛,四十余位知名风险投资人、创业导师、创投导师、创业教育学者等担任决赛评委。