redact-secret · Report
Runner authentication token
glrt--prefixed runner authentication token: a 20-character legacy body, or the routable base64url payload with a base36 length holder and CRC32 checksum.
Research record
3 events in the review history: 2 observed, 1 reviewed. Latest: observed on 2026-09-25 by automation, project maintainer. Project-maintained review is not independent validation. The family record at this release.
Format
What it looks like
- Descriptive pattern
^glrt-(?:(?:t[0-9a-f]+_)?[A-Za-z0-9_-]{20}|[A-Za-z0-9_-]{27,300}\.[0-9a-z]{2}\.[0-9a-z]{9})$
Parts are shown as recorded. Evidence classes belong to the facts below; no class is assigned to a part.
Format facts
Unresolved ·
tool-corroboration· current · observed 2026-09-24Pinned scanner rules are consistent with the contract grammar (1 artifact: gitleaks 8.30.1).
- gitleaks/gitleaks @ v8.30.1: config/gitleaks.tomlscanner-rule-source · last read 2026-10-04 · latest outcome read · supports gitleaks 8.30.1: gitleaks.toml
Provider documented ·
field-prefix· current · observed 2026-09-24prefix: glrt- (glrtr- when created via a registration token) (glrt- only in the pattern; glrtr- is documented but its current shape is unverified.)
- docs.gitlab.com/security/tokens/provider-documentation · last read 2026-10-03 · latest outcome read · supports prefix: glrt- (glrtr- when created via a registration token)
- docs.gitlab.com/ci/runners/new_creation_workflow/provider-documentation · last read 2026-09-25 · latest outcome read · supports prefix: glrt- (glrtr- when created via a registration token)
Provider documented ·
field-legacy-body· current · observed 2026-09-24legacy body: 20 characters of [A-Za-z0-9_-] (Devise.friendly_token: urlsafe_base64(15) with lIO0 translated to sxyz) (The lIO0 exclusion is not in the pattern and no twin relies on it; positives respect it.)
- heartcombo/devise @ main: lib/devise.rbprovider-sdk-source · last read 2026-09-24 · latest outcome read · supports legacy body: 20 characters of [A-Za-z0-9_-] (Devise.friendly_token: urlsafe_base64(15) with lIO0 translated to sxyz)
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/base.rbprovider-sdk-source · last read 2026-09-25 · latest outcome read · supports legacy body: 20 characters of [A-Za-z0-9_-] (Devise.friendly_token: urlsafe_base64(15) with lIO0 translated to sxyz)
Provider documented ·
field-legacy-partition-segment· current · observed 2026-09-24legacy partition segment: optional t<hex partition>_ after glrt- (runner type 1/2/3), stripped as "legacy" by runner.rb (The minting window is unknown.)
- forum.gitlab.com/t/failure-to-register-runner/122890provider-sdk-source · last read 2026-09-24 · latest outcome read · supports community sighting of glrt-t3_<20>, 2025-03
- gitlab.com/gitlab-org/gitlab/-/raw/master/app/models/ci/runner.rbprovider-sdk-source · last read 2026-09-24 · latest outcome read · supports legacy partition segment: optional t<hex partition>_ after glrt- (runner type 1/2/3), stripped as "legacy" by runner.rb
Provider documented ·
field-routable-grammar· current · observed 2026-09-24routable grammar: <base64url payload>.<2 base36 version>.<2 base36 payload length><7 base36 CRC32>; payload = 16 random bytes + sorted k:v routing lines + 1 length byte
- gitlab.com/gitlab-org/security-products/secret-detection/secret-detection-rulesprovider-sdk-source · last read 2026-09-24 · latest outcome read · supports gitlab_runner_auth_token_routable rule
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/generator/routable_token.rbprovider-sdk-source · last read 2026-09-25 · latest outcome read · supports routable grammar: <base64url payload>.<2 base36 version>.<2 base36 payload length><7 base36 CRC32>; payload = 16 random bytes + sorted k:v routing lines + 1 length byte
Provider documented ·
field-routable-checksum· current · observed 2026-09-24routable checksum: last 7 chars = base36(CRC32(everything before them)), zero-padded; offline-verifiable
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/generator/routable_token.rbprovider-sdk-source · last read 2026-09-25 · latest outcome read · supports routable checksum: last 7 chars = base36(CRC32(everything before them)), zero-padded; offline-verifiable
- handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/routable_tokens/provider-documentation · last read 2026-09-29 · latest outcome read · supports design document (status proposed) states the offline check
Provider documented ·
field-routable-version· current · observed 2026-09-24routable version: TOKEN_VERSION 1, rendered 01; routable runner tokens since GitLab 18.0 (The pattern accepts any 2 base36 characters; positives use 01.)
- gitlab.com/gitlab-org/gitlab/-/merge_requests/190340provider-sdk-source · last read 2026-09-24 · latest outcome read · supports routable version: TOKEN_VERSION 1, rendered 01; routable runner tokens since GitLab 18.0
Unresolved ·
field-glrtr-instance-prefix-unversioned-routable-form· current · observed 2026-09-24glrtr-, instance prefix, unversioned routable form: shapes unverified without a self-managed observation
- github.com/redact-secret/redact-secret-benchmarks/issues/230other · last read 2026-09-24 · latest outcome read · supports glrtr-, instance prefix, unversioned routable form: shapes unverified without a self-managed observation
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/prefix_helper.rbother · last read 2026-09-24 · latest outcome read · supports glrtr-, instance prefix, unversioned routable form: shapes unverified without a self-managed observation
Unresolved ·
listed-references· current · observed 2026-09-24The legacy contract lists 3 references without stating which property each supports.
- docs.gitlab.com/security/tokens/provider-documentation · last read 2026-10-03 · latest outcome read · supports Listed as a reference by the legacy contract
- docs.gitlab.com/ci/runners/new_creation_workflow/provider-documentation · last read 2026-09-25 · latest outcome read · supports Listed as a reference by the legacy contract
- gitlab.com/gitlab-org/security-products/secret-detection/secret-detection-rulesprovider-sdk-source · last read 2026-09-24 · latest outcome read · supports Listed as a reference by the legacy contract
Tool corroborated ·
dossier-research· current · observed 2026-09-25Legacy dossier research (verdict ready, tier T2) cited 5 sources; the dossier does not attribute sources to individual properties.
- docs.gitlab.com/security/tokens/provider-documentation · last read 2026-10-03 · latest outcome read · supports Cited by the legacy dossier research for this family
- docs.gitlab.com/ci/runners/new_creation_workflow/provider-documentation · last read 2026-09-25 · latest outcome read · supports Cited by the legacy dossier research for this family
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/726/README.mdproject-research-note · last read 2026-09-27 · latest outcome read · supports Final research evidence recorded by the legacy dossier
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/base.rbprovider-sdk-source · last read 2026-09-25 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/generator/routable_token.rbprovider-sdk-source · last read 2026-09-25 · latest outcome read · supports Cited by the legacy dossier research for this family
Tool corroborated ·
taxonomy-sources· current · observed 2026-09-25The legacy taxonomy lists 2 sources for this family. The taxonomy records no date; the dossier researchedAt is used as the observed-at date.
- docs.gitlab.com/security/tokens/provider-documentation · last read 2026-10-03 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/generator/routable_token.rbprovider-sdk-source · last read 2026-09-25 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy
Open questions
No open question is recorded for this revision.
Benchmark dossier notes
- Shape
- prefix
glrt-followed by one of three bodies. (a) Legacy: 20 characters of a URL-safe alphabet from GitLab'sfriendly_token([A-Za-z0-9_-]minusl,I,O,0). (b) Partition-prefixed:t<hex>_then the 20 characters, seen in a March 2025 forum post. (c) Routable, from GitLab 18.0: a base64url payload (27 to 300 characters),., a 2-character base36 version,., a 2-character base36 payload length and a 7-character base36 CRC32 of everything before it. - Basis
- T1 for the prefix (token overview and new-runner-workflow pages). Body and checksum come from GitLab's own server code (
routable_token.rb, Devise'sfriendly_token) and its secret-detection rules, so they are provider code but not documentation; gitleaks agrees on the legacy body. The design document isproposedand omits the version segment the code emits. The tier is T2. - Issuance
POST /user/runnersor the runner creation UI. Not attempted. Registration tokens (GR1348941plus 20 characters) are a separate, deprecated class.- Contract in core
- detector-families.md (Beta.8 wave 2, empirical route): exact 20-byte body or the routable form with the length holder and CRC32 checked offline;
glrtr-, instance-prefixed and unversioned forms are unclaimed.
In this benchmark
- Fixtures
- 43
- Left readable
- 0
- Redacted too much
- 0
- False alarms
- 0
43 fixtures: 19 expect a redaction, 24 must stay quiet. See every row
| Evidence level | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| T2Tool-corroborated | 34 | 0 | 0 | 0 |
| T3Project policy | 9 | 0 | 0 | 0 |
Every scanner on the same fixtures
In run order. Counts are what each scanner recorded on this family's fixtures, whichever rules it has; a scanner with no rule for the family has nothing to report on it.
| Scanner | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| flare-redactRuntime library · 1.6.1 · Published npm package · secrets-only (pii, generic_assignment disabled) · JavaScript engineNo rule maps to it | 43 | 19 | 0 | 0 |
| gitleaksRepository scanner · 8.30.1 · Directory scan · default rules2 rules target it | 43 | 3 | 0 | 3 |
| redact-secretProduct measured here · 0.1.0-beta.14 · Published npm package · default detectors1 detector mapped | 43 | 0 | 0 | 0 |
| trufflehogRepository scanner · 3.97.4 · Filesystem scan · verification disabledNo rule maps to it | 43 | 19 | 0 | 1 |
Benchmark dossier questions
- Open caveat
- Prefix is documented; the 20-character body and routable grammar come from GitLab server code and gitleaks. glrtr-, instance-prefixed and unversioned routable forms are unverified. No issued token captured.
Looks like it, but isn't
- Collisions
- other
glprefixes (glpat-,gldt-,glcbt-) are real GitLab secrets, not clean negatives.glrtr-is a superstring ofglrtand is not matched by aglrt-rule. Runner ids ands_+ 12 hex system ids are public. Instance-prefixed tokens (<prefix>-glrt-) exist behind a feature flag and are documented as not production ready.
Scanner rules for this family
| Scanner | Rule | What the rule matches |
|---|---|---|
| gitleaks · rules 8.30.1 | gitlab-runner-authentication-token | glrt- + 20 characters |
| gitleaks · rules 8.30.1 | gitlab-runner-authentication-token-routable | glrt-t<digit>_ + routable payload |
No rule maps to this family in flare-redact, openredaction, trufflehog.
Fixtures in this family
| Fixture | Kind and evidence | redact-secret |
|---|---|---|
gitlab-runner-authentication-token-api-headergitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-checksum-mismatch-twingitlab · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-ci-server-tokengitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-config-tomlgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-docker-registergitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-exportgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-handovergitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-helm-valuesgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-k8s-secretgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-length-holder-mismatch-twingitlab · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-prefix-letter-twingitlab · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-query-tokengitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-register-flaggitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-register-outputgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-runner-loggitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-terraform-runnergitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-token-shape-baregitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-token-shape-quotedgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-token-shape-unicode-crlfgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-twin-base-registergitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-twin-base-tomlgitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-uppercase-base36-twingitlab · wrong-alphabet | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-user-runners-responsegitlab · documented-format-literal | Must redactT2 · Tool-corroborated | Redacted |
gitlab-runner-authentication-token-angle-placeholder-placeholdergitlab · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-base64-url-encoded-valuegitlab · benign-encoded-value | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-helm-template-referencegitlab · templated-reference | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-label-prosegitlab · benign-lookalike | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-maskgitlab · benign-lookalike | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-masked-placeholdergitlab · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-migration-note-prosegitlab · prose-mention | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-prefix-onlygitlab · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-prefix-only-near-missgitlab · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-redacted-placeholdergitlab · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-referencegitlab · benign-lookalike | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-runner-object-public-idgitlab · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-shell-reference-referencegitlab · templated-reference | Must not flagT3 · Project policy | Quiet |
gitlab-runner-authentication-token-short-bodygitlab · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-short-body-twingitlab · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-short-body-twin-wrong-lengthgitlab · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-short-sha-public-idgitlab · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-stem-prefix-twingitlab · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-runner-authentication-token-system-id-public-idgitlab · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-runner-authentication-token-underscore-delimiter-twingitlab · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
Sources
Documentation and code
- docs.gitlab.com/security/tokens/
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/generator/routable_token.rb
- docs.gitlab.com/ci/runners/new_creation_workflow/
- gitlab.com/gitlab-org/gitlab/-/raw/master/lib/authn/token_field/base.rb
Research log
- redact-secret/redact-secret-benchmarks#230Research issue
- redact-secret/redact-secret#726Research issue
- redact-secret/redact-secret#730Research issue
- Final evidence, pinned to a commit/redact-secret/redact-secret/blob/8b6a5fde52ecb4dfce13f09c7a947062d21483c7/docs/audits/evidence/726/README.md