Back to skill

Security audit

Ingeniero de datos

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a legitimate data-engineering skill, but its pipeline generator can create executable workflow code from loosely validated configuration, so it needs review before production use.

Install only if you are comfortable reviewing generated pipeline code before deploying it. Do not feed untrusted YAML/JSON into the generator, do not write generated files directly into production scheduler directories, replace sample credentials with secret-managed values, and add confirmations or safeguards around truncate, backfill, rollback, and full-refresh operations.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/pipeline_orchestrator.py:184
Finding

Executable Python Code Injection in Generated Pipeline Artifacts

Content
View full analysis
str: """Generate default_args dictionary.""" return f''' default_args = {{ 'owner': '{config.owner}', 'depends_on_past': False, 'email_on_failure': True, 'email_on_retry': False, 'retries': {config.default_retries}, 'retry_delay': timedelta(minutes=5), }} ''' ``` The same issue affects generated Bash tasks: ```python def _generate_bash_task(self, task: TaskConfig) -> str: """Generate BashOperator task.""" command = task.params.get('command', 'echo "Hello World"') return f''' {task.task_id} = BashOperator( task_id='{task.task_id}', bash_command='{command}', retries={task.retries}, retry_delay=timedelta(minutes={task.retry_delay_minutes}), execution_timeout=timedelta(minutes={task.timeout_minutes}), ) ''' ``` Task names and dependencies are also inserted as Python expressions: ```python def _generate_dependencies(self, config: PipelineConfig) -> str: """Generate task dependencies.""" deps_code = "\n # Task dependencies\n" for task in config.tasks: if task.dependencies: for dep in task.dependencies: deps_code += f" {dep} >> {task.task_id}\n" return deps_code ``` Configuration is loaded and passed to the generators without contextual escaping or strict schema validation. Generated output is written even when validation reports problems: ```python if args.config: with open(args.config) as f: if HAS_YAML: config_data = yaml.safe_load(f) else: config_data ...[truncated 3353 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
references/dataops_best_practices.md:740
Finding

Unpinned Third-Party Dependencies in CI/CD and Workflow Guidance

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (24)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The bulk-ingestion example embeds AWS access key material in SQL and performs unconditional table truncation on overwrite. This combines credential-exposure risk with a destructive operation that could cause data loss if copied into a real pipeline, especially given the skill's audience is likely to operationalize these examples in production systems.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill instructs the agent to read multiple local reference files and execute local Python scripts, which implies file read/write-capable behavior, but it does not declare any explicit tool scope such as permissions or allowed-tools. This creates an authorization ambiguity where an agent or runtime may grant broader filesystem access than the skill actually needs, increasing the chance of unintended file access or modification if the skill is invoked in a permissive environment.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file contains guidance to perform destructive operations such as deleting target rows before insert and later includes overwrite/truncate patterns, but the surrounding prose does not warn readers about potential data loss or the need for safeguards. For markdown files, safety-affecting behaviors should be accompanied by explicit warnings when they can affect user data or system integrity.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The CDC connector example includes a plaintext database password directly in documentation. Even if presented as a sample value, normalizing inline secrets encourages insecure credential handling and can lead users to hardcode real credentials in config files, source control, or deployment artifacts.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · references/dataops_best_practices.md (reported line 819)May include surrounding context.

md
- name: Notify on success
        if: success()
        run: |
          curl -X POST ${{ secrets.SLACK_WEBHOOK }} \
            -H 'Content-type: application/json' \
            -d '{"text":"dbt production deployment successful!"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · references/dataops_best_practices.md (reported line 826)May include surrounding context.

  • name: Notify on failure if: failure() run: | curl -X POST ${{ secrets.SLACK_WEBHOOK }}
    -H 'Content-type: application/json'
    -d '{"text":"dbt production deployment FAILED!"}'
text

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
60% 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.

Content

Scanner excerpt · references/dataops_best_practices.md (reported line 891)May include surrounding context.

md
set -e

# Download production manifest for state comparison
aws s3 cp s3://dbt-artifacts/prod/manifest.json ./target/prod_manifest.json

# Run only modified models and their downstream dependencies
dbt run \

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
60% 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.

Content

Scanner excerpt · references/dataops_best_practices.md (reported line 907)May include surrounding context.

Upload CI artifacts

dbt docs generate aws s3 sync ./target s3://dbt-artifacts/ci/${GITHUB_SHA}/

text

---

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · references/dataops_best_practices.md (reported line 1215)May include surrounding context.

1. Acknowledge the Alert

bash
# Acknowledge in PagerDuty
curl -X POST https://api.pagerduty.com/incidents/{incident_id}/acknowledge

# Post in #data-incidents Slack channel

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown file includes commands to clear Airflow tasks, backfill pipelines, run dbt full refreshes, and restore prior table versions, all of which can materially alter production data or pipeline state. The surrounding runbook gives procedural steps but does not include explicit cautions about data loss, duplicate processing, rerun side effects, or the need for operator confirmation before executing them.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The markdown instructs writing aggregated user event data to Delta Lake, which can affect user data and privacy, but the workflow description provides no warning about persistence, retention, or handling of event data. For markdown files, this rule applies when the skill description omits warnings about behaviors that could affect user data or system integrity.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

This section directs failed records into a DLQ path, which preserves potentially sensitive event payloads for later analysis, yet the markdown contains no caution that invalid records will be retained separately. In markdown guidance, omission of such a warning is a quality and safety issue when user data may be stored or exposed unexpectedly.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The profiler, report generator, suite generator, and schema generator can write derived artifacts that include sensitive dataset details such as top values, inferred patterns, row statistics, and allowed values. In data-engineering contexts, those outputs may contain PII, secrets, or commercially sensitive values, and the tool does not warn users, redact sensitive fields, or require explicit opt-in before persisting them to disk.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The generated schema field is named and documented elsewhere as pattern, which implies a regex constraint usable by the validator. But col.detected_pattern is just a symbolic label like email or uuid from TypeDetector.detect_pattern, not the actual regex, so the generated schema contradicts the intended meaning of the field and will not behave as documented during later validation.

Content

No source excerpt is available for this finding.

compile() call detected

Medium
Category
Dangerous Code Execution
Confidence
65% confidence
Finding

compile() creates code objects from strings. When combined with exec()/eval(), it enables obfuscated code execution.

Content

Scanner excerpt · scripts/pipeline_orchestrator.py (reported line 339)May include surrounding context.

python
# Try to parse the code
        try:
            compile(code, '<string>', 'exec')
        except SyntaxError as e:
            issues.append(f"Syntax error: {e}")

compile() call detected

Medium
Category
Dangerous Code Execution
Confidence
65% confidence
Finding

compile() creates code objects from strings. When combined with exec()/eval(), it enables obfuscated code execution.

Content

Scanner excerpt · scripts/pipeline_orchestrator.py (reported line 452)May include surrounding context.

python
# Try to parse the code
        try:
            compile(code, '<string>', 'exec')
        except SyntaxError as e:
            issues.append(f"Syntax error: {e}")

compile() call detected

Medium
Category
Dangerous Code Execution
Confidence
65% confidence
Finding

compile() creates code objects from strings. When combined with exec()/eval(), it enables obfuscated code execution.

Content

Scanner excerpt · scripts/pipeline_orchestrator.py (reported line 579)May include surrounding context.

python
# Try to parse the code
        try:
            compile(code, '<string>', 'exec')
        except SyntaxError as e:
            issues.append(f"Syntax error: {e}")

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The docstring on emit_metrics says it will emit Prometheus metrics from the streaming query, and the surrounding code defines PROCESSING_LAG and BATCH_DURATION. However, the implementation only increments RECORDS_PROCESSED and then stops at a comment about parsing offsets, without updating the lag or batch-duration gauges. This is an intent/documentation mismatch rather than merely an incomplete example because the function's stated behavior is broader than what the code actually performs.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest positions the skill around designing and building data pipelines, quality frameworks, and related infrastructure tasks, and this file is documented as a "Data Quality Validator." However, the code also creates new persistent artifacts such as expectation suites and inferred schemas, which goes beyond pure validation/reporting behavior described in the module docstring and usage header.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code path writes a generated report to a user-specified path, but provides no prior warning that the operation will modify the filesystem or overwrite an existing file. For code-file SQP-2, file writes should have some visible disclosure; here the only notice comes after the write succeeds.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The command writes analysis output to a path supplied by the user, but there is no visible warning or confirmation before performing the file write. Although this is not highly risky, SQP-2 for code files calls for user disclosure around file writes when none is present.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This branch writes generated content directly to the specified output path with no pre-write disclosure. A simple post-write completion message does not warn the user beforehand about the filesystem change or possible overwrite.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The code performs a file write to a user-provided output path but does not display any warning or confirmation before modifying the filesystem. Under SQP-2, even benign file writes should have some visible disclosure when otherwise undocumented in-code.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The template command saves generated JSON to a specified file path, but the code only logs after the write completes. There is no advance disclosure that running the command will create or overwrite a file, which fits SQP-2's missing-warning criterion for code-file file writes.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.