此报告尚无所请求语言的翻译,当前显示规范英文报告。

版本化安全评估

报告编号: SA-3E4B6C31

7/9/2026, 7:18:51 AM

last30days 安全评估 v5

Skill 安全认证报告

审计历史
审计模型: codex 最新发布的报告
技能名称
last30days
版本
v5
维护者
sickn33
覆盖范围
36 已扫描文件 · 7,069 分析行数
策略版本
不可用

已确认问题的最高严重性

高

有 4 个已确认的安全问题需要处理。

安装上下文

请查看当前 Skill 详情页

本页仅汇总报告证据。Skill 详情页提供 canonical install advisory。

打开当前 Skill 详情页

本报告不会阻止或授权 manifest 或 ZIP。

Confirmed runtime network calls to OpenAI, xAI, and Reddit, plus API-key handling, hidden configuration loading, and local report/cache writes. Most markdown, plan, test, and fixture hits are false positives, but one packaged photo contains GPS EXIF metadata. No evidence found of prompt-injection text that tries to bypass security review.

报告位置

最新发布的报告

“最新”仅指报告序列,不代表 artifact 当前有效。

审计证明

无法签发证明

所需的不可变绑定不完整。

人工验证

未进行人工验证

本报告没有人工验证记录。

覆盖范围

36 已扫描文件 · 7,069 分析行数

有 70 项内容需要查看

局限

本报告不声称进行了运行时或沙箱执行,也不证明不存在副作用。

证据链

证据从来源绑定延伸到安装契约。证据可用于验证,但不是安全保证。

  1. 来源

    已绑定 commit 与路径

  2. 构件

    已绑定内容与 tree hash

  3. 审计

    已完成

  4. 安装契约

    打开 manifest 进行验证

    打开 manifest

观察到的能力

“已观察到”表示本报告记录了支持证据;“未记录”不证明该能力不存在。

包含脚本

可能执行 Skill 随附的代码。

在 1 个证据位置观察到

网络访问

可能连接外部服务。

在 31 个证据位置观察到

文件系统访问

可能读取或写入本地文件。

在 29 个证据位置观察到

环境变量

可能读取进程环境中的值。

在 43 个证据位置观察到

外部命令

可能调用 Skill 之外的命令或程序。

在 43 个证据位置观察到

能力复核项 (66)
高
Generic API/secret keys
config["OPENAI_API_KEY"],
The main pipeline passes configured API keys into OpenAI or xAI search clients for outbound requests. This is intended behavior, but it handles user secrets.
高
Generic API/secret keys
config["OPENAI_API_KEY"],
The main pipeline passes configured API keys into OpenAI or xAI search clients for outbound requests. This is intended behavior, but it handles user secrets.
高
Generic API/secret keys
config["XAI_API_KEY"],
The main pipeline passes configured API keys into OpenAI or xAI search clients for outbound requests. This is intended behavior, but it handles user secrets.
高
Hidden file in home directory
"""Load configuration from ~/.config/last30days/.env and environment."""
The environment helper defines and loads ~/.config/last30days/.env. This is legitimate configuration loading, but it reads a hidden file that may contain API keys.
高
Generic API/secret keys
'OPENAI_API_KEY': os.environ.get('OPENAI_API_KEY') or file_env.get('OPENAI_API_KEY'),
The code reads OPENAI_API_KEY or XAI_API_KEY from process environment or the .env file. These are sensitive credentials used by provider clients.
高
Generic API/secret keys
'XAI_API_KEY': os.environ.get('XAI_API_KEY') or file_env.get('XAI_API_KEY'),
The code reads OPENAI_API_KEY or XAI_API_KEY from process environment or the .env file. These are sensitive credentials used by provider clients.
高
Generic API/secret keys
has_openai = bool(config.get('OPENAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
高
Generic API/secret keys
has_xai = bool(config.get('XAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
高
Generic API/secret keys
has_openai = bool(config.get('OPENAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
高
Generic API/secret keys
has_xai = bool(config.get('XAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
高
Generic API/secret keys
headers = {"Authorization": f"Bearer {api_key}"}
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
高
Generic API/secret keys
if config.get("OPENAI_API_KEY"):
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
高
Generic API/secret keys
config["OPENAI_API_KEY"],
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
高
Generic API/secret keys
if config.get("XAI_API_KEY"):
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
高
Generic API/secret keys
config["XAI_API_KEY"],
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
高
Generic API/secret keys
"Authorization": f"Bearer {api_key}",
The OpenAI client places the API key in an Authorization bearer header. This is necessary for the feature but is real secret transmission to an external API.
高
Generic API/secret keys
"Authorization": f"Bearer {api_key}",
The xAI client places the API key in an Authorization bearer header. This is necessary for the feature but is real secret transmission to an external API.
高
Hidden file in home directory
mkdir -p ~/.config/last30days
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
高
Hidden file in home directory
cat > ~/.config/last30days/.env << 'ENVEOF'
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
高
Hidden file in home directory
chmod 600 ~/.config/last30days/.env
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
高
Hidden file in home directory
python3 ~/.claude/skills/last30days/scripts/last30days.py "$ARGUMENTS" --emit=compact 2>&1
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
高
Generic API/secret keys
OPENAI_API_KEY=
The setup instructions solicit OpenAI or xAI API keys for storage in ~/.config/last30days/.env. Legitimate optional setup still handles sensitive credentials.
高
Generic API/secret keys
XAI_API_KEY=
The setup instructions solicit OpenAI or xAI API keys for storage in ~/.config/last30days/.env. Legitimate optional setup still handles sensitive credentials.
中
Python file write/append
with open(cache_path, 'w') as f:
The cache helper writes JSON files under the user cache directory. The path is controlled by the application, but it persists user research data locally.
中
Python file write/append
with open(MODEL_CACHE_FILE, 'w') as f:
The cache helper writes JSON files under the user cache directory. The path is controlled by the application, but it persists user research data locally.
中
Hidden file access
"""Load configuration from ~/.config/last30days/.env and environment."""
The environment helper defines and loads ~/.config/last30days/.env. This is legitimate configuration loading, but it reads a hidden file that may contain API keys.
中
Python file write/append
with open(OUTPUT_DIR / "report.json", 'w') as f:
The renderer writes reports, context files, and raw provider responses under ~/.local/share/last30days/out. This persists user research output and raw API data locally.
中
Python file write/append
with open(OUTPUT_DIR / "report.md", 'w') as f:
The renderer writes reports, context files, and raw provider responses under ~/.local/share/last30days/out. This persists user research output and raw API data locally.
中
Python file write/append
with open(OUTPUT_DIR / "last30days.context.md", 'w') as f:
The renderer writes reports, context files, and raw provider responses under ~/.local/share/last30days/out. This persists user research output and raw API data locally.
中
Python file write/append
with open(OUTPUT_DIR / "raw_openai.json", 'w') as f:
The renderer writes reports, context files, and raw provider responses under ~/.local/share/last30days/out. This persists user research output and raw API data locally.
中
Python file write/append
with open(OUTPUT_DIR / "raw_xai.json", 'w') as f:
The renderer writes reports, context files, and raw provider responses under ~/.local/share/last30days/out. This persists user research output and raw API data locally.
中
Python file write/append
with open(OUTPUT_DIR / "raw_reddit_threads_enriched.json", 'w') as f:
The renderer writes reports, context files, and raw provider responses under ~/.local/share/last30days/out. This persists user research output and raw API data locally.
中
Hidden file access
mkdir -p ~/.config/last30days
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
中
Hidden file access
cat > ~/.config/last30days/.env << 'ENVEOF'
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
中
Hidden file access
chmod 600 ~/.config/last30days/.env
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
中
Hidden file access
python3 ~/.claude/skills/last30days/scripts/last30days.py "$ARGUMENTS" --emit=compact 2>&1
The skill instructions explicitly create or use hidden paths under ~/.config or ~/.claude during setup and execution. This is user-directed but still a real filesystem side effect.
低
Python environment access
os.environ["LAST30DAYS_DEBUG"] = "1"
The --debug option mutates LAST30DAYS_DEBUG in the process environment to increase logging. It is intentional and low impact, but it is real environment manipulation.
低
Python environment access
'OPENAI_API_KEY': os.environ.get('OPENAI_API_KEY') or file_env.get('OPENAI_API_KEY'),
The code reads OPENAI_API_KEY or XAI_API_KEY from process environment or the .env file. These are sensitive credentials used by provider clients.
低
Python environment access
'XAI_API_KEY': os.environ.get('XAI_API_KEY') or file_env.get('XAI_API_KEY'),
The code reads OPENAI_API_KEY or XAI_API_KEY from process environment or the .env file. These are sensitive credentials used by provider clients.
低
Python environment access
'OPENAI_MODEL_POLICY': os.environ.get('OPENAI_MODEL_POLICY') or file_env.get('OPENAI_MODEL_POLICY',
The code reads model policy configuration from the environment or .env file. This is low-severity configuration access that can alter provider behavior.
低
Python environment access
'OPENAI_MODEL_PIN': os.environ.get('OPENAI_MODEL_PIN') or file_env.get('OPENAI_MODEL_PIN'),
The code reads model policy configuration from the environment or .env file. This is low-severity configuration access that can alter provider behavior.
低
Python environment access
'XAI_MODEL_POLICY': os.environ.get('XAI_MODEL_POLICY') or file_env.get('XAI_MODEL_POLICY', 'latest')
The code reads model policy configuration from the environment or .env file. This is low-severity configuration access that can alter provider behavior.
低
Python environment access
'XAI_MODEL_PIN': os.environ.get('XAI_MODEL_PIN') or file_env.get('XAI_MODEL_PIN'),
The code reads model policy configuration from the environment or .env file. This is low-severity configuration access that can alter provider behavior.
低
Configuration library
has_openai = bool(config.get('OPENAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
低
Configuration library
has_xai = bool(config.get('XAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
低
Configuration library
has_openai = bool(config.get('OPENAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
低
Configuration library
has_xai = bool(config.get('XAI_API_KEY'))
The code checks whether OpenAI or xAI keys are present to select active sources. This is intentional, but it is real credential-aware behavior.
低
HTTP client library
def request(
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
HTTP client library
return request("GET", url, headers=headers, **kwargs)
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
HTTP client library
return request("POST", url, headers=headers, json_data=json_data, **kwargs)
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
Python HTTP libraries
import urllib.request
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
Python HTTP libraries
req = urllib.request.Request(url, data=data, headers=headers, method=method)
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
Python HTTP libraries
with urllib.request.urlopen(req, timeout=timeout) as response:
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
Hardcoded URL
url = f"https://www.reddit.com{path}?raw_json=1"
The HTTP helper imports urllib, constructs requests, and opens URLs including Reddit JSON endpoints. This is intentional outbound network access.
低
Python environment access
DEBUG = os.environ.get("LAST30DAYS_DEBUG", "").lower() in ("1", "true", "yes")
The module reads LAST30DAYS_DEBUG from the environment to enable diagnostic logging. This is real but low-severity environment-controlled behavior.
低
HTTP/HTTPS get
response = http.get(OPENAI_MODELS_URL, headers=headers)
The model selector uses the OpenAI models endpoint through the shared HTTP client. This is intentional outbound provider communication.
低
Hardcoded URL
OPENAI_MODELS_URL = "https://api.openai.com/v1/models"
The model selector uses the OpenAI models endpoint through the shared HTTP client. This is intentional outbound provider communication.
低
Configuration library
if config.get("OPENAI_API_KEY"):
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
低
Configuration library
config.get("OPENAI_MODEL_POLICY", "auto"),
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
低
Configuration library
config.get("OPENAI_MODEL_PIN"),
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
低
Configuration library
if config.get("XAI_API_KEY"):
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
低
Configuration library
config.get("XAI_MODEL_POLICY", "latest"),
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
低
Configuration library
config.get("XAI_MODEL_PIN"),
The model selector checks configured API keys and uses an Authorization header for provider model discovery. This is legitimate but handles sensitive credentials.
低
Hardcoded URL
OPENAI_RESPONSES_URL = "https://api.openai.com/v1/responses"
The OpenAI Responses endpoint is the active destination for Reddit discovery. The skill intentionally makes authenticated external API calls.
低
HTTP/HTTPS get
data = http.get_reddit_json(path)
The Reddit enrichment flow calls http.get_reddit_json for fetched thread URLs. This is intended outbound network access to reddit.com.
低
Hardcoded URL
XAI_RESPONSES_URL = "https://api.x.ai/v1/responses"
The xAI Responses endpoint is the active destination for X search. The skill intentionally makes authenticated external API calls.

风险问题

已确认的安全问题与仍需审核的项目分开展示。

已确认安全问题 (4)

RISK-001 高
Environment file access
CONFIG_FILE = CONFIG_DIR / ".env"
The environment helper defines and loads ~/.config/last30days/.env. This is legitimate configuration loading, but it reads a hidden file that may contain API keys.
RISK-002 高
Environment file access
"""Load configuration from ~/.config/last30days/.env and environment."""
The environment helper defines and loads ~/.config/last30days/.env. This is legitimate configuration loading, but it reads a hidden file that may contain API keys.
RISK-003 高
Environment file access
cat > ~/.config/last30days/.env << 'ENVEOF'
The setup instructions solicit OpenAI or xAI API keys for storage in ~/.config/last30days/.env. Legitimate optional setup still handles sensitive credentials.
RISK-004 高
Environment file access
chmod 600 ~/.config/last30days/.env
The setup instructions solicit OpenAI or xAI API keys for storage in ~/.config/last30days/.env. Legitimate optional setup still handles sensitive credentials.

补救措施

本次审计记录了建议的修复措施。实施这些措施是维护者的责任。

  1. FIX-001
    高
    Packaged image exposes location metadata.
    Strip EXIF metadata from assets/dog-original.jpeg or replace it with a sanitized sample image before publishing.
  2. FIX-002
    高
    API keys are read from environment variables and ~/.config/last30days/.env.
    Document exactly which providers receive each key and require explicit user consent before setup or API-backed searches.
  3. FIX-003
    中
    Raw provider responses and reports are written to local output files.
    Add a retention policy, a cleanup command, and an option to disable raw response persistence.
  4. FIX-004
    中
    The skill performs outbound network research by design.
    Keep web-only mode as the default fallback and clearly label when external OpenAI, xAI, or Reddit requests will be made.

专家证据

不可变主体身份、扫描器元数据、已排除匹配项和源码级证据。

Artifact 主体

Marketplace 提交
3e4b6c31a74a3bd1a291c98cf585d720cb9fbc88
内容哈希
955dfba826db5726207f451a4da26541e332c95e36f7b096212b69879edf3b92
目录树哈希
e61feef82ee9e1185a346a34eb474df02777e143e4a6504ec9e4fb52cc45a1e0
Skill 路径
skills/sickn33/last30days
审计载荷哈希
a2bb9c9b317f85d5da4bdcde05e6cfd4

分析元数据

审计模型: codex

分析状态: 已完成

范围仅限于已记录的文件、行数、方法和证据;本报告不声称进行了运行时或沙箱执行。

验证与导出

manifest 和 lockfile 将安装 artifact 绑定到加密哈希。该完整性声明独立于安全评估。

审计证明: not_attestable