wordexp(3) 很危险:加了 WRDE_NOCMD 也挡不住命令执行
来源:yossarian.net — 2026-10
📋 概述
wordexp(3) 常被推荐用来在 C 里做 ~ 展开,但它默认开启全部 shell 展开语义,包括命令替换:一行 $(cat /etc/passwd) 就能把程序变成任意命令执行。加 WRDE_NOCMD 只是权宜之计——musl 把这个调用直接委托给系统 shell,只在前面做一次粗略扫描,仍然漏掉 Bash 认为是合法命令替换的写法;macOS 的 libc 同样委托给 /usr/lib/system/wordexp-helper,据 Julian Squires 2023 年的报告存在相同绕过。
🔑 核心要点
- wordexp(3) 是 POSIX 提供的 shell 风格展开 API,最常见的用法是把 ~/foo 展开成 /home/me/foo
- flags 传 0 等于打开全部展开功能,包括命令替换:传 "$(cmd)" 就是任意命令执行
- WRDE_NOCMD 只能挡住天真的实现:musl 把整件事转交给系统 shell,前置扫描漏掉部分 shell 认可的写法
- macOS 的 libc 把 wordexp 委托给 /usr/lib/system/wordexp-helper,2023 年研究者报告过与 musl 相同的绕过路径
- 作者没有验证换用 zsh 作默认 shell 之后该绕过是否仍然成立,但历史包袱已经足够说明问题
- 结论是不可信输入不要进 wordexp,即使带上 WRDE_NOCMD 也不行
💡 金句
Bottom line: don't use wordexp(3) on untrusted inputs, even with WRDE_NOCMD.
👍 0
👎 0
← 返回 Lobsters 首页