Back to skill

Security audit

aws-SkyRoute

Security checks for vulnerabilities and agentic risk

Overview

The skill is a static traffic-globe demo, but opening it automatically runs mutable third-party JavaScript from a CDN and its live-looking metrics are simulated.

Review this before installing or hosting. It is reasonable as a visual demo, but vendor or pin the globe.gl script and add integrity checks before using it in an internal dashboard or on an origin with sensitive sessions. Treat all displayed traffic and metrics as simulated until you wire in a real data source, and expect parts of the UI to be Chinese-localized.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Warning
Location
assets/globe.html:186
Finding
Unpinned Third-Party JavaScript Allows Remote Payload Execution<![CDATA[ ## Vulnerability Details **File Location**: `assets/globe.html`, line 186 **Vulnerability Type**: Mutable remote JavaScript dependency without version pinning or integrity verification **Risk Level**: Medium ### Vulnerable Code ```html <script src="https://unpkg.com/globe.gl"></script> <script> fetch('https://unpkg.com/world-atlas@2/countries-110m.json') .then(r=>r.json()).then(topo=>initGlobe(topo)).catch(()=>initGlobe(null)); ``` ### Technical Analysis The page loads and executes `globe.gl` directly from an unversioned unpkg URL. The URL does not identify an immutable package version, and the script element does not provide a Subresource Integrity (`integrity`) hash. Consequently, the code that executes when the dashboard is opened can change after the project has been reviewed or deployed. The browser grants the downloaded script the same JavaScript execution context as the dashboard itself. HTTPS protects the response while it is in transit, but it does not protect against a compromised package release, package ownership transfer, CDN compromise, or unexpected changes to the resource resolved by the mutable URL. The adjacent `world-atlas` request is not directly executable because its response is parsed as JSON. Nevertheless, it is also an external runtime dependency, is only pinned to major version `2`, and creates an availability and privacy dependency on unpkg. ### Attack Path 1. An attacker compromises the `globe.gl` package, its publishing credentials, the package namespace, or the serving CDN. 2. The attacker causes the mutable `https://unpkg.com/globe.gl` URL to return modified JavaScript. 3. A user opens `index.html`, which redirects the browser to `assets/globe.html`. 4. The browser retrieves the remote script on line 186. 5. Because no integrity hash is present, the browser accepts and executes the modified response. 6. The payload runs in the dashboard's origin context and can manipulate the interface, read data available to t ...[truncated 1038 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Vendor the dependency locally** - Download a reviewed release of `globe.gl`. - Store it within the project, such as `assets/vendor/globe.gl.min.js`. - Reference that local immutable file rather than retrieving executable code at runtime. 2. **Pin an exact version if CDN hosting remains necessary** - Replace the mutable package URL with a URL containing an exact, reviewed version. - Avoid floating tags, major-version-only references, and unversioned package paths. 3. **Enable Subresource Integrity** - Generate and specify an approved cryptographic hash using the `integrity` attribute. - Add `crossorigin="anonymous"` so integrity verification works correctly with the CDN. - Update the hash only after reviewing and approving a dependency upgrade. 4. **Host the map data locally** - Vendor `countries-110m.json` or pin it to an exact package version. - This reduces external request disclosure and prevents upstream availability or compatibility changes from affecting the dashboard. 5. **Apply a restrictive Content Security Policy** - Prefer a policy that permits scripts only from the dashboard's own origin. - Remove inline JavaScript or authorize it with a reviewed nonce or hash. - Restrict `connect-src` to explicitly required data endpoints. 6. **Establish dependency controls** - Record dependency versions and checksums. - Review release changes before upgrades. - Periodically scan vendored or pinned dependencies for known vulnerabilities. ]]>
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (5)

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The feature list explicitly states "Country name mapping (CC → Chinese name)", which imposes a specific language/locale in the skill's output. The file does not offer user opt-in, alternative locales, or a documented regional justification, so this is a natural-language locale policy violation.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
This file declares `lang="zh"`, and the UI text and time formatting are consistently hard-coded to Chinese (`zh-CN`). The policy for natural-language violations applies to all file types, and forcing a specific language/locale without user opt-in is explicitly in scope.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The manifest describes a globe visualization of real-time user connections flowing to AWS regions with operational metrics and alerts. In code, the regions, CloudFront edges, request counts, hit rates, latency, and related telemetry are hard-coded and then animated via random simulation logic, so the skill behaves as a demo/simulator rather than a real traffic monitor.

Natural-Language Policy Violations

Low
Confidence
93% confidence
Finding
The example mapping uses Chinese display names (`'美国'`, `'英国'`) as the apparent default localization, but the README does not mention that the skill is Chinese-localized or give users an option to choose another language. This can violate language/locale policy when a skill implicitly forces a specific language without opt-in.

Description-Behavior Mismatch

Low
Confidence
87% confidence
Finding
The stated purpose emphasizes global traffic flowing to AWS regions, suggesting region-aware destination visualization. The code defines only one ALB target and one S3 target, both in a single geographic area, and sends all simulated arcs to one of those two endpoints, which is narrower than the manifest's description.

Static analysis

No suspicious patterns detected.