加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.xcrb.com/)- 应用程序、AI行业应用、CDN、低代码、区块链!
当前位置: 首页 > 站长资讯 > 评论 > 正文

站长易忽略的云安全盲区:评论区成容器攻击入口

发布时间:2026-11-13 11:02:56 所属栏目:评论 来源:DaWei
导读:  去年春节,我蹲在IDC机房听空调外机哼《恭喜发财》第十八秒,手机震——老张在群里@我:“评论区炸了,你那个WordPress容器里跑着的轻量级评论插件,刚被扫出CVE-2023-xxxxx。”
  我手还捏着半块凉透的蛋黄酥,油蹭在键盘

  去年春节,我蹲在IDC机房听空调外机哼《恭喜发财》第十八秒,手机震——老张在群里@我:“评论区炸了,你那个WordPress容器里跑着的轻量级评论插件,刚被扫出CVE-2023-xxxxx。”
  我手还捏着半块凉透的蛋黄酥,油蹭在键盘F12键上。没点开链接,先ssh进集群看Pod状态:三个评论服务实例全在CrashLoopBackOff。不是OOM,不是Readiness探针失败,是initContainer直接exit 137——内存没爆,但被OOMKilled了。怪事。


  我原以为又是CDN缓存穿透+爬虫毛刺QPS打穿限流阈值,结果kubectl logs -p 看到一行:`[WARN] /wp-content/plugins/simple-comments/submit.php: received raw payload with base64-encoded .sh extension in filename field`。
  这玩意儿连个Content-Disposition都没校验,光靠前端JS做后缀过滤。而前端JS?早被爬虫绕过八百遍了。站长还在后台把“评论需审核”勾上就当防住了——防个寂寞。


  工位上那盒酸辣粉汤都结膜了。小王抱着笔记本撞进来,头发乱得像刚被蜘蛛爬过三轮,说备案号被工信部临时标注“高危风险”,因为IP段里连续三小时跑出大量/wordpress/wp-admin/admin-ajax.php?action=fetch_comments的POST请求,User-Agent写着“BaiduSpider/2.0”但Referer全是钓鱼站域名。我说你别慌,他点头点头点头,突然掏出手机翻相册给我看——昨天凌晨三点,他老婆发的朋友圈截图,背景是他家路由器背面贴着的IP地址标签,水印还没干。


  监控又跳了一条报警:container_fs_usage_bytes{namespace="prod",pod=~"comment-."} > 2GB。不是磁盘撑爆,是日志疯狂写入/var/log/php/error.log——里面全是`PHP Warning: include(/tmp/.a2c8b9.sh): failed to open stream`。那脚本早删了,可攻击者每两分钟重提一次,路径拼接用的是$_POST['filename'] + $_SERVER['DOCUMENT_ROOT']。我敢打包票:这个插件作者绝对没在Dockerfile里加RUN rm -rf /tmp/ && ln -sf /dev/null /tmp/.a2c8b9.sh。没人干这事。


  后来查镜像层,发现基础镜像里压根没装auditd,只开了syslog转发——结果攻击者上传的.sh脚本第一行就是`rm /var/log/syslog`,第二行就wget下载新payload。而syslog转发配置里,日志等级设的是warning以上……所以所有chmod +x、chown nobody:nogroup、curl -fsSL都静默消失了。优胜劣汰?对,活下来的站点都是把评论关了、或者干脆扔掉WP改静态博客的。剩下的,等哪天k8s节点被挂上挖矿机,再优胜一遍。


  李工在群里发了个“捂脸”表情包,附言:“客户问我们‘为啥CDN拦截不了’,我回‘因为CDN不解析PHP’,他反问我‘那你们CDN是假的吗’……”
  我没回。盯着屏幕右下角,时间跳成03:17。去年这时候,我还在帮人调nginx.conf里的limit_req zone=comment burst=5 nodelay,以为封住IP就万事大吉。结果呢?人家用动态IP池打评论表单,表单本身连CSRF token都不带,token值硬编码在HTML里。你说这怎么拦?


  现在我改了个习惯:每次客户说“评论功能上线”,我就去他GitLab私有仓库里搜“wp-content/plugins//submit.php”,搜出来立刻拒掉合并请求,不管PR标题写得多悲壮。有次客户在Jira里写“紧急需求:支持邮箱订阅+评论通知”,我批注:“先删评论模块,再谈订阅。”他隔天打电话来,语气像我欠他三百七十二块押金没退。我说那你把容器启动命令贴我看看,他沉默了四十三秒,挂了。


  不过有个事我说不准:为什么几乎每个被攻破的评论容器,最后都留在同一个Node上?查kubelet日志,全是systemd: cgroup memory limit exceeded。但Node资源明明够——kubectl describe node 显示used只有62%。我拉过cAdvisor指标比对,发现是那个Node的runtime(containerd)版本老旧,对memory.swap.max处理有bug,导致OOM Killer乱杀。可这跟评论区有半毛钱关系?没有。但每次复盘,它都准时出现在最后一行。真邪门。


  对了,前两天在备案系统里看到个ID,开头是“沪ICP备2020xxxxxxxx”,后六位和我工位对面老刘三年前离职时用的测试子域名hash一致。他走的时候没交出那个子域名的DNS权限。我不知道这有没有用,但今早我又去查了阿里云控制台的AccessKey操作日志——空白。空白得很干净,不像没动过,倒像被谁手动清过三次。


文章配图,仅供参考

  不说了,运维群弹窗又闪:“【告警】pod/comment-api-6f89b4cd8-8zg2w terminated: OOMKilled”。
  我去重启。这次顺便把/etc/cron.d/comment-purge脚本里的sleep 3600改成sleep 300。至于要不要把整个评论链路从prod namespace挪到test namespace先跑三天……再说吧。手边这杯咖啡凉了,得趁热喝一口。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!