Back to skill

Security audit

humanize

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a real Chinese writing optimizer, but it can send full drafts to the configured model endpoint and keeps snippets of prior drafts in persistent plaintext state.

Review before installing. Use this skill only with a trusted local or explicitly approved model endpoint, avoid confidential customer or business drafts unless that endpoint is acceptable, and clear both ./runs and the persistent humanize strategy-state file if you need to remove retained text. Consider pinning dependencies before production use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/local_generation.py:149
Finding

Unrestricted transmission of user content to a configurable endpoint

Content
View full analysis
str: base_url = __import__("os").environ.get("HUMANIZE_LLM_BASE_URL", "").strip() if base_url: return base_url.rstrip("/") log_path = copaw_working_dir() / "copaw.log" if log_path.exists(): text = log_path.read_text(encoding="utf-8", errors="ignore") matches = re.findall(r"http://127\.0\.0\.1:(\d+)/health", text) if matches: port = matches[-1] return f"http://127.0.0.1:{port}/v1" matches = re.findall(r"llama\.cpp server started on port (\d+)", text) if matches: port = matches[-1] return f"http://127.0.0.1:{port}/v1" return "http://127.0.0.1:54841/v1" ``` ```python def call_chat( *, base_url: str, model: str, system_prompt: str, user_prompt: str, temperature: float = 0.3, max_tokens: int = 300, ) -> dict[str, Any]: if base_url.startswith("copaw-active://"): return _call_copaw_active_model( system_prompt=system_prompt, user_prompt=user_prompt, temperature=temperature, max_tokens=max_tokens, ) payload = { "model": model, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ], "temperature": temperature, "max_tokens": max_tokens, } try: return _http_post_json(base_url.rstrip("/") + "/chat/completions", payload, timeout=120.0) except urllib.error.HTTPError as exc: detail = exc.read().decode("utf-8", errors="ignore") raise RuntimeError(f"L ...[truncated 2894 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/strategy_state.py:276
Finding

Persistent plaintext retention of user tasks and draft previews

Content
View full analysis
Path: path = state_path() path.parent.mkdir(parents=True, exist_ok=True) state["updated_at"] = _timestamp() path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8") return path ``` ```python history = next_state.setdefault("history", []) history.append( { "recorded_at": _timestamp(), "task": task, "chosen_profile": chosen_profile, "failure_tags": failure_tags, "improved": improved, "delta": round(delta, 6), "baseline_preview": baseline_text[:120], "challenger_preview": challenger_text[:120], } ) next_state["history"] = history[-20:] return next_state ``` The evolved state is persisted after processing: ```python state = evolve_after_attempts( state, task=task, chosen_profile=chosen_profile, failure_tags=failure_tags, improved=improved, baseline_text=baseline_text, challenger_text=challenger_text, delta=delta, ) ... save_state(state) ``` ### Technical Analysis The strategy mechanism needs aggregate information such as profile wins, losses, failure tags, and policy weights. It does not need plaintext copies of user tasks or generated communications. Nevertheless, each history entry stores: - The task text. - The first 120 characters of the baseline. - The first 120 characters of the challenger. - Associated outcome metadata. Up to 20 entries are retained in `strategy-state.json` beneath the persistent runtime directory. Because many short communication drafts are fewer than 120 characters, the so-called preview may contain the complete message. This s ...[truncated 1257 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/runtime_common.py:99
Finding

Runtime installation uses mutable dependencies without integrity verification

Content
View full analysis
list[str]: return [ "-m", "pip", "install", "--disable-pip-version-check", "--upgrade", "pip", "setuptools", "wheel", ] ``` ```python def ensure_runtime(force_reinstall: bool = False) -> None: rt_root = runtime_root() rt_root.mkdir(parents=True, exist_ok=True) hf_cache_dir().mkdir(parents=True, exist_ok=True) if force_reinstall and venv_dir().exists(): shutil.rmtree(venv_dir()) if runtime_python().exists(): return host_python = pick_host_python() subprocess.run( [host_python, "-m", "venv", str(venv_dir())], check=True, ) subprocess.run( [str(runtime_python()), *pip_install_args()], check=True, env=_subprocess_env(), ) subprocess.run( [ str(runtime_python()), "-m", "pip", "install", "--disable-pip-version-check", "-r", str(skill_root() / "requirements.lock.txt"), ], check=True, env=_subprocess_env(), ) ``` The file named `requirements.lock.txt` contains version ranges rather than exact versions and hashes: ```text torch>=2.6,<2.7 transformers>=4.49,<4.51 huggingface-hub>=0.30,<1.0 PyYAML>=6.0,<7.0 safetensors>=0.5,<1.0 ``` ### Technical Analysis The bootstrap process executes two mutable installation operations: 1. It upgrades `pip`, `setuptools`, and `wheel` to whichever versions are current at installation time. 2. It installs application dependencies from broad version ranges without cryptographic hashes. As a result, the repository contents do not fully de ...[truncated 1755 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (103)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

A CLI scoring utility consuming file-based specs and emitting JSON reports does not match the advertised interactive writing assistant model. This mismatch is dangerous mainly because it obscures data handling and system behavior, not because scoring itself is inherently harmful.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 24)May include surrounding context.

md
Code and other local coding agents can invoke the same CLI after reading this `SKILL.md`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 209)May include surrounding context.

md
- If `run_from_brief.py` succeeds and prints `HUMANIZE_USER_VISIBLE_SUMMARY`, treat that as the canonical result. Do not overwrite it with a separate handcrafte

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 246)May include surrounding context.

md
- If `run_from_brief.py` succeeds and prints `HUMANIZE_USER_VISIBLE_SUMMARY`, treat that as the canonical result. Do not overwrite it with a separate handcrafte

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 247)May include surrounding context.

md
- If `run_from_brief.py` succeeds and prints `HUMANIZE_USER_VISIBLE_SUMMARY`, treat that as the canonical result. Do not overwrite it with a separate handcrafte

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 254)May include surrounding context.

md
- If `run_from_brief.py` succeeds and prints `HUMANIZE_USER_VISIBLE_SUMMARY`, treat that as the canonical result. Do not overwrite it with a separate handcrafte

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 434)May include surrounding context.

md
- If `run_from_brief.py` succeeds and prints `HUMANIZE_USER_VISIBLE_SUMMARY`, treat that as the canonical result. Do not overwrite it with a separate handcrafte

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 432)May include surrounding context.

md
- `scripts/parse_user_brief.py`: normalize structured or loose user input into spec + session mode

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · scripts/runtime_common.py (reported line 119)May include surrounding context.

python
def _subprocess_env(extra: dict[str, str] | None = None) -> dict[str, str]:
    env = os.environ.copy()
    env.setdefault("HF_HOME", str(hf_cache_dir()))
    env.pop("TRANSFORMERS_CACHE", None)
    env.setdefault("HF_HUB_DISABLE_XET", "1")

Reflective dangerous call via getattr() with a literal sink name

High
Category
Dangerous Code Execution
Confidence
85% confidence
Finding

Reflective access to an execution sink via getattr() with a constant name (e.g. getattr(os, 'system'), getattr(builtins, 'exec')) is functionally identical to a direct exec/os.system call but evades name-based detection. This is a deliberate evasion technique rather than idiomatic code.

Content

Scanner excerpt · scripts/scoring_core.py (reported line 230)May include surrounding context.

python
model = AutoModelForSequenceClassification.from_pretrained(resolved)
    device = default_device()
    model.to(device)
    getattr(model, "eval")()
    bundle = {"tokenizer": tokenizer, "model": model, "device": device}
    _MODEL_BUNDLE[key] = bundle
    return bundle

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The profile strings and later directives are written entirely in Chinese and instruct generation style such as '更像真人微信的表达', indicating the skill is steering output toward a specific language/locale. There is no visible opt-in, language selection, or documented justification that this skill is intentionally limited to Chinese-language use.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/strategy_state.py (reported line 223)May include surrounding context.

python
directives.append("上一轮压缩过头了,这一轮保留更多原文里的有效信息,不要只剩一句概括。")
    if "copied_baseline" in failure_tags:
        directives.append("上一轮只是复读 baseline,这一轮必须明显改写,不能原样重复。")
    return directives


def evolve_after_attempts(

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Line L03 describes the repository as a general-purpose Chinese copy humanize skill, and the document consistently presents the skill as operating in Chinese without offering a language choice or opt-in. This creates a natural-language locale policy concern because the skill appears to enforce a specific language by default rather than letting the user choose.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

该 markdown 文件整体仅以中文撰写,未见为用户提供语言/locale 选择,也未说明该技能仅面向特定中文区域或用户群体。根据规则,强制单一语言而无用户 opt-in 或明确合理的区域性说明,属于自然语言层面的语言/locale 策略风险。

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The description explicitly frames the skill as a Chinese-language rewriting tool ("一个中文文案…skill"). Under the stated policy, forcing a specific language without user opt-in can be a natural-language policy violation unless the locale constraint is clearly documented and justified as region-specific; this README presents the constraint as a default capability rather than an explicit user choice.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.