T09 · Insecure Skill Coding Practices
- Location
scripts/check_liveness.py:39- Finding
Biometric Images Are Retained by Default Without an Explicit Opt-Out
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does what it claims, but it handles sensitive face images in a way that may store them with the provider by default without enough user control or warning.
Review this carefully before installing. Only use it with clear consent from the person in the image, avoid putting identifying information in vendor_data, restrict access to the Didit account and API key, and prefer changing the script or requests to set save_api_request=false unless retention is explicitly required.
scripts/check_liveness.py:39Biometric Images Are Retained by Default Without an Explicit Opt-Out
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
with open(user_image, "rb") as f:
files = {"user_image": (os.path.basename(user_image), f)}
response = requests.post(API_URL, headers=headers, files=files,
data=data, timeout=60)
if response.status_code != 200:
The skill requires environment access for an API key and makes outbound network requests, but it does not declare tool scope such as permissions or allowed-tools. This weakens sandboxing and review controls, making it easier for an agent to use capabilities that were not explicitly disclosed to users or policy enforcement layers.
This skill sends a selfie to a third-party biometric verification service and may return sensitive inferred attributes such as age, gender, blocklist status, and duplicate-face matching results, but the description does not warn users about that transmission. Because biometric data is highly sensitive and often regulated, missing disclosure undermines informed consent and can lead to privacy, compliance, and trust failures.
The documentation states that save_api_request defaults to true, which implies uploaded face images and related request data may be retained in the provider's Business Console, but it gives no warning about storage or retention. Silent persistence of biometric submissions increases privacy risk, expands breach exposure, and may violate data minimization expectations.
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://verification.didit.me/v3/passive-liveness/",
headers={"x-api-key": "YOUR_API_KEY"},
files={"user_image": ("selfie.jpg", open("selfie.jpg", "rb"), "image/jpeg")},
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
formData.append("user_image", selfieFile);
formData.append("face_liveness_score_decline_threshold", "80");
const response = await fetch("https://verification.didit.me/v3/passive-liveness/", {
method: "POST",
headers: { "x-api-key": "YOUR_API_KEY" },
body: formData,
The script uploads a biometric face image and optional vendor/session identifier to a third-party service without an explicit runtime warning, consent prompt, or privacy notice. Because face images are highly sensitive personal data, users may disclose biometric information to an external processor without understanding where it is sent or the privacy implications.
No suspicious patterns detected.