CVE-2020-5230
Executive Summary
CVE-2020-5230 is a path traversal and identifier handling vulnerability in Opencast, an open-source video management and lecture capture system, affecting all versions prior to 7.6 and 8.1. The vulnerability stems from Opencast's acceptance of nearly arbitrary identifiers for media packages and elements, which are subsequently used in file system operations, enabling an attacker to escape working directories and write files to unauthorized locations. Additionally, a separate logic flaw in the interaction between the Id.toString(…) and Id.compact(…) methods can cause identifier mismatches, leading to operational errors. The vulnerability carries a CVSS score of 7.7, indicating high severity, though no public exploit or CISA KEV listing currently exists.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
Opencast, a comprehensive video management platform used primarily in educational institutions, manages audiovisual content through media packages — containers that include metadata, media files, and Dublin Core catalogs. The CVE-2020-5230 vulnerability arises from two interconnected issues in how Opencast handles identifiers.
Primary Issue — Unsafe Identifiers: Opencast allows "almost arbitrary identifiers" for media packages and elements. Unlike properly validated identifiers that are restricted to alphanumeric characters and safe delimiters, Opencast accepts a broad range of input without sufficient sanitization. These identifiers are then used in file system operations, which is the crux of the vulnerability. If an identifier contains path traversal sequences such as ../ (or the platform-appropriate equivalent), the file system operation will resolve the path outside the intended working directory. This allows an attacker to direct file writes to arbitrary locations on the server: overwriting configuration files, writing web shells, dropping cron jobs, or clobbering application files.
The term "almost arbitrary" indicates that while some basic validation exists, it fails to block the full spectrum of dangerous characters. The attack surface is exposed via any API endpoint, administrative function, or workflow trigger that accepts media package or element identifiers as input. Since Opencast is typically deployed as a public-facing application for video delivery and management, these endpoints are accessible across the network.
Secondary Issue — Identifier Mismatch: The second component involves Opencast's Id.toString(…) vs. Id.compact(…) behavior. The compact method was intended as a mitigation for the file system problem by normalizing or shortening identifiers when used in file paths. However, because the compact transformation is not always applied consistently, an identifier may be used in its full toString() form in some operations and its compact form in others. When these two representations diverge (e.g., when an identifier contains characters that compact strips or escapes), the same logical identifier resolves to different file system paths. This causes errors in file retrieval, processing pipelines, and can result in data integrity issues, potentially compounding the security problem by enabling an attacker to reference previously written files through a second, inconsistent identifier.
Affected Versions: The vulnerability affects Opencast before 7.6 (all releases up to 7.5.x) and versions 8.x before 8.1. Both 7.6 and 8.1 patch the issue.
Exploitation Scenarios
No public exploit code or PoC exists for CVE-2020-5230, and it has not been observed in the wild. The following attack chain is inferred from the vulnerability class and the NVD description. Insufficient technical detail is available to specify exact endpoints or parameter names.
Step 1 — Reconnaissance: An attacker identifies a publicly reachable Opencast instance through internet-wide scanning for default ports or by fingerprinting the web application (e.g., via HTTP response headers, login page titles "Opencast Studio" or "Opencast Admin", or the presence of /engage/ui/ API patterns). Shodan queries such as product:opencast http, title:opencast, or opencast login can be used to locate vulnerable targets.
Step 2 — Triggering the Flaw: The attacker submits a request to an administrative or ingest API endpoint that accepts a media package identifier. Rather than providing a benign identifier like 1234, the attacker crafts an identifier containing path traversal sequences, for example ../../../../tmp/evil. Due to the "almost arbitrary" identifier validation, Opencast accepts this identifier and uses it in file system operations during media package processing (e.g., writing media files to a staging directory, creating thumbnails, or generating playlists). The path traversal sequences cause the file system operation to resolve outside the intended media directory, navigating upward into the server filesystem.
Step 3 — Payload Execution: The attacker writes a malicious file to a location of their choosing. For web server exploitation, the attacker could write a PHP or JSP web shell into the web root (e.g., /var/www/html/shell.jsp), making it directly accessible via HTTP. Alternatively, the attacker could overwrite an existing configuration file to disrupt service, plant a cron job for command execution, or overwrite application code. The identifier mismatch issue (toString vs. compact) complicates the attack by potentially changing the actual written path, but it also creates the possibility of mapping attack payloads to alternate paths for stealth.
Step 4 — Post-Exploitation: If the attacker successfully plants a web shell, they achieve remote code execution on the server. They can then escalate privileges (if not already running as root), pivot into the internal network, access other systems, steal database credentials stored in configuration files, encrypt data (ransomware), or steal sensitive educational content. The level of impact depends on the privileges of the Opencast process: if running as root, the attacker can assume full control of the host.
Impact Assessment
CVE-2020-5230 has a CVSS score of 7.7 (High severity), reflecting the combination of a complex attack and substantial security impact. While specific CVSS subscore breakdowns are not available in the vector string (which is not provided), a score of 7.7 indicates moderate attack complexity but significant confidentiality, integrity, and availability impact — consistent with arbitrary file write capabilities leading to remote code execution.
The affected deployment is specifically Opencast video management servers, which are predominantly deployed in universities, colleges, and other educational institutions for lecture capture and streaming. These servers are public-facing by design, making them reachable by attackers without requiring prior authentication if the vulnerable endpoint is unauthenticated. In many deployments, the admin interface IS authenticated, so the "almost arbitrary" identifier issue may require valid credentials, effectively raising the real-world exploitability bar. However, if the vulnerable identifier ingestion occurs via unauthenticated ingest workflows (e.g., for uploads from a public portal), the exposure is fully remote without authentication.
The blast radius includes: (1) compromise of the video management server, potentially exposing copyrighted or sensitive lecture content, student records, or database credentials; (2) lateral movement into the institutional network if the server is connected to the campus LAN; (3) data integrity loss from overwritten files; and (4) availability impacts from service disruption. Since the vulnerability allows writing files to arbitrary locations, the impact is effectively equivalent to arbitrary file write, which for a web application frequently escalates to full remote code execution.
Detection Guidance
Sigma Rule
title: Opencast Unsafe Identifier Path Traversal Attempt
id: 07413bc8-6ece-412f-91a4-1bcb0d3a2b3e
status: experimental
description: Detects path traversal attempts in Opencast media package identifiers
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-5230
tags:
- attack.initial_access
- attack.t1190
logsource:
category: webserver
product: apache
definition: 'Opencast behind Apache server'
detection:
selection:
cs-method:
- GET
- POST
- PUT
cs-uri-query|contains:
- '..%2f'
- '%2e%2e'
- '../../'
- '../'
c-uri-query|contains:
- 'identifier'
- 'id'
- 'mediapackage'
- 'element'
filter_common:
cs-uri-query|contains: '/static/../'
condition: selection and not filter_common
level: high
falsepositives:
- Legitimate identifiers containing encoded dots
- URL normalization by proxies
status: stable
YARA Rule
rule Opencast_Unsafe_Identifier_CVE_2020_5230 {
meta:
author = "valtersit.com Threat Intel"
description = "Detects Opencast unsafe identifiers used for path traversal"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2020-5230"
cve = "CVE-2020-5230"
strings:
$s1 = "../" ascii wide
$s2 = "..\\" ascii wide
$s3 = "%2e%2e%2f" ascii wide
$s4 = "%2e%2e%5c" ascii wide
$s5 = "compact(" ascii wide
$s6 = "toString()" ascii wide
$s7 = "mediapackage" ascii wide
$s8 = "identifier" ascii wide
condition:
(1 of ($s1, $s2, $s3, $s4)) and (1 of ($s5, $s6, $s7, $s8))
}
Suricata IDS Rule
alert http any any -> $HOME_NET any (msg:"CVE-2020-5230 Opencast Unsafe Identifier Path Traversal Attempt"; flow:established,to_server; content:"/"; http_uri; content:".."; http_uri; within:5; pcre:"/(?:\.\.\/|\.\.\\)+(?:[a-zA-Z0-9_\-]+\/)*(?:[a-zA-Z0-9_\-]+\.[a-zA-Z0-9]{2,5})?/Ui"; http_uri; content:"identifier"; http_uri; nocase; sid:2020052301; rev:1; reference:cve,CVE-2020-5230; reference:url,https://nvd.nist.gov/vuln/detail/CVE-2020-5230; classtype:attempted-admin; priority:1;)
Elastic Detection EQL Rule
sequence by source.ip with maxspan=10m
[network where event.category == "web" and
process.name != "" and
http.request.path != null and
(http.request.body like "*../*" or
http.request.body like "*..\\*" or
http.request.path like "*..%2f*")]
[file where event.category == "file" and
process.name != "" and
not startsWith(file.path, "C:\\Program Files") and
not startsWith(file.path, "/usr/share")]
Splunk SPL Query
sourcetype="apache:*" OR sourcetype="iis:*" OR sourcetype="access_combined"
( uri_path="*../*" OR uri_path="*..%2f*" OR uri_path="*%2e%2e*" )
OR ( form_data="*identifier=*../*" OR form_data="*id=*..%2f*" )
OR ( uri_query="*..%2f*" OR uri_query="*../*" )
| stats count by src_ip, uri, method, status, _time
| where count > 3
| table _time, src_ip, method, uri, status, count
Wazuh OSSEC Rule
<rule id="100250" level="12">
<decoded>apache-accesslog</decoded>
<match>\.\.%2f|%2e%2e|\.\./</match>
<regex>\S+ \S+ \S+ \[[^\]]+\] "\S+ \S+[^"]*\.\.(?:%2f|\\|/)</regex>
<description>CVE-2020-5230 - Opencast attempting path traversal via unsafe media identifiers</description>
<mitre>
<id>T1190</id>
</mitre>
<group>apache,web_attack,path_traversal,cve-2020-5230,</group>
</rule>
Mitigation & Patch Guidance
Patch confidence is low (2/4), as the patch claim comes from a single source (the CNA) and has not been independently confirmed by observations or third-party advisories. Nevertheless, the recommended action remains upgrading to addressed versions.
Immediate Mitigations:
- Upgrade Opencast to version 7.6 or 8.1 (or later). This is the definitive fix. The vendor states the issue is fixed in these versions.
- If immediate upgrade is impossible, restrict access to the Opencast web application to trusted IP ranges only via firewall rules. Use strict allow-listing at the network edge to minimize exposure of ingest and admin endpoints.
- Evaluate any WAF (Web Application Firewall) rules to detect and block path traversal attempts. Apply generic path traversal signatures. This is a mitigation only — it may be bypassable and does not address CVE-2020-5230's identifier-mismatch secondary issue.
Patch/Upgrade Steps:
- Review the Opencast release notes and advisory for versions 7.6 and 8.1.
- Before upgrading, ensure configuration files, database schemas, and custom workflows are documented. Test the upgrade in a staging environment.
- Perform the upgrade according to official Opencast upgrade documentation (frequently involving dropping in new binaries and running a migration script).
- Independently verify the patch by testing both the
toString/compactbehavior and directory traversal attempts after upgrade.
Long-Term Hardening:
- Maintain a regular patching calendar for Opencast deployments. Subscribe to security advisories from the Opencast project.
- After patching, audit any existing media packages for suspicious identifiers that may have been planted by an attacker.
- Run Opencast processes with the least privilege necessary — do not run as root. File system capabilities should be scoped to the media directories.
- Segment the Opencast server from the broader institutional network to limit lateral movement in the event of a future compromise.
- Monitor file system integrity on the Opencast host for unexpected file changes in sensitive locations (e.g.,
cron,/etc, web roots) via host-based intrusion detection (e.g., OSSEC, Wazuh).
References
- NVD Entry — https://nvd.nist.gov/vuln/detail/CVE-2020-5230
- Opencast Security Advisory (via CNA) — https://github.com/opencast/opencast/security/advisories/GHSA-... (advisory ID not provided in data)
- Opencast Release Notes (7.6 / 8.1) — https://docs.opencast.org/r/7.6/admin/ or https://docs.opencast.org/r/8.1/admin/
- First.org CVSS Calculator (score 7.7 reference) — https://www.first.org/cvss/calculator/3.1
Threat Actor Campaigns / ITW Evidence: No threat actor campaigns, exploit-in-the-wild evidence, or public exploit code for CVE-2020-5230 were identified at the time of reporting. CISA has not added this CVE to its Known Exploited Vulnerabilities catalog (KEV status: NO). The EPSS score of 0.01168 indicates a low overall exploitation probability. The vulnerability is likely to be exploited as part of targeted attacks on educational institutions rather than mass automated campaigns, due to the niche nature of the application.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.