Skip to content

feat: TeamPCP PyPI campaign detection — IOC ledger, litellm .pth tests, import-time spec - #137

Merged
MoSLoF merged 1 commit into
mainfrom
feat/teampcp-detection
Aug 30, 2026
Merged

MoSLoF merged 1 commit into
mainfrom
feat/teampcp-detection

Conversation

@MoSLoF

@MoSLoF MoSLoF commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

Intent

Turn the telnyx/litellm supply-chain analysis (TeamPCP campaign) into depSNORT detection capability, across three tracks. No new check and no scope/gate change — tracks 1–2 reuse existing VC-003 and VC-002e; track 3 is spec + decision only.

Changes

1. IOC ledger (VC-003) — immediate detection

  • docs/ioc-teampcp.example.json — reference feed flagging litellm 1.82.8, telnyx 4.87.1, telnyx 4.87.2 (critical).
  • internal/datasource/ioc/ioc_test.go — loads the shipped feed; asserts it matches the compromised versions and not a clean telnyx@4.85.0.

2. litellm .pth — validates existing detection (Track A)

  • internal/ecosystem/pypi/installsurface_test.go — the real .pth trigger reads obfuscation+exec; a benign bootstrap-import .pth does not (the FP boundary).
  • internal/check/builtin/teampcp_pth_test.go — VC-002e fires on the litellm shape, stays silent on the benign one.

3. telnyx import-time gap (Track B) — spec + decision, no code

  • docs/VC-002L-python-import-time.md — scoped AnalyzePythonLoadTime spec: capability-gated, advisory-only, corpus-gated.
  • D-165 in docs/DECISIONS.md — records the boundary: gap acknowledged, held out of scope until the spec's corpus eval is met; never gates prematurely.

Security semantics

No scope expansion, no new gate class. The import-time gap (telnyx _client.py runs on import, outside the install-surface model) is documented, not silently coded — honoring zero-silent-failure and gate-vs-severity disciplines. Coverage honesty preserved (offline sdist gap still reported as "NOT an all-clear" in E2E).

Validation

  • go test ./... — all pass · go vet clean · go build ok · new Go files gofmt-clean.
  • E2E: scan -ioc docs/ioc-teampcp.example.json on telnyx==4.87.1 → exit 1, one VC-003 block finding.

Adversarial / FP review

  • Benign-lookalike controls on both new detections: clean telnyx@4.85.0 (ledger) and benign bootstrap-import .pth (VC-002e).
  • Track B spec §6 enumerates the import-time FP corpus (env reads, plugin registries, embedded-data decode) as the promotion gate.

Remaining limitations

Track B is spec-only; the import-time analyzer is not implemented. npm non-entry runtime modules are the same class of gap, noted but not closed.

🤖 Generated with Claude Code

…s, import-time spec

Turn the telnyx/litellm (TeamPCP) supply-chain analysis into detection, across three tracks. No new check and no scope/gate change: tracks 1-2 reuse VC-003 and VC-002e; track 3 is spec + decision only.

1. IOC ledger (VC-003): docs/ioc-teampcp.example.json flags litellm 1.82.8 and telnyx 4.87.1/4.87.2; test loads the shipped feed and asserts it matches the compromised versions but not a clean 4.85.0.

2. litellm .pth (Track A): analyzer tests assert the real .pth trigger reads obfuscation+exec while a benign bootstrap import does not; check tests assert VC-002e fires on the former and stays silent on the latter.

3. telnyx import-time gap (Track B): payload in telnyx/_client.py runs on import, out of the install-surface model. Recorded as a boundary in D-165 and specified in docs/VC-002L-python-import-time.md (scoped, advisory-only, corpus-gated) — no code until the spec is met.

Validation: go test ./... green, vet clean, build ok. E2E: scan -ioc blocks telnyx@4.87.1 (exit 1, VC-003 block).
@MoSLoF
MoSLoF merged commit 04f4288 into main Aug 30, 2026
11 checks passed
@MoSLoF
MoSLoF deleted the feat/teampcp-detection branch August 30, 2026 15:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant