Every attack has a tell.
GATillTell is the detection engine inside TillShield. Every Till product already keeps a server-side record of who did what: sign-ins and second factors in TillAuth, keys and roles in the workspace, secret reads in TillSecrets, pushes and protection changes in TillForge, backup deletions in TillArk, and the edge decisions TillGate makes. TillTell puts those records on one stream and reads them with a library of rules, each tied to a MITRE ATT&CK technique. Nothing to install, nothing to ship: it runs on the workspace you already have.
What TillTell sees
Each product writes an event with the same shape: who (a user, a service or an unknown caller, with the address and country when known), did what (an action such as auth.login_failed or secret.reveal), to what, with what outcome. Two fields matter for trust:
- trust is
serverwhen a Till service recorded the event itself andclientwhen an app SDK or the endpoint agent reported it. Most library rules demand server evidence; a rule that would revoke or block never fires on a client-reported record. - drill marks traffic from a labelled exercise. Drill findings prove a rule sees the pattern; they never alert and never count toward a rule’s record.
Events are kept for detection and hunting for the workspace’s retention tier: 30, 90 or 400 days. Change it under Shield → Settings → TillTell; it applies to events recorded from then on.
The rules that ship
Every rule names the ATT&CK technique it covers, the false positives to expect, a playbook it would suggest, and fixtures that must both fire and stay quiet before it ships. Some rules match one event; others correlate a burst, an order of events, a count of distinct values or a first-time value per account. The library today holds 62 rules:
| Rule | Fires on | ATT&CK |
|---|---|---|
tell-account-brute-force | Password guessing against one account | T1110.001 |
tell-admin-role-granted | Owner or admin role granted | T1098 |
tell-backup-mass-delete | Several backups deleted by one person | T1490 |
tell-backup-retention-cut | Backup retention shortened by a person | T1490 |
tell-branch-protection-dropped | Branch protection removed | T1685 |
tell-cert-pinning-wave | Certificate pinning failing across many sessions | T1638 |
tell-cred-stuffing | Credential stuffing from one address | T1110.004 |
tell-credential-burst | Many new keys or tokens from one actor | T1098.001 |
tell-device-compromised | App running on a rooted or jailbroken device | T1404 |
tell-edge-block-storm | One address blocked at the edge again and again | T1499.003 |
tell-history-rewrite | Repository history rewritten | T1565.001 |
tell-host-account-created | Local account created on a host | T1136.001 |
tell-host-admin-group-add | Account added to an admin group on a host | T1098 |
tell-host-agent-silent | Endpoint agent went silent | T1685 |
tell-host-autostart-added | New autostart entry on a host | T1547.001, T1543.001, T1547.015, T1546.004, T1037.004 |
tell-host-defense-disabled | Host protection turned off | T1685, T1685.001, T1686 |
tell-host-download-and-run | Script downloaded and run in one command | T1105, T1059.004, T1059.001 |
tell-host-encoded-powershell | PowerShell given an encoded command | T1059.001, T1027.010 |
tell-host-isolation-lifted | Host isolation lifted on the host | T1685 |
tell-host-kernel-module | Kernel module loaded after boot | T1547.006 |
tell-host-log-cleared | Security log cleared on a host | T1685.005, T1685.006 |
tell-host-lsass-read | Process read the memory of lsass | T1003.001 |
tell-host-malware-detected | Malware detected on a host | T1204.002 |
tell-host-preload-hijack | Library preloaded into every process | T1574.006 |
tell-host-proxy-execution | Windows system binary used to run remote code | T1218.005, T1218.010, T1218.011 |
tell-host-remote-admin-login | Remote login as root or Administrator | T1078.003 |
tell-host-reverse-shell | Reverse shell started | T1059.004 |
tell-host-scheduled-job | New scheduled job on a host | T1053.003, T1053.005 |
tell-host-service-installed | New system service on a host | T1543.002, T1543.003, T1543.004 |
tell-host-ssh-brute-force | Password guessing against a host | T1110.001 |
tell-host-ssh-key-added | SSH key added to an account on a host | T1098.004 |
tell-host-web-shell | Web server started a shell | T1505.003 |
tell-insider-detection-weakened | Several detections turned down by one person | T1685 |
tell-insider-guardrail-off | Workspace approvals or required two-factor turned off | T1685, T1556.006 |
tell-insider-mass-clone | One person cloned many repositories | T1213.003 |
tell-insider-mirror-host-then-push | Mirror host allowed, then a push mirror set up | T1567.001 |
tell-insider-push-mirror | Repository set to push to an outside host | T1567.001 |
tell-insider-repo-delete-burst | One person deleted several repositories | T1485 |
tell-insider-repo-made-public | Private repository made public | T1567 |
tell-insider-repos-erased | Repository encryption key destroyed | T1485 |
tell-insider-secret-mass-delete | One person deleted many secrets | T1485 |
tell-insider-secret-new-project | Secrets read from a project the person has not used | T1555 |
tell-insider-secret-reveal-burst | One person revealed many secret values | T1555 |
tell-login-new-country | Sign-in from a country not seen for this account | T1078 |
tell-mfa-fatigue | Repeated MFA failures on one account | T1621 |
tell-mfa-removed | Second factor removed from an account | T1556.006 |
tell-password-then-mfa-removed | Password changed, then second factor removed | T1098 |
tell-scim-mass-deprovision | Many accounts removed through SCIM | T1531 |
tell-secret-allowlisted | Secret let into a repository | T1552.001 |
tell-secret-export | Secrets or data exported out of the platform | T1567 |
tell-secret-in-history | Secret in a repository's history | T1552.001 |
tell-secret-mass-read | Many distinct secrets read by one actor | T1552 |
tell-secret-push-burst | Repeated pushes refused for secrets | T1552.001 |
tell-service-mints-credential | Service credential created another credential | T1098.001 |
tell-service-new-action | Service credential doing something new | T1078.004 |
tell-service-new-environment | Service credential reading a new environment | T1555 |
tell-session-theft | Session theft detected | T1539 |
tell-signin-flagged-address | Sign-in from an address other workspaces flagged | T1078 |
tell-signin-tor-exit | Sign-in from a Tor exit relay | T1090.003 |
tell-sso-trust-changed | Single sign-on configuration changed | T1484.002 |
tell-till-credential-in-code | TillDev credential found in code | T1552.001 |
tell-token-refused-burst | Credential refused repeatedly | T1550.001 |
Open any rule on the rules page or with tilldev shield tell rules show to read its YAML, its fixtures and its record in your workspace. The tell-host- rules read events from the endpoint agent; the tell-insider- and tell-service- rules watch your own members and credentials, and Insider risk ranks who set them off.
Rules of your own
A workspace can add up to 100 rules of its own, in the same format, held to the same tests, and run on the same stream. Write one from scratch, or copy a library rule and tune it, then try it on your recent events before it runs. See Writing TillTell rules.
Stages: a rule earns its way
Every rule is at one of four stages in your workspace. New library rules and new workspace rules start in shadow.
| Stage | What the rule may do |
|---|---|
draft | Nothing is recorded. Leaving draft needs the rule’s fixtures to pass. |
shadow | Findings are recorded on the TillTell page and never alert. Watch it here first. |
advisory | Findings are recorded, alert, and open or join an incident; the rule suggests nothing. |
live | Findings alert, open or join an incident, and carry the rule’s suggested playbook. |
Owners and admins move rules up. The system only ever moves a rule down, and only for one reason: too many false positives. When 20% or more of the last 20 triaged findings were judged false positive or benign (once at least 10 have been triaged), the rule falls back to shadow and the move is written to the workspace audit log with the numbers behind it.
Unattended playbooks
A live rule may run its playbook without a person once it has earned it: 30 or more triaged findings, 5% or fewer false positives, and none in the last 10. Even then two humans stand in the way: the workspace switch under Shield → Settings → TillTell must be on, and an owner or admin confirms automation for that rule. A demotion clears the confirmation. Both thresholds can be overridden per workspace and per rule through the API.
Triage feeds the lifecycle
Every finding takes a verdict from any member of the workspace. Verdicts are appended, never edited, so a rule’s record is a history nobody can tidy up after the fact.
| Verdict | Means | Effect |
|---|---|---|
true_positive | An attack or a policy breach. | The finding stays open as triaged; counts for the rule. |
false_positive | The rule was wrong. | The finding closes; counts against the rule. |
benign | Matched as written, nothing hostile. | The finding closes; counts against the rule as noise. |
duplicate | Already covered by another finding. | The finding closes; no signal either way. |
The ATT&CK map, scored honestly
Shield → TillTell → Coverage lays out the MITRE ATT&CK Enterprise and Mobile matrices by tactic and scores every technique against the rules running in your workspace. A rule counts once it is out of draft; a draft runs nowhere, so it covers nothing.
| Cell | What it claims |
|---|---|
| No rule | No library or workspace rule is tagged with this technique, or every rule that is sits in draft. |
| Some sub-techniques | The technique has no rule of its own, but rules cover some of its sub-techniques. |
| Rule | A running rule is tagged with it, or rules cover every sub-technique. The rule exists; nothing yet shows it fires. |
| Proven by drill | A defense drill replayed the rule’s own test through TillTell and the rule fired, within the last 90 days and for the rule version running now. The only strong claim the map makes, dated. |
Prove a rule with a defense drill under Shield → TillDrill. Changing the rule takes its proof away until it is drilled again.
What your sources can see
ATT&CK says which kinds of records each technique is detected from. TillTell checks that against the Till products that have written to your security stream in the last 90 days. Techniques none of them can see are faded rather than counted as gaps, and the ones they can see with no running rule are listed as gaps, each naming the Till product whose records would make it visible. Techniques only a host can show, such as process execution and persistence, stay faded until the endpoint agent reports from your hosts: the map never claims what the stream cannot observe.
Incidents no rule saw
A technique also carries the number of real incidents from the last 180 days that were resolved with it and had no TillTell finding in them. That is the rule backlog laid on the map: detection you needed and did not have.
From the terminal
# what fired, newest first (open findings by default)
tilldev shield tell findings
tilldev shield tell findings --rule tell-cred-stuffing --stage live --json
# read one, with its record and evidence, then judge it
tilldev shield tell finding <id>
tilldev shield tell verdict <id> fp --note "shared office egress during a password reset"
tilldev shield tell escalate <id> # open an incident from it, or show the one it is in
# the library and your own rules as your workspace runs them
tilldev shield tell rules ls
tilldev shield tell rules show tell-secret-mass-read
tilldev shield tell rules stage tell-cred-stuffing advisory --reason "two weeks clean in shadow"
tilldev shield tell rules automate tell-cred-stuffing
# rules of your own: check, try on recent events, save
tilldev shield tell rules validate rule.yaml
tilldev shield tell rules backtest rule.yaml --hours 72
tilldev shield tell rules create rule.yaml
# the ATT&CK map, and the techniques you can see but don't cover
tilldev shield tell coverage
tilldev shield tell coverage --domain mobile
tilldev shield tell coverage --gaps
# retention and the unattended-playbook switch
tilldev shield tell settings
tilldev shield tell settings set --retention long --automationThe same operations are on the HTTP API under /api/shield/tell/…, documented in the API reference. Stage changes, automation confirmations, verdicts, settings changes and every change to a workspace rule land in the workspace audit log.