심층 취약점 탐지
요청부터 데이터베이스까지 데이터 흐름을 추적해, 패턴 매칭 린터가 놓치는 인젝션, 접근 제어 결함, 시크릿 유출, SSRF, 로직 결함을 잡아냅니다. 모든 발견 사항은 CWE에 매핑됩니다.
사용자 검색의 SQL 인젝션
req.query.name이(가) 쿼리에 그대로 연결되어 누구나 users 테이블을 읽거나 삭제할 수 있습니다.
41 export async function search(req) {- 42 const q = `SELECT * FROM users WHERE name = '${req.query.name}'`;+ 42 const q = 'SELECT * FROM users WHERE name = $1';+ 43 return db.query(q, [req.query.name]);시니어 감사자의 깊이를, 머지 큐의 속도로.
요청부터 데이터베이스까지 데이터 흐름을 추적해, 패턴 매칭 린터가 놓치는 인젝션, 접근 제어 결함, 시크릿 유출, SSRF, 로직 결함을 잡아냅니다. 모든 발견 사항은 CWE에 매핑됩니다.
모든 발견 사항에는 실제 코드에 맞춘 구체적인 패치와 그 패치가 막는 공격 방식이 함께 제공됩니다. 강의가 아니라 diff를 검토하세요.
감사는 시니어 보안 감사자 지침에 따라 Claude Fable 5.1에서 실행됩니다. 근거를 인용하고, 실제 악용 가능성으로 심각도를 평가하며, 신뢰도를 솔직하게 밝힙니다.
근거 있는 위험 점수와, 몇 분 안에 조치할 수 있는 발견 사항.
acme/storefront · 샘플 리포트 · 예시 데이터
모든 발견 사항에 정확한 코드 줄, CWE 분류, 패치가 포함됩니다. 클릭해서 펼쳐 보세요.
lib/billing.ts:3
- const stripe = new Stripe("sk_live_51H…");
+ const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!); // and rotate the leaked key
app/api/invoices/[id]/route.ts:12
- const invoice = await db.invoice.findUnique({ where: { id } });
+ const invoice = await db.invoice.findFirst({ where: { id, userId: session.user.id } });
app/login/page.tsx:27
- router.push(searchParams.get('next') ?? '/');
+ router.push(safeRelativePath(searchParams.get('next')));