#1622·thefuck

Poisoned THEFUCK_OUTPUT_LOG 会指导修正后的命令;未引号的输出标记会在别名 eval 中执行

作者: REYu6创建于 2026年9月9日更新于 2026年9月9日

□ 说明

在即时模式(THEFUK INSTANT-MODE= true')中,更正后的命令提案取自会话输出日志(THEFUK UTPUT LOG'),输出产生的符号被拼接入提案中*而无需引用。 再加上两个弱点,从有毒的日志中产生命令注射链:

  1. output readers/read log.py:: get script group lines'选择一个日志组,用于一个带有松散下弦匹配的指令(所有(部分为脚本-行,部分为部分为")'),覆盖整个共享日志;
  2. 许多规则从command.output'中提取符号,并插入未引用的新命令——例如:rules/brew install.py' regex-摘录了你的意思是X建议并返回`'brew安装 " +公式;
  3. CorrectedCommand.run ' 撰写了 " stdout " 的提案,而外号的外号则评价了 " stdout " ——所以提案中的任何内容都作为 shell 代码执行(有-是',甚至没有立即确认)。

□ 影响

任何能够写入会话日志(当日志是组/世界可写入时的第二个本地用户——参见关于0755/0777默认模式的单独报告;或任何进程妥协)的人,在受害人的 shell会话中,当下一个在匹配失败的命令上运行fuck时,都会得到任意命令执行. 例如: " 你是指邪恶吗? 触摸/tmp/pwned? " 的被毒的日志行产生提议 " 布雷安装邪恶;触摸/tmp/pwned " ,别名则逐字评价。

□ PoC(英语:

在他妈的3.32(源安装)上验证. 该日志被下毒,其结构与所期望的“read log”相同(a `\u200b*10'- 标记的脚本行后有“输出”行,并添加到 1 MiB mmap 尺寸):

MARK = "\u200b" * 10
线 = [f'{MARK} 布雷安装 foo\n],
'警告:没有带有"foo"名称的现有公式. 你是指邪恶吗?
f"{MARK}$\n"] (韩语).
# 贴到1048576字节,像贝壳一样

受害者方(在PATH上用 " brew " shim模拟了一台装有酿酒设备的机器):

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? (原始内容存档于2017-10-25). The Fuck UTPUT LOG=/tmp/ the fuck poisoned.log. FUKK INSTANT MODE=真实的? PS1=$MARK'$' the fuck -- 是"brew sind foo" (美国英语).


□ 执行结果

[受害者]他妈的stout(什么外壳别名evals): 酿造安装邪恶; 触摸/tmp/ the fuck pwned REC [证据]提案载有注入的有效载荷:真 [证据] 在别名风格 eval 之后执行的有效载荷命令: True # /tmp/ the fuck pwned REC 创建


由被毒掉的原木所指导的建议是写成"出出"的并按别名的准确评价,执行所注入的命令.

建议的固定方向:在编制提案(`shlex.quote')时引用产出产生的符号,并(或)将日志组的匹配收紧,超出下弦限制.