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## 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
## 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" ``` 2. 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 ``` 3. Prefer a signed, immutable release artifact. Verify its signature and a hardcoded SHA-256 checksum before extraction or execution. 4. 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`. 5. Where practical, vendor the reviewed source into the Skill package so that the audited files are the files that will be built. 6. 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. 7. 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. 8. 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)

Lp3

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.

External Transmission

Medium
Category
Data Exfiltration
Content
| 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"}'` |
Confidence
60% 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
| 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"}'` |
Confidence
60% 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
| 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"}'` |
Confidence
60% 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
| 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"}'` |
Confidence
60% 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
```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"}}
Confidence
60% 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
`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'
```
Confidence
60% 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
```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)
Confidence
60% 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
-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
Confidence
60% 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
-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
Confidence
60% 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
# → /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}
Confidence
60% 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
# → /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}
Confidence
60% 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
~/.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)
Confidence
60% 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
-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}}'
```
Confidence
60% 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
-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":{}}'
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
| `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 |
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.

Missing User Warnings

Medium
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.

Missing User Warnings

Medium
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.

External Transmission

Medium
Category
Data Exfiltration
Content
```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)
Confidence
60% 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
-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}}'
Confidence
60% 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
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
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.