Back to skill

Security audit

Sec Daily Digest

Security checks for vulnerabilities and agentic risk

Overview

This digest skill is mostly coherent, but it needs review because its network fetching can be steered to internal URLs and its AI/email features can send collected content outside the local machine.

Review before installing in corporate, cloud, or private-network environments. Prefer dry-run or trusted-source use, avoid --enrich and --email for sensitive material, use only approved AI providers and recipients, and consider adding outbound URL validation before running it where internal services are reachable.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
src/rss/fetch.ts:30
Finding

Server-Side Request Forgery Through Unvalidated Feed and Article URLs

Content
View full analysis
]*>/gi)].map((m) => m[0]); return tags .map((tag): OpmlFeed => ({ name: pickAttr(tag, ["text", "title"]) || "unknown", xmlUrl: pickAttr(tag, ["xmlUrl"]), htmlUrl: pickAttr(tag, ["htmlUrl"]), })) .filter((feed) => feed.xmlUrl.length > 0); } ``` `src/rss/fetch.ts:30-70`: ```ts export async function fetchFeed( feed: FeedSource, options?: { timeoutMs?: number; retries?: number; fetcher?: typeof fetch; seed?: number; }, ): Promise { const fetcher = options?.fetcher ?? fetch; const timeoutMs = options?.timeoutMs ?? 15_000; const retries = options?.retries ?? 2; const seed = options?.seed ?? 0; for (let attempt = 0; attempt <= retries; attempt += 1) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), timeoutMs); try { const response = await fetcher(feed.xmlUrl, { signal: controller.signal, headers: buildFetchHeaders(seed + attempt), }); clearTimeout(timeout); if (!response.ok) { if ((response.status === 403 || response.status === 429) && attempt < retries) { await sleep(250 + attempt * 300); continue; } throw new Error(`HTTP ${response.status}`); } const xml = await response.text(); return parseFeedItems(xml, feed.name, feed.htmlUrl); } catch (error) { clearTimeout(timeout); if (attempt >= retries) { console.warn(`[rss] failed ${feed.name}: ${error instanceof Error ? error.message : String(error)}`); return []; } ...[truncated 4169 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Warning
Location
src/ai/prompts.ts:25
Finding

Indirect Prompt Injection Through Untrusted Feed and Article Content

Content
View full analysis
{ let entry = `Index ${article.index}: [${article.sourceName}] ${article.title}\nURL: ${article.link}\n${article.description.slice(0, 800)}`; if (article.fullText) { entry += `\n\n[Full text excerpt]\n${article.fullText.slice(0, 500)}`; } return entry; }) .join("\n\n---\n\n"); return `...${articleList}...`; } ``` `src/ai/prompts.ts:67-81`: ```ts export function buildSummaryPrompt(articles: SummaryPromptArticle[], lang: "zh" | "en"): string { const articleList = articles .map((article) => { let entry = `Index ${article.index}: [${article.sourceName}] ${article.title}\nURL: ${article.link}\nCategory: ${article.category}\nKeywords: ${article.keywords.join(", ")}\n${article.description.slice(0, 1200)}`; if (article.fullText) { entry += `\n\n[Full text excerpt]\n${article.fullText.slice(0, 1500)}`; } return entry; }) .join("\n\n---\n\n"); const langInstruction = lang === "zh" ? "..." : "Use English output for title_zh, summary_zh, and reason_zh."; ``` `src/ai/parse.ts:75-96`: ```ts export function validateSummaryResult(payload: unknown): SummaryResultItem | null { if (!payload || typeof payload !== "object") { return null; } const obj = payload as Record; const index = asNumber(obj.index); const titleZh = asString(obj.title_zh); const summaryZh = asString(obj.summary_zh); const reasonZh = asString(obj.reason_zh); if (index === null || !titleZh || !summaryZh || !rea ...[truncated 3549 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (56)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 76)May include surrounding context.

md
- Pipeline: `src/pipeline/run.ts`

YARA rule 'offensive_tool_references': References to well-known offensive security tools [hacktools]

High
Category
YARA Match
Confidence
70% confidence
Finding

YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Content

Scanner excerpt · src/config/sources.ts (reported line 47)May include surrounding context.

ts
rue, priority: true, topics: ["security"] },
  { id: "billdemirkapi", type: "twitter", name: "Bill Demirkapi", handle: "billdemirkapi", enabled: true, priority: false, topics: ["security"] },
  { id: "hackerfantastic", type: "twitter", name: "hackerfantastic", handle: "hackerfantastic", enabled: true, priority: false, topics: ["security"] },
  { id: "_wald0", type: "twitter", name: "Andy Robbins, BloodHound", handle: "_wald0", enabled: true, priority: false, topics: ["security"] },
  { id: "aionescu", type: "twitter", name: "Alex Ionescu", handle: "aionescu", enabled: true, priority: false, topics: ["security"] },
  { id: "tiraniddo", type: "twitter", name: "James Forshaw", handle: "tiraniddo", enabled: true, priority: false, topics: ["security"] },
];

// AI / frontier-tech KOLs (sourced from tech-news-digest defaults)
export const DEFAULT_TECH_TWITTER_SOURCES: TwitterSourceConfig[] = [
  // AI Labs & CEOs
  { id: "sama-twitter", type: "twitter", name: "Sam Altman (OpenAI CEO)", handl

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The skill description says it fetches from Twitter/X and performs AI scoring/full-text enrichment, and later documents provider API keys and --enrich, but it does not clearly warn users that external requests may disclose queried URLs, retrieved content, or derived summaries to third-party services. For markdown files, omissions of warnings about behaviors affecting privacy should be flagged.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This markdown file documents the --email feature and the underlying gog gmail send command, which sends the generated report outside the local system. While the mechanics are explained, there is no explicit user warning about potential privacy or data-handling implications of emailing collected and AI-generated content.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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 321)May include surrounding context.

Install as a personal skill:

bash
mkdir -p ~/.claude/skills
ln -sfn "$SKILL_SRC" ~/.claude/skills/sec-daily-digest

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README explicitly promotes emailing generated digests and includes examples that may contain scraped article content, summaries, or third-party material, but it does not warn users that this transmits potentially sensitive or copyrighted content to an external email service. In a security-research context, digests may include internal notes, private source selections, or enriched article text, so silent external transmission creates a real privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README documents use of external AI providers and optional full-text fetching, but does not clearly warn that article bodies, URLs, metadata, and generated summaries may be transmitted to third-party services. Because this skill aggregates security content and can fetch full text before scoring, users may unknowingly send large amounts of browsing-derived data to OpenAI, Anthropic, Gemini, or other providers.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

个人技能安装:

bash
mkdir -p ~/.claude/skills
ln -sfn "$SKILL_SRC" ~/.claude/skills/sec-daily-digest

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.zh-CN.md (reported line 321)May include surrounding context.

个人技能安装:

bash
mkdir -p ~/.claude/skills
ln -sfn "$SKILL_SRC" ~/.claude/skills/sec-daily-digest

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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.zh-CN.md (reported line 321)May include surrounding context.

个人技能安装:

bash
mkdir -p ~/.claude/skills
ln -sfn "$SKILL_SRC" ~/.claude/skills/sec-daily-digest

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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.zh-CN.md (reported line 321)May include surrounding context.

个人技能安装:

bash
mkdir -p ~/.claude/skills
ln -sfn "$SKILL_SRC" ~/.claude/skills/sec-daily-digest

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

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

项目级安装:

bash
mkdir -p ./.claude/skills
ln -sfn "$SKILL_SRC" ./.claude/skills/sec-daily-digest

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.zh-CN.md (reported line 328)May include surrounding context.

项目级安装:

bash
mkdir -p ./.claude/skills
ln -sfn "$SKILL_SRC" ./.claude/skills/sec-daily-digest

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file explicitly says the skill should not be used when the user expects arbitrary output language switching, and later states the implementation outputs fixed bilingual-style markdown. This imposes a language/locale constraint rather than offering user choice or opt-in, which matches the policy-violation category for forced language behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The Required Behavior section mandates output sections including AI发展, 安全动态, and 漏洞专报, and clarifies that the implementation uses fixed bilingual-style markdown. This is a natural-language policy concern because it hard-codes a language/locale choice instead of allowing user selection.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill documents an email delivery feature that sends generated digest content via an external mail client/service (gogcli) but does not clearly warn that article summaries, extracted content, and possibly sensitive research context will leave the local environment. This can create unintended data disclosure, especially if users run the tool on internal, embargoed, or sensitive source material and assume output remains local.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The template describes email delivery and instructs users to set TWITTERAPI_IO_KEY or X_BEARER_TOKEN, which implies external network transmission and use of credentials. The surrounding markdown does not warn that content and related metadata may be sent to third-party services or email recipients.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code requires title_zh, summary_zh, and reason_zh fields and returns null when those Chinese-specific fields are absent. This hard-codes a language constraint in the skill logic without any visible mechanism for user choice or justification, which matches the language/locale policy violation category.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This file contains natural-language prompt instructions that require Chinese output by default, such as '你是网络空间安全研究员助手' and Chinese-only response requirements. Under the policy, forcing a specific language without offering user choice or opt-in is a locale/language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Although the function accepts lang: "zh" | "en", the prompt still defines output fields as title_zh, summary_zh, and reason_zh, and labels them as Chinese content. This creates a language policy inconsistency and still centers a forced locale rather than offering a fully neutral user-selected language mode.

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 · src/ai/providers/claude.ts (reported line 10)May include surrounding context.

ts
}

  const model = env.CLAUDE_MODEL?.trim() || "claude-3-5-sonnet-latest";
  const endpoint = env.CLAUDE_API_BASE?.trim().replace(/\/+$/, "") || "https://api.anthropic.com/v1";

  return {
    id: "claude",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code performs an outbound HTTP request and transmits the caller-provided prompt to a third-party service, which can affect user privacy if prompts contain sensitive data. Within this file there is no confirmation prompt, logging, comment, or docstring warning that prompt contents will be sent externally.

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 · src/ai/providers/openai.ts (reported line 3)May include surrounding context.

ts
import { type AIProvider } from "./types";

const OPENAI_DEFAULT_BASE = "https://api.openai.com/v1";
const OPENAI_DEFAULT_MODEL = "gpt-4o-mini";

function normalizeBase(base: string): string {

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code sends the user-supplied prompt to a remote API and includes a bearer token from an environment variable, but the file provides no confirmation prompt, user-facing log, or explanatory comment/docstring warning about that transmission. For a code file, outbound network calls carrying user data and credential-backed access are safety-relevant operations that should have some visible disclosure unless documented elsewhere.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code only accepts output_language when it equals "bilingual_zh_en", which enforces a specific language/locale format rather than offering a user choice. This is a natural-language policy concern because it hard-codes a locale constraint without any visible opt-in or documented justification in this file.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/ai/providers/claude.ts:4

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/ai/providers/gemini.ts:4

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/ai/providers/openai.ts:11