只要按下F12,未成年就能秒变成年人?Discord的“数字城墙”裂开了
这事儿有点荒谬。
辛辛苦苦架设的“数字护栏”,严防死守要求用户上传身份证、眨眨眼、点点头,结果在黑客眼里,不过是一行可以在浏览器控制台里随意粘贴的代码。
就在Discord准备在3月向全球推行强制年龄验证的时候,有人直接把底裤给扒了。
不需要假身份证,不需要高超的PS技术,甚至不需要借用爸妈的手机。只要你会按F12,会复制粘贴,几秒钟,你的账号就能完成“成年礼”。
一场关于“信任”的魔术秀
事情是这样的。
Discord为了合规,找来了一家叫k-id的第三方服务商做年龄验证。按理说,这技术听起来挺高大上:为了保证隐私,他们不会把你的脸或者视频直接传到服务器上,而是只上传一堆关于你面部特征的“元数据”。
听起来很安全对吧?
但这恰恰是最大的漏洞。
既然不传视频,只传数据,那服务器怎么知道这数据是摄像头实时扫出来的,还是我用代码伪造出来的?
这就好比你考驾照不需要本人去,只需要提交一份“体检报告”,而这份报告完全可以在家里用打印机随便编。
只要几行代码,就能骗过AI
这群技术极客们是怎么做到的?说白了,就是“逆向工程”加“数据伪造”。
他们写了一段脚本,直接扔进Discord的网页版控制台。这段脚本干了一件很“暴力”的事:它直接劫持了Discord内部的API客户端,向服务器发送了一个伪造的验证请求。
这里有个很有意思的技术细节,我念叨一下。
k-id的合作伙伴Faceassure为了防作弊,加了一层AES-GCM加密。这玩意儿通常用来保证数据没被篡改。一般人看到这就懵了,但在这群黑客眼里,这只是个稍微复杂点的数学题。
他们发现,只要把encrypted_payload(加密载荷)、auth_tag(认证标签)、timestamp(时间戳)和iv(初始化向量)这几个参数算对,服务器就会以为这数据是“纯净”的。
// add a chunk to get all of the webpack chunks
_mods = webpackChunkdiscord_app.push([[Symbol()],{},r=>r.c]);
这还没完,最绝的是对“预测数据”的处理。
系统会根据你的面部数据生成一堆outputs和raws,还要用Z-score算法剔除异常值。黑客们为了过这一关,直接写代码模拟了这套算法,生成了完美的“假数据”。
甚至连摄像头的设备名、验证的时间线,都被一一伪造得天衣无缝。
当你在屏幕前傻乎乎地对着摄像头点头时,黑客早就用代码把服务器“哄”开心了。
不止Discord,这是一场通用的“降维打击”
你以为这只是Discord的倒霉日?
并没有。
同样的套路,在Twitch、Snapchat甚至Kick上照样能跑。只不过在这些平台上,操作更简单粗暴一点:你只需要把验证页面的二维码链接抠出来,扔到那个破解网站的输入框里。
这就像是你拿着一把万能钥匙,不仅能开自家的门,还能开邻居家,甚至整栋楼的门。
有意思的是,评论区里有位大佬说得挺透彻:
“真正的稳健方法将是生成人工视频输入……如果他们开始要求使用难以伪造摄像头的手机,你只需要把摄像头放在高分辨率屏幕前就行了。”
这就是猫鼠游戏最无奈的地方:只要是人造的防线,就一定有人造的梯子。
墙是修给监管看的,还是拦用户的?
看完整个技术拆解,我个人觉得最讽刺的不是技术本身,而是背后的逻辑。
Discord为了所谓的“合规”,为了满足监管机构的要求,给用户上了一道道枷锁。普通用户体验极差,隐私风险敞口大开,结果呢?
这道防线在懂行的人面前,脆得像张纸。
有人就在评论区里发出了灵魂拷问:
“我不理解为什么(主要是)年轻人要费这么大劲,去继续当一个对充满敌意的服务的忠实客户?”
这话扎心了。
一方面是平台为了免责拼命筑墙,一方面是用户为了留在平台上拼命拆墙。
这是安全验证还是形式主义?平台把责任甩给了第三方验证商,验证商用看似高大上的算法糊弄了平台,而黑客用几行代码揭穿了所有人的底牌。
最后剩下的,只有老老实实对着摄像头眨眼的普通用户。
这事儿,你怎么看?
参考链接:
https://age-verifier.kibty.town/