Back to skill

Security audit

AI通识课资深专家V8.2BNBU

Security checks across malware telemetry and agentic risk

Overview

This appears to be a real AI teaching assistant, but its privacy and offline claims are stronger than the code actually supports, so it needs review before use with student data.

Install only if you are comfortable reviewing and controlling its network use. Treat “zero-upload” as “raw course files are intended to stay local, but abstracted metadata may be sent to a configured cloud endpoint,” not as a guarantee that nothing leaves the machine. Avoid using it with real student identifiers, grades, answers, or sensitive family data until the publisher aligns the privacy docs with implementation, adds explicit permissions, and documents endpoint/provider controls and data retention clearly.

Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (249)

subprocess module call

Medium
Category
Dangerous Code Execution
Content
if script_args is None:
        script_args = []
    cmd = [str(venv_python), str(SCRIPT_DIR / script_name), *script_args]
    return subprocess.run(
        cmd,
        check=False,
        capture_output=capture_output,
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
)
        if not os.path.exists(ps_script):
            return None
        result = subprocess.run(
            ["powershell", "-NoProfile", "-ExecutionPolicy", "Bypass",
             "-File", ps_script, "--probe-only"],
            capture_output=True, text=True, timeout=15,
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
):
        if hasattr(cost_monitor, attr):
            try:
                return bool(getattr(cost_monitor, attr))
            except Exception:
                return False
    # 3) 鍏滃簳锛歝umulative_cost_usd >= monthly_budget_usd
Confidence
50% confidence
Finding
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
for attr in ("cumulative_cost_usd", "cumulative_cost", "total_cost_usd", "cost_usd"):
        if hasattr(cost_monitor, attr):
            try:
                return float(getattr(cost_monitor, attr))
            except Exception:
                continue
    return 0.0
Confidence
50% confidence
Finding
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
for attr in ("monthly_budget_usd", "monthly_budget", "budget_usd", "budget"):
        if hasattr(cost_monitor, attr):
            try:
                v = float(getattr(cost_monitor, attr))
                return v
            except Exception:
                continue
Confidence
50% confidence
Finding
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
"""运行 exe 并尝试给定参数,返回是否成功(用于校验下载是否完整)。"""
    for flag in flags:
        try:
            result = subprocess.run(
                [str(exe_path), flag],
                capture_output=True,
                timeout=15,
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
VENV_DIR.parent.mkdir(parents=True, exist_ok=True)
    log.info(f"[venv] 创建统一虚拟环境:{VENV_DIR}")
    subprocess.run([sys.executable, "-m", "venv", str(VENV_DIR)], check=True)
    if not VENV_PYTHON.exists():
        raise RuntimeError(f"虚拟环境创建后未找到 Python:{VENV_PYTHON}")
    log.info(f"[venv] ✓ 虚拟环境已就绪:{VENV_PYTHON}")
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
raise FileNotFoundError(f"requirements.txt 不存在:{REQUIREMENTS_FILE}")

    log.info(f"[venv] 安装依赖:{REQUIREMENTS_FILE}")
    subprocess.run([str(venv_python), "-m", "pip", "install", "--upgrade", "pip"], check=True)
    subprocess.run(
        [str(venv_python), "-m", "pip", "install", "-r", str(REQUIREMENTS_FILE)],
        check=True,
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
log.info(f"[venv] 安装依赖:{REQUIREMENTS_FILE}")
    subprocess.run([str(venv_python), "-m", "pip", "install", "--upgrade", "pip"], check=True)
    subprocess.run(
        [str(venv_python), "-m", "pip", "install", "-r", str(REQUIREMENTS_FILE)],
        check=True,
    )
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
if not VENV_PYTHON.exists():
        return
    cmd = [str(VENV_PYTHON), str(script_path), *sys.argv[1:]]
    raise SystemExit(subprocess.call(cmd))


def runtime_summary() -> dict[str, str]:
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
if not hasattr(self, attr):
            return []
        errors: List[Exception] = []
        for fn in getattr(self, attr):
            try:
                fn({"target": None, **payload})
            except Exception as e:
Confidence
50% confidence
Finding
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Content
def add_global(self, event: str, fn) -> None:
        attr = f"_global_{event}"
        if hasattr(self, attr):
            getattr(self, attr).append(fn)

    def trigger_global(self, event: str, **payload) -> List[Exception]:
        attr = f"_global_{event}"
Confidence
50% confidence
Finding
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Tainted flow: 'req' from sys.stdin.read (line 857, user input) → urllib.request.urlopen (network output)

Medium
Category
Data Flow
Content
req = urllib.request.Request(url, data=payload, headers=headers, method="POST")

    try:
        with urllib.request.urlopen(req, timeout=connect_timeout) as resp:
            body = resp.read().decode("utf-8")
            provider_resp = json.loads(body)
    except socket.timeout as exc:
Confidence
65% confidence
Finding
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Tainted flow: 'connect_timeout' from os.environ.get (line 743, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
req = urllib.request.Request(url, data=payload, headers=headers, method="POST")

    try:
        with urllib.request.urlopen(req, timeout=connect_timeout) as resp:
            body = resp.read().decode("utf-8")
            provider_resp = json.loads(body)
    except socket.timeout as exc:
Confidence
90% confidence
Finding
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Intent-Code Divergence

Medium
Confidence
98% confidence
Finding
Earlier sections repeatedly state this skill is version 8.2.0-aipc and introduce V8.2 Module H as the current release, but the file structure block still names the root directory `ai-literacy-expert-v8.1.0-aipc/` and `VERSION.txt` as `8.1.0-aipc`. This is an active documentation contradiction that could mislead operators about which artifacts and release they are auditing or deploying.

Intent-Code Divergence

Medium
Confidence
99% confidence
Finding
The document's title, manifest header, and feature sections all identify V8.2-AIPC as the current version, but the version/history section says the current version is V8.1-AIPC (`8.1.0-aipc`) and frames V8.2 as a future roadmap item. That contradiction undermines the declared intent and makes the documented state of the skill unreliable.

Description-Behavior Mismatch

Low
Confidence
98% confidence
Finding
The description states '5 项目 × 29 专业 × 5 课时教案', which implies the file provides lesson plans for 29 majors. However, the actual `lesson_plans` content contains only 12 entries, and the summary later confirms this is only first-phase coverage. This is a manifest/data description mismatch rather than an implementation detail.

Intent-Code Divergence

Low
Confidence
95% confidence
Finding
The file comment says it installs the environment for "ai-literacy-expert-v7.3", while the provided manifest is for "ai-literacy-expert-v8.2.0-aipc". This is an active documentation mismatch about which skill/version the script serves, which can mislead reviewers about intent and deployment target.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The manifest strongly frames this skill around AI-literacy teaching workflows on AI PC, highlighting local inference and zero-upload privacy. In contrast, the documented fallback chain explicitly routes OCR/ASR/TTS/RAG requests to cloud providers such as Baidu, Tencent, Aliyun, Edge TTS, and Elasticsearch, which materially changes the privacy and deployment model rather than being a mere implementation detail.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
This file describes a generic multi-provider execution manager that can invoke several external cloud AI services when local tools fail. For a skill positioned as an AI-literacy teaching expert with AI PC edge-cloud collaboration but also zero-upload privacy and local inference emphasis, broad cloud failover across OCR/ASR/TTS/RAG is an extra operational capability not clearly justified as necessary for lesson planning or curriculum design.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
Lines L014-L015 state that the system runs completely offline to protect learner privacy. However, L127, L157, L206, and L289-L292 describe fallback to API-based grading, loading a remote PDF library from a CDN, initial AI generation, and uploading results when network is restored, which materially exceeds a fully offline design.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The guide presents immediate feedback with subjective-answer scoring via 'local AI model or API' and later defines '联网提交:恢复网络 → 上报成绩 → 获取报告' at L291. These instructions conflict with the earlier claim at L014 that the evaluation system is completely offline for privacy protection, creating an intent/documentation contradiction within the file.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
Lines L001-L003 state that the file is fully inherited into V7 and remains completely valid, yet the actual content beginning at L005 is an audit report for 'AI 通识课资深专家 V5' reviewing 'ai-literacy-expert-v4.3'. This is not merely incomplete documentation: the header asserts current-version validity while the body clearly targets older versions and discusses planned V5 upgrades rather than the manifested V8.2 skill.

Description-Behavior Mismatch

Medium
Confidence
85% confidence
Finding
The manifest describes an AI literacy teaching, lesson-planning, courseware, and curriculum-design assistant, with privacy-oriented claims such as zero-upload privacy/local inference. This reference document additionally requires asynchronous reporting to /api/audit and collection of trigger-hit and adoption-rate behavior logs, which are not clearly part of the pedagogical content-generation purpose and introduce telemetry behavior beyond the manifest's core instructional scope.

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.destructive_delete_command, suspicious.dynamic_code_execution, suspicious.exposed_secret_literal

Documentation contains a destructive delete command without an explicit confirmation gate.

Warn
Code
suspicious.destructive_delete_command
Location
references/deployment-guide.md:1619

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
support/p5.min.js:1

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
support/p5.sound.min.js:2

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/deployment-guide.md:592