ct-advisor
A legitimate clinical-trial methodology advisor that forwards non-vague questions to a public Coze cloud endpoint, with sibling-skill delegation, hardware-ID tracking, and obfuscated shared credentials — all with documented rationale, no hidden malicious functionality, and no credential-harvest or data-exfiltration chains.
Why this conclusion was reached
1/4 dimensions flagged2 undeclared or violating capabilities were inferred.
60 lower-risk artifacts were extracted and still need context.
There is no explicit malicious chain in the report.
1 dependency or supply-chain issues need attention.
What drove the risk score up
adapters/coze_token_embedded.py embeds XOR+base64 obfuscated tokens for ct-advisor.coze.site/run and ct-bugreport.coze.site/run. The obfuscation key is hardcoded in the same file. SKILL.md discloses the network path but does not explicitly call out 'credentials embedded as obfuscated blobs in Python'. Tokens are for a public shared Coze bot (not a personal account), so the impact of disclosure is bounded, and the code comments explain the design rationale.
scripts/hardware_id.py reads SMBIOS UUID (Windows), IOPlatformUUID (macOS), or machine-id (Linux) and sends sha256:... as query_origin. Rationale (stable, non-reversible machine ID for audit/limit) is documented in code and AGENTS.md. Disclosure is non-PII, but explicit mention in SKILL.md permissions section would be cleaner.
config.json ships with both ct-advisor.coze.site/run and ct-bugreport.coze.site/run pre-whitelisted. AGENTS.md §4.1 explains this is author-preset and that the agent must never edit config.json. Since both endpoints are the skill's intended outbound paths, pre-approval is functionally correct, but the large volume of documentation makes the whitelist easy to miss.
Most important evidence
Embedded obfuscated credentials lack explicit SKILL.md callout
adapters/coze_token_embedded.py contains XOR+base64 obfuscated tokens for two Coze endpoints, with the obfuscation key hardcoded in the same file. SKILL.md network_note discloses the outbound path but does not explicitly mention 'credentials embedded as obfuscated Python blobs'. The tokens are for a public shared Coze bot (not a personal account), and the code comments explain the design rationale, but explicit documentation in SKILL.md would close the minor doc gap.
adapters/coze_token_embedded.py:32 Hardware-ID machine fingerprinting without prominent SKILL.md disclosure
scripts/hardware_id.py reads SMBIOS UUID (Windows), IOPlatformUUID (macOS), or /etc/machine-id (Linux) and sends sha256:<64-hex> as query_origin in outbound payloads. The rationale (stable, non-reversible device ID for audit/limit) is in code comments and AGENTS.md, but SKILL.md does not call it out in the permissions block, making the disclosure easy to miss.
scripts/hardware_id.py:21 auto_approve_endpoints whitelist is author-preset and pre-loaded
config.json ships with two endpoints pre-whitelisted: ct-advisor.coze.site/run and ct-bugreport.coze.site/run. AGENTS.md §4.1 explicitly prohibits the agent from editing config.json and explains the whitelist is author-preset. The pre-approval is functionally correct (both are the skill's intended endpoints), but the large SKILL.md volume means this detail is buried.
config.json:7 Declared capability vs actual capability
SKILL.md: 'Read-only to own files (writes only config.json + optional data/qa_log.jsonl, off by default)' SKILL.md declares controlled-coze-opt-in; network:WRITE to ct-advisor.coze.site/run (main path) and ct-bugreport.coze.site/run (optional bug report); outbound payload is sanitized (adapters/sanitize.py strips PII and tokens) scripts/handle_need_tool.py line ~400: subprocess.run() executes sibling skill CLI commands; execution boundary validation (_execution_boundary_violation) restricts to python/rscript + paths inside SKILLS_DIR. Shell access is gated by tool_mapping.json whitelist and user-consent install flow. adapters/coze_token_embedded.py reads CT_ADVISOR_COZE_TOKEN env var; hardware_id.py reads machine-id; sanitize.py scans for secret-key-named dict keys. No credential exfiltration — only local resolution. Sibling skills (ct-registry/safety/literature/samplesize) are invoked via need_tool card execution (subprocess), with A/B tier gate, user-consent install flow, and install_mode=suggest (never auto-install) per SKILL.md and handle_need_tool.py No clipboard access found in codebase No browser automation found in codebase No database access found in codebase Suspicious artifacts and egress
https://ct-bugreport.coze.site/run AGENTS.md:62
http://lb-*.clb.gz-tencentclb.com CHANGELOG.md:297
https://ct-advisor.coze.site/run CHANGELOG.md:1139
http://127.0.0.1:10808/ CHANGELOG.md:1344
https://api.coze.cn/v1/chat adapters/backend.py:77
https://api.skillhub.cn/api/v1/search adapters/install_sibling.py:51
https://api.skillhub.cn/api/v1/download adapters/install_sibling.py:52
https://www.nccn.org/profelines/immunotherapy knowledge/ref-icae-safety.md:6
https://www.hematology.org/clinicians knowledge/ref-icae-safety.md:7
https://pubmed.ncbi.nlm.nih.gov knowledge/ref-icae-safety.md:8
https://www.ich.org/ knowledge/ref-interaction-style.md:79
https://www.ich.org/page/search-index-ich-guidelines knowledge/ref-interaction-style.md:79
Dependencies and supply chain
| Package | Version | Source | Known vuln | Notes |
|---|---|---|---|---|
| requests | 2.32.3 | pip | No | Version is pinned; imported lazily only when an outbound Coze call is made; missing import triggers a manual-install prompt (no auto-pip install) |
File composition
adapters/coze_token_embedded.py config.json CHANGELOG.md scripts/handle_need_tool.py README.md