Logo ryp 的博客

博客

WyOJ 的安全修复与运维学习指南

avatar ryp 2026-10-23 22:53:08

如 最近爆出的 PHP 严重安全漏洞 所给出的,PHP 最近爆出了严重的 RCE 安全漏洞。

WyOJ 中招了,但我暂时没有心情修复他。理由如下:

  • WyOJ 现在用的 PHP 7.4.3,官方没有补丁。我没这个时间和精力,也没有能力去重新编译整个 PHP,因为我对整个 PHP 生态其实一点也不熟悉。

  • WyOJ 现在有精确到 10 分钟的增量数据库与题目数据备份,也有代码版本跟踪系统。如果真的有黑客把 WyOJ 打爆了,我可以在拿到机子的半个小时内重新拉起来一个。

  • 况且,WyOJ 的前端部署在 Docker 里头,黑客打进来,他也干扰不到实体机。内网里的其他机器上也没有任何数据。

  • 这个 bug 不是脚本式的,一个脚本就能攻陷,而是需要技巧的。

综上,我暂时不打算修复这个“巨大”的 bug。


然而,我却确实修复了一个非常重大的,由 __vector__(利用 DeepSeek)发现的 bug。

这个 bug 的具体路径是:

  • 利用团队可以自由创建题目,注册一个团队,并上传一道题目,开启 Hack。

  • 过了这道题。

  • 重新上传数据,构造一个 ex_x/ 目录,里面放一个 .keep 文件保证上传时空文件夹不被丢掉。

  • 将新数据的 problem.conf 配置成 input_suf x/../../../../../opt/uoj/web/<name>,input_suf php,准备侵入到 /opt/uoj/web/ 中。

  • Hack 这个提交,并成功,触发 WyOJ 将 Hack 输入以 ex_input_suf_1.in 之类的格式拷贝到数据目录中。

  • 拷贝的过程中没有验证,于是我们就成功将 Hack 输入保存到了 /opt/uoj/web/<name>.php。

  • 访问 <name>.php 即可执行需要的命令。

整个攻击过程,一气呵成,非常漂亮,非常精美。击节赞叹之!

这个 bug 的根本原因是:

原版 UOJ 由于只有管理员可以上传数据,因此没有考虑验证 problem.conf 是否会遭遇攻击。

然而,WyOJ 将上传数据的权限草率地开放给了所有人(只需注册组),因此在很多地方留下了漏洞。

当前,bug 已经修复。具体可见 WyOJ git 仓库。

感谢大家对 WyOJ 的支持!


另外,如果有人想要维护 WyOJ,这当然是欢迎的!欢迎大家踊跃报名。

但 WyOJ 虽小,毕竟也是个生产环境,我暂且武断地认为,大概需要掌握以下技术,基本按照重要程度降序排序:

意识

一切修改都要考虑安全性。做一切修改前,考虑有无备份。做一切修改后,验证原功能是否可用,是否做了破坏性的修改。

如果是使用 AI 编写的代码,必须要通读一遍,能指出修改了哪些地方。

特别地,禁止 AI 参与任何形式的运维活动,包括但不限于直接通过跳板机连接主服务器,运行未经验证的由 AI 编写的脚本,利用 AI 修改自己并不熟悉的系统配置。

AI 只能在本地测试非生产环境部署。

计算机硬件基础

机房的机器条件简陋,包括一台奔腾 E5700,五台奔腾 G2030,配置最高的一台是 i3-3240 4GB 内存,加装的是自己买的二手 120GB SSD。

因此,长期维护者,必须能非常熟练地拆装 PC,能配置网络(硬件部分),会打网线最好。

操作系统

不用说了。

这部分可以看 CSAPP,《深入理解计算机系统》。

计算机网络与路由

WyOJ,或者是任何一个互联网应用中,都包含了大量网络知识。

WyOJ 的网络架构是:云服务器(82.157.60.207)上的 nginx 反向代理到 frp,再由 frp 隧道和本机的 Docker 暴露出的 80 端口联通。

同时,WyOJ 的数据存储在 iSCSI 硬盘上。这部分最好会配置。

这部分,大家可以看《TCP/IP 详解》(三卷的大厚书,有你啃的),《TCP/IP 路由技术》(思科的书,两卷册,也够啃的)。

Arch Linux、Alpine Linux、Ubuntu 的运维

基础的 Linux 运维是不用说的,再强调也不为过。

我的标准大概是,至少有一年的 Linux 使用经验,最好有两年及以上。

这里的使用,指的是使用在实体机上安装的非 WSL 的 Linux 发行版。虚拟机的硬件过于简单,WSL 又很难说得上是严肃的 Linux。

我本人是大约六年级开始使用 Linux 的,折腾过各种东西,甚至长期使用过不安 DE 的纯命令行界面。所以我的观点也许有些偏激,但我还是认为,如果你看到黑乎乎的命令行就紧张的话,那你还是千万不要当运维了。

Docker 与 Docker Compose 的运维

Docker 不仅仅是一个工具,更是现代各种软件部署的基石。不会用 Docker,在今天和不会用 Linux 是个等号。

Docker 相关的有些杂项的最近刚出版的书籍,图书馆就有,可以借来看看。

SQL / MySQL

MySQL 在运维中很重要。就 WyOJ 而言,大量的原始数据在前端是没有展示的,你必须得在 MySQL 里头用 select + join 一个一个查。

我觉得能深刻理解联合和索引即可。大家可以看看《高性能 MySQL》。

Restic 等工具

我对 WyOJ 最引以为傲的东西之一就是精确到十分钟的备份系统了。虽然这实际上很简单,但我还是很骄傲。

呵呵,运维就是这样。你折腾出的东西,回头看看,其实很简单,但你还是很认可自己做的这些成就的。

尤其是 Restic 救了我好几条命。我觉得如果你做运维的话,他也总有一天会救你一命。

PHP 与 传统前端开发

这部分其实越来越不重要了,也是最值得用 AI 取代的部分之一。

值得注意的是,关键的 PHP 代码,我还是推荐手写的。如果要用 AI,必须有审查。

UNIX/Linux 环境 C/C++ 编程

APUE 那本书最好能看过。其实如果你不看 APUE,我是比较怀疑你对 UNIX/Linux 的理解的。

就我个人而言,我自己写过内核,所以对内核理解相对深刻一些。

这部分的书,有《UNIX 环境高级编程》(Advanced Programming in the UNIX Environment)。《Linux 设备驱动程序》(Linux Device Drivers)等。


我暂时能想到的就是这些东西。看起来很多很复杂,但其实大家不用怕,我在高一刚部署 WyOJ 的时候,也并不会这么多东西,比如 MySQL 和 Restic 都是我后来才慢慢学的。

AI 时代,看起来好像,编程简单了一万倍。实际上,运维在这几年内,还是少不了人类的。AI 是会犯错的,而且频率不低。

其实,我上面提的要求挺高了,可能是比大家出去找个运维的工作给你的要求还要高。呵呵。

这只是我列的一个要求,带有大量的我个人主观色彩。大家学习肯定不一定非要按照我的想法来。主要是我希望,有这方面想法的人,能一步一步学下去。运维是门很踏实的活,在 AI 时代,他越来越是一门追求踏实的活。前几天的 PHP 漏洞,对大量的运维是一场大考。以后这样的大考会越来越多的。

再次提醒大家,运维绝对不是一种享受。也许有时候大家看起来,说,感觉平常 ryp 也没干啥东西。运维就是这么个手艺。你做的东西要比你被看到的东西多一百万倍。如果大家有想法,就慢慢学吧。

ryp

评论

Little_Cck
wyojyydsrypnb,ryp将会带领wyoj走向越来越大的舞台

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

ryp Avatar
我拒绝零假设
活跃度 近 53 周
查看全年