T09 · Insecure Skill Coding Practices
- Location
references/setup-guide.md:84- Finding
API Key May Be Accidentally Committed Due to Missing Git Exclusion
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This image-processing skill mostly does what it says, but it under-discloses third-party handling of sensitive images and contains misleading API-key storage guidance.
Review carefully before installing. Use only images and URLs you are authorized to send to Cutout.Pro, avoid sensitive portraits, identity documents, regulated data, private signed URLs, or internal-only assets unless your organization approves that processing, and store CUTOUT_API_KEY outside the repository or add a real .gitignore before creating a .env file.
references/setup-guide.md:84API Key May Be Accidentally Committed Due to Missing Git Exclusion
scripts/requirements.txt:1Unpinned Dependency Without Artifact Integrity Verification
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def _parse_env_file(env_path: Path) -> dict[str, str]:
"""Parse a .env file and return a key=value dictionary."""
result: dict[str, str] = {}
if not env_path.exists():
return result
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def _parse_env_file(env_path: Path) -> dict[str, str]:
"""Parse a .env file and return a key=value dictionary."""
result: dict[str, str] = {}
if not env_path.exists():
return result
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def _parse_env_file(env_path: Path) -> dict[str, str]:
"""Parse a .env file and return a key=value dictionary."""
result: dict[str, str] = {}
if not env_path.exists():
return result
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
key = os.environ.get("CUTOUT_API_KEY")
if key:
return key
env_data = _parse_env_file(ROOT_DIR / ".env")
return env_data.get("CUTOUT_API_KEY")
The README explicitly promotes uploading local images or supplying remote image URLs to a third-party service, but it does not clearly warn users that image contents and possibly metadata will be transmitted off-host to Cutout.Pro. For a visual-processing skill, that omission can lead users to send sensitive photos, identity documents, or internal images without informed consent, creating privacy and compliance risk rather than a memory-safety bug.
The skill performs sensitive actions implied by its documentation and referenced scripts—reading environment variables for an API key, reading and writing local files, and making outbound network requests—yet it does not declare any explicit tool scope such as permissions or allowed-tools. This weakens transparency and policy enforcement, increasing the chance that an agent could invoke broader capabilities than a user expects when processing local images and external URLs.
The skill encourages uploading local image files and submitting image URLs to Cutout.Pro, but it does not prominently warn users that image content will be transmitted to a third-party external service for processing. This creates a privacy and data-handling risk, especially for personal photos, biometric face images, or proprietary images that users may assume are processed locally.
The documentation instructs users to upload image files or submit image URLs to a third-party service without any privacy or data-handling warning. Because user images may contain personal, sensitive, or regulated data, omitting notice of external transmission can cause unintentional disclosure and non-compliant use.
The faceAnalysis feature is described as returning facial landmarks and face bounding data, but the documentation does not warn that this may involve biometric-like facial information being transmitted to and generated by an external service. In environments handling employee, customer, or identity images, this omission raises privacy, consent, and regulatory risk beyond ordinary image processing.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import requests
response = requests.post(
'https://www.cutout.pro/api/v1/matting?mattingType=6',
files={'file': open('/path/to/photo.jpg', 'rb')},
headers={'APIKEY': 'your_api_key_here'},
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import requests
response = requests.post(
'https://www.cutout.pro/api/v1/matting?mattingType=6',
files={'file': open('/path/to/photo.jpg', 'rb')},
headers={'APIKEY': 'your_api_key_here'},
This example transmits a portrait image to an external service and requests faceAnalysis, which returns facial landmark data. In context, this is more sensitive than ordinary outbound traffic because it processes face imagery and derives biometric-like metadata, yet the example provides no warning, consent guidance, or data-sensitivity caveat.
import requests
response = requests.post(
'https://www.cutout.pro/api/v1/matting2?mattingType=3&faceAnalysis=true',
files={'file': open('/path/to/portrait.jpg', 'rb')},
headers={'APIKEY': 'your_api_key_here'},
The skill uploads local image contents to a third-party API, but the CLI does not provide an explicit privacy or data-transfer warning at the point of use. This can lead users to unintentionally send sensitive images off-system, which is a real privacy/security issue even though the network behavior is functionally expected for this integration.
Although the document notes that API calls consume credits, it does not present this as a user-facing warning before usage examples or invocation steps, so a user may trigger paid operations without informed consent. In agent settings, this can lead to unexpected account consumption or small financial loss through repeated or automated requests.
User-supplied image URLs are forwarded to an external API without an explicit notice that the URL itself will be shared with a third party. While less sensitive than raw file upload in many cases, URLs can still expose internal locations, signed links, or private resources if users are not clearly informed.
The dependency is specified as requests>=2.28.0, which allows installation of any newer version without ensuring reproducibility or constraining to a reviewed release. This increases supply-chain risk and makes it difficult to verify whether deployments will avoid vulnerable or breaking versions over time.
# Cutout.Pro Visual API Skill - Dependencies
# Install: pip install -r requirements.txt
requests>=2.28.0
The manifest references requests without pinning to a specific version, while multiple known advisories exist for that package. Because the exact installed version is undefined, consumers may resolve to a vulnerable release, making the dependency posture unverifiable and potentially exposing the skill to known issues such as credential leakage or request-handling flaws.
No suspicious patterns detected.