mcpField
O
owasp-security-check

owasp-security-check

github.com/sergiodxaセキュリティ921.7k 回インストール38 週間前に更新
リポジトリ

owasp-security-check について

OWASP Security Checkは、WebアプリケーションやREST APIを確認する開発者向けのセキュリティ監査スキルです。一般的な脆弱性を扱うルールと、重大度に沿った調査、指摘事項の報告、修正案の提示を備えています。

主な機能

  1. 015カテゴリにわたる20のルール
  2. 02重大度順の監査手順
  3. 03認証とアクセス制御の確認
  4. 04入力・API・設定のリスクを網羅
  5. 05影響と修正例を含む指摘事項

活用シーン

  1. 01本番公開前のWebアプリ確認
  2. 02認証・認可コードの評価
  3. 03REST APIのセキュリティ確認
  4. 04機密データを扱う変更の点検

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sergiodxa/agent-skills --skill owasp-security-check

インストール後、Claude Code で/owasp-security-checkを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

rules/
api-security.md
authentication-failures.md
broken-access-control.md
cors-configuration.md
cryptographic-failures.md
csrf-protection.md
data-integrity-failures.md
file-upload-security.md
injection-attacks.md
insecure-design.md
logging-monitoring.md
rate-limiting.md
redirect-validation.md
secrets-management.md
security-headers.md
security-misconfiguration.md
sensitive-data-exposure.md
session-security.md
ssrf-attacks.md
vulnerable-dependencies.md

詳細

OWASP セキュリティチェック

Web アプリケーションと REST API を対象とした、包括的なセキュリティ監査パターンです。OWASP Top 10 と一般的な Web の脆弱性を網羅する、5 つのカテゴリにわたる 20 個のルールが含まれています。

適用するタイミング

次の場合にこのスキルを使用します。

  • コードベースのセキュリティ脆弱性を監査するとき
  • ユーザーから提供されたファイルやフォルダーのセキュリティ上の問題を確認するとき
  • 認証・認可の実装を確認するとき
  • REST API のセキュリティを評価するとき
  • データ保護対策を評価するとき
  • 設定やデプロイ設定を確認するとき
  • 本番環境へのデプロイ前
  • 機密データを扱う新機能を追加した後

このスキルの使用方法

  1. アプリケーションの種類を特定する - Web アプリ、REST API、SPA、SSR、または混在型
  2. 優先度順にスキャンする - CRITICAL のルールから始め、次に HIGH、MEDIUM の順に確認します
  3. 関連するルールファイルを確認する - @rules/ ディレクトリから該当するルールを読み込みます
  4. 検出事項を報告する - 重大度、ファイルの場所、影響を記録します
  5. 修正方法を提示する - 修正に使える具体的なコード例を示します

監査ワークフロー

ステップ 1:優先度順に体系的に確認する

優先度に従ってカテゴリを確認します。

  1. CRITICAL:認証と認可、データ保護、入力・出力のセキュリティ
  2. HIGH:設定とヘッダー
  3. MEDIUM:API と監視
ステップ 2:レポートを作成する

検出事項を次の形式で記載します。

  • 重大度:CRITICAL | HIGH | MEDIUM | LOW
  • カテゴリ:ルール名
  • ファイル:パスと行番号
  • 問題:問題の内容
  • 影響:セキュリティ上の結果
  • 修正:修正方法を示すコード例

ルールの概要

認証と認可(CRITICAL)
broken-access-control - @rules/broken-access-control.md

認可の欠如、IDOR、権限昇格を確認します。

// Bad: No authorization check
async function getUser(req: Request): Promise<Response> {
  let url = new URL(req.url);
  let userId = url.searchParams.get("id");
  let user = await db.user.findUnique({ where: { id: userId } });
  return new Response(JSON.stringify(user));
}

// Good: Verify ownership
async function getUser(req: Request): Promise<Response> {
  let session = await getSession(req);
  let url = new URL(req.url);
  let userId = url.searchParams.get("id");

  if (session.userId !== userId && !session.isAdmin) {
    return new Response("Forbidden", { status: 403 });
  }

  let user = await db.user.findUnique({ where: { id: userId } });
  return new Response(JSON.stringify(user));
}
authentication-failures - @rules/authentication-failures.md

脆弱な認証、MFA の欠如、セッションの問題を確認します。

// Bad: Weak password check
if (password.length >= 6) {
  /* allow */
}

// Good: Strong password requirements
function validatePassword(password: string) {
  if (password.length < 12) return false;
  if (!/[A-Z]/.test(password)) return false;
  if (!/[a-z]/.test(password)) return false;
  if (!/[0-9]/.test(password)) return false;
  if (!/[^A-Za-z0-9]/.test(password)) return false;
  return true;
}
データ保護(CRITICAL)
cryptographic-failures - @rules/cryptographic-failures.md

脆弱な暗号化、平文での保存、不適切なハッシュ化を確認します。

// Bad: MD5 for passwords
let hash = crypto.createHash("md5").update(password).digest("hex");

// Good: bcrypt with salt
let hash = await bcrypt(password, 12);
sensitive-data-exposure - @rules/sensitive-data-exposure.md

ログやレスポンス内の PII、情報が漏えいするエラーメッセージを確認します。

// Bad: Exposing sensitive data
return new Response(JSON.stringify(user)); // Contains password hash, email, etc.

// Good: Return only needed fields
return new Response(
  JSON.stringify({
    id: user.id,
    username: user.username,
    displayName: user.displayName,
  }),
);
data-integrity-failures - @rules/data-integrity-failures.md

署名されていないデータ、安全でないデシリアライゼーションを確認します。

// Bad: Trusting unsigned JWT
let decoded = JSON.parse(atob(token.split(".")[1]));
if (decoded.isAdmin) {
  /* grant access */
}

// Good: Verify signature
let payload = await verifyJWT(token, secret);
secrets-management - @rules/secrets-management.md

ハードコードされたシークレット、露出した環境変数を確認します。

// Bad: Hardcoded secret
const API_KEY = "sk_live_a1b2c3d4e5f6";

// Good: Environment variables
let API_KEY = process.env.API_KEY;
if (!API_KEY) throw new Error("API_KEY not configured");
入力・出力のセキュリティ(CRITICAL)
injection-attacks - @rules/injection-attacks.md

SQL、XSS、NoSQL、コマンド、パストラバーサルのインジェクションを確認します。

// Bad: SQL injection
let query = `SELECT * FROM users WHERE email = '${email}'`;

// Good: Parameterized query
let user = await db.user.findUnique({ where: { email } });
ssrf-attacks - @rules/ssrf-attacks.md

検証されていない URL、内部ネットワークへのアクセスを確認します。

// Bad: Fetching user-provided URL
let url = await req.json().then((d) => d.url);
let response = await fetch(url);

// Good: Validate against allowlist
const ALLOWED_DOMAINS = ["api.example.com", "cdn.example.com"];
let url = new URL(await req.json().then((d) => d.url));
if (!ALLOWED_DOMAINS.includes(url.hostname)) {
  return new Response("Invalid URL", { status: 400 });
}
file-upload-security - @rules/file-upload-security.md

制限のないアップロード、MIME 検証を確認します。

// Bad: No file type validation
let file = await req.formData().then((fd) => fd.get("file"));
await writeFile(`./uploads/${file.name}`, file);

// Good: Validate type and extension
const ALLOWED_TYPES = ["image/jpeg", "image/png", "image/webp"];
const ALLOWED_EXTS = [".jpg", ".jpeg", ".png", ".webp"];
let file = await req.formData().then((fd) => fd.get("file") as File);

if (!ALLOWED_TYPES.includes(file.type)) {
  return new Response("Invalid file type", { status: 400 });
}
redirect-validation - @rules/redirect-validation.md

オープンリダイレクト、検証されていないリダイレクト URL を確認します。

// Bad: Unvalidated redirect
let returnUrl = new URL(req.url).searchParams.get("return");
return Response.redirect(returnUrl);

// Good: Validate redirect URL
let returnUrl = new URL(req.url).searchParams.get("return");
let allowed = ["/dashboard", "/profile", "/settings"];
if (!allowed.includes(returnUrl)) {
  return Response.redirect("/");
}
設定とヘッダー(HIGH)
insecure-design - @rules/insecure-design.md

アーキテクチャにおけるセキュリティ上のアンチパターンを確認します。

// Bad: Security by obscurity
let isAdmin = req.headers.get("x-admin-secret") === "admin123";

// Good: Proper role-based access control
let session = await getSession(req);
let isAdmin = await db.user
  .findUnique({
    where: { id: session.userId },
  })
  .then((u) => u.role === "ADMIN");
security-misconfiguration - @rules/security-misconfiguration.md

デフォルト設定、デバッグモード、エラー処理を確認します。

// Bad: Exposing stack traces
catch (error) {
  return new Response(error.stack, { status: 500 });
}

// Good: Generic error message
catch (error) {
  console.error(error); // Log server-side only
  return new Response("Internal server error", { status: 500 });
}
security-headers - @rules/security-headers.md

CSP、HSTS、X-Frame-Options などを確認します。

// Bad: No security headers
return new Response(html);

// Good: Security headers set
return new Response(html, {
  headers: {
    "Content-Security-Policy": "default-src 'self'",
    "X-Frame-Options": "DENY",
    "X-Content-Type-Options": "nosniff",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
  },
});
cors-configuration - @rules/cors-configuration.md

過度に許可的な CORS 設定を確認します。

// Bad: Wildcard with credentials
headers.set("Access-Control-Allow-Origin", "*");
headers.set("Access-Control-Allow-Credentials", "true");

// Good: Specific origin
let allowedOrigins = ["https://app.example.com"];
let origin = req.headers.get("origin");
if (origin && allowedOrigins.includes(origin)) {
  headers.set("Access-Control-Allow-Origin", origin);
}
csrf-protection - @rules/csrf-protection.md

CSRF トークン、SameSite Cookie を確認します。

// Bad: No CSRF protection
let cookies = parseCookies(req.headers.get("cookie"));
let session = await getSession(cookies.sessionId);

// Good: SameSite cookie + token validation
return new Response("OK", {
  headers: {
    "Set-Cookie": "session=abc; SameSite=Strict; Secure; HttpOnly",
  },
});
session-security - @rules/session-security.md

Cookie フラグ、JWT の問題、トークンの保存方法を確認します。

// Bad: Insecure cookie
return new Response("OK", {
  headers: { "Set-Cookie": "session=abc123" },
});

// Good: Secure cookie with all flags
return new Response("OK", {
  headers: {
    "Set-Cookie":
      "session=abc123; Secure; HttpOnly; SameSite=Strict; Path=/; Max-Age=3600",
  },
});
API と監視(MEDIUM-HIGH)
api-security - @rules/api-security.md

REST API の脆弱性、マスアサインメントを確認します。

// Bad: Mass assignment vulnerability
let userData = await req.json();
await db.user.update({ where: { id }, data: userData });

// Good: Explicitly allow fields
let { displayName, bio } = await req.json();
await db.user.update({
  where: { id },
  data: { displayName, bio }, // Only allowed fields
});
rate-limiting - @rules/rate-limiting.md

レート制限の欠如、ブルートフォース攻撃の防止策を確認します。

// Bad: No rate limiting
async function login(req: Request): Promise<Response> {
  let { email, password } = await req.json();
  // Allows unlimited login attempts
}

// Good: Rate limiting
let ip = req.headers.get("x-forwarded-for");
let { success } = await ratelimit.limit(ip);
if (!success) {
  return new Response("Too many requests", { status: 429 });
}
logging-monitoring - @rules/logging-monitoring.md

不十分なロギング、ログ内の機密データを確認します。

// Bad: Logging sensitive data
console.log("User login:", { email, password, ssn });

// Good: Log events without sensitive data
console.log("User login attempt", {
  email,
  ip: req.headers.get("x-forwarded-for"),
  timestamp: new Date().toISOString(),
});
vulnerable-dependencies - @rules/vulnerable-dependencies.md

古くなったパッケージや既知の CVE を確認します。

# Bad: No dependency checking
npm install

# Good: Regular audits
npm audit
npm audit fix

よくある脆弱性のパターン

確認するパターンのクイックリファレンス:

  • 検証されていないユーザー入力:req.json() → 直ちに使用
  • 認証チェックの欠如:認可ミドルウェアのないルート
  • ハードコードされたシークレット:"password"、"secret"、"key" を含む文字列
  • SQL インジェクション:クエリ内での文字列連結
  • XSS:dangerouslySetInnerHTML、.innerHTML
  • 脆弱な暗号化:パスワードに md5、sha1 を使用
  • セキュリティヘッダーの欠如:CSP、HSTS、またはセキュリティヘッダーがない
  • CORS のワイルドカード:認証情報を使用している場合の Access-Control-Allow-Origin: *
  • 安全でない Cookie:Secure、HttpOnly、SameSite フラグがない
  • パストラバーサル:検証なしでファイルパスにユーザー入力を使用

重大度のクイックリファレンス

直ちに修正(CRITICAL):

  • SQL/XSS/コマンドインジェクション
  • 機密性の高いエンドポイントでの認証の欠如
  • コード内にハードコードされたシークレット
  • パスワードの平文保存
  • IDOR 脆弱性

早急に修正(HIGH):

  • CSRF 対策の欠如
  • 脆弱なパスワード要件
  • セキュリティヘッダーの欠如
  • 過度に寛容な CORS
  • 安全でないセッション管理

可能なときに修正(MEDIUM):

  • レート制限の欠如
  • 不完全なログ記録
  • 古くなった依存関係(既知のエクスプロイトなし)
  • 重要でないフィールドに対する入力検証の欠如

改善(LOW):

  • 任意のセキュリティヘッダーの欠如
  • 詳細すぎるエラーメッセージ(本番環境以外)
  • 最適ではない暗号化パラメーター

コメント