T09 · Insecure Skill Coding Practices
- Location
scripts/tukeli.py:93- Finding
API credential may be disclosed through cross-origin HTTP redirects
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a real Tukeli image-processing skill, but it should go to Review because it sends images and an API key to a paid external service with weak or inaccurate safeguards.
Install only if you are comfortable sending selected images, image URLs, prompts, and optional facial landmark data to Tukeli's servers and paying for API usage. Do not rely on the documented TUKELI_MAX_IMAGES_PER_DAY limit unless it is implemented or enforced provider-side, and prefer running it in an isolated environment with a scoped API key and reviewed dependency pinning.
scripts/tukeli.py:93API credential may be disclosed through cross-origin HTTP redirects
scripts/requirements.txt:4Dependencies are installed without reproducible version and integrity controls
references/setup-guide.md:119Documented daily paid-API usage limit is not implemented
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]:
"""解析 .env 文件,返回 key=value 字典。"""
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]:
"""解析 .env 文件,返回 key=value 字典。"""
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]:
"""解析 .env 文件,返回 key=value 字典。"""
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("TUKELI_API_KEY")
if key:
return key
env_data = _parse_env_file(ROOT_DIR / ".env")
return env_data.get("TUKELI_API_KEY")
The skill performs sensitive actions implied by its documentation and referenced scripts—reading local files, writing outputs/metadata, accessing environment variables for API keys, and making network requests—yet it does not declare any explicit tool scope or allowed-tools boundaries. This weakens least-privilege controls and makes it easier for an agent runtime to grant broader capabilities than users expect, increasing the blast radius if the skill is misused or compromised.
The skill describes uploading local images or submitting image URLs to a third-party cloud API, but it does not clearly warn users that their content will leave the local environment and be processed by an external service. This creates a privacy and data-handling risk, especially for personal photos, faces, IDs, or other sensitive imagery, because users may invoke the skill without informed consent about external transmission.
The documentation describes uploading image files and submitting image URLs to a third-party API but does not clearly warn users that their images will be transmitted off-platform to an external service. This creates privacy and compliance risk, especially if users send sensitive, proprietary, or personal images under the assumption processing is local or first-party.
The faceAnalysis option returns facial landmarks and face bounding data, which may constitute biometric or sensitive personal data in many jurisdictions. Documenting this feature without a clear warning can lead integrators to unknowingly collect, transmit, or store regulated facial data, increasing privacy, legal, and misuse risk.
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://picupapi.tukeli.net/api/v1/matting?mattingType=6',
files={'file': open('/path/to/file.jpg', 'rb')},
headers={'APIKEY': 'INSERT_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://picupapi.tukeli.net/api/v1/matting?mattingType=6',
files={'file': open('/path/to/file.jpg', 'rb')},
headers={'APIKEY': 'INSERT_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://picupapi.tukeli.net/api/v1/matting?mattingType=6',
files={'file': open('/path/to/file.jpg', 'rb')},
headers={'APIKEY': 'INSERT_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://picupapi.tukeli.net/api/v1/paintAsync',
json={
'imgUrl': 'https://example.com/transparent.png',
The guide tells users to submit local files or image URLs to an external API endpoint but does not clearly disclose that image content will leave the local environment and be processed by a third party. This creates a real privacy and data-governance risk, especially if users upload sensitive photos, biometric data, or proprietary images without informed consent.
This file presents its descriptive documentation entirely in Chinese, and the user-facing exception messages are also hard-coded in Chinese. Under the policy, forcing a specific language without user opt-in or clear justification is a natural-language policy violation.
The skill uploads local image files or sends image URLs to a third-party API, but the runtime flow does not provide a prominent consent/privacy warning before transmission. Users may unknowingly send sensitive personal images or internal URLs to an external service, creating privacy and data-handling risk.
The AI background feature transmits image content and free-form text prompts to a third-party endpoint without a clear in-band warning or consent mechanism. Because prompts and images may contain personal, confidential, or regulated data, silent transmission increases privacy and compliance risk.
This code sends user-supplied images/text to an external API over the network, which is expected for the skill but still security-relevant because sensitive data may leave the local environment. In the skill context, the danger is not hidden malware behavior but undisclosed third-party data transfer and possible exposure of personal or confidential content.
}
if method == "POST":
resp = requests.post(url, json=body, headers=headers, timeout=timeout)
else:
resp = requests.get(url, params=body, headers=headers, timeout=timeout)
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
}
if method == "POST":
resp = requests.post(url, json=body, headers=headers, timeout=timeout)
else:
resp = requests.get(url, params=body, headers=headers, timeout=timeout)
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
if method == "POST":
resp = requests.post(url, json=body, headers=headers, timeout=timeout)
else:
resp = requests.get(url, params=body, headers=headers, timeout=timeout)
_raise_for_status(resp)
return resp.json()
文件中的自然语言说明全部为中文,且未提供多语言选项、英文别名或声明该技能仅面向中文用户。根据语言/区域政策,若技能强制特定语言而无用户选择或合理限定,可能构成自然语言策略问题。
A language or locale policy issue can arise when a skill forces a specific language without user opt-in. This file presents all instructions in Chinese and does not indicate that the skill is region-specific or provide an alternative language option.
This requirements file contains natural-language comments only in Chinese, which may impose a specific language/locale on users without offering a choice or documenting a justified region-specific constraint. The policy for this audit flags language or locale restrictions when they are forced without opt-in.
The dependency is specified as requests>=2.28.0, which allows installation of a wide range of versions and makes builds non-reproducible. In a skill that calls external visual-processing APIs and may handle image URLs, uploads, credentials, and remote network traffic, leaving requests unpinned increases the chance of pulling in a vulnerable or behavior-changing release during deployment.
# 图可丽视觉 API Skill - 依赖
# 安装:pip install -r requirements.txt
requests>=2.28.0
requests has multiple published advisories, and because the manifest does not pin a specific version, there is no way to verify whether the installed package includes fixes. Given this skill's purpose—making outbound HTTP requests to a third-party image API and potentially fetching user-supplied URLs—dependency uncertainty can expose secrets, request metadata, or transport security assumptions if an affected version is resolved.
文件头文档、CLI 描述和用户输出均固定为中文,没有提供语言切换、用户选择或对中文限定场景的说明。按规则,强制特定语言而无用户 opt-in 可能构成语言/locale 政策问题。