このレポートには指定された言語の翻訳がありません。代わりに正規の英語レポートを表示しています。

バージョン付きセキュリティ評価

レポートID: SA-3E4B6C31

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

last30days セキュリティ評価 v5

スキルセキュリティ認証レポート

監査履歴
監査モデル: codex 最新の公開済みレポート
スキル名
last30days
バージョン
v5
メンテナー
sickn33
カバレッジ
36 スキャンされたファイル · 7,069 解析済み行数
ポリシーバージョン
利用不可

確認済みの検出結果における最高重大度

高

4 件の確認済みセキュリティ検出結果に対応が必要です。

インストールのコンテキスト

現在のスキルページを確認

このページはレポートの証拠のみを要約しています。正規のインストール勧告は Skill ページで提供されます。

現在のスキルページを開く

このレポートは、マニフェストまたは 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.

レポートの位置

最新の公開済みレポート

「最新」はレポートの順序を指し、アーティファクトの最新性を指すものではありません。

監査アテステーション

証明不可

必要な不変のバインディングは不完全です。

人による検証

未検証

このレポートには人による検証は記録されていません。

カバレッジ

36 スキャンされたファイル · 7,069 解析済み行数

レビュー対象の項目を 70 件表示

制限事項

このレポートはランタイムまたはサンドボックスでの実行を主張するものではなく、副作用がないことを証明するものでもありません。

証拠チェーン

ソースバインディングからインストール契約まで証拠をたどってください。利用可能な証拠は検証を支援しますが、安全性を保証するものではありません。

  1. ソース

    コミットとパスにバインド済み

  2. アーティファクト

    コンテンツとツリーのハッシュがバインド済み

  3. 監査

    完了

  4. インストール契約

    検証するためにマニフェストを開く

    マニフェストを開く

確認された機能

「確認」とは、このレポートで裏付けとなる証拠が記録されていることを意味します。「記録なし」は、機能が存在しないことを証明するものではありません。

スクリプトを含む

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.

専門家による証拠

不変の対象ID、スキャナーメタデータ、除外された一致項目、およびソースレベルの証拠。

アーティファクト主体

Marketplace コミット
3e4b6c31a74a3bd1a291c98cf585d720cb9fbc88
コンテンツハッシュ
955dfba826db5726207f451a4da26541e332c95e36f7b096212b69879edf3b92
ツリーハッシュ
e61feef82ee9e1185a346a34eb474df02777e143e4a6504ec9e4fb52cc45a1e0
Skill パス
skills/sickn33/last30days
監査ペイロードハッシュ
a2bb9c9b317f85d5da4bdcde05e6cfd4

分析メタデータ

監査モデル: codex

分析状態: 完了

対象範囲は、記録されたファイル、行、メソッド、および証拠に限定されます。ランタイムまたはサンドボックスでの実行は主張していません。

検証とエクスポート

マニフェストとロックファイルは、インストール成果物を暗号学的ハッシュに結び付けます。この完全性に関する主張は、セキュリティ評価とは別のものです。

監査アテステーション: not_attestable