VDB
GCVE-110-OSM-2026-14001
GCVE-110-OSM-2026-14001
Advisory PublishedCVSS 9.6/10
setup.py registers a custom install command (cmdclass install hook) and also fires at module import that connects to the hardcoded bare-IP endpoint 137.131.233.62:8080 and bridges a /bin/bash -i subprocess over the socket, giving the operator interactive shell access on the installer's host. Before opening the shell, the code POSTs host identifiers (hostname, uid, JCX_ENVIRONMENT) over plaintext HTTP to http://137.131.233.62:443/shell-beacon. The install hook double-forks, calls setsid, redirects stdio to /dev/null, and enters an infinite reconnect loop with a 60-second sleep, persisting the backdoor beyond the pip install process. A /tmp/.jcx_channel.done guard file is used to coordinate the channel. Destination is a bare IP unrelated to any publisher domain.
In specific environments, package starts a reverse shell during installation.
Category: MALICIOUS - The campaign has clearly malicious intent, like infostealers.
Campaign: 2026-10-journey-test-helloshell
Reasons (based on the campaign):
- The package contains code to create a reverse shell, allowing an attacker to execute any commands on the victim's machine.
- The package overrides the install command in setup.py to execute malicious code during installation.
- targetted-attack
Judge assessment: The setup.py implements a full reverse shell backdoor that fires at install time via both a module-level `_fire()` call and overridden `cmdclass` install/develop hooks. The `_session()` function opens a raw TCP connection to the attacker's relay at 137.131.233.62:8080, authenticates with a derived password, spawns `/bin/bash -i`, and bridges its stdin/stdout over the socket via `_pump()`, giving the operator interactive shell access. Before opening the shell channel, `_beacon()` POSTs the victim's hostname, uid, and `JCX_ENVIRONMENT` value to the HTTP beacon endpoint at 137.131.233.62:443/shell-beacon. The `_daemonize()` function double-forks, calls `os.setsid()`, redirects stdio to /dev/null, and enters an infinite reconnect loop with 60-second sleep intervals, persisting the backdoor as a daemon beyond the pip install process. A guard file at `/tmp/.jcx_channel.done` prevents re-execution but the beacon fires before the guard is written, ensuring visibility even on failed channel establishment.
ENTRY
setup.py (install-hook: install/develop/build override present)
- setup.py Code Execution in setup.py
DESTINATION
- 2 exfil (custom-c2)
(values recorded in verified_iocs)
EXFIL
- Environment Variable Exfiltration in setup.py: "os.environ.get("JCX_ENVIRONMENT", ""))).encode() try: req = urllib"
- Python File Upload to Remote in setup.py: "urllib.request.Request( BEACON_URL, data="
- Data Encoding for Exfiltration in setup.py: "base64.b64encode("
- Network Request in setup.py: "urllib.request.Request("
- System Information Collection in setup.py: "socket.gethostname()"
- Suspicious Domain in setup.py: "http://137.131.233.62"
ADDITIONAL FINDINGS
- Shell Command Execution in setup.py: "subprocess.Popen("
- Setup.py Command Override in setup.py: "cmdclass={"install": BuildHook, "develop""
PAYLOAD FILES
setup.py
Weaknesses (CWE)
CWE-506Embedded Malicious Code
Risk Scores
CVSS 3.1
9.6/10
Critical · CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
Affected Products
| Vendor | Product | Versions | Platforms |
|---|---|---|---|
| unknown | journey-test-helloshell | all (affected) | — |
Aliases
Browse GCVE Records
854 records in the GCVE database · Updated October 30, 2026
No matching records found.
Explore Further
Investigate this vulnerability in the interactive console or download the raw GCVE record.