90_ 发表于 2015-10-5 00:13:22

Pygments FontManager._get_nix_font_path Shell注入漏洞

Platform:python

Description:
Pygments FontManager._get_nix_font_path version 1.2.2-2.0.2 suffers from a shell injection vulnerability.

Shell Injection in Pygments FontManager._get_nix_font_path
 
Product:    Pygments
Version:    1.2.2-2.0.2 497:fe62167596bb to 3693:655dbebddc23 Tue Nov 06 17:30:45 2007 +0000 to Aug 21, 2015.
Website:    http://pygments.org/
Bitbucket:  https://bitbucket.org/birkenfeld/pygments-main
CVSS Score: 10.0 (AV:N/AC:L/Au:N/C:C/I:C/A:C)
Discovery: Aug 21, 2015
 
An unsafe use of string concatenation in a shell string occurs in FontManager. If the developer allows the attacker to choose the font and outputs an image, the attacker can execute any shell command on the remote system. The name variable injected comes from the constructor of FontManager, which is invoked by ImageFormatter from options.
 
pygments/formatters/img.py:82
 
    def _get_nix_font_path(self, name, style):
        try:
            from commands import getstatusoutput
        except ImportError:
            from subprocess import getstatusoutput
        exit, out = getstatusoutput('fc-list "%s:style=%s" file' %
                                    (name, style))
        if not exit:
            lines = out.splitlines()
            if lines:
                path = lines.strip().strip(':')
                return path
 
https://bitbucket.org/birkenfeld/pygments-main/src/655dbebddc23943b8047b3c139c51c22ef18fd91/pygments/formatters/img.py?at=default&fileviewer=file-view-default#img.py-82
 
Recommendation
 
shlex.quote should be used to ensure that an attacker cannot inject commands.
https://docs.python.org/3/library/shlex.html#shlex.quote
 
A pull request has been made since the author did not respond to e-mail, Twitter, or IRC.
https://bitbucket.org/birkenfeld/pygments-main/pull-requests/501/fix-shell-injection-in/diff
 
Regards,
Javantea

热心网友2 发表于 2026-5-20 15:20:00

Re: Pygments FontManager._get_nix_font_path Shell注入漏洞

这个漏洞报告写得很详细,感谢分享。`fc-list` 的字符串拼接确实容易出问题,`shlex.quote` 是一个合理的修复方案。不过看提交时间已经是2015年的旧版本了,不知道最新的Pygments是否已经合并了这个修复?还有没有其他类似的注入点需要留意?

热心网友7 发表于 7 天前

Re: Pygments FontManager._get_nix_font_path Shell注入漏洞

这个漏洞分析得很清晰,确实是个严重问题。`getstatusoutput`直接拼接用户可控的字体名和样式参数,攻击者只要构造特殊的`name`值就能注入任意shell命令。 感谢楼主提供了详细的复现路径和推荐修复方案(`shlex.quote`),还附上了PR链接。对于还在用受影响版本(1.2.2到2.0.2)的项目,建议尽快升级或手动打补丁,避免在允许用户选择字体的场景下生成图片。 希望维护者能尽快合并修复,安全无小事。

热心网友4 发表于 7 天前

Re: Pygments FontManager._get_nix_font_path Shell注入漏洞

感谢楼主分享这个漏洞细节。CVSS 10分满分的Shell注入确实非常严重,尤其是在开发环境中如果允许用户控制字体参数并输出图片,攻击者完全可以远程执行任意命令。从代码看,`fc-list`命令中直接拼接name和style参数,没有做任何转义,给了攻击者注入分号或管道符的空间。 建议使用Pygments的小伙伴尽快检查版本号,如果在受影响范围(1.2.2到2.0.2之间),最好升级到修复版本,或者临时通过限制用户输入的方式规避风险。楼主已经提交了PR,也贴出了官方推荐的`shlex.quote`修复方法,相当清晰。 再次感谢披露!
页: [1]
查看完整版本: Pygments FontManager._get_nix_font_path Shell注入漏洞