Back to skill

Security audit

AI前沿哨兵

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent AI-news collector, but its WebUI credential handling and custom feed fetching create security issues users should review before installing.

Review this skill before installing. It should be run in a limited workspace, with pinned dependencies and only trusted feed URLs. Avoid entering a Twitter bearer token into the WebUI until token storage and DOM injection issues are fixed; prefer environment variables or a backend secret store. Use cron only if you intentionally want scheduled background collection.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (7)

T09 · Insecure Skill Coding Practices

Error
Location
webui/app.js:340
Finding

Persistent DOM XSS in Custom Source Rendering

Content
View full analysis
🔗 ${source.name}
✏️ 自定义

${source.description || '自定义RSS订阅源'}

订阅地址: ${truncateUrl(source.url)}
${source.tags && source.tags.length > 0 ? `
${source.tags.map(tag => `${tag}`).join('')}
` : ''}
${source.count || 0}
已采集
-
上次采集
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
webui/app.js:223
Finding

Twitter Bearer Token Persisted in Plaintext Browser Storage

Content
View full analysis
{ state.settings.twitterToken = e.target.value; }); } ``` ### Technical Analysis The Twitter Bearer Token is placed in the general `state.settings` object, and the complete object is serialized to `localStorage`. Browser local storage is neither encrypted nor protected from scripts executing in the same origin. Using an HTML password input only obscures the token visually; it does not protect the stored value. This is especially dangerous because the same WebUI contains a persistent DOM XSS vulnerability. Any successful same-origin script injection can retrieve the token with a single `localStorage.getItem()` call. The token is long-lived application authentication material and should not be persisted in a script-readable browser store. ### Attack Path 1. A user enters a Twitter Bearer Token in the configuration interface. 2. The application copies the token into `state.settings.twitterToken`. 3. The user invokes a save operation, causing all settings to be serialized into `sentinel-settings`. 4. A same-origin injected script, compromised third-party ...[truncated 776 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/parsers/blog_rss.py:55
Finding

Arbitrary RSS URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
Remediation
View remediation
MAX_FEED_BYTES: raise ValueError("Feed exceeds maximum permitted size") ``` 6. Accept only expected RSS, Atom, or XML content types. 7. Apply outbound firewall rules so the collector cannot reach metadata services or sensitive internal networks. 8. Ensure DNS rebinding protections validate the actual connected address, not only the original hostname string. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
references/sources_guide.md:173
Finding

Extension Guidance Forwards API Secrets to Unrestricted Configured URLs

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:148
Finding

Unpinned Third-Party Dependency Installation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
templates/morning_report.md:7
Finding

Untrusted Remote Content Is Emitted into Markdown Without Structural Escaping

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/parsers/arxiv.py:39
Finding

arXiv Metadata Retrieved over Cleartext HTTP

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (56)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个端到端的“AI情报哨兵”系统,应侧重于采集AI领域最新动态、多源整合分析与报告生成。而实际代码块仅是 quality_scorer.py,其核心能力是对已经存在的报告数据进行质量评分:统计条目数量与内容长度、解析发布时间评估时效性、统计来源/类型/话题多样性、根据Markdown结构评估可读性,并输出星级、评级和Markdown评分卡。它不包含数据采集、外部源访问、情报监测、自动分析生成报告等与声明主用途相符的核心行为。虽然“报告质量评分”可以作为整个系统的辅助组件,但就该代码块本身而言,其实际行为与声明的主要用途存在明显偏差。

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/api_setup.md (reported line 67)May include surrounding context.

  • 已认证:5000次/小时

如需更高配额:

  1. 在 GitHub Settings 生成 Personal Access Token
  2. 在请求时添加 Header:
python

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/api_setup.md (reported line 172)May include surrounding context.

bearer_token = os.environ.get("TWITTER_BEARER_TOKEN", "")

text

- 或创建 `config/secrets.yaml`(已加入.gitignore):

```yaml
twitter:

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/api_setup.md (reported line 185)May include surrounding context.

bearer_token = os.environ.get("TWITTER_BEARER_TOKEN", "")

text

- 或创建 `config/secrets.yaml`(已加入.gitignore):

```yaml
twitter:

Chaining Abuse

High
Category
Tool Misuse
Confidence
70% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · reports/2026-04-10/xiaohongshu_report.md (reported line 50)May include surrounding context.

md
🔧 **kpjadhav94/python-for-embedded**
Python Language for Embedded Engineer...
⭐0 Stars | Python

🔧 **modern-python/spellchecks**
Python library for spell-checking text i...

Chaining Abuse

High
Category
Tool Misuse
Confidence
70% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · reports/2026-04-10/xiaohongshu_report.md (reported line 54)May include surrounding context.

md
🔧 **kpjadhav94/python-for-embedded**
Python Language for Embedded Engineer...
⭐0 Stars | Python

🔧 **modern-python/spellchecks**
Python library for spell-checking text i...

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · webui/index.html (reported line 11)May include surrounding context.

html
</head>
<body>
    <div class="app">
        <!-- 侧边栏 -->
        <aside class="sidebar">
            <div class="logo">
                <span class="logo-icon">⌘</span>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · webui/index.html (reported line 207)May include surrounding context.

html
</div>
                </div>
                
                <!-- ==================== 配置视图 ==================== -->
                <div class="view" id="settingsView">
                    <div class="settings-group">
                        <h3>API配置</h3>

Session Persistence

Medium
Category
Rogue Agent
Confidence
85% confidence
Finding

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.

Content

Scanner excerpt · README.md (reported line 154)May include surrounding context.

bash
# 编辑 crontab
crontab -e

# 添加以下内容
0 8 * * * cd /path/to/ai-sentinel && python scripts/collect.py --all && python scripts/reporter.py --type morning

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README tells users to place a Twitter/X Bearer Token into configuration or the WebUI but does not warn that this is a sensitive credential, should not be committed to source control, and should be stored securely. In a project centered on automated collection and reporting, users are likely to persist credentials in plain YAML files or browser-managed UI state, increasing the chance of accidental exposure via repos, backups, logs, or shared hosts.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill declares powerful tools (shell, filesystem, http) and describes network collection plus writing reports to disk, but it does not define an explicit scope such as permissions or allowed-tools. This creates an overbroad execution surface where the agent may perform file and network actions beyond what users clearly expect, increasing the chance of unintended data access or persistence.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The skill name, description, triggers, and usage instructions are all presented in Chinese, implying a fixed language/locale experience. There is no opt-in, user choice, or documented justification that this is a region-specific tool, so the file reflects a natural-language locale constraint without accommodation.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger list includes broad phrases like AI资讯, AI动态, 晨报, and 晚报, which can match ordinary conversation and cause the skill to activate unintentionally. Because the skill has shell, filesystem, and HTTP capabilities, accidental activation could trigger external requests and local file writes without sufficiently explicit user intent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description highlights reporting features but does not clearly warn users that it collects data from external sources and writes generated reports to disk. This weakens informed consent and can lead to privacy, compliance, or operational issues if users do not realize network access and local persistence will occur.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This manifest/config file contains natural-language comments and source names primarily in Chinese, which imposes a specific language context without any user opt-in or justification that the skill is intended only for Chinese-speaking users. Under the policy, forcing a language or locale without choice or documented necessity is a natural-language policy violation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api_setup.md (reported line 208)May include surrounding context.

md
1. 检查Bearer Token是否正确
2. 确认开发者账号状态正常
3. 检查API配额是否用尽
4. 查看 [Twitter API Status](https://api.twitterstat.us/)

### GitHub API 403错误

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The file presents the report entirely in Chinese from the title onward, indicating a fixed language choice. Under the policy, forcing a specific language without user opt-in or a documented regional justification is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Section headers, labels, and generated summaries across the report are in Chinese, but the file does not mention any language preference setting or locale-specific scope. This can violate language policy when users are not offered a choice or informed of a justified locale limitation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

This markdown file is entirely written as a Chinese-language report and presents the content in a fixed locale/style without any indication that the user can choose another language. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the locale restriction is clearly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The module title and user-facing descriptions are written entirely in Chinese, and the command-line interface messages also assume Chinese-language interaction. The policy requires flagging language or locale constraints when a skill forces a specific language without opt-in, and this file contains no indication that users may choose another language or that the Chinese-only behavior is region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The module docstring and all user-facing documentation/comments are written exclusively in Chinese, including the stated capability description. Under the policy for natural-language violations, forcing a specific language without user opt-in is a locale/language constraint that is not documented as region-specific or optional.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This code file contains natural-language descriptions and output strings in Chinese, including the module docstring and later user-visible messages, but it does not provide any user opt-in or indicate that the skill is intentionally limited to Chinese-speaking users. That can violate a language/locale policy requiring user choice or explicit justification for a fixed language.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/parsers/github_trending.py (reported line 49)May include surrounding context.

python
since = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
        date_filter = f" created:>{since}"
    
    url = "https://api.github.com/search/repositories"
    params = {
        "q": query + date_filter,
        "sort": "stars",

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/api_setup.md:144

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/sources_guide.md:176

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/parsers/twitter_x.py:27