Back to skill

Security audit

Alumni Career Tracker

Security checks for vulnerabilities and agentic risk

Overview

This skill is purpose-aligned but needs review because it stores and exports identifiable alumni career and possible compensation data with weak controls.

Review this skill before installing if you will handle real alumni data. Use only consented data, avoid storing salary details or private notes unless necessary, keep the data file in a restricted location, and do not export raw records to shared folders. Pin dependencies before deployment.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/main.py:30
Finding

Identifiable Alumni and Compensation Data Stored in Plaintext

Content
View full analysis

Vulnerability Details

File Location: scripts/main.py, lines 30–42 and 108–112
Vulnerability Type: Plaintext storage of sensitive personal data
Risk Level: Medium

Vulnerable Code

python
@dataclass
class AlumniRecord:
    """校友记录数据类"""
    name: str
    graduation_year: int
    degree: str  # PhD, Master, Bachelor
    current_status: str  # industry, academia, startup, other
    organization: str
    position: str
    location: str = ""
    field: str = ""
    salary_range: str = ""
    notes: str = ""
python
def _save_data(self):
    """保存数据到文件"""
    self.data_path.parent.mkdir(parents=True, exist_ok=True)
    with open(self.data_path, 'w', encoding='utf-8') as f:
        json.dump([r.to_dict() for r in self.alumni], f, ensure_ascii=False, indent=2)

Technical Analysis

The application collects personally identifiable and potentially sensitive information, including names, employers, positions, locations, notes, and salary ranges. The _save_data method serializes every field directly into an unencrypted JSON file.

The implementation does not apply encryption, field-level redaction, access-permission hardening, consent tracking, retention controls, or anonymization before persistence. It also does not prevent the default database or exported copies from being committed to source control, copied into backups, or read by other local processes with filesystem access.

This behavior conflicts with the privacy protections described in SKILL.md, including its statements that reports should use aggregated data and that individual salary information must not be shared. The documented privacy_guard.py component is not present in the audited project.

Attack Path

  1. A user adds or imports alumni records containing names, employment information, locations, salary ranges, or private notes.
  2. add_alumni invokes _save_data, which serializes all record fi ...[truncated 1054 chars]
Remediation
View remediation

Remediation Suggestions

  1. Minimize collection of salary data and free-form notes; do not collect fields that are unnecessary for the stated analysis.
  2. Encrypt sensitive records at rest using a reviewed encryption library and keep encryption keys outside the data file and source repository.
  3. Create database and export files with restrictive owner-only permissions, such as mode 0600 on supported systems.
  4. Add explicit consent, retention, deletion, and opt-out metadata to each record.
  5. Produce anonymized or aggregated reports by default. Require an explicit, clearly warned option to export identifiable records.
  6. Exclude names, salary ranges, and notes from routine analytical output unless specifically required and authorized.
  7. Warn users when an output path is located inside a source repository or broadly shared directory.
  8. Document secure backup, deletion, and access-control requirements.
  9. Implement and test the privacy controls claimed by the documentation rather than relying on procedural checklist language alone.

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unpinned Third-Party Dependencies Permit Unreviewed Package Changes

Content
View full analysis

Vulnerability Details

File Location: requirements.txt, lines 1–3
Vulnerability Type: Unpinned and non-reproducible dependencies
Risk Level: Low

Vulnerable Code

text
dataclasses
pandas
rich

Technical Analysis

All declared packages are unconstrained. Package installers may therefore select whatever versions are available from the configured package index at installation time. The installed dependency set can change without any modification to the audited project.

No lock file, exact version constraints, or package hashes are provided. Consequently, the source reviewed during this audit does not fully determine the code that will be installed and executed in a future environment.

The dataclasses backport is normally unnecessary when the project requires Python 3.7 or newer, because dataclasses is included in the standard library. Retaining an unnecessary package increases the supply-chain and compatibility surface.

This finding does not establish that any currently named package is malicious. The risk arises from unconstrained future resolution, compromised upstream releases or indexes, and installation from an attacker-controlled package source.

Attack Path

  1. A user or automated deployment runs pip install -r requirements.txt.
  2. The installer queries its configured package index and resolves the latest versions satisfying the unconstrained names.
  3. A compromised upstream release, unsafe mirror, or malicious package served by an attacker-controlled index is selected.
  4. Package installation hooks or imported runtime code execute with the privileges of the installing or running user.
  5. The dependency can access data and resources available to that account, including alumni records processed by the application.

Impact Assessment

The maximum scope depends on how dependencies are installed and where the application runs. In a normal user installation, compromised de ...[truncated 449 chars]

Remediation
View remediation

Remediation Suggestions

  1. Define and enforce a supported Python version.
  2. Remove the dataclasses dependency when Python 3.7 or newer is required.
  3. Pin every direct and transitive dependency to a reviewed version through a lock file.
  4. Generate hash-verified requirements and install with pip install --require-hashes.
  5. Regenerate the lock file through a controlled dependency-update process rather than automatically accepting latest releases.
  6. Use a trusted package index and prevent fallback to unapproved public or internal indexes.
  7. Run dependency vulnerability and provenance checks in continuous integration.
  8. Install and execute the application in a least-privileged virtual environment or container.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The skill says it is not for real-time job searching, yet it documents updating LinkedIn profiles and monitoring alumni changes, which implies live collection and processing of third-party personal data. This creates a privacy and compliance risk because users may treat the feature as routine tracking without validating consent, platform terms, or data minimization requirements.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
- ❌ **Sharing individual salaries** → Violates privacy expectations
  - ✅ Report salary ranges or medians only; aggregate by groups

- ❌ **Identifiable case studies without consent** → Privacy breach
  - ✅ Always get written permission before highlighting individuals

**Interpretation Issues:**

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
- ❌ **Sharing individual salaries** → Violates privacy expectations
  - ✅ Report salary ranges or medians only; aggregate by groups

- ❌ **Identifiable case studies without consent** → Privacy breach
  - ✅ Always get written permission before highlighting individuals

**Interpretation Issues:**

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill goes beyond analysis and recommendation generation by maintaining a persistent alumni database and supporting record creation, update, deletion, and later import/export workflows. In a skill ecosystem, that scope expansion increases the chance of unauthorized collection, retention, and modification of personal career data without clear user expectation or controls.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The code exposes a deletion operation unrelated to the core analysis use case, enabling destruction of stored alumni records by name. In a shared or semi-automated environment, this increases the risk of accidental or unauthorized data loss and undermines integrity of the dataset used for recommendations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Deletion occurs immediately with no confirmation prompt, dry-run mode, or recovery mechanism. This makes accidental invocation or misuse much more likely to cause irreversible loss of alumni records, especially since deletion is keyed only by a name string that may not be unique.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The export path allows writing complete alumni records, potentially including names, organizations, locations, notes, and salary ranges, to arbitrary files. That creates a direct data-exfiltration and privacy risk if the skill is run in an environment with sensitive alumni data or broad filesystem access.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The manifest describes analyzing alumni career trajectories and generating recommendations, but the documented workflow also includes running a served dashboard on port 8080. While visualization is related, exposing a served interface is an additional operational capability beyond core analysis and guidance and is not explicitly scoped in the manifest.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency is unpinned, so installs may resolve to different versions over time, reducing build reproducibility and increasing supply-chain risk if a future release introduces a vulnerability or breaking change. In this specific case, 'dataclasses' is also unnecessary on modern Python versions because it is part of the standard library in Python 3.7+, which can create compatibility or dependency confusion issues if installed from PyPI unnecessarily.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
dataclasses
pandas
rich

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

An unpinned 'pandas' dependency allows different versions to be installed across environments, which creates reproducibility and supply-chain exposure. Because known advisories exist for some pandas versions, failing to pin also makes it impossible to verify whether deployments are using a safe release.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
dataclasses
pandas
rich

Unverifiable Dependency: pandas has 1 known advisory(ies) (CVE-2020-13091 (** DISPUTED ** pandas through 1.0.3 can unserialize and execute commands from an)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The manifest does not pin 'pandas', so there is no way to verify from this file whether the installed version is affected by the cited advisory. Even though the referenced CVE is disputed and may require unsafe downstream usage patterns, the lack of version control prevents reliable risk assessment and could allow deployment of a vulnerable release.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The unpinned 'rich' dependency permits uncontrolled version drift, which can introduce unexpected behavior or newly disclosed package vulnerabilities. While the direct impact is typically lower than for network-facing libraries, it still weakens supply-chain hygiene and reproducibility.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
dataclasses
pandas
rich

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This file contains user-facing natural language in Chinese, including the module description and command/help text, but does not indicate that the language is configurable or user-selected. That can violate language/locale policy when a skill forces a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/main.py (reported line 189)May include surrounding context.

python
"""
        result = self.alumni
        for key, value in filters.items():
            result = [a for a in result if getattr(a, key, None) == value]
        return result

    def analyze(

Static analysis

No suspicious patterns detected.