Why a Password Was Not Detected | Nightfall AI Knowledge Base
Why a Password Was Not Detected
Data type: Passwords and user credentials
Issue
A password-like value was present in scanned content but produced no finding, or scored Possible and never rose higher. Frequently reported during secrets-and-credentials validation testing.
Environment
All content integrations and endpoint scan paths. Describes the native Password detector. Does not apply to custom regex detectors, which match purely on pattern.
Before troubleshooting: test the sample in the Nightfall Playground
The Playground returns the model's confidence score for any text you paste, independent of your policies and detection rules.
For passwords, the Playground result splits three ways and each points somewhere different:
| Playground result | What it means | Where to look next |
| Scores above Possible | The detector works. Your policy did not act on it. | Configuration — cause 9 |
| Scores exactly Possible and never higher | Everything matched, then the test-data cap applied | Cause 7 — your test value looks like test data |
| No finding at all | One of the match criteria wasn't met | Causes 1–6 |
The middle row is the one people misread. Possible is not a weak signal here; it is frequently a hard cap applied to values that look like test data.
How password detection works
Passwords are the hardest credential category. Modern datasets are full of high-entropy strings that are not passwords — API keys, hashes, internal IDs, UUIDs, tokens, encoded blobs. Entropy alone cannot classify a value as a password at usable precision. The detector therefore requires several conditions to hold together rather than scoring a value on its own merits.
Match criteria — all must be true, or there is no finding at all:
-
A password keyword sits beside the value
-
The value is 6–40 characters
-
The value contains no spaces
-
The content is not a meeting or conferencing context
-
The value is not an environment variable reference, placeholder, redaction, or money amount
Then a confidence cap may apply. Even when everything matches, confidence is capped at Possible if the value looks like test data — see cause 7 for the four triggers.
The practical consequence: a real credential in an unusual layout produces nothing, while a realistic-looking test password in a perfect layout produces Possible and no more. Those are different problems with different fixes, and the Playground result tells you which one you have.
Cause and resolution
1. No password keyword near the value
The detector needs a password keyword in proximity to the high-entropy value. The relationship between the two is flexible — assignment, put/set, email, natural language, and list layouts all qualify. What matters is that a keyword is nearby.
All of these are evaluated:
password: Xk7#mQp2vLz9 → assignment
password = Xk7#mQp2vLz9 → assignment
set_password("Xk7#mQp2vLz9") → put/set
The password I use for that account is Xk7#mQp2vLz9 → natural language
Saving my streaming passwords:
• ServiceA — Xk7#mQp2vLz9 → list
What fails is a high-entropy value with no keyword near it at all:
Xk7#mQp2vLz9 → no keyword, not evaluated
Here you go: Xk7#mQp2vLz9 → no password keyword, not evaluated
This is a deliberate precision mechanism rather than a defect. A random-looking string on its own is indistinguishable from an API key, a hash, a UUID, a build identifier, or a generated token. The keyword is what makes it a password rather than one of those.
Resolution: Add a password keyword near the value and re-test. If your production data genuinely contains bare credentials with no nearby label, that is an expected limitation — capture samples and send them to us rather than treating it as a tuning problem.
2. The value was shorter than 6 or longer than 40 characters
Values outside the 6–40 character range are not evaluated.
| Value | Result |
Ab3!x (5 chars) | Too short, not evaluated |
Xk7#mQp2vLz9 (12 chars) | In range |
| A 45-character passphrase | Too long, not evaluated |
The upper bound matters more than it used to. Long passphrases are increasingly recommended by security teams and password managers, and a 41-character passphrase will not be detected.
Resolution: Keep test values inside the range. If your organization's password policy encourages passphrases longer than 40 characters, flag it to us — that is a coverage gap worth tracking, not a configuration issue.
3. The value contained spaces
Values containing spaces are not recognized. A multi-word passphrase is not evaluated as a password, regardless of how it is labelled or how strong it is.
password: Xk7#mQp2vLz9 → no spaces, evaluated
password: correct horse battery → contains spaces, not evaluated
This is the second constraint that works against modern passphrase guidance. Combined with the 40-character limit in cause 2, the two properties security teams most actively encourage — long, and multi-word — are both outside what the detector evaluates.
Resolution: Do not use spaces in test values. Use punctuation as separators instead. If your organization's password policy encourages spaced passphrases, raise it with us — that is a coverage gap, not a tuning problem.
4. The content looked like a meeting invitation
Meeting and conferencing context is excluded deliberately. Meeting passcodes are shared constantly, are low-sensitivity, and would otherwise dominate alert volume.
Zoom meeting password: 847592 → excluded by design
Resolution: Do not use meeting-style content as a test case. If a genuine credential is being shared inside a meeting invitation, capture the sample — that is a legitimate edge case for Detection.
5. The value matched an environment variable, placeholder, redaction, or money shape
These shapes are excluded before scoring — no finding at all, as distinct from the Possible cap in cause 7.
password = ${DB_PASSWORD} → environment variable reference
password = <redacted> → redaction
password = {{PASSWORD}} → placeholder
password = $1,250.00 → money shape
Resolution: Confirm your test value is a literal credential, not a reference to one. This is a frequent self-inflicted miss in config files and code samples, where the surrounding material is full of exactly these patterns.
6. The model did not classify the value as a credential
The final match criterion is the ML model itself. A value can satisfy every structural requirement and still not be classified as a password if it does not resemble one.
Resolution: Test with values that resemble credentials your users would actually create — see the guidance under cause 7. If a realistic credential with a nearby keyword is not classified, that is the most valuable escalation you can send us, because it is a genuine model gap rather than a structural one.
7. It scored Possible and stopped there — the test-data cap
If the Playground returns Possible and never more, everything matched and then the cap applied. Four triggers apply it, and any one is enough.
a. The value contains a giveaway substring. Case-insensitive, matched anywhere inside the value:
| Substring | Catches |
pass | mypassword1, Passw0rd!, passphrase9 |
secret | MySecret99, secret_key1 |
test | test_credential, Testing123 |
example | example_pw1 |
abc | abc12345, Xabc999! |
123 | Password123!, a1234567 |
contrase | contrasena1, micontraseña |
pass and secret are the two that surprise people, because they are exactly what someone reaches for when inventing a test credential. MySecretPass99! trips both.
b. The value is on the known-placeholder list. A curated list of placeholder passwords, matched exactly — not a language dictionary. Common vendor defaults and well-known sample credentials live here.
c. The value is mostly one or two characters. If at least 75% of the value is made up of one or two distinct characters, it reads as filler: aaaaaa1111, abababab.
This is the mechanism behind the most commonly reported "misses," which are not misses at all:
| Sample | Outcome | Why |
Bill's password is: FluffyPancakesarethebest123! | Capped at Possible | Contains 123 |
Here is my password: Password123!@#445 | Capped at Possible | Contains both pass and 123 |
Resolution: Re-test with a value that avoids all four triggers. A working recipe:
| Requirement | Avoids |
| 6–40 characters | Cause 2 |
| No spaces | Cause 3 |
None of pass, secret, test, example, abc, 123, contrase | Trigger (a) |
| Not a common placeholder or vendor default | Trigger (b) |
| No long runs of one or two repeated characters | Trigger (c) |
password: Xk7#mQp2^vLz9 → satisfies all six
password: MySecretPass99! → contains "secret" and "pass", capped
password: Sunflower1 → single token, capped
password: correct horse jump → spaces, not evaluated at all
Worth confirming with Detection: the exact token-splitting rule — whether digits or case changes count as boundaries alongside punctuation — and the contents of the known-placeholder list.
8. The test data was not representative of production content
Synthetic strings behave differently from real credentials in real containers. Credentials in realistic account notes, config files, login records, or onboarding documents are far better representations of how the detector performs.
Resolution: Ask for sanitized examples that resemble the actual environment. These are the most valuable test cases and the most valuable escalation artifacts.
9. Coverage or configuration gap
Verify the detector ran at all: is it deployed on that integration, is rule scope set to Content, and are minimum confidence and minimum findings filtering the result out? Note that a policy set to Likely or higher will suppress every Possible-capped finding from cause 7 — which is the correct behavior, but it means those findings exist and are simply never surfaced.
10. A custom password detector is interfering
Custom "Password" detectors frequently fire on the literal word password rather than on a credential value, generating heavy noise. The inverse also occurs — an over-tightened custom detector misses real credentials the native detector would have caught.
Resolution: Where a custom detector exists, test the same samples against the native detector before tuning either one.
Recommended configuration
Start with the native Password detector at Very Likely for chat and collaboration surfaces. In most deployments this gives the best balance of coverage and manageable noise.
Then run a feedback loop:
-
Report false positives — they directly refine model precision
-
Share sanitized examples of credentials that were missed — the only way misses get addressed
-
Adjust based on observed results rather than changing thresholds preemptively
Note that lowering the threshold to Possible will surface every capped value from cause 7. That is usually the opposite of what a customer wants, since those values are test data by definition.
Reporting a missed detection to Nightfall Support
Non-findings are not retained. A missed password cannot be reconstructed after the fact.
Contact Nightfall Support and include these three items at minimum:
| Required | Detail |
| Sanitized sample | The value and its surrounding text, exactly as it appeared — including the nearby keyword and the layout. Substitute the credential characters, but preserve length and character classes. A value sent on its own cannot be tested, because keyword proximity is itself one of the match criteria. |
| Time of the test | Date and time including time zone, so Support can correlate against scan and policy logs. |
| Environment | Where the test ran — Slack, endpoint (specify copy/paste, file upload, or screenshot), Google Drive, Outlook, Teams, OneDrive, Jira, Zendesk, or the specific integration. |
Also helpful, in rough order of value:
-
Your Playground result — and specifically whether it returned Possible or nothing at all. These are different problems with different fixes.
-
The value's character count
-
The container type — chat message, code file, config file, document, credential list
-
Detection rule configuration: scope, minimum confidence, minimum findings
-
Whether a custom password detector is deployed alongside the native one
Triage sequence
-
Paste the sample into the Playground, with its surrounding text intact, and record the result.
-
Possible and no higher → test-data cap; work cause 7. Re-test with a value that avoids all four triggers.
-
Nothing at all → one of the match criteria wasn't met. Check in this order: adjacent keyword (cause 1), length (cause 2), spaces (cause 3), meeting context (cause 4), env/placeholder/money shape (cause 5).
-
Scored above Possible in the Playground but the policy did not fire → configuration; work causes 9 and 10.
-
If a realistic credential with a nearby keyword still returns nothing, that is a model gap — escalate; it is the highest-value report you can send.
-
Still unexplained → contact Nightfall Support with a sanitized sample, the time of the test, and the environment.