PyPI / posthog / 7.72.0

posthog 7.72.0

Source
https://github.com/posthog/posthog-python
Tag scanned
posthog-v7.72.0
Compared with
posthog-v7.71.0 (0 signals introduced since)
Files
429 scanned, 276 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 2 warn · 8 info
Scan time
9.3 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 9 of 9 warn and critical signals; 7 demoted to info.
Disclude version
4.0.0
Scanned (UTC)
2026-10-20 07:10

Signals

Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.

  1. `eval` called on a non-literal expression (ast pass, confidence 0.70)

            return "Error: invalid characters"
        return f"Result: {eval(expression.replace('^', '**'))}"
    suspicious LLM, confidence 0.80 Calculator tool in an example agent passes a sanitized expression string to eval.
    Reasoning

    eval is called on an expression derived from user/LLM input after replacing ^ with **. This is a genuine code-injection risk in an example, though the snippet shows a character check earlier (the 'invalid characters' return) that partly restricts input. Still a poor pattern worth flagging.

  2. `eval` called on a non-literal expression (ast pass, confidence 0.70)

            return "Error: invalid characters"
        return f"Result: {eval(expression.replace('^', '**'))}"
    suspicious LLM, confidence 0.80 Single-agent example calculator evaluates a filtered expression with eval.
    Reasoning

    Same eval-based calculator as multi_agent.py, with an earlier invalid-character guard. Risky pattern in example code, not evidence of malicious intent.

  3. info warn → info by review frame-introspection posthog/exception_utils.py:1060:21

    `sys._getframe` — call-stack frame introspection (ast pass, confidence 0.70)

            try:
                frame = sys._getframe(depth)
                depth += 1
            except ValueError:
    likely benign LLM, confidence 0.90 Stack walking helper that reads frames up to a depth until ValueError.
    Reasoning

    sys._getframe with a depth counter inside a try/except ValueError is the standard way to walk the stack for exception context in a logging/telemetry library. Legitimate.

  4. info warn → info by review encoding-base64 posthog/test/mcp/test_session_token.py:68:15

    base64-like blob (95 bytes, compression ratio 1.12) (raw pass, confidence 0.60)

        )
        frozen = "eyJzaWQiOiJzZXNfZml4dHVyZSIsImNuIjoiQ2xhdWRlIENvZGUiLCJjdiI6IjEuMi4zIiwicHYiOiIyMDI1LTA2LTE4In0"
    
        # Encode side: our output is byte-identical to the shared wire format.
    likely benign LLM, confidence 0.92 Test fixture containing a base64 encoded JSON session token.
    Reasoning

    The string is a base64url-encoded JSON fixture (decodes to session/client metadata) in a test asserting wire-format compatibility. Plain test data, not obfuscation.

  5. info warn → info by review decoder-decompress-payload posthog/test/test_capture_v1.py:456:24

    file imports decoder module(s) zlib and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

            self.assertEqual(call["data"][0], 0x78)  # zlib header
            roundtripped = zlib.decompress(call["data"]).decode("utf-8")
            self.assertNotIn("api_key", json.loads(roundtripped))
    likely benign LLM, confidence 0.93 Test roundtrips a zlib-compressed capture payload to check its contents.
    Reasoning

    Test decompresses its own zlib-compressed request body to assert the api_key is absent. Normal test verification of an outgoing payload.

  6. info warn → info by review decoder-decompress-payload posthog/test/test_metrics.py:55:23

    file imports decoder module(s) gzip and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

        body = kwargs.get("data")
        return json.loads(gzip.decompress(body).decode("utf-8"))
    likely benign LLM, confidence 0.93 Test helper gunzips and parses a captured request body.
    Reasoning

    Helper decompresses a gzip request body captured from a mock to parse JSON for assertions. Standard test code.

  7. info warn → info by review decoder-decompress-payload posthog/test/test_request.py:227:27

    file imports decoder module(s) gzip, zlib and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

            self.assertEqual(headers["Content-Encoding"], "gzip")
            body = json.loads(gzip.decompress(data))
            self.assertEqual(body["batch"], [])
            self.assertEqual(body["api_key"], TEST_API_KEY)
    likely benign LLM, confidence 0.93 Request test decompresses gzip body to verify its JSON contents.
    Reasoning

    Test gunzips captured request data to check batch and api_key fields. Ordinary test assertion logic.

  8. info warn → info by review decoder-decompress-payload posthog/test/tracing/test_client_traces.py:60:23

    file imports decoder module(s) gzip and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

        args, kwargs = session.post.call_args
        return json.loads(gzip.decompress(kwargs["data"])), args[0], kwargs
    likely benign LLM, confidence 0.93 Tracing test helper decompresses gzip payload from mock call args.
    Reasoning

    Helper gunzips mocked session post data for test inspection. Ordinary test code.

  9. info warn → info by review decoder-decompress-payload posthog/test/tracing/test_transport.py:71:27

    file imports decoder module(s) gzip and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

            assert kwargs["headers"]["Content-Type"] == "application/json"
            assert json.loads(gzip.decompress(kwargs["data"])) == PAYLOAD
    
        def test_falls_back_to_the_default_timeout(self):
    likely benign LLM, confidence 0.93 Transport test checks gzip-compressed JSON payload equals expected data.
    Reasoning

    Test decompresses the gzip body passed to a mocked post and compares to the expected payload. Routine test verification.

  10. line length 1545 characters (raw pass, confidence 0.50)

    class posthog.client.Client(project_api_key: str, host=None, debug=False, max_queue_size=10000, send=True, on_error=None, flush_at=100, flush_interval=5.0, gzip=False, max_retries=3, sync_mode=False, timeout=15, thread=1, poll_interval=30, personal_api_key=None, disabled=False, disable_geoip=True, is_server=True, histo

Reproduce This Scan

Run disclude locally to verify. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.

cargo install disclude --version 4.0.0
git clone https://github.com/posthog/posthog-python posthog-python && cd posthog-python
git checkout posthog-v7.72.0
disclude scan --severity info --diff posthog-v7.71.0 .