T08 · Insecure Dependencies
- Location
README.md:93- Finding
Unpinned Third-Party Dependencies and Mutable Update Sources
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is mostly coherent, but it asks users to rely on an authenticated Google NotebookLM session, optional recurring recovery jobs, and a recovery script with weak path controls.
Review this before installing. Use a dedicated NotebookLM/Google account if possible, treat ~/.notebooklm/storage_state.json like a password, avoid copying it to shared or less-trusted servers, and do not enable the cron recovery jobs unless you need unattended recovery. Prefer pinned dependency versions, do not run the skill or cron as root, and keep output/status files in a private directory.
README.md:93Unpinned Third-Party Dependencies and Mutable Update Sources
README.md:244Optional Cron Jobs Create Durable Authenticated Execution
scripts/recover_tier2_delivery.sh:59Recovery Status File Allows Unconfined Download Destinations
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
Ubuntu/Debian:
sudo apt update && sudo apt install -y ffmpeg
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
Ubuntu/Debian:
sudo apt update && sudo apt install -y ffmpeg
The documented purpose understates broader operational behavior such as background polling, recovery workflows, status tracking, and filesystem-based job handoff. These persistence and recovery features make the skill more powerful than a simple one-shot generator and can affect user data retention, unattended execution, and artifact downloads over time.
The documented purpose understates broader operational behavior such as background polling, recovery workflows, status tracking, and filesystem-based job handoff. These persistence and recovery features make the skill more powerful than a simple one-shot generator and can affect user data retention, unattended execution, and artifact downloads over time.
The README instructs users to copy ~/.notebooklm/storage_state.json from one machine to another to enable headless use, but it does not warn that this file is effectively a persistent authenticated session credential. Anyone who obtains that file may be able to access the user's NotebookLM account/session until it expires or is revoked, so normal file transfer mistakes, backups, logs, or multi-user server exposure become credential-compromise risks.
The transfer and server-side placement of storage_state.json creates persistent reuse of an authenticated NotebookLM session on another host. In a multi-user or less-trusted server environment, compromise of that host or accidental file exposure can grant account access without needing the original login flow, making the skill context more dangerous because it explicitly operationalizes session portability for automation.
notebooklm auth check
ssh user@server "mkdir -p ~/.notebooklm"
scp /.notebooklm/storage_state.json user@server:/.notebooklm/storage_state.json
ssh user@server "chmod 600 ~/.notebooklm/storage_state.json"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
Ubuntu/Debian:
sudo apt update && sudo apt install -y ffmpeg
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
Ubuntu/Debian:
sudo apt update && sudo apt install -y ffmpeg
The README instructs users to copy ~/.notebooklm/storage_state.json from a local machine to a server for headless use, but it does not clearly warn that this file contains active authenticated session material equivalent to account access. If the server is less trusted, multi-user, compromised, or logs/transfers are exposed, the copied credential can be stolen and reused to access the user's NotebookLM session.
The instructions create a persistent server-side copy of the NotebookLM session state under ~/.notebooklm/storage_state.json, enabling continued authenticated access from the server. Persisting reusable session material on a remote host increases the attack surface substantially, especially on VPS, CI, or shared systems where host compromise, backup leakage, or local-user access could expose the token.
notebooklm auth check
ssh user@server "mkdir -p ~/.notebooklm"
scp /.notebooklm/storage_state.json user@server:/.notebooklm/storage_state.json
ssh user@server "chmod 600 ~/.notebooklm/storage_state.json"
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
ssh user@server "mkdir -p ~/.notebooklm"
scp /.notebooklm/storage_state.json user@server:/.notebooklm/storage_state.json
ssh user@server "chmod 600 ~/.notebooklm/storage_state.json"
### 5. 驗證
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
ssh user@server "mkdir -p ~/.notebooklm"
scp /.notebooklm/storage_state.json user@server:/.notebooklm/storage_state.json
ssh user@server "chmod 600 ~/.notebooklm/storage_state.json"
### 5. 驗證
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
如果 agent 在交付中途超時,delivery-status.json 會追蹤待處理的項目。恢復腳本會自動輪詢、下載並更新狀態。
# crontab -e
*/5 * * * * cd /path/to/notebooklm-studio-skill && bash scripts/recover_tier2_delivery.sh ./output >> /var/log/notebooklm-recovery.log 2>&1
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
如果 agent 在交付中途超時,delivery-status.json 會追蹤待處理的項目。恢復腳本會自動輪詢、下載並更新狀態。
# crontab -e
*/5 * * * * cd /path/to/notebooklm-studio-skill && bash scripts/recover_tier2_delivery.sh ./output >> /var/log/notebooklm-recovery.log 2>&1
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
如果 agent 在交付中途超時,delivery-status.json 會追蹤待處理的項目。恢復腳本會自動輪詢、下載並更新狀態。
# crontab -e
*/5 * * * * cd /path/to/notebooklm-studio-skill && bash scripts/recover_tier2_delivery.sh ./output >> /var/log/notebooklm-recovery.log 2>&1
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
如果 agent 在交付中途超時,delivery-status.json 會追蹤待處理的項目。恢復腳本會自動輪詢、下載並更新狀態。
# crontab -e
*/5 * * * * cd /path/to/notebooklm-studio-skill && bash scripts/recover_tier2_delivery.sh ./output >> /var/log/notebooklm-recovery.log 2>&1
The skill writes files and directories locally (mkdir -p, temp text files, output artifacts, and delivery-status.json) but does not declare any explicit tool scope such as permissions or allowed-tools. That mismatch weakens policy enforcement and can let the skill perform broader filesystem actions than reviewers or runtime controls expect.
The description says to use the skill whenever the user sends content and asks to generate learning materials, podcasts, videos, or study packages. Those triggers are broad everyday requests and the file does not provide negative examples or tighter scope boundaries, which could cause unintended invocation for generic summarization or media-generation tasks.
The skill applies a default language (zh_Hant) to a global NotebookLM account setting, which affects all notebooks in the account rather than only the current task. A user who does not explicitly opt in could have unrelated future work altered, creating cross-task state leakage and unintended account-wide changes.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
Refer to `references/artifact-options.md` for priority levels:
- **ASK** options: must ask the user
- **OFFER** options: state the default, let user decide whether to change
- **SILENT** options: use defaults without asking
- Options already specified by the user → skip
- Present all questions in a single message (batch, not one-by-one)
The skill hard-codes zh_Hant as the global default language, which can cause the agent to process or generate outputs in a language the user did not request. In this context, that is risky because it can silently alter user-visible output, reduce usability, and create misleading or inaccessible artifacts, especially for users expecting another language.
The file instructs the agent to use the built-in messaging tool to deliver artifacts to Telegram, maintain delivery state, retry sends, and continue until all artifacts reach a terminal status. That behavior materially expands the skill from NotebookLM import/generation into outbound messaging and persistent delivery orchestration, which creates a capability mismatch and can cause unintended exfiltration of generated content to external recipients if the skill is invoked in an unexpected context.
The README says the skill supports 30+ languages but sets a default of Traditional Chinese. That imposes a language default in natural-language behavior without indicating that the user is asked to choose or explicitly opt in, which can violate language/locale policy expectations.
The markdown states --language has a default of en, which imposes a specific language choice in the skill documentation. Under the policy, forcing a language or locale without user opt-in can be a natural-language policy violation unless clearly justified as region-specific.
The manifest says the skill imports sources into NotebookLM and generates user-selected artifacts, but this document adds a local media post-processing step via ffmpeg compression. While related to delivery, invoking external post-processing tooling is not part of the stated NotebookLM generation purpose as described.