Hacker News 中文摘要

RSS订阅

修复Unix v4中的缓冲区溢出:如同1973年的方式 -- Fixing a Buffer Overflow in Unix v4 Like It's 1973

文章摘要

文章讲述了在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行的源代码中:

  1. 程序使用100字节固定大小的password缓冲区
  2. 输入循环缺少边界检查
  3. 输入超过100字节会导致内存故障(测试时可能触发核心转储)

修复过程充满复古趣味: - 使用1973年的行编辑器ed进行代码修改 - 添加计数器变量i和缓冲区大小检查 - 采用索引检查而非指针运算(因旧编译器兼容性问题)

修改后的编译部署过程简洁明了: 1. 用cc编译器直接编译su.c 2. 将生成的a.out移至/bin/su 3. 设置setuid位和权限(chmod 4755)

这个案例生动展现了早期UNIX哲学的魅力:系统自带完整源代码和编译器,无需外部工具链即可完成修复。同时也折射出1973年不同的安全观念——在受信任的隔离环境中,缓冲区溢出攻击的概念尚未形成。

(注:原文中大量网站导航、图片描述、联系方式等非核心内容已精简,保留了技术细节和历史背景的完整叙述)

评论总结

以下是评论内容的总结:

  1. 关于代码漏洞的讨论

    • 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")。
  2. 漏洞利用与修复

    • 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")。
  3. 代码改进建议

    • 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")。
  4. 历史工具与背景

    • SoftTalker回忆在受限环境中使用ed编辑器的经历("I had to use ed once in a very limited recovery situation")。
    • ChrisArchitect提供相关历史分析链接("An initial analysis of the discovered Unix V4 tape")。

总结:讨论聚焦于代码漏洞细节、修复方法及历史背景,同时包含对代码风格和改进的建议。