Hello,大家好,我是民间发明家,覃健祥。我申请了20多项发明专利,听到这个数字,有的朋友觉得好厉害但又不明白这些发明和我们的日常生活有什么关系,有的则问我是不是为了资助奖励申请了一堆凑数的专利,其实,我的大脑里有100个创新点可以申请专利,只是申请专利的时间和金钱成本都太高了,我只能优先申请一些商业价值大的创新程度高的。
为了消除大家对专利的神秘感,我打算写篇文章科普一下。恰好,就在2月23日,我有件名为《基于HMAC算法的密钥保护方法、装置、设备和存储介质》的专利获得了国家专利局的受理通知书,这件专利和淘宝11亿客户手机号被盗的惊天大案有关,我在专利中提出的漏洞普遍存在于各行各业,很多受害者正在被攻击而不自知;我提出的防护方案具有非常好的通用性。
在此也请各位读者朋友多多转发,好让业界早日受益,若专利成功取得授权,我将授权国防/政务/科研/教育等公共行业免费使用,对本文传播有贡献的读者朋友也可申请免费授权(可用于商业目的)。
月黑风高夜,昏暗的房间里,弥漫着羊肉汤的膻味,一个大学生模样的年轻人端坐电脑前,几亿个手机号离奇出现沾满指纹的电脑屏幕上,在上千公里之外的不夜城,一个个淘宝网购用户相继收到陌生的微信好友申请,继而被拉进一个微信群领优惠券购物,群主的广告账户余额不断地飞速跳动,一个完美的获取用户隐私变现的闭环形成了。
是什么神秘的力量让中国两大互联网巨头的用户产生了神奇的交集?手机号怎样完成了这不可思议的时空之旅?天之骄子为何铤而走险?敬请收看本期《走近科学》,啊不对不对,手抖打错了,敬请收看本期《了不起的小发明》,哈哈
1. 圈门锁失守,猛虎啖羊羔
说到获取几亿个手机号,人们最容易想到的手段之一就是爬虫抓取。在人们的常识中,爬虫属于百度谷歌才有的高科技工具。诚然,百度谷歌要收录全网上百亿的网页,还要保证一定的实时性,技术难度确实非常大,研发费用都是以亿为单位的。
但是,抓取淘宝用户手机号的爬虫却不需要那么高的技术含量,因为淘宝有官方手机客户端,淘宝为自己的手机客户端提供了接口(即API),API有两大优点,使得抓取难度远远小于网页:
一是简洁性。网页不止包含了数据信息,还包含了排版信息,要把数据从网页上提取出来,需要一些复杂的规则和算法。
二是稳定性,网页可能每个月都在改版,改版了,原来提取数据的规则和算法就要重写。而API非常稳定,通常一次定义好了之后几年都不变。
于是,通过API抓取淘宝用户手机号,不需要写复杂的规则就能直接拿到手机号,爬虫开发一次可以用很久。
淘宝的十几亿用户在黑客眼里就是羊圈里成千上万只肥羊,接下来就是想办法突破羊圈的门了。高价值的用户信息必然有着极高的安全等级,淘宝采用了国际上主流的HMAC技术来鉴定调用接口的是官方的客户端,还是未授权的第三方爬虫。HMAC技术的H代表hash,中文翻译是哈希,是全世界银行业金融业广泛采用的基石技术,当下最火的区块链也是靠哈希来保证数据的可信性。
听起来淘宝的用户库是不是跟谍战大片里的银行金库的保险柜一样安全了?遗憾的是,淘宝将HMAC算法用到的密钥,明文放在了HTTP COOKIE里(后面会讲技术细节),这就好比保险柜钥匙插在了门上。圈门大开,虎入羊群,一个大学本科文化水平的人,就这样单枪匹马从淘宝官方的接口中盗取了11.8亿用户的手机号用户名等隐私。
这正是:
蓬门今始为君开,
花径不曾缘客扫。
数只皂雕追紫燕,
一群猛虎啖羊羔。
2.天网疏不漏,伸手必被捉
2021年6月,中国裁判文书网公布了一份判决文书,名为《逯某、黎某侵犯公民个人信息一审刑事判决书》,编号为(2021)豫1403刑初78号,这个惊天大案的真相浮出水面。详情可见腾讯的这篇报道:超11亿条!你的淘宝信息可能被泄露了
根据这份判决书,我们简单回顾一下要点:
时间线
- 案犯2019年9月开始作案
- 淘宝网风控人员在2020年7月发现,8月报案,同月,嫌疑人被抓获
- 2021年6月一审判决。
损失
- 案犯损失自由,淘宝损失商誉。
- 两名案犯分别被判处3年多有期徒刑,违法所得予以追缴,另处罚款数十万。
被盗用户规模
- 淘宝报案称有3500万(只是2020年7月6日至7月13日之间被风控人员监测到的数据)
- 司法机关查获认定为11.8亿,淘宝经抽样核实,认可这11.8亿数据的真实性
- 嫌疑人辩称只抓了几千万,剩下的11亿是别的地方下载的,法院未予采纳。
作案技术手段
- 通过手机淘宝的官方接口接口抓取,判决书中所称mtop,即mobile taobao open platform,手机淘宝专用的接口平台
- 不同于淘宝开放平台(TOP),手机淘宝的接口平台是淘宝私有的,只有兄弟公司和极少数合作伙伴能申请到访问权限。淘宝报案称嫌疑人非法绕过风控机制,证明他们没有合法申请的访问权限,推测是通过淘宝“插在门上的钥匙”伪装成淘宝官方客户端抓取数据的
开发爬虫的法律风险
在我们互联网行业有几句玩笑话:爬虫玩得好,牢饭吃到饱;《Python爬虫:从入门到入狱》。
我科普的目的是提高大家的安全意识和法律意识,分享安全防护技术的同时也做点普法工作。
爬虫违法的高风险区有这些:
- 抓取大量个人隐私贩卖牟利。罪名是侵犯公民个人信息,属于刑事犯罪。非法获取/出售50条个人隐私即可判刑,本案中,涉案公民信息条数超标10倍以上,触发情节特别严重的法条,所以刑期也达到了3年以上
- 爬虫访问过于频繁造成对方服务器崩溃。罪名是破坏计算机信息系统,属于刑事犯罪,造成为1万人服务的系统停机一小时即为情节严重。比如这个CTO和程序员双双被判刑的案子
:某公司抓取市居住证系统致服务器崩溃,多个政务系统中断服务,CTO和程序员分别被判3年和1年刑。 - 抓取同行的数据用作商业目的。构成不正当竞争,属于民事侵权。比如中国法院网报道过的这个案子:大众点评诉百度案一审宣判 百度赔偿323万
拥有编程手艺的朋友们,一定要多了解法律常识,保持技术造福社会的初心,不要迷信“避风港原则”,莫伸手,伸手必被捉。
3. 蚁穴何足道,千里之堤溃
早在2015年,我就通过乌云漏洞平台向淘宝报告了HMAC密钥明文放在cookie中的安全漏洞,但淘宝认为那个不是密钥,危害等级低。我认为这个是app secret,淘宝认为这只是一个token,这只是文字表述的差异,就算你把它命名为noise,也不改变它在程序中100%承担着HMAC算法secret角色的事实。
这种将明文密钥放在通信报文中的做法,相当于给了攻击者一个永久有效的访问权限,导致接口被攻击者用来抓数据,淘宝的技术团队认为本质上跟淘宝去抓别人的数据没有区别。详细对话过程参见我2015年9月29日发的这条微博
当时在阿里内网也引起过关注,但不知道为什么,淘宝一直坚持使用这个显然不安全不专业的方案,即使11亿消费者的隐私被盗,也没能引起淘宝的重视,直到今天(2022年3月1日),淘宝还在用6年前就被我找出过安全漏洞的方案。证据如下:
Dear Officer, the lift is running with huge safety risk.
No, there is no lift, this is only elevator.
讳疾忌医,终致溃堤,扼腕叹息。
4. 亡羊可补牢,为时犹未晚
提供互联网服务的朋友们,一定要定期认定审视自己的安全体系,安全防护方案多多益善,不是说买了一套防火墙就万事大吉了,淘宝这个级别的公司尚且遭遇这么大的安全事故,说明安全绝不是轻轻松松就能做好的。
希望阿里的朋友们能帮我把这篇文章转发给阿里相关技术团队,尽早把这扇敞开了7年的大门关上。亡羊补牢,为时未晚。
当然了,11亿消费者手机号这么容易被盗,错误不止是明文密钥这一个,API网关缺少优秀的限流限频和隐私过滤功能也是重要原因。这个做起来也颇有难度,我这几年投资做了一个API安全网关,服务过央企,也服务过小创业公司,遇到很多技术挑战,也申请了不少专利,遍尝个中酸甜苦辣。
懂技术的读者朋友可能会觉得,把密钥基藏在js代码里,反复编码加密几次,再混淆一下代码,不就安全了吗?其实不是的,由于浏览器运行环境和JavaScript语法的特殊性,网页端的JavaScript是解释执行的,可被重写覆盖的,JavaScript藏不住真正的秘密。我只用了一行代码,几秒钟就找出淘宝的密钥了,有了密钥,我才发现居然就明文放在cookie里。上面的两张截图可以看到,我把密钥打印在控制台或者警告了。
用kotlin开发 的Android客户端可能也有类似的风险,我还没测试过,预计比网页端破解难度大一些。
基于md5或者sha系列哈希函数的签名验证机制,在互联网使用得非常广泛,这从各大开放平台的签名算法文档就可以看出来。绝大多数的网页版,都能用一行代码几秒钟破解出密钥,无论你把密钥藏得多深。
有鉴于此,我在2015年发明了一种可以真正防止网页端HMAC密钥被盗的方法,并成功运用在我公司的所有产品上。直到2022年,发现业界仍然没有类似的技术,才申请了专利。这个专利的核心是保护密钥安全,秘密在于以下几点:
权利要求1:使用衰减后的密钥
哈希算法都是摘要算法,从输入到输出存在信息衰减,无法逆推。平常大家下载一个几百兆的软件,用于验证下载文件完整性的hash(也叫check sum)只有16~32字节,足见衰减系数有多大。
我们可以将明文的密钥预先执行一部分衰减运算,再将衰减后的密钥放在网页端JavaScript代码中,在网页端JavaScript代码中实现一个变种的hash函数,使其利用衰减后的密钥计算出与标准hash函数兼容的结果。这样,攻击者就不能从网页端偷到真正的明文密钥了,因为,你没法偷走一个不存在的东西。
攻击者拿到衰减后的密钥,用标准的hash函数必然算不出正确的签名,便无法破解HMAC安全机制。
这就是本专利的权利要求1(专利法规定,权利要求1是基石,权利要求2,3,4都是基于权利要求1的)。
这是篇科普文,我尽量讲得通俗易懂些,详细的技术细节不展开讲,我在专利技术交底书里写了证明过程,大家有兴趣看得话,评论里告诉我,我后面贴上来。
权利要求2:保护变种hash函数
通过代码混淆,使混淆后的代码可读性大大降低,大大提高攻击者人肉阅读变种hash函数源码的时间成本。
实际上,即使不混淆,写得极其优雅的md5, sha256函数源代码也非常复杂,我感觉因爬虫被判刑的技术员,读得懂md5源代码的屈指可数。
此外,还可以将混淆后的hash函数代码编译成web assembly二进制产物,攻击者只能反编译再阅读,难度又提升了一个数量级。
权利要求3:定期自动更换
写一个自动化程序,定期执行,更换密钥,以及变种hash函数的算法,更换的时间间隔远远小于攻击者破解的时间,就算他们破解出来也没用了。
5. 摆下迷魂阵,请君入瓮来
在能检测到爬虫行为或者攻击行为的前提下,第一时间用攻防技术硬扛不一定是最佳选择,兵者,诡道也,业内还有这么一些请君入瓮的方法:
蜜罐
检测到攻击行为后,并不提示错误码和警告消息,而是故意卖给破绽,用一些假的商业价值不大的数据喂养攻击者,令其乐不思蜀,不再精进技术去攻击真正敏感的地方。
毒丸
若是公开的接口被抓取,为保证正常用户服务不受影响,识别出非法爬虫后,在数据里埋设毒丸:给爬虫返回真假参半的数据,令其被领导或者黑产买家责难数据质量差,生意难以为继。
养猪
若对方变现模式是非法外挂,刚检测出来时,可不打草惊蛇,待对方小有所成发展了一定数量收费客户后,一举封杀,退款纠纷将仅使其焦头烂额。
钓鱼
若对方变现模式是售卖抓取的数据,第一时间不封禁其抓取通道,而是收集证据,够刑事立案标准再诉诸法律。
如果大家喜欢这篇文章,除了转发之外,还可以扫描下方二维码关注我们的微信公众号:代码狗说代码
我的同事会在那里和我一起写文章,都是信息安全/软件技术/智能硬件领域的一些科普,通俗易懂,也有技术含量,欢迎大家来交流。