T09 · Insecure Skill Coding Practices
- Location
server.py:312- Finding
Message Transmission Bypasses the Documented Confirmation Gate
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real WeChat automation tool, but it can send messages from the active chat without enforced confirmation and leaves sensitive screenshots on disk.
Install only if you are comfortable with a local automation tool that can type into and send from your active WeChat window. Use it only with an already verified chat visible, review the message manually before allowing any tool call, and remove or redesign the screenshot-writing and confirmation behavior before using it with sensitive contacts or messages.
server.py:312Message Transmission Bypasses the Documented Confirmation Gate
server.py:8Global GUI Automation Disables the Emergency Abort and Fails Open on Activation Errors
server.py:67Sensitive WeChat Content Is Persisted in Plaintext Screenshot Files
requirements.txt:1Unbounded Dependency Versions Permit Unreviewed Future Releases
The skill’s declared purpose is narrowly framed as sending WeChat messages, but the documentation also describes screenshot capture of the WeChat window and exposes a status/introspection capability about the local app window. That mismatch is security-relevant because users or higher-level agents may grant or invoke the skill assuming a limited send-only scope, while it can also collect UI data and operate on the currently focused chat, increasing the chance of privacy leakage or sending to the wrong recipient.
The skill captures screenshots of WeChat windows and later saves multiple images of chats, search results, and typed content to disk, which can expose private conversations, contact lists, and message contents beyond what is needed to send a message. Persisting this data creates a confidentiality risk because other local users, malware, backups, or logs may access the images.
The tool directly performs GUI automation to input and send messages with no user confirmation, recipient verification, or final review step. In an agent setting this is especially risky because accidental, malicious, or misrouted tool invocations can immediately transmit content to real contacts.
The file's natural-language docstrings, tool descriptions, status/error messages, and UI assumptions are entirely in Chinese, with no opt-in or alternative locale support. Under the policy, forcing a specific language without user choice is a natural-language locale violation unless clearly justified as region-specific.
Writing screenshots of chat/search windows to disk without clear disclosure unnecessarily persists sensitive UI content, including contacts and messages. Even if intended for debugging, undisclosed local storage of such artifacts expands the data exposure surface and can leak private information long after the operation completes.
The code copies the provided message into the system clipboard without disclosure, which can overwrite the user's clipboard and expose sensitive message contents to other applications, clipboard history, remote desktop sync, or OS-level telemetry. Clipboard-based automation is common, but doing it silently with potentially sensitive content is a privacy and integrity issue.
The exposed tool interface advertises message sending but only operates on the currently focused/open chat window, while the skill description claims it can send to a specified contact. This mismatch creates a dangerous integrity flaw: an agent or user may believe the recipient is controlled when in reality the automation can send to whichever conversation is active, causing misdelivery of sensitive or harmful messages.
The dependency is specified with a lower bound only, so builds may resolve to different versions over time, including versions with newly introduced regressions or vulnerable transitive combinations. In a skill that automates a desktop messaging client, supply-chain integrity matters because compromised packages could gain the same local-user capabilities as the automation process.
pyautogui>=0.9.54
pygetwindow>=0.0.9
pytesseract>=0.3.13
Pillow>=12.1.0
Using an unpinned pygetwindow version makes installation non-reproducible and can silently pull in future releases with security or stability issues. Because this skill interacts with desktop windows on Windows, any compromised dependency could help manipulate UI state or observe user context under the current user's privileges.
pyautogui>=0.9.54
pygetwindow>=0.0.9
pytesseract>=0.3.13
Pillow>=12.1.0
pyperclip>=1.11.0
An unpinned pytesseract dependency allows different environments to install different versions, weakening reproducibility and making it hard to verify whether known issues are fixed. In this skill, OCR is part of desktop automation, so dependency compromise could influence what is read from screen content or how the host process behaves.
pyautogui>=0.9.54
pygetwindow>=0.0.9
pytesseract>=0.3.13
Pillow>=12.1.0
pyperclip>=1.11.0
opencv-python>=4.13.0
Pillow is unpinned despite having a history of security advisories, so the manifest does not guarantee installation of a non-vulnerable release. Given this skill also processes screenshots/images for automation, an affected imaging library could expose the host to image parsing flaws such as denial of service or, in some versions, more serious memory-safety issues.
pyautogui>=0.9.54
pygetwindow>=0.0.9
pytesseract>=0.3.13
Pillow>=12.1.0
pyperclip>=1.11.0
opencv-python>=4.13.0
Pillow has known advisories, and because the dependency is not pinned, it is impossible to determine from this manifest whether deployment will use a patched or vulnerable release. This is more relevant in this skill than in a generic app because image handling is core to desktop automation, increasing the chance that vulnerable parsing paths are reachable.
An unpinned pyperclip version creates a supply-chain and reproducibility risk because future package releases may alter behavior or introduce vulnerabilities without any manifest change. In a messaging automation skill, clipboard access is sensitive because manipulated or malicious package behavior could expose or tamper with copied content.
pygetwindow>=0.0.9
pytesseract>=0.3.13
Pillow>=12.1.0
pyperclip>=1.11.0
opencv-python>=4.13.0
opencv-python is unpinned even though the package ecosystem around image parsing and native bindings has had multiple advisories. Since this skill likely uses OpenCV for screen/image analysis in a local desktop context, installing an unsafe version could expose the host to crashes, resource exhaustion, or native-code vulnerabilities when processing image data.
pytesseract>=0.3.13
Pillow>=12.1.0
pyperclip>=1.11.0
opencv-python>=4.13.0
opencv-python has multiple known advisories, and the lack of an exact version means the security posture of the installed package cannot be verified from the manifest. Because OpenCV includes native code and is likely exercised by screenshot/image analysis features in this skill, unresolved version ambiguity increases the risk of exposing the host to known vulnerable code paths.
No suspicious patterns detected.