Skip to content
Open-Source Registry

pypi / henosis-cli / 0.6.206

henosis-cli 0.6.206

bitbison: flagged, behavior flagged, dependencies flagged, posture not checked, pipeline clean, 1 of 1 jobs captured RiskhighVulnscritical
processes
717
operations
70K
packages
35
compiler runs
3
connections
2
build time
1m 01s
job time
1m 01s
capture
872 KB
records
123K
bytes / record
7.1
run f39d9207-1f75-43a5-a2f9-d1f95fb9cce2 · built 2026-11-05 · complete View on PyPI
Reviewed by Bitbison: secrets-exposureOn start, without asking, the client copies the OAuth tokens in ~/.codex/auth.json into ~/.henosis_cli_codex_auth.json and uses them with chatgpt.com and auth.openai.com; the user-typed /codex transcribe command puts the ChatGPT access token and account id in a WebSocket message to henosis.us, which neither the README nor the PyPI description mentions.

Graph

credential-copied · high
3

Checks

14 of 18 clear Network activity Sensitive data access and transfer +2 more
Build behavior▲▲✓✓✓✓✓✓✓✓✓
Supply chain▲▲✓✓✓✓
Pipeline✓

Detections

2
  • henosis-cli read a copy of codex-auth, then connected to henosis.us
    .henosis_cli_codex_auth.json › henosis.us:443
    high
  • Package code connected to an undeclared host
    henosis.us:443 › henosis.us:443, pypi.org
    medium

Detection

highwitnessed

henosis-cli read a copy of codex-auth, then connected to henosis.us

Credential copied by the build

Subject
/home/runner/.henosis_cli_codex_auth.json
Destination
henosis.us:443
Jobs
build-import
Rule
credential-copied · henosis-cli

Evidence

  1. Credentials found in a file the build wrotecause

    codex-auth in /home/runner/.henosis_cli_codex_auth.json, written by henosis-cli after reading a planted file

    subject /home/runner/.henosis_cli_codex_auth.json

    by /home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli

  2. Read a credential's copy, then connectedcause

    henosis-cli read /home/runner/.henosis_cli_codex_auth.json, then connected to henosis.us

    target henosis.us:443

    by /home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli

  3. Why it matterscontext

    Credentials were exposed in this file.

What came before it

Loading the graph

Processes

build-import

python›python

Ran
/home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli
Invoked by
.venv/bin/python /home/runner/work/_temp/imports.py henosis-cli
Lineage · 2 processes
  1. python.venv/bin/python /home/runner/work/_temp/imports.py henosis-cli1581
  2. python/home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli1587

Remediation

Find why the process read the copy and what it sent: nothing allows that connection.

Detection

mediumwitnessed

Package code connected to an undeclared host

Unexpected network connection

Subject
henosis.us:443
Destination
henosis.us:443, pypi.org
Jobs
build-import
Rule
egress · henosis-cli

Evidence

  1. Connection outside the process’s allowed destinationscause

    opened by henosis-cli

    subject henosis.us:443

    by /home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli

  2. Allowed hostssupport

    Declared or allowed hosts: pypi.org

  3. Why it matterscontext

    The package's own code reached this host while the release ran; no manifest, tool profile, network allowlist entry or accepted download covers it.

What came before it

Loading the graph

Processes

build-import

python›python

Ran
/home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli
Invoked by
.venv/bin/python /home/runner/work/_temp/imports.py henosis-cli
Lineage · 2 processes
  1. python.venv/bin/python /home/runner/work/_temp/imports.py henosis-cli1581
  2. python/home/runner/work/henosis-cli/henosis-cli/.venv/bin/python /home/runner/work/henosis-cli/henosis-cli/.venv/bin/henosis-cli1587

Remediation

Identify the request. If required, declare the host in the relevant manifest or tool profile, or add a reviewed allow_hosts entry. Otherwise remove it.

Network

2 peers
  • henosis.us:443 henosis-cli's own build code · henosis-cli · Comcast Cable Communications, LLC unjudged
  • files.pythonhosted.org:8080 the package manager · python3.14 (henosis-cli) via pypi.org ecosystem
Vulnerabilities47FixSeverity
Dependencies
pillow 12.3.0>=13.0.0
CVE-2026-112393Pillow: Heap buffer overflow in _tiffWriteProc when saving TIFF to BytesIOcritical
CVE-2026-112398Pillow: Heap buffer overflow in FlashPix (FPX) JPEG decoding leads to code executioncritical
CVE-2026-112403Pillow: Heap buffer overflow in ImagingJpegDecodecritical
CVE-2026-112900Pillow: Argument Injection in Ghostscript call, potentially leading into RCEcritical
CVE-2026-96639Pillow multi-frame loaders can reuse stale native image storage after mode transitionscritical
CVE-2026-112390Pillow: Infinite loop in MIC n_frames when the embedded TIFFhigh
CVE-2026-112392Pillow: NULL dereference in ImagingExpand via rank filters on zero-size imageshigh
CVE-2026-112397Pillow: Out-of-bounds access in _imagingmorph on a zero-width imagehigh
CVE-2026-112399Pillow: APNG background disposal allocates full canvas before decompression bomb checkhigh
CVE-2026-112400Pillow: GIF seek keeps rejected size after DecompressionBombError, allowing DoShigh
CVE-2026-112402Pillow: Double free in ImagingScaleAffine on calloc failure via Image.transformhigh
CVE-2026-112404Pillow: OOB read in TiffDecode.c tile and RGBA paths leaks heap memory into pixelshigh
CVE-2026-112405Pillow: NULL pointer dereference in Image.merge via an unvalidated band 0high
CVE-2026-112406Pillow: Infinite loop in PdfParser.rewrite_pages on page tree Parent cyclehigh
CVE-2026-112892Pillow: MSP RLE decoder expands a tiny file into unbounded memoryhigh
CVE-2026-112893Pillow: Invalid free in FreeType glyph rendering when a stroker is activehigh
CVE-2026-112894Pillow: Quadratic-time DoS in PDF save_all (PdfParser.next_object_id)high
CVE-2026-112895Pillow: Unbounded recursion parsing a PDF page tree or trailer chain (incomplete fix for CVE-2026-42310)high
CVE-2026-112896Pillow: TIFF encoder ColorMap plane-size mismatch causes a heap out-of-bounds readhigh
CVE-2026-112897Pillow: TiffDecode returns uninitialized memory as pixels for short JPEG stripshigh
CVE-2026-112902Pillow: Memory disclosure and segfault in libtiff encoder via crafted TIFF tagshigh
CVE-2026-96637Pillow: Decompression bomb check bypass in SpiderImagePlugin.seek() leads to unbounded allocation DoShigh
CVE-2026-96640Pillow PDF append accepts malformed shared page-tree DAG causing resource exhaustionhigh
CVE-2026-96642Pillow: TarIO negative size field causes infinite CPU-spin loophigh
CVE-2026-96643Pillow: PNG eXIf chunk makes EXIF parsing run in quadratic timehigh
CVE-2026-96644Pillow: Heap over-read in WMF/EMF rendering via 16-bit dimension truncation (Windows builds)high
CVE-2026-96778Pillow: Heap buffer overflow writing JPEG comment after ICC profile fills bufferhigh
GHSA-78g4-xqwv-q3g8Pillow: Bundled libopenjp2 2.5.4 in all wheels since 11.1.0 carries OSV-2025-219 heap-buffer-overflow write reachable from Image.open().load()high
CVE-2026-112391Pillow: PdfParser can recurse without limit in get_value() and linearize_page_tree()medium
CVE-2026-112394Pillow: P;2L and P;4L decoders may read 1 to 3 bytes past the passed buffer sizemedium
CVE-2026-112395Pillow tiled-TIFF decoder reads past tile buffer in copy4 (Unpack.c:1290)medium
CVE-2026-112396Pillow: Heap use-after-free when encoding TIFF to an in-memory buffermedium
CVE-2026-112401Pillow: Quadratic GIF comment concatenation allows DoS in Image.open()medium
CVE-2026-112891Pillow: Quadratic GIF comment copying during savemedium
CVE-2026-112898Pillow: Image.quantize() with empty palette leaks uninitialized stack memorymedium
CVE-2026-112899Pillow: EPS load(scale) lets Ghostscript render past the decompression bomb limitmedium
CVE-2026-112901Pillow: ReDoS in XbmImagePlugin: 512-byte file stalls Image.open() for minutesmedium
CVE-2026-114501Pillow: Arrow export leaks stale heap memory when PILLOW_ALIGNMENT > 1medium
CVE-2026-96636Pillow: Decompression-bomb protection bypass via multi-frame seek() in MPO and DCX (MpoImageFile.seek / DcxImageFile.seek)medium
CVE-2026-96638Pillow: BMP RLE decoder memory-amplification DoS via unbounded delta escape / absolute modemedium
CVE-2026-96641Pillow: Reachable undefined behavior in native integer operations, potentially leading to denial of service or logic integrity compromisemedium
pip 25.1.1>=26.2.0
CVE-2025-8869pip's fallback tar extraction doesn't check symbolic links point to extraction directorymedium
CVE-2026-13346pip would incorrectly handle doubly-encoded package URLs from indexesmedium
CVE-2026-3219pip has an interpretation conflict due to handling both concatenated tar and ZIP files as ZIP filesmedium
CVE-2026-6357pip Vulnerable to Inclusion of Functionality from Untrusted Control Spheremedium
CVE-2026-8643pip: Path traversal in console_scripts/gui_scripts entry point names allows installing scripts outside of target directorymedium
CVE-2026-1703pip Path Traversal vulnerabilitylow

Dependencies

34
Dependencies34Build behaviour
annotated-types0.8.0
anyio4.16.0
build1.6.1
certifi2026.10.23
cffi2.1.1
cryptography50.0.2
distro1.9.0
greenlet3.5.6
h110.16.0
httpcore1.0.9
httpx0.28.1
idna3.20
jiter0.18.0
markdown-it-py4.2.0
mdurl0.1.2
openai2.54.0
packaging26.3
pillow12.3.0
playwright1.64.1
pycparser3.12
pydantic2.14.3
pydantic-core2.50.4
pyee14.0.0
pygments2.21.0
pyproject-hooks1.3.3
rich15.0.0
sniffio1.3.1
tqdm4.70.1
typing-extensions4.16.0
typing-inspection0.4.5
websockets17.4
pip25.1.1
setuptools84.2.1
wheel0.48.0

Versions214

Raw data

capture
872 KB
records
122,703
bytes per record
7.1

Loading a sample of the capture

Want to see more? E-mail us at hello@bitbison.io about your use case.

1 of 1 jobs captured: build-import success · Generated 2026-11-05 · run f39d9207-1f75-43a5-a2f9-d1f95fb9cce2

analysis 0.1.0 · 2026-11-04 · bfee307 · graph v2

Bitbison's review

henosis-cli copies the Codex CLI's ChatGPT login on every start and sends its access token to henosis.us for /codex transcribe, undisclosed

Conclusion
secrets-exposure
Covers
0.6.205, 0.6.206, 0.6.207 and 0.6.208
Reviewed by
Bitbison
Updated
2026-11-06

On start, without asking, the client copies the OAuth tokens in ~/.codex/auth.json into ~/.henosis_cli_codex_auth.json and uses them with chatgpt.com and auth.openai.com; the user-typed /codex transcribe command puts the ChatGPT access token and account id in a WebSocket message to henosis.us, which neither the README nor the PyPI description mentions.

Indicators

hosts
henosis.us (73.20.52.255): receives the ChatGPT access token and account id from /codex transcribe; login check at startchatgpt.com: Codex model requests, usage and reset, with the access tokenauth.openai.com: token refresh, with the refresh tokenapi.openai.com: voice transcription, with the access tokenapi.anthropic.com, platform.claude.com: Claude subscription routeauth.x.ai, cli-chat-proxy.grok.com: Grok route
requests
GET https://henosis.us/api_v2/check-auth (Henosis cookies only)POST https://henosis.us/api_v2/realtime/transcription/ws-token, then wss://henosis.us/api_v2/realtime/transcription/ws?token=<ticket> with a start message carrying auth.mode=codex_oauth, auth.access_token=<ChatGPT access token>, auth.account_id=<ChatGPT account id> (/codex transcribe only)POST https://auth.openai.com/oauth/token grant_type=refresh_token, client_id=app_EMoamEEZ73f0CkXaXp7hrannPOST/WSS https://chatgpt.com/backend-api/codex/responses with Authorization: Bearer <access token>, chatgpt-account-id, originator: codex_cli_rsGET https://chatgpt.com/backend-api/wham/usage (and wham/* usage, reset, profile) with the access tokenwss://api.openai.com/v1/realtime and POST https://api.openai.com/v1/audio/transcriptions with the access token
environment
HENOSIS_SERVER (overrides the henosis.us/api_v2 base the transcribe token goes to)
files
~/.codex/auth.json (read on start when the client has no Codex login of its own; rewritten with only auth_mode, tokens and last_refresh on each token refresh; deleted by /codex logout)~/.henosis_cli_codex_auth.json (written 0600 through a temporary ~/..henosis_cli_codex_auth.json.<random>.tmp: access_token, refresh_token, id_token, account_id, email, expiry_date, last_refresh_at)~/.henosis_cli_auth.json (Henosis's own login cookies)~/.claude/.credentials.json (read; used only with api.anthropic.com and platform.claude.com)~/.grok/auth.json (read; used only with auth.x.ai and cli-chat-proxy.grok.com)henosis_cli-0.6.208.tar.gz (sha256 04e765365561947e8f148f3419b64ab0b51a322d6aa1cd57efb52381058a6c77)cli.py of 0.6.208 (sha256 d5c0e7fa85d82ad4a98d97cf42cd67914ca2fdcda86a30e212339808ca4862b2)
processes
python running the henosis-cli console script (henosis_cli_tools.cli_entry:main), started with no arguments

What was examined

0.6.205
sha256:a4b61e6a019ea51cbdc43b749f7faeef5efbf6fa4b0688c741572a30b6c9cbed
0.6.206
sha256:b1fa010b94a77292cce57ec22321cdab7d4350c0e9979c4a5cf01c161c68bf69
0.6.207
sha256:cb5b349d6ccf8a6333f979d1582549fdf633d4a742290c4ab253dfcc0b5cf660
0.6.208
sha256:04e765365561947e8f148f3419b64ab0b51a322d6aa1cd57efb52381058a6c77