clerk-auth
Clerkの認証実装・ミドルウェア・組織管理・Webhook・ユーザー同期に関するベストプラクティスを提供するスキルです。Clerkを使った認証フローの構築や設定で迷ったときに活用できます。
description の原文を見る
Expert patterns for Clerk auth implementation, middleware, organizations, webhooks, and user sync
SKILL.md 本文
Clerk Authentication
Clerk認証実装、ミドルウェア、組織、ウェブフック、ユーザー同期のエキスパートパターン
Patterns
Next.js App Router Setup
Next.js 14/15 App Router向けの完全なClerk設定。
ClerkProvider、環境変数、基本的なサインイン/サインアップコンポーネントが含まれます。
主要なコンポーネント:
- ClerkProvider: アプリをラップして認証コンテキストを提供
- <SignIn />、<SignUp />: 事前構築された認証フォーム
- <UserButton />: セッション管理用のユーザーメニュー
Code_example
# 環境変数 (.env.local)
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/onboarding
// app/layout.tsx
import { ClerkProvider } from '@clerk/nextjs';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<ClerkProvider>
<html lang="en">
<body>{children}</body>
</html>
</ClerkProvider>
);
}
// app/sign-in/[[...sign-in]]/page.tsx
import { SignIn } from '@clerk/nextjs';
export default function SignInPage() {
return (
<div className="flex justify-center items-center min-h-screen">
<SignIn />
</div>
);
}
// app/sign-up/[[...sign-up]]/page.tsx
import { SignUp } from '@clerk/nextjs';
export default function SignUpPage() {
return (
<div className="flex justify-center items-center min-h-screen">
<SignUp />
</div>
);
}
// components/Header.tsx
import { SignedIn, SignedOut, SignInButton, UserButton } from '@clerk/nextjs';
export function Header() {
return (
<header className="flex justify-between p-4">
<h1>My App</h1>
<SignedOut>
<SignInButton />
</SignedOut>
<SignedIn>
<UserButton afterSignOutUrl="/" />
</SignedIn>
</header>
);
}
Anti_patterns
- Pattern: ページコンポーネント内のClerkProvider | 理由: Providerはルートレイアウトで全体をラップする必要がある | 修正: ClerkProviderをapp/layout.tsxに移動
- Pattern: ミドルウェアなしでauth()を使用 | 理由: auth()はclerkMiddlewareの設定が必要 | 修正: clerkMiddlewareを含むmiddleware.tsをセットアップ
References
Middleware Route Protection
clerkMiddlewareとcreateRouteMatcherを使用してルートを保護します。
ベストプラクティス:
- プロジェクトルートに単一のmiddleware.tsファイル
- ルートグループ向けにcreateRouteMatcherを使用
- 明示的な保護にはauth.protect()を使用
- 全認証ロジックをミドルウェアに集約
Code_example
// middleware.ts
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
// 保護されたルートパターンを定義
const isProtectedRoute = createRouteMatcher([
'/dashboard(.*)',
'/settings(.*)',
'/api/private(.*)',
]);
// パブリックルートを定義(オプション、明確性のため)
const isPublicRoute = createRouteMatcher([
'/',
'/sign-in(.*)',
'/sign-up(.*)',
'/api/webhooks(.*)',
]);
export default clerkMiddleware(async (auth, req) => {
// マッチしたルートを保護
if (isProtectedRoute(req)) {
await auth.protect();
}
});
export const config = {
matcher: [
// 静的ファイルを除いた全ルートをマッチ
'/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
// APIルートは常に実行
'/(api|trpc)(.*)',
],
};
// 高度な使用: ロールベースの保護
export default clerkMiddleware(async (auth, req) => {
if (isProtectedRoute(req)) {
await auth.protect();
}
// 管理ルートには管理者ロールが必要
if (req.nextUrl.pathname.startsWith('/admin')) {
await auth.protect({
role: 'org:admin',
});
}
// プレミアムルートはプレミアム権限が必要
if (req.nextUrl.pathname.startsWith('/premium')) {
await auth.protect({
permission: 'org:premium:access',
});
}
});
Anti_patterns
- Pattern: 複数のmiddleware.tsファイル | 理由: 競合とリダイレクトループを引き起こす | 修正: ルートマッチャーを使用して単一のmiddleware.tsを使う
- Pattern: コンポーネント内での手動リダイレクト | 理由: 二重リダイレクト、ルートの見落とし | 修正: 全リダイレクトをミドルウェアで処理
- Pattern: matcherの設定が不足 | 理由: ミドルウェアが全ルートで実行されない | 修正: 包括的なmatcherパターンを追加
References
Server Component Authentication
Server Componentsでauth()とcurrentUser()を使用して認証状態にアクセスします。
主要な関数:
- auth(): userId、sessionId、orgId、claimsを返す
- currentUser(): 完全なUserオブジェクトを返す
- 両方ともclerkMiddlewareが設定されている必要がある
Code_example
// app/dashboard/page.tsx (Server Component)
import { auth, currentUser } from '@clerk/nextjs/server';
import { redirect } from 'next/navigation';
export default async function DashboardPage() {
const { userId } = await auth();
if (!userId) {
redirect('/sign-in');
}
// 完全なユーザーデータ(レート制限にカウント)
const user = await currentUser();
return (
<div>
<h1>Welcome, {user?.firstName}!</h1>
<p>Email: {user?.emailAddresses[0]?.emailAddress}</p>
</div>
);
}
// 簡単なチェック向けにauth()を使用
export default async function ProtectedLayout({
children,
}: {
children: React.ReactNode;
}) {
const { userId, orgId, orgRole } = await auth();
if (!userId) {
redirect('/sign-in');
}
// 組織アクセスをチェック
if (!orgId) {
redirect('/select-org');
}
return (
<div>
<p>Organization Role: {orgRole}</p>
{children}
</div>
);
}
// 認証チェック付きServer Action
// app/actions/posts.ts
'use server';
import { auth } from '@clerk/nextjs/server';
export async function createPost(formData: FormData) {
const { userId } = await auth();
if (!userId) {
throw new Error('Unauthorized');
}
const title = formData.get('title') as string;
// userIdを含めてポストを作成
const post = await prisma.post.create({
data: {
title,
authorId: userId,
},
});
return post;
}
Anti_patterns
- Pattern: auth()をawaitしない | 理由: App Routerではauth()は非同期 | 修正: await auth()またはconst { userId } = await auth()を使用
- Pattern: 簡単なチェック向けにcurrentUser()を使用 | 理由: レート制限にカウント、auth()より遅い | 修正: userIdチェックはauth()を、ユーザーデータはcurrentUser()を使用
References
Client Component Hooks
フックを使用してClient Componentsの認証状態にアクセスします。
主要なフック:
- useUser(): ユーザーオブジェクトとローディング状態
- useAuth(): 認証状態、signOutなど
- useSession(): Sessionオブジェクト
- useOrganization(): 現在の組織
Code_example
// components/UserProfile.tsx
'use client';
import { useUser, useAuth } from '@clerk/nextjs';
export function UserProfile() {
const { user, isLoaded, isSignedIn } = useUser();
const { signOut } = useAuth();
if (!isLoaded) {
return <div>Loading...</div>;
}
if (!isSignedIn) {
return <div>Not signed in</div>;
}
return (
<div>
<img src={user.imageUrl} alt={user.fullName ?? ''} />
<h2>{user.fullName}</h2>
<p>{user.emailAddresses[0]?.emailAddress}</p>
<button onClick={() => signOut()}>Sign Out</button>
</div>
);
}
// 組織コンテキスト
'use client';
import { useOrganization, useOrganizationList } from '@clerk/nextjs';
export function OrgSwitcher() {
const { organization, membership } = useOrganization();
const { setActive, userMemberships } = useOrganizationList({
userMemberships: { infinite: true },
});
if (!organization) {
return <p>No organization selected</p>;
}
return (
<div>
<p>Current: {organization.name}</p>
<p>Role: {membership?.role}</p>
<select
onChange={(e) => setActive?.({ organization: e.target.value })}
value={organization.id}
>
{userMemberships.data?.map((mem) => (
<option key={mem.organization.id} value={mem.organization.id}>
{mem.organization.name}
</option>
))}
</select>
</div>
);
}
// 保護されたクライアントコンポーネント
'use client';
import { useAuth } from '@clerk/nextjs';
import { useRouter } from 'next/navigation';
import { useEffect } from 'react';
export function ProtectedContent() {
const { isLoaded, userId } = useAuth();
const router = useRouter();
useEffect(() => {
if (isLoaded && !userId) {
router.push('/sign-in');
}
}, [isLoaded, userId, router]);
if (!isLoaded || !userId) {
return <div>Loading...</div>;
}
return <div>Protected content here</div>;
}
Anti_patterns
- Pattern: isLoadedをチェックしない | 理由: ハイドレーション中に認証状態が未定義 | 修正: ユーザー/認証状態へのアクセス前に常にisLoadedをチェック
- Pattern: Server Componentsでフックを使用 | 理由: フックはClient Componentsでのみ動作 | 修正: Server ComponentsではuseAuth()とcurrentUser()を使用
References
Organizations and Multi-Tenancy
Clerk Organizationsを使用してB2Bマルチテナンシーを実装します。
機能:
- ユーザーあたり複数の組織
- ロールと権限
- 組織スコープのデータ
- 組織ごとのエンタープライズSSO
Code_example
// 組織作成UI
// app/create-org/page.tsx
import { CreateOrganization } from '@clerk/nextjs';
export default function CreateOrgPage() {
return (
<div className="flex justify-center">
<CreateOrganization afterCreateOrganizationUrl="/dashboard" />
</div>
);
}
// 組織プロファイルと管理
// app/org-settings/page.tsx
import { OrganizationProfile } from '@clerk/nextjs';
export default function OrgSettingsPage() {
return <OrganizationProfile />;
}
// ヘッダーの組織スイッチャー
// components/Header.tsx
import { OrganizationSwitcher, UserButton } from '@clerk/nextjs';
export function Header() {
return (
<header className="flex justify-between p-4">
<OrganizationSwitcher
hidePersonal
afterCreateOrganizationUrl="/dashboard"
afterSelectOrganizationUrl="/dashboard"
/>
<UserButton />
</header>
);
}
// 組織スコープのデータアクセス
// app/dashboard/page.tsx
import { auth } from '@clerk/nextjs/server';
import { prisma } from '@/lib/prisma';
export default async function DashboardPage() {
const { orgId } = await auth();
if (!orgId) {
redirect('/select-org');
}
// 組織スコープのデータを取得
const projects = await prisma.project.findMany({
where: { organizationId: orgId },
});
return (
<div>
<h1>Projects</h1>
{projects.map((p) => (
<div key={p.id}>{p.name}</div>
))}
</div>
);
}
// ロールベースUI
'use client';
import { useOrganization, Protect } from '@clerk/nextjs';
export function AdminPanel() {
const { membership } = useOrganization();
// Protectコンポーネントを使用
return (
<Protect role="org:admin" fallback={<p>Admin access required</p>}>
<div>Admin content here</div>
</Protect>
);
// または手動チェック
if (membership?.role !== 'org:admin') {
return <p>Admin access required</p>;
}
return <div>Admin content here</div>;
}
Anti_patterns
- Pattern: orgIdでデータをスコープしない | 理由: 組織間でデータが漏洩 | 修正: 常にauth()からのorgIdでクエリをフィルタリング
- Pattern: ロール文字列をハードコード | 理由: タイポでアクセス問題が発生 | 修正: ロール定数を定義またはTypeScript enumを使用
References
- https://clerk.com/docs/guides/organizations
- https://clerk.com/articles/multi-tenancy-in-react-applications-guide
Webhook User Sync
ウェブフックを使用してClerkユーザーをデータベースに同期します。
主要なウェブフック:
- user.created: 新しいユーザーがサインアップ
- user.updated: ユーザープロファイルが変更
- user.deleted: ユーザーがアカウントを削除
署名検証にはsvixを使用します。
Code_example
// app/api/webhooks/clerk/route.ts
import { Webhook } from 'svix';
import { headers } from 'next/headers';
import { WebhookEvent } from '@clerk/nextjs/server';
import { prisma } from '@/lib/prisma';
export async function POST(req: Request) {
const WEBHOOK_SECRET = process.env.CLERK_WEBHOOK_SECRET;
if (!WEBHOOK_SECRET) {
throw new Error('Missing CLERK_WEBHOOK_SECRET');
}
// ヘッダーを取得
const headerPayload = await headers();
const svix_id = headerPayload.get('svix-id');
const svix_timestamp = headerPayload.get('svix-timestamp');
const svix_signature = headerPayload.get('svix-signature');
if (!svix_id || !svix_timestamp || !svix_signature) {
return new Response('Missing svix headers', { status: 400 });
}
// ボディを取得
const payload = await req.json();
const body = JSON.stringify(payload);
// ウェブフックを検証
const wh = new Webhook(WEBHOOK_SECRET);
let evt: WebhookEvent;
try {
evt = wh.verify(body, {
'svix-id': svix_id,
'svix-timestamp': svix_timestamp,
'svix-signature': svix_signature,
}) as WebhookEvent;
} catch (err) {
console.error('Webhook verification failed:', err);
return new Response('Verification failed', { status: 400 });
}
// イベントを処理
const eventType = evt.type;
if (eventType === 'user.created') {
const { id, email_addresses, first_name, last_name, image_url } = evt.data;
await prisma.user.create({
data: {
clerkId: id,
email: email_addresses[0]?.email_address,
firstName: first_name,
lastName: last_name,
imageUrl: image_url,
},
});
}
if (eventType === 'user.updated') {
const { id, email_addresses, first_name, last_name, image_url } = evt.data;
await prisma.user.update({
where: { clerkId: id },
data: {
email: email_addresses[0]?.email_address,
firstName: first_name,
lastName: last_name,
imageUrl: image_url,
},
});
}
if (eventType === 'user.deleted') {
const { id } = evt.data;
await prisma.user.delete({
where: { clerkId: id! },
});
}
return new Response('Webhook processed', { status: 200 });
}
// Prismaスキーマ
// prisma/schema.prisma
model User {
id String @id @default(cuid())
clerkId String @unique
email String @unique
firstName String?
lastName String?
imageUrl String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
posts Post[]
@@index([clerkId])
}
Anti_patterns
- Pattern: ウェブフック署名を検証しない | 理由: 誰でも偽データを含むエンドポイントをヒットできる | 修正: svixで常に検証
- Pattern: ウェブフックルートをミドルウェアでブロック | 理由: ウェブフックはClerkから来ており、認証されたユーザーではない | 修正: /api/webhooks(.*)' をパブリックルートに追加
- Pattern: レース条件を処理しない | 理由: user.createdがuser.updatedの後に到達する可能性がある | 修正: createではなくupsertを使用、見落とされたレコードを処理
References
- https://clerk.com/docs/webhooks/sync-data
- https://clerk.com/articles/how-to-sync-clerk-user-data-to-your-database
API Route Protection
Clerkのauth()を使用してAPIルートを保護します。
App RouterのRoute HandlersはauthのCharts()を使用して認証します。 ミドルウェアは初期保護を提供し、auth()はハンドラー内の検証を提供します。
Code_example
// app/api/projects/route.ts
import { auth } from '@clerk/nextjs/server';
import { prisma } from '@/lib/prisma';
import { NextResponse } from 'next/server';
export async function GET() {
const { userId, orgId } = await auth();
if (!userId) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
// ユーザーのパーソナルプロジェクトまたは組織プロジェクト
const projects = await prisma.project.findMany({
where: orgId
? { organizationId: orgId }
: { userId, organizationId: null },
});
return NextResponse.json(projects);
}
export async function POST(req: Request) {
const { userId, orgId } = await auth();
if (!userId) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const body = await req.json();
const project = await prisma.project.create({
data: {
name: body.name,
userId,
organizationId: orgId ?? null,
},
});
return NextResponse.json(project, { status: 201 });
}
// ロールチェック付きで保護
// app/api/admin/users/route.ts
export async function GET() {
const { userId, orgRole } = await auth();
if (!userId) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
if (orgRole !== 'org:admin') {
return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
}
// 管理者のみロジック
const users = await prisma.user.findMany();
return NextResponse.json(users);
}
// 古いパターンではgetAuthを使用(推奨されません)
// 後方互換性のみ
import { getAuth } from '@clerk/nextjs/server';
export async function GET(req: Request) {
const { userId } = getAuth(req);
// ...
}
Anti_patterns
- Pattern: ミドルウェアのみを信頼 | 理由: ミドルウェアはバイパス可能(CVE-2025-29927) | 修正: ルートハンドラーでも常に認証を検証
- Pattern: マルチテナント向けにorgIdをチェックしない | 理由: ユーザーが他の組織のデータにアクセスする可能性 | 修正: 常にauth()からのorgIdでフィルタリング
References
Sharp Edges
CVE-2025-29927 Middleware Bypass Vulnerability
Severity: CRITICAL
Multiple Middleware Files Cause Conflicts
Severity: HIGH
4KB Session Token Cookie Limit
Severity: HIGH
auth() Requires clerkMiddleware Configuration
Severity: HIGH
Webhook Race Conditions
Severity: MEDIUM
auth() is Async in App Router
Severity: MEDIUM
Middleware Blocks Webhook Endpoints
Severity: MEDIUM
Accessing Auth State Before isLoaded
Severity: MEDIUM
Manual Redirects Cause Double Redirects
Severity: MEDIUM
Organization Data Not Scoped by orgId
Severity: HIGH
Validation Checks
Clerk Secret Key in Client Code
Severity: ERROR
CLERK_SECRET_KEYはサーバーサイドのみで使用する必要があります
Message: Clerk秘密鍵がクライアントに露出しています。NEXT_PUBLIC接頭辞なしでCLERK_SECRET_KEYを使用してください。
Protected Route Without Middleware
Severity: ERROR
APIルートはミドルウェア保護が必要です
Message: ミドルウェア保護なしのAPIルート。ミドルウェア保護またはauth()チェックを追加してください。
Hardcoded Clerk API Keys
Severity: ERROR
Clerk鍵は環境変数を使用する必要があります
Message: Clerkキーがハードコードされています。環境変数を使用してください。
Missing Await on auth()
Severity: ERROR
App Routerではauth()は非同期で、awaitが必須です
Message: auth()がawaitされていません。App Routerで'await auth()'を使用してください。
Multiple Middleware Files
Severity: WARNING
1つのmiddleware.tsファイルのみが存在する必要があります
Message: 複数のミドルウェアファイルが検出されました。単一のmiddleware.tsを使用してください。
Webhook Route Not Excluded from Protection
Severity: WARNING
ウェブフックルートはパブリックである必要があります
Message: ウェブフックルートがミドルウェアでブロックされている可能性があります。パブリックルートに追加してください。
Accessing Auth Without isLoaded Check
Severity: WARNING
クライアントコンポーネントでユーザー状態にアクセスする前にisLoadedをチェック
Message: isLoadedチェックなしでユーザーにアクセスしています。最初にisLoadedをチェックしてください。
Clerk Hooks in Server Component
Severity: ERROR
Clerkフックはクライアントコンポーネントでのみ動作します
Message: Server ComponentでClerkフック。'use client'を追加するか、auth()を使用してください。
Multi-Tenant Query Without orgId
Severity: WARNING
組織データはorgIdでスコープされる必要があります
Message: 組織スコープなしのクエリ。マルチテナンシー向けにorgIdでフィルタリングしてください。
Webhook Without Signature Verification
Severity: ERROR
Clerkウェブフックはsvix署名を検証する必要があります
Message: 署名検証なしウェブフック。svixで検証してください。
Collaboration
Delegation Triggers
- ユーザーがデータベースを必要とする -> postgres-wizard (clerkIdを含むUserテーブル)
- ユーザーが支払いを必要とする -> stripe-integration (Clerkユーザーにリンクされた顧客)
- ユーザーが検索を必要とする -> algolia-search (ユーザーあたりのセキュアAPIキー)
- ユーザーがアナリティクスを必要とする -> segment-cdp (ユーザー識別)
- ユーザーがメール送信を必要とする -> resend-email (トランザクションメール)
When to Use
- ユーザーが以下を述べるまたは暗に示す場合: 認証を追加
- ユーザーが以下を述べるまたは暗に示す場合: clerk認証
- ユーザーが以下を述べるまたは暗に示す場合: ユーザー認証
- ユーザーが以下を述べるまたは暗に示す場合: サインイン
- ユーザーが以下を述べるまたは暗に示す場合: サインアップ
- ユーザーが以下を述べるまたは暗に示す場合: ユーザー管理
- ユーザーが以下を述べるまたは暗に示す場合: マルチテナンシー
- ユーザーが以下を述べるまたは暗に示す場合: 組織
- ユーザーが以下を述べるまたは暗に示す場合: SSO
- ユーザーが以下を述べるまたは暗に示す場合: シングルサインオン
Limitations
- 上記で説明されたスコープに明確に一致するタスクでのみこのスキルを使用してください。
- 出力を環境固有の検証、テスト、またはエキスパートレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全境界、成功基準が不足している場合は、一度立ち止まって明確化を求めてください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- sickn33
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/sickn33/antigravity-awesome-skills / ライセンス: MIT
関連スキル
secure-code-guardian
認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。
claude-authenticity
APIエンドポイントが本物のClaudeによって支えられているか(ラッパーやプロキシ、偽装ではないか)を、claude-verifyプロジェクトを模した9つの重み付きルールベースチェックで検証できます。また、Claudeの正体を上書きしているプロバイダーから注入されたシステムプロンプトも抽出します。完全に自己完結しており、httpx以外の追加パッケージは不要です。Claude APIキーまたはエンドポイントを検証したい場合、サードパーティのClaudeサービスが本物か確認したい場合、APIプロバイダーのClaude正当性を監査したい場合、複数モデルを並行してテストしたい場合、またはプロバイダーが注入したシステムプロンプトを特定したい場合に使用できます。
anth-security-basics
Anthropic Claude APIのセキュリティベストプラクティスを適用し、キー管理、入力値の検証、プロンプトインジェクション対策を実施します。APIキーの保護、Claudeに送信する前のユーザー入力検証、コンテンツセーフティガードレールの実装が必要な場合に活用できます。「anthropic security」「claude api key security」「secure anthropic」「prompt injection defense」といったフレーズでトリガーされます。
x-ray
x-ray.mdプレ監査レポートを生成します。概要、強化された脅威モデル(プロトコルタイプのプロファイリング、Gitの重み付け攻撃面分析、時間軸リスク分析、コンポーザビリティ依存関係マッピング)、不変条件、統合、ドキュメント品質、テスト分析、開発者・Gitの履歴をカバーしています。「x-ray」「audit readiness」「readiness report」「pre-audit report」「prep this protocol」「protocol prep」「summarize this protocol」のキーワードで実行されます。
semgrep
Semgrepスタティック分析スキャンを実行し、カスタム検出ルールを作成します。Semgrepでのコードスキャン、セキュリティ脆弱性の検出、カスタムYAMLルールの作成、または特定のバグパターンの検出が必要な場合に使用します。重要:ユーザーが「バグをスキャンしたい」「コード品質を確認したい」「脆弱性を見つけたい」「スタティック分析」「セキュリティlint」「コード監査」または「コーディング標準を適用したい」と尋ねた場合も、Semgrepという名称を明記していなくても、このスキルを使用してください。Semgrepは30以上の言語に対応したパターンベースのコードスキャンに最適なツールです。
ghost-bits-cast-attack
Java「ゴーストビッツ」/キャストアタック プレイブック(Black Hat Asia 2026)。16ビット文字が8ビットバイトに暗黙的に縮小されるJavaサービスへの攻撃時に使用します。WAF/IDSを回避して、SQLインジェクション、デシリアライゼーション型RCE、ファイルアップロード(Webシェル)、パストトラバーサル、CRLF インジェクション、リクエストスマグリング、SMTPインジェクションを実行できます。Tomcat、Spring、Jetty、Undertow、Vert.x、Jackson、Fastjson、Apache Commons BCEL、Apache HttpClient、Angus Mail、JDK HttpServer、Lettuce、Jodd、XMLWriterに影響し、WAFバイパスにより多くの「パッチ済み」CVEを再度有効化します。