iOS工程师私藏:交互式网站破局同质化
|
去年十月,我盯着那个iOS工程师甩进安全群的链接看了十八秒——不是因为加载慢,是首页动效在拖影,但WAF日志里那串IP又太眼熟:192.168.122.73,我们测试网段里早该下线的旧堡垒机地址。他截图里写了“交互式网站破局同质化”,底下还手写标注“iOS私藏”,字迹带点右上翘,像没绷住的笑。我没点开,先去翻了CDN边缘节点的access_log——果然,/api/v2/user/state 返回 200 的同时,/static/js/vendor.4d8a2.js 有三次 404,时间戳差两秒,毫秒级对齐。这不对劲。 我原以为又是哪个前端把本地mock服务漏推到生产环境,结果查GitLab commit记录,last push 是十月十七号凌晨三点十一分,作者是“liang@ios.xxx.com”,改的是一个叫“web-interact-core”的子模块,diff 里夹着三行注释:// touchend → pointerup // 防 Safari 点透 // legacy fallback for iPadOS 15.7。我敢打包票,这个 iPadOS 版本号没写错,他们真在测那个废弃的灰度通道。可当我 ssh 进那台 nginx 节点搜 vendor.4d8a2.js,发现 /usr/share/nginx/html/static/js/ 下多出个 vendor.4d8a2.js.bak,权限是 600,owner 是 nobody,md5 和线上 js 不一样——但大小只差十二字节。我截了图扔进群里,没人回。 深夜两点零七分,钉钉突然全员@,标题是“【紧急】web-interact-core 上游依赖链变更通知”。发信人是运维小张,但他头像还是三个月前的钓鱼邮件截图。我顺手点了他个人资料页右上角的“最近访问”,跳出个 403,URL path 里带了 utm_source=interact-web。这个我说不准,到底是不是他们自己埋的监控跳转。但我记得去年六月,同一个域名被 WAF 规则库第 427 号规则封过一次,就因为 /interact/session/ 拦不住 POST+JSON 带 base64 编码的 cookie,后来改成用 Cookie-SameSite=Strict 强顶了三个月,直到某天下午三点四十,日志里突然多了三百七十二次 /interact/session/reset,来源 UA 全是 “Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148”——连设备型号都懒得换。 服务器上那个 vendor.4d8a2.js.bak,我 diff 出来的十二字节差异,是开头多了个 function _s(){return!1}();——没调用,没导出,纯占位。我问了iOS组的阿哲,他说:“哦,防 debug 的,Safari Web Inspector 里断点会崩,所以加个空函数撑着。” 我问他怎么不加 try-catch,他说:“加了,但苹果说 iOS 17.4 的 JS 引擎优化掉 try 块了,除非里头有 await。” 这个我信。他说话时左手在 iPhone 屏幕上划拉三下,微信界面弹出个新对话框,收件人备注是“WebShell 同步群-测试专用”。
文章配图,仅供参考 昨天重扫了一遍所有 interac 相关路径,/interact/health 响应头里多了一行 X-Powered-By: web-interact-core/2.3.1-alpha.7+g2f4c8ad,而 git tag 里最新的是 2.3.0。2f4c8ad 这个 commit hash,我搜了内部 Gitee,没匹配。倒是 Jenkins 构建日志里有一条 timestamp=1700321987(对应十月十九号晚上十点一十九分)的 job,状态 SUCCESS,build_id=117842,但构建参数里 environment=prod-internal,branch=refs/remotes/origin/HEAD。我顺手 curl -I 了一下那个 build_id 对应的 artifact URL,返回 404。可五分钟后,我在 ES 里搜 keyword “interact” 和 status:200,看到同一分钟内有六次来自 10.233.64.102 的请求,user_agent 是 “Go-http-client/1.1”,response_body_size 都是 128KB,刚好是那个 vendor.4d8a2.js 的大小。 安全是成本不是收入——这话他当时敲在群里,带了个波浪号~。我回了个“?”。他补了一句:“就像你做日志脱敏,不是为了赚钱,是为了别被罚钱。” 我没接。倒是我隔壁工位的老陈,正调试一条绕过 WAF 的 XSS payload,听见后抬头说:“iOS 给你们传了啥文件?给我看看。” 说完伸手要他手机,阿哲下意识锁屏,手指按在电源键上停了半秒。老陈笑了下,转回去继续敲键盘,敲的是 sed -i 's/eval(/_ev__/g' ./js/main.js。这活我干过,去年七月,某次渗透测试里 eval() 被 WAF 放行,结果上线第二天,整站白屏,JS Error 里报 _ev___ is not defined,因为 UglifyJS 把变量名也压了。失败案例就这一个,我记死了。 群里现在安静了。但十分钟前,有人上传了张截图:阿里云 SLS 控制台,查询语句是 request_uri:"/interact/" | select count(1) as c, status group by status order by c desc limit 10,结果里 200 有九万两千次,499 有四百一十三次,401 是八十六次,还有三十二次 418。我点了点那个 418,发现全部来自 User-Agent: "curl/7.64.1",IP 地址全落在同一个 C 段,和早先那个 192.168.122.73 不在一块儿。不过无所谓了。反正今天上午十点,CTO 在晨会说,要把 web-interact-core 作为明年 Q1 全栈技术债清退重点——顺便问问有没有人知道,为啥每次上线,K8s event 日志里总会冒出一条 Warning: “Secret xxx-key was mounted to pod but not referenced in container env or volumeMounts”。这个我管不了。 我删掉了本地 ~/tmp/interact-bak 目录里那个 vendor.4d8a2.js.bak 文件,但忘了 chmod +x 权限,rm 时提示 Permission denied。只好 sudo rm。刚输完密码,终端右下角弹出系统通知:“您最近访问的站点可能含有未验证的脚本,是否阻止加载?” 没点确认,也没点拒绝。我把终端窗口最小化了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |




