Skip to content

Commit 6ff3070

Browse files
committed
fix: validate artifact contents before use to prevent artifact poisoning
CodeQL flagged the download-artifact + require() pattern as artifact poisoning: data written by an external user in the capture workflow flows into a write-token context without validation. Validate reviewer login against the GitHub login charset (alphanumeric and hyphens) and confirm pr_number is a positive integer before passing either value to the removal function. Fails the step with a clear message if contents are unexpected. Signed-off-by: Mounil Kanakhara <mounilkankhara@gmail.com>
1 parent a3a7489 commit 6ff3070

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

.github/workflows/on-review.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ jobs:
9090
with:
9191
script: |
9292
const fs = require('fs');
93-
const { reviewer, pr_number: prNumber } = JSON.parse(fs.readFileSync('review.json', 'utf8'));
93+
const raw = JSON.parse(fs.readFileSync('review.json', 'utf8'));
94+
const reviewer = typeof raw.reviewer === 'string' && /^[a-zA-Z0-9][a-zA-Z0-9-]*$/.test(raw.reviewer)
95+
? raw.reviewer : null;
96+
const prNumber = Number.isInteger(raw.pr_number) && raw.pr_number > 0
97+
? raw.pr_number : null;
98+
if (!reviewer || !prNumber) {
99+
core.setFailed(`Invalid artifact contents: reviewer=${raw.reviewer}, pr_number=${raw.pr_number}`);
100+
return;
101+
}
94102
const { removeReviewerFromAssignees } = require('./.github/scripts/bot-pr-add-reviewers-as-assignees.js');
95103
await removeReviewerFromAssignees({ github, context, reviewer, prNumber });

0 commit comments

Comments
 (0)