T09 · Insecure Skill Coding Practices
- Location
references/ui.md:238- Finding
Unauthenticated HTTP UI Testing and Control Interface
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is documentation-only and mostly coherent, but it documents a UI testing HTTP interface that can inspect and control apps without stating access controls or production safeguards.
Install only if you are comfortable using documentation that includes powerful native-app APIs. Treat the Geisterhand UI testing server as test-only unless the Perry project separately proves it is authenticated, loopback-only, and excluded from production builds; also review generated code that uses microphone, clipboard, keychain, child_process, plugins, FFI, or automatic updates for explicit user consent and safe scoping.
references/ui.md:238Unauthenticated HTTP UI Testing and Control Interface
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
min_sdk = 24 target_sdk = 34 keystore = "path/to/keystore" keystore_password = "@keychain/android-keystore" # Keychain reference key_alias = "release"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
min_sdk = 24 target_sdk = 34 keystore = "path/to/keystore" keystore_password = "@keychain/android-keystore" # Keychain reference key_alias = "release"
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
import { openURL, isDarkMode, getDeviceIdiom, getDeviceModel } from 'perry/system'
import { preferencesSet, preferencesGet } from 'perry/system'
import { keychainSave, keychainGet, keychainDelete } from 'perry/system'
import { notificationSend, notificationOnTap } from 'perry/system'
import { audioStart, audioStop, audioGetLevel } from 'perry/system'
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
category = "public.app-category.utilities" minimum_version = "13.0" # macOS deployment target signing_identity = "Developer ID Application: ..." entitlements = "path/to/entitlements.plist"
### [ios]
The example shows an available update being installed immediately after detection, without any user-facing confirmation, staged rollout, or safety prompt. In an auto-update context this can lead to unexpected code changes being applied at runtime and increases the blast radius of any updater compromise or operational mistake, even though the manifest signing and hashing controls reduce tampering risk.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
const res = await fetch('https://api.example.com/data')
const data = await res.json()
The Utilities table includes child_process examples such as execSync('ls') and spawn('cmd', args), which execute system commands and can affect system integrity. The document presents this capability without any cautionary note about command execution, platform effects, or safe handling of untrusted input.
The manifest describes a skill focused on the Perry compiler, Perry project configuration, native UI, system APIs, threading, and related platform features. This file additionally advertises child_process support with execSync and spawn, which enables arbitrary command execution and is not clearly justified by the stated compiler/documentation purpose.
The documentation presents microphone/audio capture APIs without any privacy warning, permission guidance, or notice that user consent is required. In a code-assistant skill, this can normalize silent or careless collection of ambient audio and make downstream generated code more likely to omit disclosure and consent handling.
This markdown file includes a file system example showing writeFile('out.txt', data), which can modify user files, but the surrounding documentation does not mention that examples may write to disk or affect local data. Under the markdown-specific warning criterion, behaviors that can affect user data should be disclosed.
The clipboard API is documented as a simple read/write primitive without warning that writes modify the user's global system clipboard. This can lead generated applications to overwrite user clipboard contents unexpectedly, causing privacy and integrity issues even if the API itself is legitimate.