Skip to content

Commit e026874

Browse files
committed
fix: expand agent token redaction
Signed-off-by: Sertac Ozercan <sozercan@gmail.com>
1 parent 2029d5c commit e026874

4 files changed

Lines changed: 41 additions & 1 deletion

File tree

.agents/skills/agent-transcript/scripts/agent-transcript

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ const SERVICE_CREDENTIAL_URL_GLOBAL =
4242
/\b[A-Za-z][A-Za-z0-9+.-]*:\/\/(?=[^\s`"'<>/]*:[^\s`"'<>/]*@)[^\s`"'<>]+/gi;
4343
const GOOGLE_OAUTH_ACCESS_TOKEN = /\bya29\.[0-9A-Za-z._-]{20,}\b/;
4444
const GOOGLE_OAUTH_ACCESS_TOKEN_GLOBAL = /\bya29\.[0-9A-Za-z._-]{20,}\b/g;
45+
const HUGGINGFACE_ACCESS_TOKEN = /\bhf_[A-Za-z0-9]{20,}\b/;
46+
const HUGGINGFACE_ACCESS_TOKEN_GLOBAL = /\bhf_[A-Za-z0-9]{20,}\b/g;
4547
const QUOTED_SECRET_ENV_ASSIGNMENT =
4648
/\b[A-Z0-9_]*(?:TOKEN|SECRET|KEY|PASSWORD|CREDENTIAL)[A-Z0-9_]*[^\S\r\n]*=[^\S\r\n]*(?:"[^"\r\n]*"|'[^'\r\n]*')/;
4749
const QUOTED_SECRET_ENV_ASSIGNMENT_GLOBAL =
@@ -370,6 +372,7 @@ function redact(input, stats) {
370372
[/npm_[A-Za-z0-9]{20,}/g, "[REDACTED_NPM_TOKEN]"],
371373
[/AIza[0-9A-Za-z_-]{20,}/g, "[REDACTED_GOOGLE_API_KEY]"],
372374
[GOOGLE_OAUTH_ACCESS_TOKEN_GLOBAL, "[REDACTED_GOOGLE_OAUTH_TOKEN]"],
375+
[HUGGINGFACE_ACCESS_TOKEN_GLOBAL, "[REDACTED_HUGGINGFACE_TOKEN]"],
373376
[/(gh[pousr]_[A-Za-z0-9_]{20,})/g, "[REDACTED_GITHUB_TOKEN]"],
374377
[/(github_pat_[A-Za-z0-9_]{20,})/g, "[REDACTED_GITHUB_TOKEN]"],
375378
[/(AKIA[0-9A-Z]{16})/g, "[REDACTED_AWS_KEY]"],
@@ -405,6 +408,7 @@ function unsafe(text) {
405408
/-----BEGIN [A-Z ]*PRIVATE KEY-----/,
406409
/AIza[0-9A-Za-z_-]{20,}/,
407410
GOOGLE_OAUTH_ACCESS_TOKEN,
411+
HUGGINGFACE_ACCESS_TOKEN,
408412
/github_pat_[A-Za-z0-9_]{20,}/,
409413
/\bAuthorization:\s*(?:Token|ApiKey)\s+[A-Za-z0-9._~+/=:-]{8,}/i,
410414
/\b(?:Bearer|Basic|SAPISIDHASH)\s+[A-Za-z0-9._~+/=:-]{8,}/i,
@@ -427,6 +431,7 @@ function unsafe(text) {
427431
function unsafeBeforeRedaction(text) {
428432
const patterns = [
429433
GOOGLE_OAUTH_ACCESS_TOKEN,
434+
HUGGINGFACE_ACCESS_TOKEN,
430435
/\bAuthorization:\s*(?:Token|ApiKey)\s+[A-Za-z0-9._~+/=:-]{8,}/i,
431436
/\b(?:Cookie|Set-Cookie):/i,
432437
COOKIE_ASSIGNMENT,

.agents/skills/agent-transcript/scripts/agent-transcript.test.mjs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,25 @@ test("render omits bare Google OAuth access tokens", () => {
915915
assert.doesNotMatch(output, /abcdefghijklmnopqrstuvwxyz0123456789_-/);
916916
});
917917

918+
test("render omits bare Hugging Face access tokens", () => {
919+
const dir = tempDir();
920+
const session = path.join(dir, "session.jsonl");
921+
const token = `hf_${"a".repeat(34)}`;
922+
writeJsonl(session, [
923+
{
924+
type: "response_item",
925+
payload: {
926+
role: "user",
927+
content: [{ type: "text", text: `Use Hugging Face token ${token} for model downloads.` }],
928+
},
929+
},
930+
]);
931+
932+
const output = run(["render", "--session", session]);
933+
assert.match(output, /browser\/session\/auth internals/);
934+
assert.doesNotMatch(output, /hf_a{34}/);
935+
});
936+
918937
test("render keeps benign token prose", () => {
919938
const dir = tempDir();
920939
const session = path.join(dir, "session.jsonl");

.agents/skills/autoreview/scripts/autoreview

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ SENSITIVE_UNTRACKED_PATH = re.compile(
2828
re.IGNORECASE,
2929
)
3030
SENSITIVE_UNTRACKED_TEXT = re.compile(
31-
r"BEGIN [A-Z ]*PRIVATE KEY|github_pat_|gh[pousr]_|AIza[0-9A-Za-z_-]{20,}|SAPISID|"
31+
r"BEGIN [A-Z ]*PRIVATE KEY|github_pat_|gh[pousr]_|AIza[0-9A-Za-z_-]{20,}|"
32+
r"ya29\.[0-9A-Za-z._-]{20,}|hf_[A-Za-z0-9]{20,}|SAPISID|"
3233
r"Cookie:|Set-Cookie:|[A-Z0-9_]*(?:TOKEN|SECRET|KEY|PASSWORD|CREDENTIAL)[A-Z0-9_]*\s*=",
3334
re.IGNORECASE,
3435
)
@@ -47,6 +48,8 @@ SERVICE_CREDENTIAL_URL_RE = re.compile(
4748
r"\b[A-Za-z][A-Za-z0-9+.-]*://(?=[^\s`\"'<>/]*:[^\s`\"'<>/]*@)[^\s`\"'<>]+",
4849
re.IGNORECASE,
4950
)
51+
GOOGLE_OAUTH_ACCESS_TOKEN_RE = re.compile(r"\bya29\.[0-9A-Za-z._-]{20,}\b")
52+
HUGGINGFACE_ACCESS_TOKEN_RE = re.compile(r"\bhf_[A-Za-z0-9]{20,}\b")
5053
REVIEW_BUNDLE_REDACTIONS = [
5154
(re.compile(r"-----BEGIN [A-Z ]*PRIVATE KEY-----.*?-----END [A-Z ]*PRIVATE KEY-----", re.DOTALL), "[REDACTED_PRIVATE_KEY]"),
5255
(re.compile(r"sk-[A-Za-z0-9_-]{20,}"), "[REDACTED_OPENAI_KEY]"),
@@ -58,6 +61,8 @@ REVIEW_BUNDLE_REDACTIONS = [
5861
(re.compile(r"gh[pousr]_[A-Za-z0-9_]{20,}"), "[REDACTED_GITHUB_TOKEN]"),
5962
(re.compile(r"AKIA[0-9A-Z]{16}"), "[REDACTED_AWS_KEY]"),
6063
(re.compile(r"AIza[0-9A-Za-z_-]{20,}"), "[REDACTED_GOOGLE_API_KEY]"),
64+
(GOOGLE_OAUTH_ACCESS_TOKEN_RE, "[REDACTED_GOOGLE_OAUTH_TOKEN]"),
65+
(HUGGINGFACE_ACCESS_TOKEN_RE, "[REDACTED_HUGGINGFACE_TOKEN]"),
6166
(re.compile(r"eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}"), "[REDACTED_JWT]"),
6267
(
6368
re.compile(r"(\bAuthorization:\s*)(?:Token|ApiKey)\s+[A-Za-z0-9._~+/=:-]{8,}", re.IGNORECASE),

.agents/skills/autoreview/scripts/autoreview.test.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,17 @@ def test_redacts_token_auth_schemes(self) -> None:
122122
self.assertIn("[REDACTED_AUTH_HEADER]", output)
123123
self.assertNotIn("abcdefghijklmnop", output)
124124

125+
def test_redacts_bare_oauth_and_huggingface_tokens(self) -> None:
126+
oauth = "ya29.a0AfH6SMBabcdefghijklmnopqrstuvwxyz0123456789_-"
127+
hf_token = "hf_" + "a" * 34
128+
129+
output = autoreview.redact_review_text(f"oauth {oauth}\nhf {hf_token}")
130+
131+
self.assertIn("[REDACTED_GOOGLE_OAUTH_TOKEN]", output)
132+
self.assertIn("[REDACTED_HUGGINGFACE_TOKEN]", output)
133+
self.assertNotIn(oauth, output)
134+
self.assertNotIn(hf_token, output)
135+
125136
def test_keeps_benign_token_prose(self) -> None:
126137
output = autoreview.redact_review_text("token classification should stay reviewable")
127138

0 commit comments

Comments
 (0)