Back to skill

Security audit

Aws Cloud Toolkit

Security checks for vulnerabilities and agentic risk

Overview

The AWS management skill is coherent, but it needs review because it encourages broad AWS permissions and destructive cloud operations without enough scoping, provenance, or safety guidance.

Install only from a verified source, avoid the placeholder repository or unverified package name, and do not grant the wildcard IAM policy as written. Use least-privilege, preferably short-lived AWS credentials, and require explicit confirmation before running terminate, delete, update, upload, or invoke operations against real AWS resources.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (3)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
README.md:56
Finding
Overly Broad Account-Wide AWS Permissions## Vulnerability Details **File Location**: `README.md`, lines 56-72 **Vulnerability Type**: Excessive cloud permissions and violation of least privilege **Risk Level**: High **Vulnerable Code Snippet**: ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:*", "s3:*", "lambda:*", "cloudwatch:*", "logs:*" ], "Resource": "*" } ] } ``` ### Technical Analysis The documented IAM policy grants every available action for EC2, S3, Lambda, CloudWatch, and CloudWatch Logs against all applicable resources. It does not limit access by action, resource ARN, region, account, resource tag, network origin, or other IAM conditions. These permissions exceed the needs of many advertised operations. For example, listing resources does not require deletion privileges, while routine monitoring does not require unrestricted control over log groups and alarms. The policy also combines read-only and destructive capabilities in one role. If users adopt this policy, any process operating with their AWS credentials could terminate instances, delete S3 objects or buckets where AWS permits it, replace Lambda code, modify monitoring, or delete forensic logs. The repository contains no implementation that would enforce confirmations, resource allowlists, or other safeguards around these operations. ### Attack Path 1. A user follows the README and attaches the documented policy to an IAM identity or role. 2. The user exposes those credentials to the advertised toolkit, an unintended package, a compromised dependency, or another process in the same environment. 3. The compromised process uses the wildcard permissions to enumerate account resources. 4. It performs destructive or unauthorized operations such as terminating EC2 instances, replacing Lambda function code, deleting S3 data, disabling alarms, or deleting l ...[truncated 734 chars]
Remediation
## Remediation Suggestions - Replace wildcard service actions with an explicit list of operations required by each feature. - Publish separate read-only, deployment, and destructive-operation policies. - Restrict permissions to designated resource ARNs wherever AWS supports resource-level authorization. - Add IAM conditions for approved regions, accounts, resource tags, and request contexts. - Use short-lived credentials obtained through IAM roles or AWS IAM Identity Center instead of long-lived access keys. - Apply permission boundaries and organization-level service control policies as defense in depth. - Require explicit user confirmation and clear resource identification before termination, deletion, or code replacement. - Prevent operational roles from deleting or weakening audit logs unless that capability is strictly necessary. - Document the minimum permissions required by each individual command.

T08 · Insecure Dependencies

Warning
Location
README.md:35
Finding
Ambiguous and Unverified Installation Sources## Vulnerability Details **File Location**: `README.md`, lines 35-41 **Vulnerability Type**: Untrusted package source and dependency-confusion exposure **Risk Level**: Medium **Vulnerable Code Snippet**: ```bash # Install from source git clone https://github.com/your-org/aws-cloud-toolkit.git cd aws-cloud-toolkit pip install -r requirements.txt # Or install via pip (when published) pip install aws-cloud-toolkit ``` ### Technical Analysis The source installation command uses the placeholder organization `your-org`, so it does not identify a repository whose ownership or provenance can be verified. The alternative command directs users to install the unqualified `aws-cloud-toolkit` package name even though the documentation states that it is only intended for use when published. This project contains documentation and dependency metadata but no implementation of the advertised `aws_cloud_toolkit` module. Consequently, the reviewed repository does not establish that either installation target corresponds to the audited content. If the placeholder repository or package name is controlled or later claimed by an unrelated party, copied installation commands may cause users to install attacker-controlled code. Python packages and their dependencies can execute code during installation or when imported. The resulting process may also have access to the AWS credentials that the same documentation instructs users to configure. ### Attack Path 1. A user copies one of the installation commands from the README. 2. The placeholder repository or unverified package name resolves to content not represented by this audited project. 3. The user installs or imports the resulting package. 4. Attacker-controlled package code executes with the user's local privileges. 5. If AWS credentials are present in environment variables or local configuration, the package can attempt to read and misuse them. 6. If the user also adopted the d ...[truncated 593 chars]
Remediation
## Remediation Suggestions - Replace the placeholder URL with the exact repository controlled by the project owner. - Remove the PyPI installation command until the package has been published under a verified owner. - Document the authoritative repository, package publisher, and release-signing process. - Pin installation instructions to immutable release tags or commit hashes where practical. - Publish artifact hashes and provenance attestations for official releases. - Enable trusted publishing and multi-factor authentication for package maintainers. - Verify that the published package contents correspond to the reviewed source tree. - Warn users not to install similarly named packages from unverified publishers.

T08 · Insecure Dependencies

Note
Location
requirements.txt:2
Finding
Open-Ended and Non-Reproducible Dependency Versions## Vulnerability Details **File Location**: `requirements.txt`, lines 2-17 **Vulnerability Type**: Unpinned third-party dependencies and excessive dependency surface **Risk Level**: Low **Vulnerable Code Snippet**: ```text boto3>=1.28.0 botocore>=1.31.0 python-dotenv>=1.0.0 click>=8.0.0 pyyaml>=6.0 # Testing pytest>=7.0.0 pytest-cov>=4.0.0 pytest-asyncio>=0.21.0 moto>=4.0.0 # Development black>=23.0.0 flake8>=6.0.0 mypy>=1.0.0 ``` ### Technical Analysis Every dependency uses an open-ended minimum version rather than an exact, reviewed version. A future installation can therefore resolve to package releases that did not exist when the project was audited. This makes builds non-reproducible and prevents the repository from defining a known dependency set. Testing and development tools are also included in the same requirements file as runtime libraries. Installing unnecessary packages increases the number of transitive dependencies and package-maintainer trust relationships exposed to users. Open-ended constraints do not establish that any listed dependency is currently malicious or vulnerable. The weakness is that later, unreviewed versions can be selected automatically, including a compromised release or a release with incompatible security behavior. ### Attack Path 1. A user runs `pip install -r requirements.txt`. 2. The resolver selects the newest available versions satisfying the lower bounds. 3. One selected direct or transitive release is compromised, vulnerable, or otherwise unsafe. 4. The package executes code during installation, import, testing, or normal operation. 5. The code gains access to data and credentials available to the Python process, potentially including configured AWS credentials. 6. Any resulting cloud impact is determined by the permissions assigned to those credentials. ### Impact Assessment The principal impacts are non-re ...[truncated 396 chars]
Remediation
## Remediation Suggestions - Generate and commit a lock file containing exact dependency versions. - Require package hashes during installation, such as through pip hash-checking mode. - Separate runtime dependencies from test and development dependencies. - Review and test dependency updates before merging them. - Use automated vulnerability and dependency monitoring with a documented response process. - Constrain compatible versions deliberately rather than accepting every future release. - Generate a software bill of materials for release artifacts. - Install production dependencies in an isolated environment with only the credentials and permissions required at runtime.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (27)

Missing User Warnings

High
Confidence
95% confidence
Finding
Documenting S3 bucket and object deletion without any warning about irreversible data loss can enable accidental or unsafe use by an agent or user. Because S3 may store backups, logs, or business-critical data, deletion capabilities are especially sensitive in this context.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Content
s3.create_bucket('my-unique-bucket-name')

# Upload file
s3.upload_file('my-unique-bucket-name', 'data/file.csv', '/local/path/file.csv')
```

### EC2 Operations
Confidence
55% confidence
Finding
Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Content
s3.create_bucket('my-unique-bucket-name')

# Upload file
s3.upload_file('my-unique-bucket-name', 'data/file.csv', '/local/path/file.csv')
```

### EC2 Operations
Confidence
55% confidence
Finding
Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Content
s3.create_bucket('my-unique-bucket-name')

# Upload file
s3.upload_file('my-unique-bucket-name', 'data/file.csv', '/local/path/file.csv')
```

### EC2 Operations
Confidence
55% confidence
Finding
Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
This markdown file includes examples for terminating EC2 instances and deleting S3 buckets/objects, which can irreversibly affect user infrastructure and data. The surrounding documentation does not warn users about destructive effects, required caution, or confirmation before running these operations.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill advertises powerful AWS resource management actions including create and terminate operations, but provides no caution about destructive effects, authorization checks, or confirmation requirements. In an agentic context, this increases the chance of accidental infrastructure disruption or unintended changes to cloud resources.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
Lambda create, update, and delete operations can change production behavior, break integrations, or remove critical automation, yet the documentation gives no caution about these risks. In an automated toolkit, omission of such warnings makes unsafe deployment or deletion more likely.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill shows raw AWS credential environment variables without any warning on secure storage, rotation, or avoidance of hardcoded secrets. This can normalize unsafe secret handling and increase the risk of credential exposure in shells, logs, screenshots, or source control.

Natural-Language Policy Violations

Low
Confidence
71% confidence
Finding
The title line presents bilingual branding with Chinese and English, but the document does not explain language preference, opt-in, or locale scope. If organizational policy requires not forcing a specific language or locale without user choice, this may be a minor policy concern.

Missing User Warnings

Low
Confidence
81% confidence
Finding
The documentation shows uploading local files to S3 and invoking Lambda with payload data, both of which transmit user or system data to AWS services. The README does not disclose that executing these examples sends data off the local system to cloud endpoints.

Unpinned Dependencies

Low
Category
Supply Chain
Content
# AWS Cloud Toolkit - Dependencies
boto3>=1.28.0
botocore>=1.31.0
python-dotenv>=1.0.0
click>=8.0.0
Confidence
94% confidence
Finding
The dependency is specified with a lower bound only, which permits installation of any newer version and makes builds non-reproducible. This increases supply-chain risk because a future vulnerable or malicious release could be pulled without review.

Unpinned Dependencies

Low
Category
Supply Chain
Content
# AWS Cloud Toolkit - Dependencies
boto3>=1.28.0
botocore>=1.31.0
python-dotenv>=1.0.0
click>=8.0.0
pyyaml>=6.0
Confidence
94% confidence
Finding
The dependency is specified with a lower bound only, which permits installation of any newer version and makes builds non-reproducible. This increases supply-chain risk because a future vulnerable or malicious release could be pulled without review.

Unpinned Dependencies

Low
Category
Supply Chain
Content
# AWS Cloud Toolkit - Dependencies
boto3>=1.28.0
botocore>=1.31.0
python-dotenv>=1.0.0
click>=8.0.0
pyyaml>=6.0
Confidence
97% confidence
Finding
python-dotenv is unpinned, so the environment may resolve to an unknown release, including one affected by published advisories. Because this package can influence environment loading and file handling, version uncertainty increases the chance of pulling a vulnerable release into builds or deployments.

Unverifiable Dependency: python-dotenv has 2 known advisory(ies) (CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via ); CVE-2026-28684 (python-dotenv reads key-value pairs from a .env file and can set them as environ)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
96% confidence
Finding
The manifest references python-dotenv without pinning an exact version, so it is impossible to verify whether the resolved package includes versions affected by known advisories. In practice this means the project may silently install a vulnerable release, especially across different environments or over time.

Unpinned Dependencies

Low
Category
Supply Chain
Content
boto3>=1.28.0
botocore>=1.31.0
python-dotenv>=1.0.0
click>=8.0.0
pyyaml>=6.0

# Testing
Confidence
97% confidence
Finding
click is unpinned, which allows arbitrary newer versions to be installed and makes the dependency state unverifiable. Since CLI frameworks may process user-controlled input, using an unconstrained version can expose the project to future or currently unknown vulnerable releases.

Unverifiable Dependency: click has 1 known advisory(ies) (CVE-2026-7246 (Pallets Click, versions 8.3.2 and below, contain a command injection vulnerabili)), 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
click has published advisory history, but the use of a non-specific version range prevents determining whether the deployed version is affected. This leaves the CLI stack potentially exposed to known issues while also obscuring accurate vulnerability management.

Unpinned Dependencies

Low
Category
Supply Chain
Content
botocore>=1.31.0
python-dotenv>=1.0.0
click>=8.0.0
pyyaml>=6.0

# Testing
pytest>=7.0.0
Confidence
98% confidence
Finding
PyYAML has a long history of unsafe deserialization issues, and leaving it unpinned makes it impossible to know which behavior or vulnerability profile will be installed. In a cloud toolkit context, YAML parsing may be used on configuration input, increasing the security relevance of version control.

Unverifiable Dependency: pyyaml has 8 known advisory(ies) (CVE-2019-20477 (Deserialization of Untrusted Data in PyYAML); CVE-2020-1747 (Improper Input Validation in PyYAML); CVE-2020-14343 (Improper Input Validation in PyYAML) +5 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
98% confidence
Finding
PyYAML has multiple historical security issues, including unsafe deserialization risks, and the unpinned requirement makes it impossible to establish whether a safe version is used. Given this is an AWS/cloud toolkit where YAML may be used for configuration or templates, the context makes the uncertainty more dangerous than a generic library list.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pyyaml>=6.0

# Testing
pytest>=7.0.0
pytest-cov>=4.0.0
pytest-asyncio>=0.21.0
moto>=4.0.0
Confidence
88% confidence
Finding
pytest is unpinned, which reduces reproducibility and may pull in vulnerable or breaking versions. However, as a testing dependency, the direct production exposure is typically lower unless test tooling runs in sensitive CI environments.

Unverifiable Dependency: pytest has 2 known advisory(ies) (CVE-2025-71176 (pytest has vulnerable tmpdir handling); CVE-2025-71176 (pytest has vulnerable tmpdir handling)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding
pytest has known advisories, and because the version is not pinned there is no reliable way to determine if the installed test dependency is affected. The main exposure is to CI and developer environments, so the practical impact is lower than for production dependencies.

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Testing
pytest>=7.0.0
pytest-cov>=4.0.0
pytest-asyncio>=0.21.0
moto>=4.0.0
Confidence
87% confidence
Finding
pytest-cov is unpinned, creating non-reproducible test environments and some supply-chain risk. The danger is usually limited to development and CI contexts rather than runtime production exposure.

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Testing
pytest>=7.0.0
pytest-cov>=4.0.0
pytest-asyncio>=0.21.0
moto>=4.0.0

# Development
Confidence
87% confidence
Finding
pytest-asyncio is unpinned, so builds may resolve to unexpected versions with security or reliability issues. Because it is test-only, the primary risk is to CI or developer environments rather than deployed runtime systems.

Unpinned Dependencies

Low
Category
Supply Chain
Content
pytest>=7.0.0
pytest-cov>=4.0.0
pytest-asyncio>=0.21.0
moto>=4.0.0

# Development
black>=23.0.0
Confidence
87% confidence
Finding
moto is unpinned, which introduces supply-chain and reproducibility risk in testing environments. While not usually a production dependency, compromise of CI or developer systems can still affect the software delivery pipeline.

Unpinned Dependencies

Low
Category
Supply Chain
Content
moto>=4.0.0

# Development
black>=23.0.0
flake8>=6.0.0
mypy>=1.0.0
Confidence
89% confidence
Finding
black is unpinned, allowing unknown versions to be installed in developer or CI environments. This can expose the toolchain to known vulnerabilities or malicious upstream changes, even if production runtime impact is indirect.

Unverifiable Dependency: black has 5 known advisory(ies) (CVE-2026-32274 (Black: Arbitrary file writes from unsanitized user input in cache file name); CVE-2024-21503 (Black vulnerable to Regular Expression Denial of Service (ReDoS)); CVE-2024-21503 (Versions of the package black before 24.3.0 are vulnerable to Regular Expression) +2 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
86% confidence
Finding
black has known advisories, but the manifest does not constrain it to a verified safe version. While this primarily affects developer and CI tooling rather than the deployed application, compromise of the build environment can still be security-relevant.

Static analysis

No suspicious patterns detected.