文章摘要
文章讲述了在2025年发现的UNIX v4系统中,作者在审计su(1)程序时发现了一个缓冲区溢出漏洞,并着手修复这个历史性系统漏洞的过程。UNIX v4是首个用C语言重写的版本,具有重要历史意义。
文章总结
修复UNIX v4缓冲区溢出漏洞:一场1973年的复古调试
2025年,人们在磁带上发现了唯一存世的UNIX v4系统副本。这个版本标志着计算机历史上的关键时刻——UNIX首次用C语言重写。爱好者们成功在PDP-11模拟器上运行了这个系统。
在审计核心工具su(1)时,作者发现了一个缓冲区溢出漏洞。这个50年前的程序与现代版本功能相似:作为setuid-root可执行文件,它通过验证root密码来提权。问题出在仅50行的源代码中:
- 程序使用100字节固定大小的password缓冲区
- 输入循环缺少边界检查
- 输入超过100字节会导致内存故障(测试时可能触发核心转储)
修复过程充满复古趣味: - 使用1973年的行编辑器ed进行代码修改 - 添加计数器变量i和缓冲区大小检查 - 采用索引检查而非指针运算(因旧编译器兼容性问题)
修改后的编译部署过程简洁明了: 1. 用cc编译器直接编译su.c 2. 将生成的a.out移至/bin/su 3. 设置setuid位和权限(chmod 4755)
这个案例生动展现了早期UNIX哲学的魅力:系统自带完整源代码和编译器,无需外部工具链即可完成修复。同时也折射出1973年不同的安全观念——在受信任的隔离环境中,缓冲区溢出攻击的概念尚未形成。
(注:原文中大量网站导航、图片描述、联系方式等非核心内容已精简,保留了技术细节和历史背景的完整叙述)
评论总结
以下是评论内容的总结:
关于代码漏洞的讨论
- mgerdts质疑代码中
(&fin)[1] = 0的作用,猜测是否在内存中写入0("What is up with fin? Is it really just writing an int 0...")。 - w-m分析密码缓冲区溢出可能性,但指出密码会被哈希覆盖("password is overwritten with its hash before the comparison")。
- mgerdts质疑代码中
漏洞利用与修复
- b-kuiper询问是否已有漏洞利用方法("is there already somebody that wrote the exploit...")。
- nineteen999提到已在x8664端口修复("Already patched this on my x8664 v4 UNIX port")。
- kazinator调侃1973年的远程溢出漏洞("Remotely exploiting a buffer overflow in Unix like it's 1973")。
代码改进建议
- asveikau建议优化循环条件,避免冗余变量("i is the same as (q - password)")。
- WalterBright指出固定大小缓冲区的风险("Having a buffer with a fixed size is always a red flag"),并分享动态分配内存的实践("The buffer was allocated with malloc")。
历史工具与背景
- SoftTalker回忆在受限环境中使用
ed编辑器的经历("I had to use ed once in a very limited recovery situation")。 - ChrisArchitect提供相关历史分析链接("An initial analysis of the discovered Unix V4 tape")。
- SoftTalker回忆在受限环境中使用
总结:讨论聚焦于代码漏洞细节、修复方法及历史背景,同时包含对代码风格和改进的建议。