Back to skill

Security audit

Airtable Participants

Security checks for vulnerabilities and agentic risk

Overview

This skill has a legitimate Airtable participant-management purpose, but it handles sensitive contact and donation data and instructs agents to persist detailed PII change logs outside Airtable.

Install only if Austin and the workspace are authorized to access this Airtable participant data. Before using it for record changes, revise the logging rule to avoid names, emails, phone numbers, and old/new sensitive values; prefer record IDs, field names, approval timestamps, and short retention in an access-controlled location. Also keep AIRTABLE_API_KEY out of shared memory or logs, and use recipient lists only for consented outreach with unsubscribe handling.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:101
Finding
Persistent Plaintext Logging of Participant PII## Vulnerability Details **File Location**: `SKILL.md`, lines 101–105 **Vulnerability Type**: Persistent storage of sensitive personal data in plaintext logs **Risk Level**: Medium ```markdown ## Record Modification (Requires Austin Approval) When Austin instructs a record change (e.g., marking someone unsubscribed, updating last_contact): 1. Confirm the specific change with Austin before executing 2. Execute the PATCH request 3. Log the change in memory/logs/crm-writes/YYYY-MM-DD.md with: record name/email, field changed, old value, new value, Austin's instruction timestamp ``` ### Technical Analysis The Skill requires every approved record modification to be logged in a persistent Markdown file. The required log entry includes the participant's name or email address and the old and new field values. These values may contain sensitive information, including subscription, attendance, contact, or donation status. This duplicates personal data outside Airtable and its associated access controls. The instruction does not establish file permissions, encryption, redaction, access restrictions, retention limits, or secure deletion procedures. It therefore increases the number of locations where participant data is retained and broadens the potential exposure surface. The detailed identity and field values are not necessary for a minimal operational audit trail. An Airtable record identifier, field name, operation result, authorization reference, and timestamp would normally provide traceability without duplicating direct identifiers and sensitive values. ### Attack Path 1. An authorized user requests a participant record modification. 2. The Skill reads the participant's existing record and processes the requested update. 3. After issuing the Airtable PATCH request, the Skill writes the participant's name or email address and old and new field values to `memory/logs/crm-writes/YYYY-MM-DD.md`. 4. The plaintext log persists ...[truncated 1027 chars]
Remediation
## Remediation Suggestions 1. Replace participant names and email addresses with the Airtable record ID or a non-reversible internal audit identifier. 2. Do not record old or new values unless they are strictly required for a documented compliance purpose. Prefer recording only the field name, operation type, result, timestamp, and approval reference. 3. Redact or classify sensitive fields such as email, phone number, donation status, attendance, and subscription status before logging. 4. Store audit records in a dedicated access-controlled location rather than general-purpose agent memory. 5. Apply restrictive file permissions so only the service identity responsible for auditing can read or write the logs. 6. Encrypt audit records at rest where detailed values must be retained. 7. Define a retention period and automatically delete expired records through a documented secure-deletion process. 8. Prevent logs from being included in source control, broad workspace synchronization, or unrelated backups. 9. Add an explicit rule prohibiting authentication credentials, API responses, phone numbers, and full record contents from being written to audit logs. 10. Document who may access the audit trail and periodically review that access.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (7)

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill is explicitly designed to access participant PII and generate recipient lists for email and SMS, but it does not present any user-facing privacy, consent, or data-minimization warning in the description. In context, this increases the chance of inappropriate disclosure or use of sensitive contact data by downstream users or skills, especially because the skill is positioned as an authoritative source for outreach operations.

External Transmission

Medium
Category
Data Exfiltration
Content
### Get all active participants (for newsletter sends)
```bash
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?filterByFormula={retreat_status}='active'&fields[]=name&fields[]=email" \
  -H "Authorization: Bearer $AIRTABLE_API_KEY" | jq '.records[].fields'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Get all active participants (for newsletter sends)
```bash
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?filterByFormula={retreat_status}='active'&fields[]=name&fields[]=email" \
  -H "Authorization: Bearer $AIRTABLE_API_KEY" | jq '.records[].fields'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Get all active participants (for newsletter sends)
```bash
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?filterByFormula={retreat_status}='active'&fields[]=name&fields[]=email" \
  -H "Authorization: Bearer $AIRTABLE_API_KEY" | jq '.records[].fields'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Get all active participants (for newsletter sends)
```bash
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?filterByFormula={retreat_status}='active'&fields[]=name&fields[]=email" \
  -H "Authorization: Bearer $AIRTABLE_API_KEY" | jq '.records[].fields'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Get all active participants (for newsletter sends)
```bash
curl -s "https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}?filterByFormula={retreat_status}='active'&fields[]=name&fields[]=email" \
  -H "Authorization: Bearer $AIRTABLE_API_KEY" | jq '.records[].fields'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Low
Confidence
75% confidence
Finding
The setup instructions direct operators to copy confirmed Airtable identifiers into TOOLS.md and MEMORY.md without clarifying whether those files are access-controlled, persistent, or shared with other skills. While base IDs and table names are not secrets like API keys, storing operational metadata in broad memory surfaces can widen the blast radius for later misuse or accidental disclosure.

Static analysis

No suspicious patterns detected.