Back to skill

Security audit

Didit Aml Screening

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent Didit AML screening skill, but it needs review because it sends highly sensitive identity data to a third party and provides limited user control over retention, monitoring, and output exposure.

Install only if you are prepared to send AML subject data to Didit and have the required consent or legal basis. Avoid running the helper in logged CI or shared agent sessions unless output is redacted, and prefer adding explicit controls for `save_api_request`, continuous monitoring, and full-response output before routine use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/screen_aml.py:34
Finding

Sensitive AML identity data may be retained by the remote provider without explicit opt-in

Content
View full analysis
dict: api_key = get_api_key() payload = {"full_name": full_name, "entity_type": entity_type} if date_of_birth: payload["date_of_birth"] = date_of_birth if nationality: payload["nationality"] = nationality if document_number: payload["document_number"] = document_number if threshold is not None: payload["aml_match_score_threshold"] = threshold if vendor_data: payload["vendor_data"] = vendor_data r = requests.post(ENDPOINT, headers={"x-api-key": api_key, "Content-Type": "application/json"}, json=payload, timeout=60) ``` The documented API behavior is: ```text save_api_request | boolean | No | true | Save in Business Console ``` ### Technical Analysis The script legitimately needs to send the screening subject's identity data to the declared Didit AML endpoint. However, it does not set the API's `save_api_request` field and provides no command-line control for it. According to `SKILL.md`, the service defaults this option to `true`. Consequently, names, dates of birth, nationalities, document numbers, and tracking identifiers may be stored in the provider's Business Console even when the user only intends to conduct a one-time screening. Date-of-birth and government-document information are particularly sensitive personal data. The transmission itself is not covert exfiltration: it uses HTTPS, targets the documented service, and is central to the Skill's declared purpose. ...[truncated 1528 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/screen_aml.py:69
Finding

Complete AML response containing sensitive identity and compliance data is printed to standard output

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:297
Finding

Documentation instructs users to install an unpinned third-party dependency

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Tainted flow: 'api_key' from os.environ.get (line 27, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/screen_aml.py (reported line 49)May include surrounding context.

python
payload["aml_match_score_threshold"] = threshold
    if vendor_data:
        payload["vendor_data"] = vendor_data
    r = requests.post(ENDPOINT,
                      headers={"x-api-key": api_key, "Content-Type": "application/json"},
                      json=payload, timeout=60)
    if r.status_code not in (200, 201):

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill declares environment and network capabilities via metadata/examples but does not explicitly constrain them with a tool/permission scope. In an agent setting, that can lead to overbroad execution privileges and makes it harder for hosts or reviewers to enforce least privilege.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation describes sending highly sensitive personal data such as full name, date of birth, nationality, and document number to a third-party AML provider, but it does not prominently warn about privacy, compliance, or data handling implications. Users or agents may disclose regulated PII without informed consent or appropriate legal basis.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill is presented as an AML screening integration, but the documentation also includes account registration, email verification, and billing top-up flows. Expanding instructions beyond the advertised scope increases the chance an agent performs unintended account lifecycle or payment actions, which are higher risk than read-only screening.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This example performs an outbound POST request to a third-party AML endpoint and includes sensitive identity fields in the request body. In context, external transmission is expected for the feature, but it is still security-relevant because it exports PII to an external service and depends on correct consent, scoping, and secret handling.

Content

Scanner excerpt · SKILL.md (reported line 97)May include surrounding context.

python
import requests

response = requests.post(
    "https://verification.didit.me/v3/aml/",
    headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This example performs an outbound POST request to a third-party AML endpoint and includes sensitive identity fields in the request body. In context, external transmission is expected for the feature, but it is still security-relevant because it exports PII to an external service and depends on correct consent, scoping, and secret handling.

Content

Scanner excerpt · SKILL.md (reported line 97)May include surrounding context.

python
import requests

response = requests.post(
    "https://verification.didit.me/v3/aml/",
    headers={"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"},
    json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

This TypeScript example also sends AML screening data to a third-party endpoint over the network. While aligned with the skill's purpose, it still creates real exposure of sensitive personal data and normalizes outbound transmission without an adjacent privacy and consent warning.

Content

Scanner excerpt · SKILL.md (reported line 112)May include surrounding context.

text

```typescript
const response = await fetch("https://verification.didit.me/v3/aml/", {
  method: "POST",
  headers: { "x-api-key": "YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The continuous monitoring section states that screened sessions are automatically re-screened and may trigger webhook notifications, but it does not clearly warn that processing is ongoing after the initial request. That can create hidden persistence of surveillance and continued third-party data processing beyond the user's immediate expectation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/screen_aml.py (reported line 49)May include surrounding context.

python
payload["aml_match_score_threshold"] = threshold
    if vendor_data:
        payload["vendor_data"] = vendor_data
    r = requests.post(ENDPOINT,
                      headers={"x-api-key": api_key, "Content-Type": "application/json"},
                      json=payload, timeout=60)
    if r.status_code not in (200, 201):

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script sends sensitive personal data such as full name, date of birth, nationality, and document number to a third-party AML screening provider without any explicit consent prompt, warning, or minimization guardrail in the user flow. In a compliance/KYC context this transfer may be expected, but the lack of clear notice and data-handling constraints increases privacy, legal, and misuse risk.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.