Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
writeup_split — GNU coreutils split 程序中堆溢出漏洞的 Writeup。CVE-2024-0684 | Kitploit
工具/GitHubGitHub/valentin-metz/writeup_split
漏洞分析漏洞利用论文与研究学习与教育二进制利用
GitHubvalentin-metz/writeup_split

writeup_split

GNU coreutils split 程序中堆溢出漏洞的 Writeup。CVE-2024-0684

查看仓库
42年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站

摘要

CVE-2024-0684

GNU coreutils 的“split”程序存在一个漏洞,允许用户控制的数据引发堆缓冲区溢出。

该漏洞由 40bf1591bb4362fa91e501bcec7c2029c5f65a43 于 2023-03-04 引入。 修复已随 c4c5ed8f4e9cd55a12966d4f520e3a13101637d9 于 2024-01-17 发布。

受影响版本:GNU coreutils v9.4; v9.3; v9.2

概念验证: 此仓库中的 split_me 示例文件可用于在受影响版本上触发崩溃。

root@kitploit:~
split -C 1024 ./split_me

这将导致 split 因段错误(SIGABRT)而崩溃。

发现

我是在尝试使用 QR 码自动从物理隔离系统中提取数据时发现这个漏洞的。 使用 qrencode 生成的 QR 码容量约为 4000 个字符,因此需要大量使用 split。 在一个特定的测试用例中,split 因段错误崩溃。

隔离

由于 GNU coreutils 是开源软件, 我们可以直接使用源代码来定位漏洞,而无需对二进制进行逆向工程。 在开源项目中,你应尽量在漏洞报告中提供具体的细节, 最好能指出引入漏洞的确切提交和代码行,并附上建议的修复方案。 这样维护者就能快速验证你的报告,缩短响应时间。

在跨不同系统验证该漏洞时, 我注意到崩溃只发生在相对较新的 split 版本上。 如果你有一个 good 提交和一个 bad 提交, 就可以在提交历史上进行二分查找, 从而找到真正引入该漏洞的提交。

Git 为此提供了专门的工具:git bisect。 它会自动建议需要测试的提交,并允许你将其标记为 good 或 bad。 最终你会得到引入该漏洞的那个提交;在我们的案例中:

root@kitploit:~
commit 40bf1591bb4362fa91e501bcec7c2029c5f65a43
Author: Paul Eggert <[email protected]>
Date:   Sat Mar 4 11:42:16 2023 -0800

    split: prefer signed integers to size_t
    
    This allows for better runtime checking with gcc
    -fsanitize=undefined.
    * src/split.c: Include idx.h.
    (open_pipes_alloc, n_open_pipes, suffix_length)
    (set_suffix_length, input_file_size, sufindex, outbase_length)
    (outfile_length, addsuf_length, create, cwrite, bytes_split)
    (lines_split, line_bytes_split, lines_chunk_split)
    (bytes_chunk_extract, ofile_open, lines_rr, main):
    Prefer signed integers (typically idx_t) to size_t.

 src/split.c | 105 ++++++++++++++++++++++++++++++------------------------------
 1 file changed, 52 insertions(+), 53 deletions(-)

然后,我们可以编译该程序(最好启用地址消毒器(address sanitizer)), 以找到它崩溃的确切代码行。 由于只需检查约 50 行代码, 识别该漏洞就变得很容易。 在我们的案例中,崩溃发生在一个索引错误的 memcpy() 调用处。 实际上,如果检查 memcpy() 调用附近的代码, 我们会发现一个在调用前修改索引计算的 diff:

root@kitploit:~
@@ -816,15 +820,10 @@
          /* Update hold if needed.  */
          if ((eoc && split_rest) || (!eoc && n_left))
            {
-              size_t n_buf = eoc ? split_rest : n_left;
+              idx_t n_buf = eoc ? split_rest : n_left;
              if (hold_size - n_hold < n_buf)
-                {
-                  if (hold_size <= SIZE_MAX - bufsize)
-                    hold_size += bufsize;
-                  else
-                    xalloc_die ();
-                  hold = xrealloc (hold, hold_size);
-                }
+                hold = xpalloc (hold, &hold_size, n_buf - (hold_size - n_hold),
+                                -1, sizeof *hold);
              memcpy (hold + n_hold, sob, n_buf);
              n_hold += n_buf;
              n_left -= n_buf;

如果我们将这些更改回滚并重新编译, split 就能毫无错误地处理我们所有的测试用例。

剩下的工作就是梳理逻辑,以验证该漏洞并制定修复方案。

下载工具