Skip to content

Commit 6b11081

Browse files
committed
github/secret_scanning: Consider revoked tokens as true positive
1 parent 85f5566 commit 6b11081

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

src/controllers/github/secret_scanning.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,22 +155,32 @@ fn alert_revoke_token(
155155

156156
let hashed_token = SecureToken::hash(&alert.token);
157157

158-
// not using ApiToken::find_by_api_token in order to preserve last_used_at
159-
// the token field has a uniqueness constraint so get_result() should be safe to use
160-
let token = diesel::update(api_tokens::table)
158+
// Not using `ApiToken::find_by_api_token()` in order to preserve `last_used_at`
159+
let token = api_tokens::table
161160
.filter(api_tokens::token.eq(hashed_token))
162-
.filter(api_tokens::revoked.eq(false))
163-
.set(api_tokens::revoked.eq(true))
164161
.get_result::<ApiToken>(&*conn)
165162
.optional()?;
166163

167164
let Some(token) = token else {
165+
debug!("Unknown API token received (false positive)");
168166
return Ok(GitHubSecretAlertFeedbackLabel::FalsePositive);
169167
};
170168

169+
if token.revoked {
170+
debug!(
171+
token_id = %token.id, user_id = %token.user_id,
172+
"Already revoked API token received (true positive)",
173+
);
174+
return Ok(GitHubSecretAlertFeedbackLabel::TruePositive);
175+
}
176+
177+
diesel::update(&token)
178+
.set(api_tokens::revoked.eq(true))
179+
.execute(&*conn)?;
180+
171181
warn!(
172182
token_id = %token.id, user_id = %token.user_id,
173-
"Revoked API token",
183+
"Active API token received and revoked (true positive)",
174184
);
175185

176186
if let Err(error) = send_notification_email(&token, alert, req) {

src/tests/github_secret_scanning.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,14 @@ fn github_secret_alert_for_revoked_token() {
109109
let response = anon.run::<Vec<GitHubSecretAlertFeedback>>(request);
110110
assert_eq!(response.status(), StatusCode::OK);
111111

112-
// Ensure feedback is a false positive
112+
// Ensure feedback is a true positive
113113
let feedback = response.good();
114114
assert_eq!(feedback.len(), 1);
115115
assert_eq!(feedback[0].token_raw, "some_token");
116116
assert_eq!(feedback[0].token_type, "some_type");
117117
assert_eq!(
118118
feedback[0].label,
119-
GitHubSecretAlertFeedbackLabel::FalsePositive
119+
GitHubSecretAlertFeedbackLabel::TruePositive
120120
);
121121

122122
// Ensure that the token is still revoked

0 commit comments

Comments
 (0)