T09 · Insecure Skill Coding Practices
- Location
SKILL.md:94- Finding
Unauthenticated Network-Exposed Device Control Interface
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md:94-96; supporting operational details inreferences/get-the-code.md:62-65,references/build-and-install.md:159-166, andreferences/debug-loop.md:69-102
Vulnerability Type: Unauthenticated remote access to privileged Android device-control functions
Risk Level: HighRelevant snippets:
text - The debug WebSocket server binds `0.0.0.0:9008` and does not authenticate clients. That is a known limitation written down in `SECURITY.md`. Say so before telling anyone to run this on a network they do not control.text `ScreenBodyService` runs a WebSocket server **on the device**, port **9008**, exposing every tool the brain can call.text | `screen.*` | `screen.ui_tree`, `screen.screenshot`, `screen.tap`, `screen.tap_id`, `screen.type`, `screen.submit_input`, `screen.swipe`, `screen.global` | | `device.*` | `device.battery`, `device.apps`, `device.permissions`, `device.launch`, `device.notifications` |Technical Analysis
The documented workflow starts a WebSocket service on all network interfaces at TCP port 9008 after the user enables Andee's Accessibility service. The Skill explicitly states that this service does not authenticate clients and exposes the tools available to the agent.
Consequently, a network peer that can reach the device can submit WebSocket JSON requests without proving authorization. The documented protocol permits the caller to select a method and supply its parameters:
json {"type":"request","id":"1","method":"device.battery","params":{}}The interface includes privileged operations such as reading the UI tree, taking screenshots, tapping, typing, issuing global screen actions, launching applications, and accessing notifications. These operations cross a material trust boundary: an unauthenticated network client gains access to functionality backed by the victim-approved Android Acce ...[truncated 1592 chars]
- Remediation
View remediation
Remediation Suggestions
- Bind the debug WebSocket service to loopback by default rather than
0.0.0.0, and access it throughadb forwardduring local development. - If direct network access is required, use encrypted transport and mutually authenticated, per-device sessions.
- Reject unauthenticated requests before method lookup or dispatch.
- Add an explicit, disabled-by-default user setting for network debugging and visibly indicate when the server is active.
- Apply method-level authorization and separate read-only diagnostics from state-changing or sensitive operations.
- Rotate or revoke credentials when debugging is disabled, and rate-limit failed authentication attempts.
- Restrict network exposure with platform network-security controls or firewall rules and document the exact trusted-network assumptions.
- Add tests confirming that unauthenticated clients cannot invoke any dispatcher method.
- Bind the debug WebSocket service to loopback by default rather than
