Closed top-mind closed 10 months ago
你好, 感谢你的对这个问题的整理.
不知道你是否有兴趣把上述内容整理成一篇技术博客文章? 这样讲义可以引用你的文章, 希望通过这种方式记录你的贡献.
你好, 感谢你的对这个问题的整理.
不知道你是否有兴趣把上述内容整理成一篇技术博客文章? 这样讲义可以引用你的文章, 希望通过这种方式记录你的贡献.
你好,@top-mind 委托我写了一篇技术博客来详细地阐述这个问题,我在其中引用了他的贡献。博客地址是 https://blog.rijuyuezhu.top/posts/972c44eb/
已在讲义中添加提示, 感谢你们的工作!
PA2 提供 -fsanitize=address 的编译开关,开启后可以触发 readline 库的一个内存泄漏漏洞。
性质:完全不影响PA流程。
可能有用的补充性质:我推测,绝大部分学生不会遇到、部分学生探究无果、部分学生STFW找到描述这个漏洞的追踪器、少部分学生完全理解并解释了这个现象。
为什么有必要提及:这个漏洞令人困惑,因为问题不出在学生的代码;它可能偶然被触发然后无法复现 ;即使能稳定触发,由于readline 库本身不含追踪信息,LeakSanitizer只能打印2个调用栈,很难追踪调试。我建议:在讲义中提及这个漏洞,不要给发现这个问题的学生留下遗憾。
漏洞描述:直接原因是调用了 add_history(),根本原因是 _rl_start_using_history() 没有 free 当前 data. 复现:只要在对当前行有修改的情况下用历史功能就会触发。
解释 readline v8.2 修复了这个漏洞, diff一下 readline-/misc.c 就能看出来.
版本 readline version <= 8.1.2
临时修复 从源码编译 readline 8.2
FAQ 为什么不升级 readline? 要更换PPA。弄个NJU特供PPA? 为什么不安装新版 readline? 可能是我的问题,但是v8.2 ./configure && sudo make install 会由于兼容性不可用(找不到符号,会使一些CLI、Terminal如 gnone-terminal 崩溃)。 什么时候的漏洞? 不知道。给三个时间点:readline copyright 从 1987年开始,这个漏洞至少2006年(v5.2)就存在,第一个可考的漏洞反馈在2022年,同年被首次修复。
怎样在讲义中提及