Back to skill

Security audit

Agent Touch Layer

Security checks for vulnerabilities and agentic risk

Overview

This skill is a real iOS Simulator automation helper, but its install process builds and runs unpinned code from an external GitHub repository.

Install only if you are comfortable building code from the current state of the JordanCoin/Atl GitHub repository. Prefer a pinned, reviewed commit or signed release before running setup, and avoid using it with simulator sessions containing sensitive accounts or cookies unless you intend the agent to inspect and automate them.

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

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/setup.sh:12
Finding

Unpinned Remote Source Is Retrieved, Built, and Executed

Content
View full analysis

Vulnerability Details

File Location: scripts/setup.sh:12-18 and scripts/setup.sh:48-68
Vulnerability Type: Mutable remote payload retrieval and execution
Risk Level: High

The installation metadata also initiates the same unpinned clone at SKILL.md:9-15.

Vulnerable Code

bash
# 0. Clone ATL if needed
if [ ! -d "$ATL_ROOT" ]; then
  echo ""
  echo "0️⃣  Cloning ATL repository..."
  git clone https://github.com/JordanCoin/Atl "$ATL_ROOT"
  echo "   ✅ Cloned to $ATL_ROOT"
fi

The retrieved source is subsequently built and installed:

bash
# 2. Build ATL (if repo exists)
echo ""
echo "2️⃣  Building ATL..."
if [ -d "$ATL_REPO" ]; then
  cd "$ATL_REPO"

  # Build targeting the booted simulator
  xcodebuild -workspace AtlBrowser.xcworkspace \
    -scheme AtlBrowser \
    -destination "id=$UDID" \
    -derivedDataPath /tmp/atl-dd \
    build 2>/dev/null | grep -E "^(Build|Compile|Link|===)" || true

  echo "   ✅ Build complete"

  # 3. Install
  echo ""
  echo "3️⃣  Installing ATL..."
  APP_PATH="/tmp/atl-dd/Build/Products/Debug-iphonesimulator/AtlBrowser.app"
  if [ -d "$APP_PATH" ]; then
    xcrun simctl install "$UDID" "$APP_PATH"
    echo "   ✅ Installed"
  else
    echo "   ⚠️  App not found at $APP_PATH"
    echo "   Try building manually: cd $ATL_REPO && xcodebuild ..."
  fi

The Skill installation metadata contains an equivalent mutable retrieval instruction:

yaml
install:
  - id: "atl-clone"
    kind: "shell"
    command: "git clone https://github.com/JordanCoin/Atl ~/Atl"
    label: "Clone ATL repository"
  - id: "atl-setup"
    kind: "shell"
    command: "~/.openclaw/skills/atl-browser/scripts/setup.sh"
    label: "Build and install ATL to simulator"

Technical Analysis

The setup process clones the mutable default branch of an external GitHub repository. It does not pin a reviewed commit SHA, validate a cryptographic checksum, or verify a signed release or tag before invoking xcodebuild.

Consequ ...[truncated 2552 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin the dependency to a reviewed full commit SHA rather than cloning the current default branch.
bash
ATL_COMMIT="REVIEWED_FULL_COMMIT_SHA"

git clone --no-checkout https://github.com/JordanCoin/Atl "$ATL_ROOT"
git -C "$ATL_ROOT" checkout --detach "$ATL_COMMIT"
  1. Verify the checked-out revision before building and abort on any mismatch.
bash
actual_commit=$(git -C "$ATL_ROOT" rev-parse HEAD)
if [ "$actual_commit" != "$ATL_COMMIT" ]; then
  echo "Unexpected ATL revision: $actual_commit" >&2
  exit 1
fi
  1. Prefer a signed, immutable release artifact. Verify its signature and a hardcoded SHA-256 checksum before extraction or execution.

  2. Review all Xcode build phases, package dependencies, scripts, and generated configuration at the pinned revision. Document the approved revision in both SKILL.md and scripts/setup.sh.

  3. Where practical, vendor the reviewed source into the Skill package so that the audited files are the files that will be built.

  4. Preserve and validate the actual xcodebuild exit status. Do not hide errors with 2>/dev/null and || true. If output filtering is required, inspect PIPESTATUS[0] and terminate when the build fails.

  5. Perform the build in an isolated environment with minimal credentials and filesystem access. Avoid building remote source in a user session containing sensitive development credentials.

  6. Require an explicit update and review process when changing the pinned revision rather than silently consuming upstream changes.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (21)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill declares shell-based installation and setup commands but does not declare any explicit tool scope or permission boundaries. That omission increases the chance an agent can execute powerful local commands without clear user visibility or policy enforcement, especially because setup clones and runs external code.

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 · SKILL.md (reported line 71)May include surrounding context.

md
| Task | Port | Example |
|------|------|---------|
| Browse websites | 9222 | `curl localhost:9222/command -d '{"method":"goto",...}'` |
| Open native app | 9223 | `curl localhost:9223/command -d '{"method":"openApp",...}'` |
| Screenshot (browser) | 9222 | `curl localhost:9222/command -d '{"method":"screenshot"}'` |
| Screenshot (native) | 9223 | `curl localhost:9223/command -d '{"method":"screenshot"}'` |

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 · SKILL.md (reported line 73)May include surrounding context.

md
| Task | Port | Example |
|------|------|---------|
| Browse websites | 9222 | `curl localhost:9222/command -d '{"method":"goto",...}'` |
| Open native app | 9223 | `curl localhost:9223/command -d '{"method":"openApp",...}'` |
| Screenshot (browser) | 9222 | `curl localhost:9222/command -d '{"method":"screenshot"}'` |
| Screenshot (native) | 9223 | `curl localhost:9223/command -d '{"method":"screenshot"}'` |

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 · SKILL.md (reported line 72)May include surrounding context.

md
| Task | Port | Example |
|------|------|---------|
| Browse websites | 9222 | `curl localhost:9222/command -d '{"method":"goto",...}'` |
| Open native app | 9223 | `curl localhost:9223/command -d '{"method":"openApp",...}'` |
| Screenshot (browser) | 9222 | `curl localhost:9222/command -d '{"method":"screenshot"}'` |
| Screenshot (native) | 9223 | `curl localhost:9223/command -d '{"method":"screenshot"}'` |

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 · SKILL.md (reported line 74)May include surrounding context.

md
| Task | Port | Example |
|------|------|---------|
| Browse websites | 9222 | `curl localhost:9222/command -d '{"method":"goto",...}'` |
| Open native app | 9223 | `curl localhost:9223/command -d '{"method":"openApp",...}'` |
| Screenshot (browser) | 9222 | `curl localhost:9222/command -d '{"method":"screenshot"}'` |
| Screenshot (native) | 9223 | `curl localhost:9223/command -d '{"method":"screenshot"}'` |

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 · SKILL.md (reported line 86)May include surrounding context.

bash
# Open an app by bundle ID
curl -s -X POST http://localhost:9223/command \
  -d '{"method":"openApp","params":{"bundleId":"com.apple.Preferences"}}'
# → {"success":true,"result":{"bundleId":"com.apple.Preferences","mode":"native","state":"running"}}

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 · SKILL.md (reported line 121)May include surrounding context.

snapshot returns the accessibility tree — all visible elements with their properties and tap-able references.

bash
curl -s -X POST http://localhost:9223/command \
  -d '{"method":"snapshot","params":{"interactiveOnly":true}}' | jq '.result'

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 · SKILL.md (reported line 183)May include surrounding context.

bash
# Take snapshot first
curl -s -X POST http://localhost:9223/command \
  -d '{"method":"snapshot","params":{"interactiveOnly":true}}'

# Tap element e0 (Wi-Fi cell from example above)

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 · SKILL.md (reported line 242)May include surrounding context.

md
-d '{"method":"snapshot","params":{"interactiveOnly":true}}' | jq '.result.elements[:5]'

# 4. Find and tap Wi-Fi
curl -s -X POST http://localhost:9223/command \
  -d '{"method":"find","params":{"text":"Wi-Fi","action":"tap"}}'

# 5. Wait for navigation

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 · SKILL.md (reported line 253)May include surrounding context.

md
-d '{"method":"screenshot"}' | jq -r '.result.data' | base64 -d > /tmp/wifi-settings.png

# 7. Navigate back (swipe right from left edge)
curl -s -X POST http://localhost:9223/command \
  -d '{"method":"swipe","params":{"direction":"right"}}'

# 8. Close the app

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 · SKILL.md (reported line 311)May include surrounding context.

md
# → /tmp/page.pdf (text-selectable, contains element positions)

# 3. Get specific element's position by mark label
curl -s -X POST http://localhost:9222/command \
  -d '{"id":"3","method":"getMarkInfo","params":{"label":5}}' | jq '.result'
# → {"label":5, "tag":"button", "text":"Add to Cart", "x":187, "y":432, "width":120, "height":44}

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 · SKILL.md (reported line 316)May include surrounding context.

md
# → /tmp/page.pdf (text-selectable, contains element positions)

# 3. Get specific element's position by mark label
curl -s -X POST http://localhost:9222/command \
  -d '{"id":"3","method":"getMarkInfo","params":{"label":5}}' | jq '.result'
# → {"label":5, "tag":"button", "text":"Add to Cart", "x":187, "y":432, "width":120, "height":44}

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 · SKILL.md (reported line 393)May include surrounding context.

md
~/.openclaw/skills/atl-browser/scripts/setup.sh

# 2. Navigate somewhere
curl -s -X POST http://localhost:9222/command \
  -d '{"id":"1","method":"goto","params":{"url":"https://example.com"}}'

# 3. Mark elements (shows [1], [2], [3] labels)

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 · SKILL.md (reported line 405)May include surrounding context.

-d '{"id":"3","method":"screenshot","params":{}}' | jq -r '.result.data' | base64 -d > /tmp/page.png

5. Click element [1]

curl -s -X POST http://localhost:9222/command
-d '{"id":"4","method":"clickMark","params":{"label":1}}'

text

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 · SKILL.md (reported line 444)May include surrounding context.

md
-d '{"id":"3","method":"screenshot","params":{}}' | jq -r '.result.data' | base64 -d > screenshot.png

# Mark interactive elements (shows numbered labels)
curl -s -X POST http://localhost:9222/command \
  -H "Content-Type: application/json" \
  -d '{"id":"4","method":"markElements","params":{}}'

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
85% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

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

md
| `click` | `{selector}` | Browser | Click element |
| `doubleClick` | `{selector}` | Browser | Double-click |
| `type` | `{text}` | Both | Type text |
| `fill` | `{selector, value}` | Browser | Fill input field |
| `press` | `{key}` | Both | Press key |
| `hover` | `{selector}` | Browser | Hover over element |
| `scrollIntoView` | `{selector}` | Browser | Scroll to element |

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill exposes raw JavaScript execution and DOM snapshot capabilities without warning that they can inspect page contents, scrape sensitive data, or manipulate site behavior beyond ordinary clicking and typing. Because this runs in a browser context, it can access visible page data and potentially automate actions in authenticated sessions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documented cookie methods allow reading, setting, and deleting browser cookies, which can expose authenticated session material or alter browser state in ways users may not expect. In a browser automation skill, this is particularly sensitive because cookies can grant access to logged-in accounts and cross-site workflows.

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 · SKILL.md (reported line 605)May include surrounding context.

bash
# Swipe up (scroll down)
curl -s -X POST http://localhost:9222/command \
  -d '{"id":"1","method":"swipe","params":{"direction":"up"}}'

# Swipe left (next page in carousel)

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 · SKILL.md (reported line 650)May include surrounding context.

md
-d '{"id":"4","method":"screenshot","params":{}}' | jq -r '.result.data' | base64 -d > /tmp/page.png

# 5. Click a marked element (e.g., label 14)
curl -s -X POST http://localhost:9222/command \
  -H "Content-Type: application/json" \
  -d '{"id":"5","method":"clickMark","params":{"label":14}}'

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 · SKILL.md (reported line 734)May include surrounding context.

Marks give page-relative coordinates. For tap to work, the element must be visible.

bash
# Option A: Scroll element into view first
curl -s -X POST http://localhost:9222/command -H "Content-Type: application/json" \
  -d '{"id":"1","method":"evaluate","params":{"script":"document.querySelector(\"#my-button\").scrollIntoView()"}}'

# Option B: Get viewport-relative coords via JS

Static analysis

No suspicious patterns detected.