Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the diff adds or moves a credential, logs or returns data, builds a URL or argv with a token, generates a random value, encrypts, signs, hashes, configures TLS or writes a credential file
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
A committed secret is leaked the moment the branch is pushed; deleting it in a later commit does not un-leak it. Crypto bugs are the opposite: invisible in behaviour, obvious in the parameters. Both are found by reading values, not flows.
Core principle: secrets live only in the secret store and in memory; crypto parameters are chosen by the library's safe default, never hand-assembled.
Recognisable shapes: AKIA…/ASIA… (AWS), ghp_/github_pat_/gho_ (GitHub), xoxb-/xoxp- (Slack), sk_live_/rk_live_ (Stripe), -----BEGIN … PRIVATE KEY-----, a GCP service-account JSON ("type": "service_account"), a database URL with a password, a JWT signing secret, a committed .env, kubeconfig, .npmrc with _authToken, ~/.docker/config.json.
Decide whether it is live before blocking:
changeme, xxx, <token>), documented test key (sk_test_), or a value the provider marks publishable (pk_live_, Firebase web config) → not a finding.sk_live_51H…).// ❌ token on argv — visible to every local user via ps and /proc
exec.Command("curl", "-H", "Authorization: Bearer "+token, url)
// ✅ the child reads it from its environment or stdin
cmd := exec.Command("curl", "-H", "@-", url); cmd.Stdin = strings.NewReader("Authorization: Bearer " + token)
?token= is not.Referer.NEXT_PUBLIC_*, VITE_*, REACT_APP_* variables and anything in a mobile binary are public. A server secret placed there is leaked by design.// ❌
const token = Math.random().toString(36).slice(2);
// ✅
const token = crypto.randomBytes(32).toString("base64url");
| Stack | ❌ for secrets | ✅ |
|---|---|---|
| Go | math/rand, math/rand/v2 | crypto/rand (rand.Text() in Go 1.24+) |
| Python | random | secrets.token_urlsafe, secrets.token_bytes |
| JVM | java.util.Random, kotlin.random.Random | SecureRandom |
| Node / browser | Math.random | crypto.randomBytes, crypto.randomUUID, crypto.getRandomValues |
| C# | System.Random | RandomNumberGenerator |
Weak randomness is a finding only when the value is a secret: session ids, reset tokens, API keys, nonces, invite codes. Shuffling a UI list is not.
AES/ECB/…, Java's bare Cipher.getInstance("AES") defaults to ECB) → patterns leak.hash(key + msg) → length extension; use HMAC).// ❌ ECB by default, static key
Cipher c = Cipher.getInstance("AES");
// ✅ AEAD with a fresh random 12-byte nonce per message
Cipher c = Cipher.getInstance("AES/GCM/NoPadding");
c.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(128, nonce));
InsecureSkipVerify: true (Go), verify=False (requests/httpx), rejectUnauthorized: false or NODE_TLS_REJECT_UNAUTHORIZED=0 (Node), a trust-all X509TrustManager or HostnameVerifier returning true (JVM), ServerCertificateCustomValidationCallback = (…) => true (.NET), URLSession delegates that accept any challenge (iOS). A finding when it is in a production code path talking to real hosts; a local test harness is excluded.
// ❌ world-readable token file
os.WriteFile(path, token, 0o644)
// ✅
os.WriteFile(path, token, 0o600)
Python: open() respects the umask — use os.open(path, os.O_WRONLY | os.O_CREAT, 0o600). Only a finding on multi-user machines or shared volumes; say which.
Live production secret in code → CRITICAL. Secret in logs or error bodies reachable by other users → HIGH. TLS verification disabled on a production path → HIGH. Weak randomness for session or reset tokens → HIGH. ECB/static IV on data at rest → MEDIUM to HIGH by what it protects.
pk_live_, a Firebase web apiKey, a Sentry DSN or an analytics write key.os.getenv("SECRET", "dev") — excluded unless production demonstrably runs without the variable.verify=False inside a test or a local-only dev script..env, *.pem, *.p12, id_rsa, credentials.json, service-account*.json.Cipher.getInstance("AES"), AES.MODE_ECB, a constant iv = or nonce =.Math.random, math/rand, random. near the words token, secret, code, nonce, session..gitleaks.toml or secret-scanner allowlist widened in the same diff that adds a credential.OWASP Top 10:2025 A04 Cryptographic Failures, A07 Authentication Failures, A09 Security Logging and Alerting Failures · ASVS 5.0 V11 Cryptography, V13 Configuration, V14 Data Protection · CWE-209, 214, 276, 295, 327, 328, 329, 338, 532, 598, 798
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.