Back to skill

Security audit

.Ainglish Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill appears purpose-aligned, but it exposes a mutable third-party SDK action surface under user-provided API credentials, so it should be reviewed before installation.

Install only if you are comfortable with this skill calling the Ainglish service and, when credentials are present, performing remote write actions you explicitly request. Prefer running it with narrowly scoped or short-lived credentials, and consider waiting for a version that pins the SDK and exposes a reviewed action allowlist.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Dynamic SDK Method Exposure Through an Unbounded Dependency

Content
View full analysis
=0.2.42 ``` `SKILL.md:92`: ```yaml - ainglish>=0.2.42 ``` `main.py:49-61`: ```python def _actions() -> dict[str, Any]: cls = _client_class() out = {} for name in dir(cls): if name.startswith("_") or name in _EXCLUDED: continue attr = getattr(cls, name) if callable(attr): out[name] = attr return out ACTIONS = None # populated lazily so an import error becomes a JSON envelope ``` `main.py:88-91`: ```python if action == "actions": cat = sorted(_actions()) json.dump({"status": "ok", "result": {"actions": cat + ["preflight", "actions"], "count": len(cat) + 2}}, sys.stdout, default=str) ``` `main.py:114-139`: ```python catalogue = _actions() if action not in catalogue: return _fail("UNKNOWN_ACTION", f"no such action {action!r}. Valid: {', '.join(sorted(catalogue))}, preflight, actions") kwargs = {k: v for k, v in req.items()} cls = _client_class() try: client = cls( colony_api_key=os.environ.get("COLONY_API_KEY") or None, id_token=os.environ.get("AINGLISH_ID_TOKEN") or None, ) except Exception as exc: # noqa: BLE001 return _fail(type(exc).__name__, str(exc)) method = getattr(client, action) try: inspect.signature(method).bind(**kwargs) except TypeError as exc: return _fail("INVALID_ARGS", f"{action}: {exc}") try: result = method(**kwargs) except Exception as exc: # noqa: BLE001 — the register's own envelope is the useful part return ...[truncated 3123 chars]
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill is explicitly designed around a specialized communication register and encourages participation in that register, which can steer agent outputs into a non-user-requested dialect or constrained language mode. In an agent-to-agent communication context this can cause misalignment with user intent, reduce transparency, and create opportunities for semantic manipulation if the user is not clearly informed and given a choice.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The top-level docstring identifies this as an "ainglish-skill," which explicitly signals English-only behavior, and the file provides no user choice or opt-in for language/locale. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

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 · main.py (reported line 59)May include surrounding context.

python
for name in dir(cls):
        if name.startswith("_") or name in _EXCLUDED:
            continue
        attr = getattr(cls, name)
        if callable(attr):
            out[name] = attr
    return out

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 · main.py (reported line 129)May include surrounding context.

python
except Exception as exc:  # noqa: BLE001
        return _fail(type(exc).__name__, str(exc))

    method = getattr(client, action)
    try:
        inspect.signature(method).bind(**kwargs)
    except TypeError as exc:

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
90% confidence
Finding

The dependency is specified with a lower-bound version only (ainglish>=0.2.42), which allows installation of any newer release, including unreviewed major versions that may introduce malicious code, breaking changes, or newly disclosed vulnerabilities. This weakens supply-chain integrity and makes builds non-reproducible across environments and over time.

Content

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

text
ainglish>=0.2.42