T05 · Unauthorized Access and Privilege Escalation
- Location
SKILL.md:38- Finding
Frontend Session Token Exceeds the Skill's Read-Only Privilege Requirements
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to be a real Bunpro sync/reporting tool, but it asks users to handle a live browser session token with broader and under-disclosed account access risk.
Review this before installing if you are not comfortable extracting and giving a local script your Bunpro browser session token. Prefer using an environment variable rather than --token, avoid running it on shared or logged systems, store the database in a private directory, and treat the token as account access until it expires or the session is revoked.
SKILL.md:38Frontend Session Token Exceeds the Skill's Read-Only Privilege Requirements
scripts/sync.py:392Frontend Session Token Can Be Exposed Through Command-Line Arguments
scripts/sync.py:392Environment Variable Name Mismatch Breaks the Advertised Secure Credential Path
The declared description says the skill syncs Bunpro progress from the API to local storage. However, the supplied code only opens an existing local SQLite database and runs read-only queries to display reports. It explicitly errors if the database does not already exist and tells the user to run sync.py first, confirming that syncing is handled elsewhere. The analysis and insight functionality mentioned in the description is partially consistent with the reports produced here, but the core declared purpose of syncing from the API is not represented by this code chunk. Therefore this is a material description-behavior mismatch.
The description is mostly aligned with the general intent: this is a Bunpro sync tool that uses the frontend API and stores data locally in SQLite. However, there are material gaps and scope differences. First, the tool does more than syncing grammar learning progress: it fetches user account/profile details and multiple user statistics endpoints. Second, despite defining a grammar_points table, no code populates grammar point content, so the implementation does not fully match a description centered on grammar progress data. Third, review history data is fetched but not written to the local database, which weakens the claim that it stores progress data locally for later analysis. These are meaningful description-to-behavior discrepancies, though the overall domain and high-level purpose are related.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
`POST /bookmarks`
#### Delete Bookmark
`DELETE /bookmarks/{bookmarkId}`
## Grammar Points
The script tells users how to extract a live bearer token from browser storage or network headers but does not warn that this credential is sensitive and may grant broad account API access. In a community-distributed skill, normalizing manual token extraction increases the likelihood of credential mishandling, accidental disclosure in shells/logs, or reuse in insecure contexts.
The skill declares environment-variable and network-dependent behavior but does not define an explicit tool or permission scope. That ambiguity can cause an agent platform to over-grant capabilities or hide from users that the skill will access sensitive credentials and make outbound authenticated requests.
The skill instructs users to extract a live frontend bearer token from browser storage, cookies, local storage, or request headers, but does not clearly emphasize that this credential is highly sensitive and equivalent to account access. Users may paste it into shells, logs, screenshots, chat, or version control, leading to account compromise if exposed.
The documentation explicitly instructs users to extract a browser Bearer token from DevTools, local storage, or network traffic, which is a highly sensitive session credential. That guidance normalizes unsafe credential handling and could enable account takeover if the token is exposed, reused, logged, or pasted into untrusted tooling.
This example combines external transmission with direct use of a browser-extracted Bearer token in a curl command, encouraging users to handle and transmit a live session credential outside the original application context. Even over HTTPS, this can expose the token via shell history, logs, screenshots, clipboard managers, or unsafe third-party environments.
The API requires a Bearer token obtained from the browser:
curl "https://api.bunpro.jp/api/frontend/user" \
-H "Authorization: Bearer <token_from_browser>"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import requests
API_BASE = "https://api.bunpro.jp/api/frontend"
DB_FILENAME = "bunpro.db"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import requests
API_BASE = "https://api.bunpro.jp/api/frontend"
DB_FILENAME = "bunpro.db"
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
import requests
API_BASE = "https://api.bunpro.jp/api/frontend"
DB_FILENAME = "bunpro.db"
This code persists account-derived user data locally, including username, level, XP, and related progress fields. Although the module docstring says data is stored locally for analysis, there is no user-facing warning at runtime before writing potentially sensitive personal data to bunpro.db.
The manifest and module docstring describe syncing Bunpro progress to local storage for analysis, and the database schema even defines a review_histories table. However, sync_review_histories() only performs API GET requests and returns the responses in memory; it never inserts anything into SQLite, so this documented sync behavior is not actually implemented.
The docstring Sync review session history. indicates behavior parallel to the other sync methods, which write fetched data into local SQLite tables. In reality, this function only retrieves two API endpoints and returns them in a dictionary, contradicting the stated intent of syncing history.
The skill states that personal learning progress and account-related information will be synced into a local SQLite database, but it does not clearly warn that this creates an on-disk copy of potentially sensitive personal data. Users may run it on shared systems, synced folders, or insecure backups without understanding the privacy implications.
Skill requests more permissions than appear necessary for its stated functionality. Review if elevated access is justified.
- **Auth:** Bearer JWT token from browser (not settings API key)
- **Rate limits:** Unknown - be reasonable
- **Stability:** Community-documented, may change without notice
- **Permission:** Reverse-engineered with permission from Bunpro team
## Troubleshooting
Skill requests more permissions than appear necessary for its stated functionality. Review if elevated access is justified.
- **Auth:** Bearer JWT token from browser (not settings API key)
- **Rate limits:** Unknown - be reasonable
- **Stability:** Community-documented, may change without notice
- **Permission:** Reverse-engineered with permission from Bunpro team
## Troubleshooting
No suspicious patterns detected.