redact-secret · Report
Routable personal access token
glpat- + an unpadded base64url payload of 27-300 + . + a 2-character base36 version + . + a 2-character base36 payload length + a 7-character base36 CRC32 (GitLab routable_token.rb).
Research record
3 events in the review history: 2 observed, 1 reviewed. Latest: observed on 2026-09-29 by automation, project maintainer. Project-maintained review is not independent validation. The family record at this release.
Format
What it looks like
- Descriptive pattern
^glpat-[A-Za-z0-9_-]{27,300}\.[0-9a-z]{2}\.[0-9a-z]{2}[0-9a-z]{7}$
Parts are shown as recorded. Evidence classes belong to the facts below; no class is assigned to a part.
Format facts
Provider documented ·
provider-source· current · observed 2026-09-29gitlab-org/gitlab lib/authn/token_field/generator/routable_token.rb at fa2faf33 (version field since 2025-04-22, 8343330f): "#{prefix}#{base64_payload}.#{token_version}.#{base64_payload_length}" + Zlib.crc32(...).to_s(36).rjust(7, "0"); routable_payload.rb decodes and verifies it; personal_access_token.rb binds glpat- to the routable generator (routable_pat flag removed 2025-07-24, 36573efc); re-checked 2026-09-29: glpat- + unpadded base64url payload of 27–300 + . + 2 base36 version + . + 2 base36 payload length + 7 base36 CRC32 of every byte before it; 46–319 bytes
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports glpat- + unpadded base64url payload of 27–300 + . + 2 base36 version + . + 2 base36 payload length + 7 base36 CRC32 of every byte before it; 46–319 bytes · #L7-L86
Provider documented ·
field-grammar· current · observed 2026-09-29grammar: <prefix><base64-payload>.<token-version>.<base64-payload-length><crc32>; payload 27 to 300 bytes; version and CRC base36
- handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/routable_tokens/provider-documentation · last read 2026-09-29 · latest outcome read · supports routable tokens design document
Provider documented ·
field-prefix· current · observed 2026-09-29prefix: glpat-
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/app/models/personal_access_token.rbprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports PERSONAL_TOKEN_PREFIX · #L22-L36
Provider documented ·
field-payload· current · observed 2026-09-29payload: unpadded base64url [A-Za-z0-9_-], 27 to 300 characters (The current generator caps the payload at 235; the design-document cap is used.)
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports urlsafe_encode64(padding: false); 16 random bytes + routing payload + one length byte · #L7-L86
- handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/routable_tokens/provider-documentation · last read 2026-09-29 · latest outcome read · supports minimum 27, maximum 300 bytes
Provider documented ·
field-separators· current · observed 2026-09-29separators: . after the payload and after the version; none elsewhere
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports separators: . after the payload and after the version; none elsewhere · #L7-L86
Provider documented ·
field-version· current · observed 2026-09-29version: exactly 2 [0-9a-z] (base36, zero-padded; 01 today)
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports TOKEN_VERSION = 1, TOKEN_VERSION_LENGTH = 2 · #L7-L86
Provider documented ·
field-length-holder· current · observed 2026-09-29length-holder: exactly 2 [0-9a-z]: base36 of the payload length
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/decoders/v1/routable_payload.rbprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports reads the payload length from the third field · #L24-L71
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports length-holder: exactly 2 [0-9a-z]: base36 of the payload length · #L7-L86
Provider documented ·
field-checksum· current · observed 2026-09-29checksum: exactly 7 [0-9a-z]: base36 CRC32 (zlib) of every byte from g of glpat- through the length holder, zero-padded; enforced by `validate`
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/decoders/v1/routable_payload.rbprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports valid when the CRC of everything before the last 7 characters equals them · #L24-L71
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports CRC_BYTES = 7 · #L7-L86
Provider documented ·
field-excluded-forms· current · observed 2026-09-29excluded-forms: the legacy glpat- + 20, the unversioned routable form, instance/custom prefixes and glrt- are not this family (The legacy 20-byte glpat- value is a benign sibling control here (gitlab-token owns it).)
- redact-secret/redact-secret @ 4fb78827f1ddf5b3106f25130ca510a836ada186: docs/audits/evidence/1012/gitlab-routable-personal-access-token.mdprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports excluded shapes
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/app/assets/javascripts/lib/utils/secret_detection_patterns.jsprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports instance and admin-custom prefixes · #L5-L24
Tool corroborated ·
field-peer-lag· current · observed 2026-09-29peer-lag: gitleaks 8.30.1 lags: gitlab-pat-routable reads only the unversioned form and gitlab-pat a 20-byte payload slice. trufflehog 3.97.4 gitlab/v3 overreaches: it reads the versioned form with unescaped dots and = in the payload and checks neither the length holder nor the CRC
- gitleaks/gitleaks @ v8.30.1: config/gitleaks.tomlscanner-rule-source · last read 2026-10-04 · latest outcome read · supports gitlab-pat, gitlab-pat-routable
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectors/gitlab/v3/gitlab_v3.goscanner-rule-source · last read 2026-09-29 · latest outcome read · supports keyPat at v3.97.4
- github.com/trufflesecurity/trufflehog/issues/4551scanner-rule-source · last read 2026-09-29 · latest outcome read · supports peer-lag: gitleaks 8.30.1 lags: gitlab-pat-routable reads only the unversioned form and gitlab-pat a 20-byte payload slice. trufflehog 3.97.4 gitlab/v3 overreaches: it reads the versioned form with unescaped dots and = in the payload and checks neither the length holder nor the CRC
Unresolved ·
listed-references· current · observed 2026-09-29The legacy contract lists 17 references without stating which property each supports.
- gitleaks/gitleaks @ v8.30.1: config/gitleaks.tomlscanner-rule-source · last read 2026-10-04 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ 4fb78827f1ddf5b3106f25130ca510a836ada186: docs/audits/evidence/1012/gitlab-routable-personal-access-token.mdprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/1022issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #issuecomment-5852413851
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #issuecomment-5871306275
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #issuecomment-5880547337
- github.com/redact-secret/redact-secret/issues/1012issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret-benchmarks/issues/528issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ 4fb78827f1ddf5b3106f25130ca510a836ada186: docs/audits/evidence/1012/README.mdproject-research-note · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectors/gitlab/v3/gitlab_v3.goscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/trufflesecurity/trufflehog/issues/4551scanner-rule-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/app/assets/javascripts/lib/utils/secret_detection_patterns.jsprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #L5-L24
- gitlab.com/gitlab-org/security-products/secret-detection/secret-detection-rules/-/blob/cae5670b0d83aaea0ff37c085119e82ff394f283/rules/mit/gitlab/gitlab.tomlother · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #L27-L57
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/decoders/v1/routable_payload.rbprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #L24-L71
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/app/models/personal_access_token.rbprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #L22-L36
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #L7-L86
- handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/routable_tokens/provider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
Provider documented ·
dossier-research· current · observed 2026-09-29Legacy dossier research (verdict ready, tier T1) cited 14 sources; the dossier does not attribute sources to individual properties.
- docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patternsprovider-documentation · last read 2026-10-05 · latest outcome read · supports Cited by the legacy dossier research for this family
- 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
- github.com/gitleaks/gitleaks/issues/1655issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitleaks/gitleaks @ b58d3f102cf3a2c84cb7f923d05c25c9b1aed84b: cmd/generate/config/rules/gitlab.goother · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- redact-secret/redact-secret @ 4fb78827f1ddf5b3106f25130ca510a836ada186: docs/audits/evidence/1012/gitlab-routable-personal-access-token.mdprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports Final research evidence recorded by the legacy dossier
- github.com/semgrep/semgrep-network-broker/issues/189issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- github.com/trufflesecurity/trufflehog/issues/4551scanner-rule-source · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- trufflesecurity/trufflehog @ 48b58d3bf3f02ba17bf23b87f095499bc80c6fd7: pkg/detectors/gitlab/v3/gitlab_v3.goother · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitlab.com/gitlab-org/gitlab/-/blob/87cb885dccf8cfa81ee5aa734b7f2e796413e221/lib/authn/token_field/generator/routable_token.rbother · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitlab.com/gitlab-org/gitlab/-/merge_requests/169322other · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitlab.com/gitlab-org/gitlab/-/blob/87cb885dccf8cfa81ee5aa734b7f2e796413e221/app/models/personal_access_token.rbother · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitlab.com/gitlab-org/security-products/secret-detection/secret-detection-rules/-/blob/e1c7e83815a7e55cc1514dd59d4e56459e39cbfb/rules/mit/gitlab/gitlab.tomlother · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- gitlab.com/gitlab-org/gitlab/-/work_items/623418other · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/routable_tokens/provider-documentation · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
Provider documented ·
taxonomy-sources· current · observed 2026-09-29The legacy taxonomy lists 2 sources for this family. The taxonomy records no date; the dossier researchedAt is used as the observed-at date.
- redact-secret/redact-secret @ 4fb78827f1ddf5b3106f25130ca510a836ada186: docs/audits/evidence/1012/gitlab-routable-personal-access-token.mdprovider-sdk-source · last read 2026-09-29 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rbprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy · #L7-L86
Open questions
No open question is recorded for this revision.
Benchmark dossier notes
- Shape
- prefix
glpat-, a base64url payload with no padding (0-9a-zA-Z_-), then either.+ 2-character base36 length + 7-character base36 CRC32 (unversioned), or.+ 2-character base36 version +.+ 2-character base36 length + 7-character base36 CRC32 (versioned). GitLab's rules bound the payload at 27 to 300 characters. The random part is 16 bytes, followed by a routing payload of newline-separatedkey:valuepairs and a trailing length byte.
In this benchmark
- Fixtures
- 31
- Left readable
- 0
- Redacted too much
- 0
- False alarms
- 7
31 fixtures: 14 expect a redaction, 17 must stay quiet. See every row
| Evidence level | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| T1Provider-documented | 14 | 0 | 0 | 0 |
| T2Tool-corroborated | 12 | 0 | 0 | 7 |
| T3Project policy | 5 | 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 | 31 | 12 | 2 | 1 |
| gitleaksRepository scanner · 8.30.1 · Directory scan · default rules1 rule targets it | 31 | 5 | 0 | 8 |
| redact-secretProduct measured here · 0.1.0-beta.14 · Published npm package · default detectorsNo detector mapped | 31 | 0 | 0 | 7 |
| trufflehogRepository scanner · 3.97.4 · Filesystem scan · verification disabled1 rule targets it | 31 | 0 | 0 | 3 |
Scanner rules for this family
| Scanner | Rule | What the rule matches |
|---|---|---|
| gitleaks · rules 8.30.1 | gitlab-pat-routable | glpat- + 27-300 characters + . + 2 + 7 base36 characters |
| trufflehog · rules 3.97.4 | gitlab/v3 | glpat- + 27-300 characters + 2 + 9 characters |
No rule maps to this family in flare-redact, openredaction.
Fixtures in this family
| Fixture | Kind and evidence | redact-secret |
|---|---|---|
gitlab-routable-personal-access-token-checksum-mismatch-twingitlab · invalid-checksum | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-length-holder-mismatch-twingitlab · wrong-length | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-missing-separator-twingitlab · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-payload-26-twingitlab · wrong-length | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-trailing-glue-twingitlab · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-uppercase-base36-twingitlab · wrong-alphabet | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-version-one-char-twingitlab · wrong-length | Must not flagT2 · Tool-corroborated · twin | Flagged |
gitlab-routable-personal-access-token-bare-prosegitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-bearer-headergitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-chat-pastegitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-dotenvgitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-env-reference-referencegitlab · templated-reference | Must not flagT3 · Project policy | Quiet |
gitlab-routable-personal-access-token-exportgitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-git-remote-urlgitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-json-api-keygitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-json-tokengitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-leading-glue-twingitlab · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
gitlab-routable-personal-access-token-payload-27gitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-payload-300gitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-private-token-headergitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-python-gitlabgitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-sdk-kwarggitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-x-api-key-headergitlab · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
gitlab-routable-personal-access-token-angle-placeholdergitlab · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
gitlab-routable-personal-access-token-base64-url-encoded-valuegitlab · benign-encoded-value | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-routable-personal-access-token-ci-job-token-referencegitlab · templated-reference | Must not flagT3 · Project policy | Quiet |
gitlab-routable-personal-access-token-masked-placeholdergitlab · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
gitlab-routable-personal-access-token-project-path-public-idgitlab · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-routable-personal-access-token-token-guidance-prosegitlab · prose-mention | Must not flagT3 · Project policy | Quiet |
gitlab-routable-personal-access-token-token-metadata-public-idgitlab · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
gitlab-routable-personal-access-token-truncated-near-missgitlab · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
Sources
Documentation and code
- gitlab.com/gitlab-org/gitlab/-/blob/fa2faf332129a1fd9130b052f42b85f0fa346b65/lib/authn/token_field/generator/routable_token.rb#L7-L86
- github.com/redact-secret/redact-secret/blob/4fb78827f1ddf5b3106f25130ca510a836ada186/docs/audits/evidence/1012/gitlab-routable-personal-access-token.md
- docs.gitlab.com/security/tokens/
- gitlab.com/gitlab-org/gitlab/-/blob/87cb885dccf8cfa81ee5aa734b7f2e796413e221/lib/authn/token_field/generator/routable_token.rb
- gitlab.com/gitlab-org/gitlab/-/blob/87cb885dccf8cfa81ee5aa734b7f2e796413e221/app/models/personal_access_token.rb
- gitlab.com/gitlab-org/gitlab/-/merge_requests/169322
- gitlab.com/gitlab-org/gitlab/-/work_items/623418
- gitlab.com/gitlab-org/security-products/secret-detection/secret-detection-rules/-/blob/e1c7e83815a7e55cc1514dd59d4e56459e39cbfb/rules/mit/gitlab/gitlab.toml
- handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/routable_tokens/
- github.com/gitleaks/gitleaks/blob/b58d3f102cf3a2c84cb7f923d05c25c9b1aed84b/cmd/generate/config/rules/gitlab.go
- github.com/trufflesecurity/trufflehog/blob/48b58d3bf3f02ba17bf23b87f095499bc80c6fd7/pkg/detectors/gitlab/v3/gitlab_v3.go
- github.com/trufflesecurity/trufflehog/issues/4551
- github.com/gitleaks/gitleaks/issues/1655
- github.com/semgrep/semgrep-network-broker/issues/189
- docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patterns
Research log
- redact-secret/redact-secret-benchmarks#473Research issue
- redact-secret/redact-secret#518Research issue
- redact-secret/redact-secret#1012Research issue
- redact-secret/redact-secret#1022Research issue
- redact-secret/redact-secret-benchmarks#528Research issue
- Final evidence, pinned to a commit/redact-secret/redact-secret/blob/4fb78827f1ddf5b3106f25130ca510a836ada186/docs/audits/evidence/1012/gitlab-routable-personal-access-token.md