Back to skill

Security audit

Gravitational Wave Event Analyzer

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly aligned with its gravitational-wave analysis purpose, but it needs Review because output filenames are not safely contained and can write outside the chosen output folder in some paths.

Install only in a sandboxed or low-privilege environment, use a dedicated output directory, and avoid passing untrusted event names or detector identifiers until filenames are validated and dependency versions are pinned or locked.

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
gw_analyzer.py:354
Finding

Output Path Traversal Through Unsanitized Event and Detector Identifiers

Content
View full analysis
Remediation
View remediation
str: if not value or not SAFE_IDENTIFIER.fullmatch(value): raise ValueError(f"Invalid {field}") return value ``` 2. Reject absolute paths, path separators, `..` components, null characters, and platform-specific alternate separators. 3. Resolve and verify every destination before writing: ```python base = self.output_dir.resolve() destination = (base / filename).resolve() if destination.parent != base: raise ValueError("Output path escapes the configured output directory") ``` If subdirectories are intentionally supported, use `destination.is_relative_to(base)` on supported Python versions instead of requiring the immediate parent to equal `base`. 4. Apply validation inside the library methods, not only in the CLI, because direct Python callers bypass `argparse` choices. 5. Avoid silently overwriting existing files. Use exclusive creation where appropriate, generate collision-resistant output names, or require explicit overwrite authorization. 6. Add tests covering `../`, absolute paths, Windows separators, encoded separators, empty identifiers, and valid GWOSC event names. ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unpinned and Unverified Third-Party Dependencies

Content
View full analysis
=3.0.0 gwosc>=0.7.0 numpy>=1.24.0 scipy>=1.10.0 matplotlib>=3.7.0 astropy>=5.3.0 ``` The documentation also recommends an unconstrained installation: ```bash pip install gwpy gwosc numpy scipy matplotlib astropy ``` ### Technical Analysis All dependencies use lower-bound-only constraints, while the documented installation command does not constrain versions at all. The project supplies no lockfile, artifact hashes, upper bounds, or trusted-index configuration. Consequently, installations performed at different times can resolve to different direct and transitive dependency versions. Future releases automatically become eligible without project review. Python packages and their build backends may execute code during installation, so a compromised upstream release or dependency can affect the installation environment before the analyzer runs. No evidence was found that the currently named packages are malicious or typosquatted. This finding concerns the absence of reproducible and integrity-verified dependency controls. ### Attack Path 1. A user follows the README or Skill installation instructions. 2. `pip` queries its configured package index and resolves the newest versions satisfying the broad constraints. 3. A compromised, malicious, or unexpectedly incompatible future direct or transitive release is selected. 4. Package build or installation hooks execute under the privileges of the user running `pip`. 5. The compromised dependency can subsequently execute when imported by `gw_analyzer.py`. This path requires compromise of an upstream package, dependency, package index, or distribution account; the repository itself does not introduce a known malicious pa ...[truncated 522 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (11)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill declares capabilities that inherently require network access and file output, but it does not explicitly scope or declare those permissions. That creates an authorization gap: a host agent may allow broader-than-expected execution, and users reviewing the skill cannot easily determine what external access or local write behavior will occur. In this context, downloading remote GWOSC data and writing analysis artifacts are expected behaviors, but the lack of explicit tool scoping still increases risk if the skill is repurposed or invoked in a more privileged environment.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This markdown file states that the skill queries the GWOSC Catalog API and downloads detector strain data, which means it performs network access. The description does not include any warning or disclosure about contacting external services or fetching remote data, which is a user-relevant behavior under the markdown criteria for missing warnings.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency is specified with a minimum version only, so builds may resolve to different versions over time, including future releases with undiscovered flaws or breaking behavior. While this is primarily a supply-chain hygiene issue rather than an immediately exploitable bug, it weakens reproducibility and makes security posture harder to verify.

Content

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

text
gwpy>=3.0.0
gwosc>=0.7.0
numpy>=1.24.0
scipy>=1.10.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

Using an unpinned gwosc dependency allows installation of any version at or above the minimum, which reduces build determinism and may silently introduce vulnerable or incompatible releases. In a skill that fetches remote scientific data, dependency drift increases supply-chain risk even if no direct exploit is evident in this file.

Content

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

text
gwpy>=3.0.0
gwosc>=0.7.0
numpy>=1.24.0
scipy>=1.10.0
matplotlib>=3.7.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

An unpinned numpy requirement permits resolver-selected versions that may vary by environment and time, making it impossible to guarantee that only reviewed versions are installed. Because numpy has had historical advisories, leaving it unpinned prevents clear determination of exposure and undermines reproducible secure builds.

Content

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

text
gwpy>=3.0.0
gwosc>=0.7.0
numpy>=1.24.0
scipy>=1.10.0
matplotlib>=3.7.0
astropy>=5.3.0

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
94% confidence
Finding

Numpy has known historical advisories, but the manifest does not pin a version, so it is impossible to determine whether deployed environments include a fixed or affected release. This does not prove exploitation, but it creates a real security verification gap in dependency management.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The scipy dependency is not pinned, so package resolution may pull in different releases across installations, complicating security verification and reproducibility. Since scipy has had prior security issues, this increases uncertainty about whether a deployed environment is affected.

Content

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

text
gwpy>=3.0.0
gwosc>=0.7.0
numpy>=1.24.0
scipy>=1.10.0
matplotlib>=3.7.0
astropy>=5.3.0

Unverifiable Dependency: scipy has 4 known advisory(ies) (CVE-2013-4251 (SciPy creates insecure temporary directories); CVE-2013-4251 (The scipy.weave component in SciPy before 0.12.1 creates insecure temporary dire); CVE-2023-25399 (A refcounting issue which leads to potential memory leak was discovered in scipy) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

Scipy has published advisories, and because the requirement is open-ended, there is no reliable way to verify whether an installation will avoid vulnerable versions. In this skill context the impact is moderated because the file only declares dependencies, but the uncertainty is still a legitimate supply-chain weakness.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
92% confidence
Finding

An unpinned matplotlib dependency allows unreviewed future versions to be installed, which can introduce security regressions or unexpected behavior. In this scientific plotting skill the risk is limited, but it still represents weak supply-chain control.

Content

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

text
gwosc>=0.7.0
numpy>=1.24.0
scipy>=1.10.0
matplotlib>=3.7.0
astropy>=5.3.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Leaving astropy unpinned means the environment may install any later version, including ones not yet assessed for compatibility or security. Given astropy's advisory history, the lack of pinning makes exposure unverifiable and increases supply-chain uncertainty.

Content

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

text
numpy>=1.24.0
scipy>=1.10.0
matplotlib>=3.7.0
astropy>=5.3.0

Unverifiable Dependency: astropy has 2 known advisory(ies) (CVE-2023-41334 (RCE in TranformGraph().to_dot_graph function); CVE-2023-41334 (RCE in TranformGraph().to_dot_graph function)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Astropy has a known RCE-related advisory history, and without an exact version pin the manifest cannot demonstrate that affected releases are excluded. Although exploitation would depend on how astropy features are used elsewhere, unverifiable exposure is more concerning here because one advisory class includes remote code execution impact.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.