月初我们对华为方舟做了次爱之体检( https://www.sourcebrella.com/blog/huawei-ark-compiler-test/ ),全员好评让我们深感责任重大,应该为所有开源软件(尤其是咱国产软件)尽一份力,提供好用的代码安全和质量扫描产品。当然,这样的产品最好部署在线上,让所有开源项目可以方便的接入,随时随地监控代码变更,这才能做到实时的软件安全嘛。

借着最近方舟开源的东风,今天我们也宣布一下源伞的Pinpoint on cloud计划,也就是我们要把Pinpoint技术能力部署到云上提供SaaS服务。该计划的名字叫Satellite卫星计划,寓意就是在云上提供实时监控和保护,logo如下:

satellite_logo.png

当然,Satellite还在内测阶段并未正式公开发布。初期我们会重点支持Github项目,用户可以直接在项目里安装我们的Github App,这样在PR时进行自动扫描,如下所示:

github_satellite_pr.png

卫星计划从一开始规划就得到了源伞科技的重要合作伙伴微众银行(对,就是咱们欠的微粒贷那个债主)联邦学习项目的认可和大力支持。既然是重要伙伴嘛,咱就先帮伙伴打个广告。联邦学习实际上是一种加密的分布式机器学习技术,参与各方可以在不披露底层数据和底层数据的加密(混淆)形态的前提下共建模型。它可以实现各个企业的自有数据不出本地,通过加密机制下的参数交换方式,就能在不违反数据隐私法规情况下,建立一个虚拟的共有模型。在这样一个机制下,参与各方的身份和地位相同,成功实现了打通“数据孤岛”走向“共同富裕”的目标。2018年,微众银行AI团队发布了联邦学习全球首个工业级开源框架FATE(Federated AI Technology Enabler),并在GitHub进行公开发布;发布了《联邦学习白皮书》、在国际著名期刊ACM TIST 和会议AAAI发表了关于联邦学习的研究成果,并在IEEE完成联邦学习技术的标准立项,目前已通过KDD、AAAI、IEEE等机构逐步建立起AI技术影响力。

那微众银行这大户人家,怎么看上了我们这个小后生了呢?除了颜值之外?答案就是实力 :P。微众银行联邦学习项目因为涉及使用企业的隐私数据,所以非常重视隐私安全。具体我们将在三大问题上进行合作。

1. 隐私信息防盗取

Sourcebrella Pinpoint的看家本事就是跟踪数据流。联邦学习系统在实际使用中需要在本地接触用户和伙伴的敏感数据,并能保证数据不出本地。而各大公司对数据和用户隐私都视为企业的安全红线。这么重要的数据,有没有被挪出本地呢?这就需要看个究竟了!

半年前,为了响应国家网络安全法(不是蹭热点),我们对国内众多SDK进行了盗取隐私数据的扫描(目的是学习先进偷盗技术和针对不良行为建模,更了解敌人才能更好的针对他们),因为基于研究目的,所以结果不进行公布了,总之真是行内人才知道有多么触目惊心。但是我们可以分享一个典型样例,供大家了解下隐私泄露问题在代码层面长啥样。注意!注意!注意!这只是个例子!!与联邦学习无关!!

看如下这段代码,懂代码的同学从函数名字上就可以猜到,它收集了一堆诸如设备ID,手机型号,电话号码,还有地理位置信息。

privacy_leak_sdk1.png

接着,这收集来的隐私数据开始往外传输:

privacy_leak_sdk2.png

其中传输位置是HTTPS_API_SET_STATISTICS指定的,具体值如下:

privacy_leak_sdk3.png

然后我们惊奇的发现,这个域名并不属于APP的,而是SDK自己的,因此可以断定是SDK违规在收集用户隐私。我们找遍了SDK开发文档的每一个角落(包括页眉页脚、订书钉上、图片背面)都没有发现他们会拿取这些隐私数据的声明。然而,盗取隐私数据的代码就明晃晃地躺在那,没有加密,有一点混淆,自然得好像这就是SDK应有的行为的一部分,SDK懒得去搞那些伪装了,它料定了APP程序员不会看它的代码。是啊,996都忙不完的任务,谁会去看别人写的代码呢?该SDK被非常多的大厂应用过,甚至包括用户数过亿的大站。

多说几句,近期国内外诸多APP被罚,被扣上恶意软件的帽子,一些是咎由自取,一些是真的被冤枉:SDK得了利,APP却背了锅。所以,保证软件依赖链条上的每个软件都安全才能做到最终的安全,而要做到这点,必须通过流程和工具才能真正解决问题,法律法规只能是用于事后善终。

2. 隐私数据规范使用检查

脏数据我们跟踪下来可以发现盗用,正常数据我们也可以进行跟踪,判断它是否按照规定好的路线进行使用、加密和传输。在和联邦学习的合作中,我们将根据联邦学习系统的隐私数据处理架构,判断所有涉及隐私数据处理的代码是否都是用架构中提供的API 进行数据加密和传输,这样就能规范化隐私数据的使用。这类问题技术上可以把数据的合法使用通过一个自动机来描述,如java.net.socket 使用规范如下:

java_socket_typestate.png

一个合法的socket使用方法就是先调用init函数,然后调用connect形成连接,再拿InputStream和OutputStream进行数据读写,最后调用close关闭连接。那在init之后直接就拿InputStream就会导致错误。

3. 关键代码修改告警

联邦学习系统开源后,提交者往往采用匿名或者网名等非真实身份进行代码提交,当提交的代码涉及到与隐私相关的代码部件时,在系统中发出特殊告警通知主要负责人,从源头上遏制恶意行为的引入。

之前,我们也经常接一些找后门、找内鬼的零活贴补家用。这些案例中,恶意代码往往经过多次加密、复杂的设计,执行还要基于时间和地点等逻辑判断,这使得这些小恶魔在原厂测试和安检的时候像非洲肺鱼一般无尽冬眠,而到了适宜的环境就成了脱缰的野狗。所以,一旦恶意代码被引入,再想发现就非常困难。即便是有动态监控,往往也因为触发条件不充分而很难捕捉到,这点做过恶意软件分析的朋友应该深有感受。

写在最后

目前Satellite仅开放给合作伙伴进行内测使用,将在十一月之后进入alpha测试阶段。面向公众开放和试用申请将在alpha测试后在官网(www.sourcebrella.com)和公众号(源伞科技)同步放出,大家记得关注。当然,作为一个一根筋做技术的公司,一开始我们对Satellite的定位完全没有放在赚钱上,就是希望我们能为开源软件的安全和质量提升做点贡献。做在线服务对我们是一个完全陌生的领域,我们人少,岁数还小,难免日后会照顾不周,希望大家一如既往的包容我们,支持我们,当然也欢迎更多的同行能一起为开源软件安全做点实事。