Skill Trust Decision

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.

Install decision first Source: ClawHub Scanned: Sep 19, 2026
Files 86
Artifacts 60
Violations 2
Findings 3

Why this conclusion was reached

1/4 dimensions flagged
Block
Declared vs actual capability

2 undeclared or violating capabilities were inferred.

Review
Hidden execution and egress

60 lower-risk artifacts were extracted and still need context.

Pass
Attack chain and severe findings

There is no explicit malicious chain in the report.

Review
Dependencies and supply chain hygiene

1 dependency or supply-chain issues need attention.

What drove the risk score up

Embedded obfuscated tokens without explicit SKILL.md callout +10

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.

Hardware-ID machine fingerprinting +5

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.

auto_approve_endpoints whitelist pre-loaded +5

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

Low Doc Mismatch

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
Add a 'Credential handling' subsection to SKILL.md permissions section, e.g.: 'API tokens for ct-advisor.coze.site/run and ct-bugreport.coze.site/run are embedded as XOR+base64 obfuscated blobs in adapters/coze_token_embedded.py. These are public shared bot tokens (not personal account keys). Obfuscation prevents casual browsing exposure; the key is in the same file, so the tokens are not secrets in the cryptographic sense.'
Low Sensitive Access

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
Add 'hardware_id (sha256 of SMBIOS/machine-id, non-reversible, disclosed to user)' to the SKILL.md permissions section network_note paragraph.
Info Doc Mismatch

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
Add a one-liner in SKILL.md permissions section: 'auto_approve_endpoints includes the two Coze endpoints above (pre-authorized by the author; the agent cannot modify this list per AGENTS.md §4.1).'

Declared capability vs actual capability

Filesystem Pass
Declared READ
→
Inferred READ
SKILL.md: 'Read-only to own files (writes only config.json + optional data/qa_log.jsonl, off by default)'
Network Pass
Declared controlled-coze-opt-in
→
Inferred WRITE
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)
Shell Block
Declared NONE
→
Inferred WRITE
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.
Environment Block
Declared NONE
→
Inferred READ
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.
Skill Invoke Pass
Declared controlled
→
Inferred WRITE
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
Clipboard Pass
Declared NONE
→
Inferred NONE
No clipboard access found in codebase
Browser Pass
Declared NONE
→
Inferred NONE
No browser automation found in codebase
Database Pass
Declared NONE
→
Inferred NONE
No database access found in codebase

Suspicious artifacts and egress

Medium External URL
https://ct-bugreport.coze.site/run

AGENTS.md:62

Medium External URL
http://lb-*.clb.gz-tencentclb.com

CHANGELOG.md:297

Medium External URL
https://ct-advisor.coze.site/run

CHANGELOG.md:1139

Medium External URL
http://127.0.0.1:10808/

CHANGELOG.md:1344

Medium External URL
https://api.coze.cn/v1/chat

adapters/backend.py:77

Medium External URL
https://api.skillhub.cn/api/v1/search

adapters/install_sibling.py:51

Medium External URL
https://api.skillhub.cn/api/v1/download

adapters/install_sibling.py:52

Medium External URL
https://www.nccn.org/profelines/immunotherapy

knowledge/ref-icae-safety.md:6

Medium External URL
https://www.hematology.org/clinicians

knowledge/ref-icae-safety.md:7

Medium External URL
https://pubmed.ncbi.nlm.nih.gov

knowledge/ref-icae-safety.md:8

Medium External URL
https://www.ich.org/

knowledge/ref-interaction-style.md:79

Medium External URL
https://www.ich.org/page/search-index-ich-guidelines

knowledge/ref-interaction-style.md:79

Dependencies and supply chain

PackageVersionSourceKnown vulnNotes
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

86 files · 24023 lines
Python 40 files · 11361 linesJSON 11 files · 6382 linesMarkdown 33 files · 6259 linesOther 1 files · 21 lines
Files of concern · 5
adapters/coze_token_embedded.py Python · 182 lines
Embedded obfuscated credentials lack explicit SKILL.md callout
config.json JSON · 32 lines
auto_approve_endpoints whitelist is author-preset and pre-loaded
CHANGELOG.md Markdown · 1528 lines
http://lb-*.clb.gz-tencentclb.com · https://ct-advisor.coze.site/run · http://127.0.0.1:10808/
scripts/handle_need_tool.py Python · 863 lines
http://lb-*.clb.gz-tencentclb.com),实测下载得到非
README.md Markdown · 329 lines
Other files · refine_answer.py · system_prompt.md · ref-ops-gcp-site.md · refiner.py · ref-reg-submission.md · ref-ops-data.md +1

Security positives

No reverse shell, C2, or remote code execution beyond the declared Coze cloud API call
Outbound payloads are sanitized: adapters/sanitize.py strips PII (ID cards, phone numbers, emails) and credential-named keys before leaving the local environment
Execution boundary validation in handle_need_tool.py restricts subprocess to python/rscript interpreters and paths inside the skills directory only
No credential-harvesting chain: tokens are shared Coze bot tokens (not personal account keys), and hardware_id produces a non-reversible sha256 hash
Sibling-skill installation is user-gated: default install_mode='suggest' (never auto-install), only executes after explicit user authorization (install_consent=approved)
Bug reports use a hard-whitelist schema (11 fixed keys, no free-form user data), sent only on explicit user request with two-stage confirmation
Comprehensive PII handling documented: SKILL.md explicitly forbids exposing personal info, subject data, unpublished project data, or private paths
Outbound authorization gate (_check_outbound_authorization) runs before every outbound call; non-whitelisted endpoints require user confirmation before data leaves
No base64-into-bash, no eval(), no urllib download-and-execute, no curl|bash patterns
Well-structured, extensively documented codebase (86 files, 24K lines) with clear rationale for every non-obvious design choice