T09 · Insecure Skill Coding Practices
- Location
scripts/kuro_login.py:237- Finding
Authentication Token and Personal Account Data Stored and Exposed in Plaintext
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its stated Kuro BBS wiki and account-assistant purpose, but it needs review because it stores and can print login tokens in plaintext and uses browser automation to bypass site protections for post media.
Install only if you are comfortable with a game helper handling your Kuro BBS login token and storing account data locally. Avoid using my account unless you intend to expose the raw token in logs, consider deleting ~/.kurobbs-wiki-cache after use, use pinned dependencies in a virtual environment, and treat the post-media feature as browser-based scraping that may contact additional services.
scripts/kuro_login.py:237Authentication Token and Personal Account Data Stored and Exposed in Plaintext
README.en.md:50Unpinned Playwright Package and Browser Binary Installation
scripts/kuro_login.py:323Undisclosed Public-IP Requests to Third-Party Services
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
## 🔄 更新流程(skill 改版后)
1. 在 `skills/kurobbs-wiki/` 里改源文件(走 self-modify)
2. 复制改动的文件到 `temp/_kurobbs_release/`
3. `git add -A && git commit && git push origin main`
4. 各市场会自动抓取 GitHub 更新(ClawHub 等需手动重传的另说)
The documented capabilities extend beyond lookup into profiling, pair scoring, team enumeration, guide-pool inference, protected-post scraping, media download, and detailed account-state retrieval. This overbreadth undermines informed consent and makes it easier for an agent to invoke data-processing and local-storage behaviors the user did not reasonably expect from the stated purpose.
The documented capabilities extend beyond lookup into profiling, pair scoring, team enumeration, guide-pool inference, protected-post scraping, media download, and detailed account-state retrieval. This overbreadth undermines informed consent and makes it easier for an agent to invoke data-processing and local-storage behaviors the user did not reasonably expect from the stated purpose.
The documented capabilities extend beyond lookup into profiling, pair scoring, team enumeration, guide-pool inference, protected-post scraping, media download, and detailed account-state retrieval. This overbreadth undermines informed consent and makes it easier for an agent to invoke data-processing and local-storage behaviors the user did not reasonably expect from the stated purpose.
Referenced artifact was not completely inspected
- `scripts/wikiquery.py` — 查询 CLI(tree / map / list / detail / search / post),纯标准库实现,无第三方依赖(`post` 子命令例外:内部调用 `post_fetch.py`,依赖 playwright)。
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
URL_GET_SMS_CODE_H5 = BASE + "/user/getSmsCodeForH5" # 发短信验证码(需极验 geeTestData)
URL_SDK_LOGIN = BASE + "/user/sdkLogin" # 验证码登录 → token
URL_ACCOUNT_SEEK_ROLE = BASE + "/gamer/role/list" # 用 token 拿绑定的角色列表
URL_ROLE_ACCESS_TOKEN = BASE + "/aki/roleBox/requestToken" # 换 B-At access token
URL_ROLE_DATA = BASE + "/aki/roleBox/akiBox/roleData" # 拿拥有角色详情(需 B-At + multipart)
PARAM_SERVER_ID = "76402e5b20be2c39f095a152090afddc" # ApiConfig.PARAM_SERVER_ID
The code explicitly describes using Playwright/browser automation to bypass an Aliyun WAF and retrieve protected post details. A deliberate WAF-bypass capability is risky because it expands the skill from normal API usage into anti-protection circumvention, which can enable access patterns and automation beyond the user's stated wiki-query needs.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
Detected: suspicious.dynamic_code_execution