NJU-ProjectN/nemu

[Feature request] 建议 PA 讲义提及 glibc readline 库的内存泄漏漏洞

top-mind opened this issue · 3 comments

PA2 提供 -fsanitize=address 的编译开关,开启后可以触发 readline 库的一个内存泄漏漏洞。

性质:完全不影响PA流程。

可能有用的补充性质:我推测,绝大部分学生不会遇到、部分学生探究无果、部分学生STFW找到描述这个漏洞的追踪器、少部分学生完全理解并解释了这个现象。

为什么有必要提及:这个漏洞令人困惑,因为问题不出在学生的代码;它可能偶然被触发然后无法复现 ;即使能稳定触发,由于readline 库本身不含追踪信息,LeakSanitizer只能打印2个调用栈,很难追踪调试。我建议:在讲义中提及这个漏洞,不要给发现这个问题的学生留下遗憾。

漏洞描述:直接原因是调用了 add_history(),根本原因是 _rl_start_using_history() 没有 free 当前 data.
复现:只要在对当前行有修改的情况下用历史功能就会触发。

具体而言,
$ cd $NEMU_HOME; make memuconfig
开启 fsanitize address
$ make run;
> (nemu) 
敲击 a<CR>b<UP><CR>q<CR> 按键序列(<CR>、<UP>是Vi风格的按键代码转义)
得到
> ==<pid>==ERROR: LeakSanitizer: detected memory leaks
>
> Direct leak of 32 byte(s) in 1 object(s) allocated from:
>     #0 0x7f55100b4887 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:145
>     #1 0x7f5510b4fbac in xmalloc (/lib/x86_64-linux-gnu/libreadline.so.8+0x39bac)
>
> SUMMARY: AddressSanitizer: 32 byte(s) leaked in 1 allocation(s).
> make: *** [path-to-ics/ics2023/nemu/scripts/native.mk:38: run] Error 1
表明成功触发.

解释 readline v8.2 修复了这个漏洞, diff一下 readline-/misc.c 就能看出来.
版本 readline version <= 8.1.2
临时修复 从源码编译 readline 8.2

diff --git a/nemu/src/filelist.mk b/nemu/src/filelist.mk
--- a/nemu/src/filelist.mk
+++ b/nemu/src/filelist.mk
@@ -19,7 +19,7 @@ 
-LIBS += $(if $(CONFIG_TARGET_NATIVE_ELF),-lreadline -ldl -pie,)
+LIBS += $(if $(CONFIG_TARGET_NATIVE_ELF),-ldl -pie,) path-to-directory/readline-8.2/libreadline.a -lncurses

FAQ 为什么不升级 readline? 要更换PPA。弄个NJU特供PPA?
为什么不安装新版 readline? 可能是我的问题,但是v8.2 ./configure && sudo make install 会由于兼容性不可用(找不到符号,会使一些CLI、Terminal如 gnone-terminal 崩溃)。
什么时候的漏洞? 不知道。给三个时间点:readline copyright 从 1987年开始,这个漏洞至少2006年(v5.2)就存在,第一个可考的漏洞反馈在2022年,同年被首次修复。

怎样在讲义中提及

  1. 更新框架代码,要求从源码编译/其他解决方案。
  2. 画个框框带过 (就像我不理解Ubuntu Software Updater 有什么问题一样,我可能完全不知道会发生什么、原因是什么)
  3. 讲一种修复方法。
  4. 告知这是readline 漏洞,作为选做题引导学生排查这个问题。

你好, 感谢你的对这个问题的整理.

不知道你是否有兴趣把上述内容整理成一篇技术博客文章? 这样讲义可以引用你的文章, 希望通过这种方式记录你的贡献.

你好, 感谢你的对这个问题的整理.

不知道你是否有兴趣把上述内容整理成一篇技术博客文章? 这样讲义可以引用你的文章, 希望通过这种方式记录你的贡献.

你好,@top-mind 委托我写了一篇技术博客来详细地阐述这个问题,我在其中引用了他的贡献。博客地址是 https://blog.rijuyuezhu.top/posts/972c44eb/

已在讲义中添加提示, 感谢你们的工作!