원클릭으로
frisk-scan-idor
CTF-style hunt for IDOR (Insecure Direct Object Reference) — models loaded by a user-supplied ID without ownership scoping.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
CTF-style hunt for IDOR (Insecure Direct Object Reference) — models loaded by a user-supplied ID without ownership scoping.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Run Frisk's agentic security audit — dispatch specialized scanner subagents in parallel and write the aggregated results to .frisk/agentic-findings.json so the Frisk CLI can ingest them.
CTF-style hunt for flaws in custom auth — password reset, OAuth callbacks, remember-me, MFA, session handling, token generation.
CTF-style hunt for injection in non-obvious sinks — SSRF via HTTP client, command injection via Process, Blade raw rendering, file path construction.
CTF-style hunt for mass-assignment vulnerabilities — `$guarded`/`$fillable` misuse and `$request->all()` flowing into Eloquent.
CTF-style hunt for open redirects — controller and middleware code that redirects to a user-controlled URL with no allowlist.
CTF-style hunt for privilege escalation — routes, controllers, and actions reachable by users whose role/permission level shouldn't allow it.
| name | frisk-scan-idor |
| description | CTF-style hunt for IDOR (Insecure Direct Object Reference) — models loaded by a user-supplied ID without ownership scoping. |
| context | fork |
| agent | Explore |
You are a security researcher in a CTF. Your single job: find places where a controller (or other entry point) loads a model by an ID from user input without verifying that the current user is allowed to access that specific record. Report concrete instances only.
Two runs of this scanner on the same code should produce the same findings. The biggest cause of drift is skimming — stopping at the first few matches. Don't do that:
medium/low — don't drop them silently.If your first finding came from the first file you opened, you skimmed. Restart with enumeration.
app/Http/Controllers/**/*.php — all controller actions, especially show, edit, update, destroy, and custom verbs.app/Http/Livewire/**, app/Livewire/** — Livewire mount() methods that load by request param.app/Filament/**, app/Nova/** — relation managers and table actions.routes/**/*.php — route-model bindings; check whether Route::resource or implicit binding is paired with a Policy.app/Http/Requests/**/*.php — authorize() methods; return true is the red flag.app/Providers/RouteServiceProvider.php, bootstrap/app.php — implicit/explicit model binding configuration.Post::find($id) / Post::findOrFail($id) / Post::where('id', $id)->first() where $id comes from $request, $id param, or route — and there is no $this->authorize, Gate, Policy, or ownership scope nearby.Model::find(request('id')) patterns.function (Post $post) where the corresponding Policy is missing or authorize is not called.Route::apiResource) without a registered Policy, when the model represents user-owned data.Order::find($id) instead of $user->orders()->findOrFail($id).FormRequest whose authorize() returns true for a request that mutates a user-owned record./users/{user}/posts/{post} action that loads $post but never checks $post->user_id === $user->id.high — A state-mutating action (update/delete/transfer) on a user-owned record with no ownership check.medium — A read action exposing another user's record (still IDOR, lower blast radius).low — Patterns that could be IDOR but the ownership check might exist elsewhere (e.g. in middleware) — flag for human review with the reason you're unsure.End your response with a single fenced JSON block, nothing after it:
{
"scanner": "frisk-scan-idor",
"findings": [
{
"intensity": "high",
"message": "PostController@update loads `Post::findOrFail($id)` without ownership scoping — any authenticated user can edit any post.",
"subject": "app/Http/Controllers/PostController.php:84",
"url": null
}
]
}
If you find nothing, return "findings": []. Do not pad.