Skip to content

Commit 898999f

Browse files
committed
fix(loop): reject ambiguous YAML controls
1 parent e7065ea commit 898999f

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

loops/issue-dev-loop/scripts/lib/validation.mjs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {
77
consumeHistoricalValidationCapability,
88
} from './github-identity.mjs'
99

10+
const unsupportedYamlCharacters =
11+
/[\u0000-\u0009\u000b\u000c\u000e-\u001f\u007f-\u009f\u2028\u2029]/u
12+
1013
async function collectFiles(root, output = []) {
1114
const entries = await readdir(root, { withFileTypes: true })
1215
for (const entry of entries) {
@@ -49,7 +52,7 @@ export function validateFinalizationHistory(historyLines) {
4952

5053
function activeYamlLines(source) {
5154
return source
52-
.split(/\r?\n/)
55+
.split(/\r\n|[\r\n]/)
5356
.map((line) => line.replace(/\s+$/, ''))
5457
.filter((line) => line.trim() && !line.trimStart().startsWith('#'))
5558
}
@@ -110,6 +113,7 @@ function conservativeYamlBlock(
110113
}
111114

112115
export function historicalWorkflowIsLowPrivilege(source) {
116+
if (unsupportedYamlCharacters.test(source)) return false
113117
const lines = activeYamlLines(source)
114118
if (
115119
lines.some(

loops/issue-dev-loop/tests/runtime.test.mjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5436,6 +5436,23 @@ test('historical workflow parsing is fail-closed without exposing reduced valida
54365436
' runs-on: ubuntu-latest\n',
54375437
' - permissions: write-all\n runs-on: ubuntu-latest\n',
54385438
),
5439+
historicalWorkflow.replace(
5440+
' runs-on: ubuntu-latest\n',
5441+
' runs-on: ubuntu-latest\r permissions: write-all\n',
5442+
),
5443+
historicalWorkflow.replace(
5444+
' runs-on: ubuntu-latest\n',
5445+
' runs-on: ubuntu-latest\u0085 permissions: write-all\n',
5446+
),
5447+
historicalWorkflow.replace(
5448+
' runs-on: ubuntu-latest\n',
5449+
' runs-on: ubuntu-latest\u2028 permissions: write-all\n',
5450+
),
5451+
historicalWorkflow.replace(
5452+
' runs-on: ubuntu-latest\n',
5453+
' runs-on: ubuntu-latest\u2029 permissions: write-all\n',
5454+
),
5455+
historicalWorkflow.replace('ubuntu-latest', 'ubuntu-latest\u0000'),
54395456
`${historicalWorkflow}
54405457
!!str permissions: write-all
54415458
`,

0 commit comments

Comments
 (0)