T09 · Insecure Skill Coding Practices
- Location
scripts/auto_publisher.py:37- Finding
Account Configuration Supports Plaintext Credential Storage
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its auto-publishing purpose, but it can post publicly to multiple social accounts and keeps account/log data locally without enough safeguards or confirmation controls.
Review before installing. Use it only with accounts where automated posting is acceptable, start with one platform in a visible browser, avoid putting real passwords in config/accounts.json, protect or delete local config and publish_log.json files, and treat any saved browser sessions or cookies as account credentials.
scripts/auto_publisher.py:37Account Configuration Supports Plaintext Credential Storage
The core declared purpose of multi-platform video publishing is mostly accurate: the script automates browser-based login and posting to Douyin, WeChat Channels, Xiaohongshu, Bilibili, and YouTube. However, several advertised capabilities are not actually implemented. There is no scheduling logic, no queue or delayed publishing flow, and no batch processing over multiple videos. The 'auto-caption generation' is limited to choosing from a few hardcoded text templates based on filename/topic, which is materially weaker than typical caption generation. 'Hashtag optimization' is likewise overstated, since the code only creates a small static list of generic tags rather than optimizing them. Therefore the description overstates important capabilities relative to the supplied code.
The README explicitly says login cookies are saved for reuse, but it does not warn that cookies are active session credentials that can allow account takeover if copied from disk. In the context of a multi-platform auto-publisher handling creator accounts across several services, stored browser/session cookies are especially sensitive because compromise could grant broad access to posting capabilities and account data.
The skill advertises automation that reads and writes local files, but it does not declare any tool scope or permissions boundaries in the skill manifest. This creates an avoidable transparency and trust problem: users and hosting systems cannot clearly assess or constrain filesystem access before use, increasing the chance of unintended exposure or modification of local data.
The documentation says local account configuration and publish-log files are created automatically, but it does not clearly foreground that authentication/session material and activity history will be persisted on disk. In a tool handling social-media accounts, local storage of cookies or session state can expose account access and sensitive operational history if the files are read by other users, malware, backups, or synced services.
The script proceeds directly from parsed CLI arguments into automated publishing across one or more live social-media platforms without a final confirmation, dry-run, or explicit warning that posting is irreversible. In the context of a mass auto-publisher, this increases the likelihood of accidental public disclosure, brand damage, or distribution of the wrong content at scale.
The README notes that publish records are stored in publish_log.json but does not warn that those logs may contain sensitive operational metadata such as filenames, posting times, target platforms, titles, and tags. While this is less severe than credential exposure, such logs can still leak business activity, content schedules, and account usage patterns if accessed by other users or malware.
Most of the substantive usage instructions, feature descriptions, trigger phrases, and security notes are presented only in Chinese, despite a partially bilingual heading. This can be a natural-language policy issue if organizational policy requires not forcing a specific language or locale without user opt-in.
The file's user-facing description and operational prompts are presented in Chinese, framing the tool as a Chinese-language assistant without any indication of alternate language support or user choice. Under the stated policy, forcing a specific language without opt-in is a natural-language policy concern.
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
print(f"{'='*60}")
# 登录
login_func = getattr(self, f'login_{platform}', None)
if login_func:
if not login_func():
self.results[platform] = False
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
continue
# 发布
publish_func = getattr(self, f'publish_{platform}', None)
if publish_func:
success = publish_func(str(video_path), title, tags)
self.results[platform] = success
No suspicious patterns detected.