Back to skill

Security audit

Airtable Cli

Security checks for vulnerabilities and agentic risk

Overview

This Airtable CLI is mostly purpose-aligned, but its install instructions fetch executable code from an unpinned GitHub branch and the tool can delete or bulk-change Airtable records without built-in safeguards.

Install only from the packaged audited file or a pinned, verified release rather than the raw main-branch curl command. Use a least-privilege Airtable token, test against non-production bases first, and manually verify base IDs, table names, record IDs, and merge keys before running delete, batch-delete, or upsert commands.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (2)

T03 · Remote Payload Retrieval and Execution

Warning
Location
SKILL.md:32
Finding

Mutable Remote Python Payload Download in Skill Installation Instructions

Content
View full analysis
Remediation
View remediation
/airtable_cli.py echo " airtable_cli.py" | sha256sum --check - ``` 6. Advise users to grant the Airtable token only the minimum scopes and base access required for the intended operation. ]]>

T03 · Remote Payload Retrieval and Execution

Warning
Location
README.md:34
Finding

Mutable Remote Python Payload Download in README Installation Instructions

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (15)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · airtable_cli.py (reported line 23)May include surrounding context.

python
version          Show version info

Environment:
  AIRTABLE_API_KEY   Required. Personal Access Token (pat...) or legacy API key.

Stdlib only — no pip install required.
"""

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · airtable_cli.py (reported line 88)May include surrounding context.

python
version          Show version info

Environment:
  AIRTABLE_API_KEY   Required. Personal Access Token (pat...) or legacy API key.

Stdlib only — no pip install required.
"""

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · airtable_cli.py (reported line 753)May include surrounding context.

python
version          Show version info

Environment:
  AIRTABLE_API_KEY   Required. Personal Access Token (pat...) or legacy API key.

Stdlib only — no pip install required.
"""

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This markdown file advertises "CRUD records with batch create/delete," which includes destructive deletion of Airtable data, but it does not include any caution about irreversible changes or the need to verify the target base/table first. Under the markdown-specific warning criterion, omitting a warning for destructive behavior that can affect user data is a safety gap.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The markdown advertises "CRUD records with batch create/delete," which includes irreversible data deletion, but the skill description provides no warning about potential data loss or the need to confirm targets before deleting. For a markdown file, destructive operations that can affect user data should be accompanied by an explicit warning.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The feature list states "Export/import CSV" and elsewhere mentions batch create/upsert from CSV, but the documentation does not warn that bulk import or upsert operations may change many records at once or overwrite existing data based on merge keys. In markdown descriptions, bulk data-modifying behavior should be disclosed because it can materially affect user data integrity.

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 · airtable_cli.py (reported line 41)May include surrounding context.

python
__version__ = "1.1.0"
VERSION_STRING = f"airtable-cli v{__version__} (Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro})"

API_BASE = "https://api.airtable.com/v0"
META_BASE = "https://api.airtable.com/v0/meta"

# ── ANSI helpers ──────────────────────────────────────────────────────

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 · airtable_cli.py (reported line 42)May include surrounding context.

python
__version__ = "1.1.0"
VERSION_STRING = f"airtable-cli v{__version__} (Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro})"

API_BASE = "https://api.airtable.com/v0"
META_BASE = "https://api.airtable.com/v0/meta"

# ── ANSI helpers ──────────────────────────────────────────────────────

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The CLI exposes single and batch record deletion operations that execute immediately with no confirmation prompt, dry-run mode, or explicit irreversible-action safeguard. In a command-line tool capable of bulk deletion, a mistyped table, base, or record ID can cause accidental data loss, which is especially risky in an agent or automation context where commands may be generated or executed non-interactively.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
96% confidence
Finding

This helper executes an arbitrary Python file discovered in the target product directory by invoking it with a self-test argument. In a CI or local verification context, that means untrusted repository code is run merely to validate the product, enabling arbitrary code execution with the permissions of the verifier.

Content

Scanner excerpt · ci/verify_product.py (reported line 37)May include surrounding context.

python
def has_self_test(fp):
    r = subprocess.run([sys.executable, fp, "self-test"], capture_output=True, text=True, timeout=30)
    return r.returncode == 0 and "PASS" in r.stdout

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The tool automatically runs discovered product code for self-testing without clearly warning the user that local repository code will be executed. That increases the chance of accidental execution of malicious code, especially in workflows where users expect a validator to be read-only.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · ci/verify_product.py (reported line 67)May include surrounding context.

python
all_ok &= axis(False, "frontmatter (no SKILL.md)")
        all_ok &= axis(False, "docs (no SKILL.md)")
    # 3 compiles
    comp_ok = all(subprocess.run([sys.executable, "-m", "py_compile", fp],
                                capture_output=True).returncode == 0 for fp in files)
    all_ok &= axis(comp_ok, "compiles (py_compile all .py)")
    # 4 self-test (any of 3 valid forms)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The verifier also auto-executes discovered test files with no explicit disclosure or consent step. In the context of a skill verification harness, this makes the behavior more dangerous because users may run it against untrusted submissions in CI, where silent code execution is especially risky.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
97% confidence
Finding

This logic executes any test_*.py or *_test.py files found in the target folder. Because those test files are repository-controlled and may be attacker-supplied, verifying a product can trigger arbitrary code execution in CI or on a developer machine.

Content

Scanner excerpt · ci/verify_product.py (reported line 79)May include surrounding context.

python
tests = [os.path.join(folder, f) for f in os.listdir(folder)
                 if (f.startswith("test_") or f.endswith("_test.py")) and f.endswith(".py")]
        if tests:
            st_ok = all(subprocess.run([sys.executable, t], capture_output=True, text=True,
                                      timeout=30).returncode == 0 for t in tests)
            st_note = f"{len(tests)} test_*.py"
        elif re.search(r"(?im)^test\s*:", skill_txt):

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · ci/verify_product.py (reported line 92)May include surrounding context.

python
# 7 deploy-ready
    ci = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ci_check.py")
    if os.path.isfile(ci) and os.path.isfile(skill):
        r = subprocess.run([sys.executable, ci], cwd=folder, capture_output=True, text=True)
        all_ok &= axis(r.returncode == 0, "deploy-ready (ci/ci_check.py PASS)")
    else:
        all_ok &= axis(True, "deploy-ready (skipped)")

Static analysis

No suspicious patterns detected.