点播文件防盗链二三事

作者:杨洁勇

导语

视频点播为公司大部分流媒体和音视频相关的业务提供上传、存储和下载等需求。所有文件存储在相同的仓库,提供CDN下载服务的oc节点也是共用的,所以存在各个各样的盗链问题。

1、背景介绍

于所有业务的文件都存储ftn,并且下载时提供CDN下载服务的OC节点也是相同的,所以为了识别某个下载链接是那个业务的,我们提供给业务的下载链接都会有一个相应的host用于识别各个业务(没有带上或者带上的host在下载服务没配置,直接禁止访问)。

为了防止用户或者黑客获取到下载链接后恶意访问文件,每个下载链接的url中都会带上一个vkey参数,里面包含了当前这个链接访问文件名hash值、vkey的生成时间、vkey的有效时长、通过此链接下载文件是否进行限速,当然这一切都是以一个不公开的算法加了密的。服务端收到下载请求后会解密vkey,并且对信息进行校验,限速,通过进行下一步给客户端吐数据,如果校验不通过,直接返回403.。下载链接如下:http://ip (or 域名)/host/filename?vkey

2、问题描述

首先所有文件都存储ftn,并且下载时提供CDN下载服务的OC节点也是相同的,并且除了音乐业务有自己单独的一套vkey校验库外(音乐vkey也是个坑,下面描述),其他业务(包括腾讯视频)都是用同一套vkey校验库,这就为盗链的存在提供了巨大的隐患。

1、通用的vkey算法被破解,或者一些腾讯视频精品库(付费会员才能观看)的文件对应vkey被获取后非法盗用,这时,恶意用户就可以利用这些漏洞,盗播腾讯视频精品库等内容(音乐同理)。

2、由于所有文件都存储ftn,并且下载时提供CDN下载服务的OC节点也是相同的,所有恶意用户可以利用任意业务的host下载任意业务文件(只要能正确生成vkey或获取vkey)。

3、音乐vkey校验算法没有校验文件名,也就是说获取到音乐的vkey后,可以利用音乐host下载任意业务文件。

4、音乐的vkey校验算法除了没有校验文件名之外,其实跟通过算法相同,也就是说拿到通用vkey,可以利用音乐的host下载任意文件。

3、解决措施

1、针对vkey被破解方法,这个是一个效率与安全的博弈论。或许最简单的方法是用公私秘钥(或者AES),这时候客户端知道算法也无法伪造vkey,但是公私秘钥加解密和签名耗cpu,并且要全网部署相关秘钥,怎么防止全网几千台服务秘钥不泄露等问题。通过腾讯视频播放页面或者正确的秘钥,这个更是无法阻止了,因为客户端可以任意抓包,总能获取到的下载的url。实际上也无法完全禁止文件被盗播。

那么先解决重点问题,点播这边最大的问题就是腾讯视频的精品库被盗播,利用腾讯视频自己的host和相关vkey,多次盗播视频这个问题,DC和CDN(OC)全部对腾讯视频的host接入腾讯视频那边的异步盗链打击,防止恶意用户利用腾讯视频的host盗播精品库。具体参考文章视频防盗链阶段总结。

2、针对获取到vkey后,利用非腾讯视频的host访问精品库问题,这时候这些host都死非腾讯视频业务,不能接入腾讯视频的异步防盗链打击。但是,正是由于他们是非腾讯视频host访问腾讯视频业务文件,所有禁止他们访问腾讯视频文件或者让它们只能访问自己的业务文件就解决了问题。

个业务接入时,我们都会为业务提供一个业务id(大业务不止一个,可能有多个),在源站是,但是CDN oc节点上无法获取文件对应的bizid(DC能从ftn获取到文件相关bizid),也就无法限制host访问相关文件。无法识别bizid,有没有办法从文件名识别是否为腾讯视频的文件。其实,最后就是根据文件名的规则识别为腾讯视频文件,最后全网禁止非腾讯视频的host访问腾讯视频文件。 并且腾讯视频自己启用新的vkey校验库,独立一套校验库算法。

3、点播业务除了腾讯视频,还有两大业务,音乐和空间。前面说了音乐的vkey校验没有校验文件名,拿到一个合法(或者自己生成)音乐vkey,通过音乐就可以访问任意业务视频文件(当然访问腾讯视频文件已经被我们通过识别腾讯视频文件名禁止掉了)。这样音乐的host就可能被利用来播放空间的视频文件(特别是带颜色的小视频)。

针对这种情况,首先源站的可以获取到文件对应的bizid,发现通过音乐host访问非音乐文件(bizid),直接禁止访问。那么CDN的OC节点呢,实际上空间视频的文件命名上已经呆了bizid,所有OC节点也能根据文件名知道相关bizid,禁止音乐盗播空间视频。(现在我们接入的业务都是要求文件命名问 bizid_uuid,4位+32位,但是腾讯视频和音乐文件属于比较先接入业务,命名没根据这个规则了,所以才有了前面第2点,根据腾讯视频其他规则来限制他被其他业务host盗播)。

4、效果与进展

图1和图2为非腾讯视频vcloud添加vid+后缀做限制,不允许访问腾讯视频文件。图2波动由于5月6日禁用一些音乐回源host,盗链全部换到dl.stream这个host引起。图3是源站限制host只能访问其相关的bizid文件之后音乐回源(源站dchttp)host盗链流量掉底。

图1

图2

图3

5、后续措施

A业务的host去盗播B业务的文件,此时,如果能识别通过文件名获取到任意一个业务的bizid,就能禁止这种现象。如A业务文件能获取到对应bizida,现在A的host只能访问bizida的文件;如果如B业务文件能获取到对应bizidb,禁止bizidb文件被A业务host访问。但是,如果出现无法从文件名中直接获取任意一个业务的id,就无法通过bizid禁止这种不同业务之间的盗播。所以,在内存允许的情况下,在OC缓存节点的filemgr(文件索引管理中记录每个文件的bizid),就可以做到业务之间不相互盗播文件。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

看我如何发现Uber合作方网站XXE 0day漏洞并获得9000美元赏金

1323
来自专栏BeJavaGod

app微信支付(一) - 微信支付基本业务流程解析

想必微信支付是现在很多朋友离不开的一个功能,不论是扫描支付还是公众号支付或者app端支付,基本的思路都是一样的,之前做过支付宝支付以及中国移动支付接口,这几天花...

3174
来自专栏JackeyGao的博客

我做的一些项目

963
来自专栏accesshub

省心运维,远程接入混合网络环境解决方案

解决移动办公用户远程接入需求的方案很多,但无论是购买成熟商业产品还是使用开源软件,都需要自己运维。运营维护依赖人工,需要投入人力解决,这对于人力资源缺乏的企业是...

90
来自专栏微信公众号:Java团长

微信公众号支付功能开发(Java版)

下单和修改支付状态是用户的业务系统干的事,我们来说说如何快速发起支付和接收异步通知。

631
来自专栏移动产品

关注「腾讯云助手」公众号,接收重要通知

公众号现已支持通知主要包括:工单、备案、余额预警、安全事件、域名相关、监控告警相关通知,其他通知正在陆续上线中。

3035
来自专栏即时通讯技术

约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见《微信Mars:微信内部正在使用的网络层封装库,即将开源》),不过微信团队没有失...

641
来自专栏维恩的派VNPIE

采集CTP数据到MySql的代码样例

vn.py目前所使用的数据库是MongoDB,鉴于一些用户更加习惯使用mySql,论坛内desont提供了一个vn.py与mySql相结合管理数据的示例,感谢d...

1053
来自专栏北京马哥教育

IBM专家告诉你如何完成Linux 服务器加固与安全验证

在如今的技术领域中,做一个完全安全的系统是一个不可能实现的目标。正如 FBI 的 Dennis Hughes 所说,“真正安全的计算机是没有连线、锁在一个保险箱...

2747
来自专栏DevOps时代的专栏

从无到有:京东持续集成实践分享

? 讲师 | 潘晓明 编辑 | 黄晓轩 讲师简介 ? 潘晓明 目前就职于京东商城平台产品研发部,主要从事测试开发一职,擅长测试工具的设计与开发。先后就职于惠普...

3726

扫码关注云+社区