feat(security): block credentials from reaching the LLM via prompt secret scan
All checks were successful
Deploy to Production / deploy (push) Successful in 1m20s
All checks were successful
Deploy to Production / deploy (push) Successful in 1m20s
Prompts were sent to the model with no secret scan, so a pasted API key would leak to the LLM. Added findSecretInPrompt in @bmm/types (tight provider-key patterns: Anthropic/OpenAI/GitHub/AWS/Google/Slack/Stripe/JWT/private-key) shared by both sides. The web wizard blocks before sending with a clear message; the API preview and preview-stream endpoints reject with secret_in_prompt as the hard guarantee. Credential VALUES already never touched the model - they are entered in the separate encrypted step 2; this closes the remaining leak path where a user pastes a key into the prompt itself. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@ import { InstallSnippets } from '@/components/install-snippets';
|
||||
import { StreamingLogs } from '@/components/streaming-logs';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { apiFetch, apiSseStream } from '@/lib/api';
|
||||
import { findSecretInPrompt } from '@bmm/types';
|
||||
import { Loader2, RotateCcw, X } from 'lucide-react';
|
||||
import Link from 'next/link';
|
||||
import { useRouter, useSearchParams } from 'next/navigation';
|
||||
@@ -240,6 +241,16 @@ function NewServerPageInner() {
|
||||
setError('Name and slug are required.');
|
||||
return;
|
||||
}
|
||||
// Keep credentials out of the model: block a prompt that contains a real
|
||||
// key/token before it is ever sent. Credentials go in the encrypted fields
|
||||
// in the next step, never in the prompt.
|
||||
const leaked = findSecretInPrompt(prompt);
|
||||
if (leaked) {
|
||||
setError(
|
||||
`Looks like your prompt contains ${leaked}. Remove it — API keys must never go in the prompt (it is sent to the AI). You'll add credentials in their own encrypted fields in the next step.`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
setStep('analyzing');
|
||||
|
||||
// Streaming preview: pipes Anthropic's token deltas back as SSE. Cloudflare's
|
||||
|
||||
Reference in New Issue
Block a user