T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/bilimclass.py:19- Finding
Undeclared Fixed-Profile Credential File Access
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears purpose-built for BilimClass, but it should be reviewed because it handles long-lived school account tokens and may read credentials from an unexpected Windows profile path.
Review this before installing. Treat the BilimClass tokens like passwords, keep ~/.openclaw/.env.json private and out of repositories or screenshots, and prefer removing the hard-coded Windows profile fallback and narrowing triggers so the skill only runs on explicit BilimClass requests.
scripts/bilimclass.py:19Undeclared Fixed-Profile Credential File Access
README.md:30Unpinned Third-Party Dependency Installation
The setup instructs users to extract a long-lived JWT from browser localStorage and place it in a local config file, but it does not clearly warn that this token effectively grants account access and may remain valid for about a year. This increases the risk of accidental exposure through screenshots, shell history, backups, repository commits, or local compromise, which could let someone access the student's school data.
The README states the skill auto-triggers on broad school-related natural-language phrases such as homework, grades, diary, and schedule queries. In an agent environment, broad triggers can cause unintended invocation on ordinary conversation, leading the skill to access and disclose sensitive student data when the user did not explicitly intend to call this integration.
The skill requires environment access for secrets and network access to external APIs, but it does not declare an explicit tool scope or allowed-tools policy. That omission weakens least-privilege controls and makes it harder for a host system to constrain what the skill may access or transmit, increasing the chance of unintended secret use or broader execution than users expect.
The trigger list includes very broad phrases such as "any school-related queries for Kazakhstan students," which can cause the skill to activate for unrelated or only loosely related requests. Because this skill handles sensitive educational data and uses stored credentials, accidental invocation could lead to unnecessary access to grades, homework, or schedule information without clear user intent.
The setup instructions explicitly tell users how to extract long-lived JWTs from localStorage and browser network headers, but do not warn that these are bearer credentials that grant access to student data. Publishing operational token-extraction steps without handling guidance increases the likelihood of credential leakage, reuse, or unsafe sharing, especially since one token is valid for about a year.
The script loads tokens and user identifiers from a local .env.json file and immediately uses them in Authorization headers for remote requests. While the code performs network access to an external service and accesses sensitive credentials, there is no docstring, comment, or user-facing warning explaining that stored tokens and student account data will be transmitted.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
STUDENT_UUID = bc["studentSchoolUuid"]
STUDENT_GROUPS = bc.get("studentGroups", [])
API_BASE = "https://api.bilimclass.kz/api/v4/os/clientoffice"
JOURNAL_BASE = "https://journal-service.bilimclass.kz/diary"
HEADERS = {
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
STUDENT_UUID = bc["studentSchoolUuid"]
STUDENT_GROUPS = bc.get("studentGroups", [])
API_BASE = "https://api.bilimclass.kz/api/v4/os/clientoffice"
JOURNAL_BASE = "https://journal-service.bilimclass.kz/diary"
HEADERS = {
Both request header sets hard-code "X-Localization": "ru", which imposes a specific language/locale policy on all API interactions. There is no indication that the user can opt into another locale or that the Russian-only behavior is a documented regional requirement.
The documented API headers force X-Localization: ru for both schedule and grades requests. This imposes a specific language/locale behavior without indicating user opt-in or explaining why Russian is required.
No suspicious patterns detected.