Claude Code के 7 सुरक्षा विफलता मामले | वास्तविक घटनाएं और बचाव
Claude Code के साथ हुई सात वास्तविक सुरक्षा घटनाएं: .env लीक, प्रोडक्शन DB डिलीट, बिलिंग विस्फोट और अधिक — कारण विश्लेषण और रोकथाम कोड के साथ।
“Claude Code उपयोगी है, लेकिन कुछ डरावना लगता है” — यह अनुभव बिल्कुल सही है। शक्तिशाली उपकरण शक्तिशाली दुर्घटनाएं पैदा करते हैं।
इस लेख में, Claude Code के साथ विकास करते समय हो सकने वाली सात वास्तविक सुरक्षा घटनाओं को कवर किया गया है, जिसमें वे क्यों हुईं और उन्हें कैसे रोकें — ठोस कोड और कॉन्फ़िगरेशन के साथ। दूसरों की गलतियों से सीखें इससे पहले कि वे आपकी अपनी बन जाएं।
मामला 1: .env फ़ाइल GitHub पर Push हो गई
क्या हुआ
एक डेवलपर ने Claude Code को निर्देश दिया: “मैं CI को environment variables पास करना चाहता हूं, कृपया .env फ़ाइल को भी commit करें।” Claude Code ने ईमानदारी से git add .env && git commit चलाया। GitHub पर push करने के कुछ मिनट बाद, एक crawler ने API key खोज ली। Slack पर notification आई: “Your API key has been exposed.”
कारण
.env.gitignoreमें नहीं था- Claude Code “इसे commit करो” निर्देशों को शाब्दिक रूप से निष्पादित करता है
- उपयोगकर्ता ने confirmation dialog बिना सोचे approve कर दिया
रोकथाम कोड
1. प्रोजेक्ट बनाते समय security setup को स्वचालित करें
# scripts/init-security.sh — हर बार प्रोजेक्ट बनाते समय चलाएं
#!/bin/bash
cat >> .gitignore << 'EOF'
# === Security: इन्हें कभी commit न करें ===
.env
.env.*
.env.local
!.env.example
*.pem
*.key
*-service-account.json
credentials.json
EOF
echo "✓ .gitignore में security exclusion patterns जोड़े गए"
git add .gitignore && git commit -m "security: add .gitignore patterns"
2. Hook के साथ commit से पहले scan करें
.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash(git add*)",
"hooks": [{
"type": "command",
"command": "git diff --cached --name-only | grep -E '^\\.env' && echo '🚨 आप .env फ़ाइल stage करने वाले हैं! रद्द करें!' && exit 1 || exit 0"
}]
}
]
}
}
3. Push हो जाने पर recovery
# Step 1: API key को तुरंत rotate करें (सर्वोच्च प्राथमिकता)
# Step 2: git history से पूरी तरह हटाएं
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch .env" \
--prune-empty --tag-name-filter cat -- --all
# Step 3: Remote पर force push करें
git push origin --force --all
# Step 4: GitHub cache साफ करें (GitHub Support से भी संपर्क करें)
मामला 2: Production DB पर DROP TABLE चला दिया
क्या हुआ
“यह table अब उपयोग नहीं है, कृपया इसे delete करें।” Claude Code ने DROP TABLE old_users; generate और execute किया। समस्या: यह production DATABASE_URL से connected था। सबसे हालिया backup तीन दिन पुराना था। तीन दिन का डेटा चला गया।
कारण
- Development और production दोनों में एक ही
.envshare हो रहा था - Claude Code environments के बीच अंतर नहीं कर सकता
- User का
askmode था लेकिन उसने reflexively “OK” click कर दिया
रोकथाम कोड
1. .env फ़ाइलों को environment के अनुसार पूरी तरह अलग करें
.env.development # ← local development, test DB
.env.staging # ← staging, production की copy
.env.production # ← production, manually managed, कभी share न करें
2. Scripts में environment check जोड़ें
// scripts/db-migrate.mjs
const env = process.env.APP_ENV ?? "development";
const dbUrl = process.env.DATABASE_URL ?? "";
if (env === "production") {
const readline = require("readline").createInterface({
input: process.stdin, output: process.stdout
});
await new Promise((resolve) => {
readline.question(
`⚠️ Production DB (${dbUrl.split("@")[1]}) से connect हो रहे हैं।\nक्या आप वाकई जारी रखना चाहते हैं? (yes टाइप करें): `,
(answer) => {
readline.close();
if (answer !== "yes") { console.log("रद्द किया गया।"); process.exit(0); }
resolve(undefined);
}
);
});
}
3. CLAUDE.md में production operations को प्रतिबंधित करें
## 🚨 Production Environment प्रतिबंध
यदि DATABASE_URL में `prod`, `production`, या `live` है:
- कभी भी DROP / TRUNCATE / DELETE (WHERE clause के बिना) execute न करें
- Migrations से पहले हमेशा user confirmation लें
- किसी भी destructive operation से पहले backup command प्रस्तुत करें
मामला 3: rm -rf से महत्वपूर्ण फ़ाइलें Delete हो गईं
क्या हुआ
“build/ directory को clean up करो” — path में टाइपो की वजह से rm -rf ./ बन गया, जिसने पूरा project delete कर दिया। Git के बाहर की फ़ाइलें (local config, uncommitted experimental code) हमेशा के लिए चली गईं।
कारण
rm -rfClaude Code के लिए सबसे खतरनाक commands में से एक है- Paths के आसपास double quotes नहीं थे → spaces वाले paths के साथ गलत व्यवहार
- User ने लापरवाही से approve कर दिया
रोकथाम कोड
// .claude/settings.json
{
"permissions": {
"deny": [
"Bash(rm -rf /)",
"Bash(rm -rf ~*)",
"Bash(rm -rf .*)"
],
"ask": [
"Bash(rm -rf*)"
]
}
}
Execute करने से पहले क्या delete होगा दिखाने के लिए Hook:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash(rm*)",
"hooks": [{
"type": "command",
"command": "echo '⚠️ Delete command detect हुआ। 5 सेकंड में execute होगा। रद्द करने के लिए Ctrl+C दबाएं।' && sleep 5"
}]
}
]
}
}
मामला 4: API Key Prompt में सीधे लिखकर Subagent को दे दी
क्या हुआ
“कृपया QIITA_TOKEN=abc123def456 का उपयोग करके Qiita पर post करें” — सीधे prompt में लिखकर subagent को delegate किया। Subagents logs और memory में content लिख सकते हैं, और token .claude/ के नीचे एक log file में persist हो गया।
कारण
- Prompts conversation history के रूप में retain होते हैं
- Subagent prompts भी equally log होते हैं
- Local environments में भी, other processes या backups secrets expose कर सकते हैं
रोकथाम कोड
कभी भी secrets को prompts में न लिखें — environment variables के माध्यम से पास करें
# ❌ खतरनाक
claude -p "QIITA_TOKEN=abc123 का उपयोग करके qiita-publish.mjs चलाएं"
# ✅ सुरक्षित: script process.env से पढ़ती है
# .env में QIITA_TOKEN=abc123 लिखें, फिर
claude -p "scripts/qiita-publish.mjs चलाएं (token .env से automatically पढ़ा जाएगा)"
Subagent निर्देशों के लिए भी यही सिद्धांत
// ❌ खतरनाक
Agent({ prompt: `API key ${process.env.SECRET_KEY} का उपयोग करके...` });
// ✅ सुरक्षित: केवल key का नाम पास करें, script value पढ़ेगी
Agent({ prompt: "SECRET_KEY environment variable का उपयोग करके..." });
मामला 5: Infinite API Retry Loop ने Bill विस्फोट किया
क्या हुआ
“Error आने पर automatically retry करो” — error handling के साथ script generate हुई। जब एक error अनसुलझी रही, retries कभी नहीं रुके: एक घंटे में 3,000 Anthropic API calls, जिसके परिणामस्वरूप $200 का बिल आया।
कारण
- कोई retry limit set नहीं किया
- कोई exponential backoff नहीं — 1 सेकंड के intervals पर infinite loop
- कोई billing alert configure नहीं था
रोकथाम कोड
// utils/retry.ts — सुरक्षित retry utility
export async function withRetry<T>(
fn: () => Promise<T>,
options = { maxAttempts: 3, baseDelayMs: 1000, maxDelayMs: 30000 }
): Promise<T> {
let lastError: Error;
for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {
try {
return await fn();
} catch (err) {
lastError = err as Error;
if (attempt === options.maxAttempts) break;
// Exponential backoff + jitter
const delay = Math.min(
options.baseDelayMs * Math.pow(2, attempt - 1) + Math.random() * 1000,
options.maxDelayMs
);
console.warn(`Attempt ${attempt}/${options.maxAttempts} failed: ${err.message}`);
console.warn(`Retrying in ${Math.round(delay / 1000)}s...`);
await new Promise((r) => setTimeout(r, delay));
}
}
throw new Error(`${options.maxAttempts} attempts के बाद भी failed: ${lastError!.message}`);
}
CLAUDE.md में specify करें:
## API Calls के लिए अनिवार्य नियम
- Maximum 3 retries
- हमेशा exponential backoff implement करें (1s → 2s → 4s)
- कभी infinite loops न बनाएं: while(true) + API calls forbidden हैं
मामला 6: git push --force से Colleague के Commits मिट गए
क्या हुआ
“Local state से remote को overwrite करो” — git push --force execute हुआ। एक team member ने जो 3 commits अभी-अभी push किए थे वे चले गए। उस member के पास changes की कोई local copy भी नहीं थी — code हमेशा के लिए खो गया।
कारण
--forceको खतरे की समझ के बिना execute किया जाता है- Claude Code “remote को overwrite करो” निर्देशों को ईमानदारी से execute करता है
- Developer सुरक्षित alternative
git push --force-with-leaseसे अनजान था
रोकथाम कोड
// .claude/settings.json
{
"permissions": {
"deny": [
"Bash(git push --force *master*)",
"Bash(git push --force *main*)",
"Bash(git push -f *master*)",
"Bash(git push -f *main*)"
]
}
}
CLAUDE.md में safe alternative specify करें:
## Safe Git नियम
- `git push --force` **वर्जित** है
- इसके बजाय `git push --force-with-lease` उपयोग करें
(अगर दूसरों ने changes push किए हैं तो automatically reject होगा)
- main/master पर directly push करने से पहले हमेशा user confirmation लें
मामला 7: Over-Privileged Service Account ने सभी Resources तक Access किया
क्या हुआ
“Cloud Storage operate करने के लिए इस GCP service account key का उपयोग करो।” Service account के पास Owner permissions थे। Claude Code ने Cloud Storage के अलावा BigQuery, Cloud SQL और GKE clusters से भी “investigate करने के लिए” connect किया — जिससे unexpected charges आए।
कारण
- Service account के पास excessive permissions थे (least-privilege principle का उल्लंघन)
- Claude Code available tools को aggressively use करने की प्रवृत्ति रखता है
- “Investigate करने के लिए” भी broad access के लिए legitimate कारण की तरह लगता है
रोकथाम कोड
Minimum-privilege service account बनाएं:
# ❌ बचें: Owner permission
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:[email protected]" \
--role="roles/owner"
# ✅ केवल minimum required permissions
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:[email protected]" \
--role="roles/storage.objectAdmin"
# ← केवल Cloud Storage पर read/write
CLAUDE.md में access scope explicitly define करें:
## GCP Access Restrictions
इस project में use होने वाले service account की permissions:
- Cloud Storage: Read/Write OK (bucket: my-project-assets only)
- BigQuery: Forbidden
- Cloud SQL: Forbidden
- अन्य GCP resources: Forbidden
इन permissions के बाहर resources तक access करने वाले किसी भी instruction को refuse करें।
Incidents रोकने की व्यापक Checklist
सातों मामलों के common patterns से distilled एक final checklist।
### आज करने योग्य Settings (30 मिनट)
- [ ] .gitignore में .env pattern जोड़ें
- [ ] .claude/settings.json में deny list जोड़ें (rm -rf, git push --force, DROP TABLE)
- [ ] CLAUDE.md में restrictions document करें
### साप्ताहिक Checks
- [ ] अनजाने file commits के लिए git log review करें
- [ ] Verify करें कि .env .gitignore से exclude है: `git check-ignore -v .env`
- [ ] API key rotation deadlines check करें
### Incident पर पहली प्रतिक्रिया
1. Affected API key को तुरंत revoke और rotate करें
2. Git history से हटाएं (filter-branch या BFG)
3. Breach के scope को determine करने के लिए access logs review करें
4. Stakeholders को situation report करें
सारांश
Claude Code incidents “AI के बेकाबू होने” से शायद ही कभी होते हैं — लगभग सभी मनुष्यों द्वारा security configuration को टालने से उत्पन्न होते हैं।
| मामला | मूल कारण | बचाव |
|---|---|---|
| .env leak | कोई gitignore नहीं | init script + Hook |
| Production DB deletion | कोई environment separation नहीं | .env अलग + confirmation flow |
| rm -rf accident | कोई deny list नहीं | settings.json configure करें |
| Key leak | Prompt में लिखा | Env vars पर standardize करें |
| Billing explosion | कोई retry limit नहीं | withRetry utility |
| Force push | कोई prohibition setting नहीं | deny + force-with-lease |
| Over-privileged access | Least-privilege violation | IAM roles restrict करें |
आज आपका पहला कदम: .claude/settings.json में "deny": ["Bash(rm -rf*)"] जोड़ना अकेले ही सबसे destructive accidents में से एक को रोक सकता है।
संबंधित लेख
- Claude Code Security Best Practices की पूरी गाइड
- Claude Code Permissions की पूरी गाइड
- CLAUDE.md Best Practices
संदर्भ
अपने Claude Code वर्कफ़्लो को अगले स्तर पर ले जाएँ
Claude Code में तुरंत कॉपी-पेस्ट करने योग्य 50 आज़माए हुए प्रॉम्प्ट टेम्पलेट।
मुफ़्त PDF: 5 मिनट में Claude Code चीटशीट
बस अपना ईमेल दर्ज करें और हम तुरंत A4 एक-पृष्ठ चीटशीट PDF भेज देंगे।
हम आपकी व्यक्तिगत जानकारी की सुरक्षा करते हैं और स्पैम नहीं भेजते।
लेखक के बारे में
Masa
Claude Code का गहराई से उपयोग करने वाले इंजीनियर। claudecode-lab.com चलाते हैं, जो 10 भाषाओं में 2,000 से अधिक पेजों वाला टेक मीडिया है।
संबंधित लेख
Claude Code सुरक्षा सर्वोत्तम प्रथाएं: API कुंजी, अनुमतियां और प्रोडक्शन सुरक्षा
Claude Code को सुरक्षित रूप से उपयोग करने के लिए व्यावहारिक सुरक्षा मार्गदर्शिका। API कुंजी प्रबंधन से लेकर अनुमति सेटिंग्स, Hooks-आधारित स्वचालन और प्रोडक्शन परिवेश सुरक्षा तक — कार्यशील कोड उदाहरणों के साथ।
Claude Code परमिशन की सम्पूर्ण गाइड | settings.json, Hooks और Allowlist की विस्तृत व्याख्या
Claude Code की परमिशन सेटिंग्स की पूरी जानकारी। allow/deny/ask का सही उपयोग, Hooks से ऑटोमेशन, एनवायरनमेंट के अनुसार settings.json और व्यावहारिक पैटर्न — काम करने वाले कोड के साथ।
हार्नेस इंजीनियरिंग की संपूर्ण गाइड | Claude Code से सीखें AI एजेंट बनाना
सिर्फ़ प्रॉम्प्ट से LLM नहीं संभलता। टूल, कॉन्टेक्स्ट और कंट्रोल लूप को जोड़ने वाले 'हार्नेस' को चलते कोड और Claude Code की वास्तुकला के सहारे समझें।