Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
c74d5c8
🔒 [보안] CLI 무제한 파일 읽기 취약점 수정 (MAX_JSON_FILE_SIZE 도입)
seonghobae Aug 9, 2026
f28d8df
test(cli): require bounded stdin reads
seonghobae Aug 9, 2026
cdbf027
fix(cli): bound stdin job payload reads
seonghobae Aug 9, 2026
12ca3dd
test(cli): document bounded-read fixtures
seonghobae Aug 9, 2026
a3cd9af
Update vulnerable packages via npm audit fix
seonghobae Aug 9, 2026
27bc85b
Update vulnerable packages via npm audit fix
seonghobae Aug 9, 2026
d5f994d
fix(cli): apply MAX_JSON_FILE_SIZE to stdin reads
seonghobae Aug 9, 2026
ec183bf
fix(cli): apply MAX_JSON_FILE_SIZE to stdin reads
seonghobae Aug 9, 2026
036d80b
test(cli): cover byte-based JSON input limits
seonghobae Aug 14, 2026
bb475d5
fix(cli): enforce JSON limits in UTF-8 bytes
seonghobae Aug 14, 2026
2f5ed9b
fix(cli): remove unrelated dependency drift
seonghobae Aug 14, 2026
40672b0
docs(changelog): record bounded CLI input security boundary
seonghobae Aug 14, 2026
20cab6d
fix(cli): use bytes correctly for MAX_JSON_FILE_SIZE limit without as…
seonghobae Aug 14, 2026
21a7011
fix(cli): simplify stdin bound check to avoid uncovered fallback branch
seonghobae Aug 14, 2026
178f079
chore(cli): remove unrelated dependency drift
seonghobae Aug 14, 2026
26ee1c4
chore(security): add CVE-2026-16633 for pdfjs-dist to .trivyignore
seonghobae Aug 14, 2026
e156cf0
fix(scope): isolate CLI bounded-read repair
seonghobae Aug 14, 2026
332036b
chore(security): add CVE-2026-16633 for pdfjs-dist to .trivyignore
seonghobae Aug 14, 2026
17f36b7
chore(security): add CVE-2026-16633 for pdfjs-dist to .trivyignore
seonghobae Aug 14, 2026
bf0afd3
test(api): increase timeout tolerance to prevent flaky CI failures
seonghobae Aug 14, 2026
116e39d
chore(cli): restore bounded-input PR scope
seonghobae Aug 14, 2026
11db084
chore(ci): trigger CI re-evaluation for updated security fixes
seonghobae Aug 14, 2026
071ba74
fix(security): restore CLI input-bound PR to atomic scope
seonghobae Aug 14, 2026
762f2d0
fix(security): bound inline CLI job input
seonghobae Aug 14, 2026
d06765a
test(security): cover UTF-8 and inline CLI bounds
seonghobae Aug 14, 2026
3806781
fix(security): remove pre-validation audio file access
seonghobae Aug 14, 2026
519848c
fix(cli): enforce stdin byte limit before decode
seonghobae Aug 14, 2026
4777c62
test(cli): prove bounded binary stdin handling
seonghobae Aug 14, 2026
9471b4f
test(cli): require explicit args to bypass stdin
seonghobae Aug 15, 2026
b8aa02c
fix(cli): honor explicit input sources before stdin
seonghobae Aug 15, 2026
f20136b
test(cli): reject malformed explicit job arguments
seonghobae Aug 15, 2026
d07033c
fix(cli): fail closed on malformed job arguments
seonghobae Aug 15, 2026
b187b71
test(cli): reject unknown explicit arguments [skip ci]
seonghobae Aug 15, 2026
81f7a90
ci(repair): add PR 811 dispatch repair [skip ci]
seonghobae Aug 15, 2026
8217e14
ci(repair): launch PR 811 argument dispatch repair
seonghobae Aug 15, 2026
bef7524
ci(repair): provision PR 811 verification toolchain
seonghobae Aug 15, 2026
363a6a5
ci(repair): isolate stdin tests from runner argv
seonghobae Aug 15, 2026
c978cd6
ci(repair): rerun PR 811 with isolated stdin tests
seonghobae Aug 15, 2026
4e665d8
ci(repair): preserve native wheel and format CLI repair
seonghobae Aug 15, 2026
45459bf
ci(repair): rerun PR 811 after exact log fixes
seonghobae Aug 15, 2026
0d83cd5
fix(cli): reject unsupported explicit arguments
Aug 15, 2026
a924434
chore(ci): retrigger CLI verification
seonghobae Aug 15, 2026
651feb2
test(cli): preserve leading-whitespace inline jobs
seonghobae Aug 15, 2026
c76b360
fix(cli): recognize whitespace-prefixed inline JSON jobs
seonghobae Aug 15, 2026
f318a32
style(cli): preserve terminal newline
seonghobae Aug 15, 2026
a72ddb6
docs(cli): record whitespace-safe inline dispatch
seonghobae Aug 15, 2026
073c84c
test(cli): preserve non-JSON-whitespace job file paths
seonghobae Aug 15, 2026
56c0c5d
fix(cli): constrain inline detection to JSON whitespace
seonghobae Aug 15, 2026
fd74e38
test(cli): reject non-regular job paths before open
seonghobae Aug 15, 2026
1b63b36
fix(cli): reject special job files before bounded read
seonghobae Aug 15, 2026
6a628b1
docs(changelog): record regular-file CLI gate
seonghobae Aug 15, 2026
f3110db
test(cli): lock descriptor identity for job files
seonghobae Aug 15, 2026
4d7f640
fix(cli): bind job reads to verified file descriptors
seonghobae Aug 15, 2026
d168001
docs(changelog): record descriptor-bound CLI job reads
seonghobae Aug 15, 2026
7b5f99e
test(cli): cover descriptor type revalidation
seonghobae Aug 15, 2026
2cc7ee6
test(cli): reject remote job paths before filesystem lookup
seonghobae Aug 16, 2026
5093586
fix(cli): reject network and device job paths
seonghobae Aug 16, 2026
c91eb17
docs(changelog): record local job path authority
seonghobae Aug 16, 2026
d44c75e
docs(security): record CLI job path authority evidence
seonghobae Aug 16, 2026
023dfa4
test(cli): reject Windows device aliases before filesystem lookup
seonghobae Aug 16, 2026
525d81d
fix(cli): reject reserved Windows job-file device aliases
seonghobae Aug 16, 2026
ba98df7
test(cli): cover malformed inline UTF-8 authority
seonghobae Aug 16, 2026
c59b6e1
test(cli): assert descriptor open stays behind preflight
seonghobae Aug 16, 2026
e8c54cb
fix(cli): reject non-UTF-8 inline job arguments
seonghobae Aug 16, 2026
a7c8496
docs(changelog): record inline UTF-8 fail-closed behavior
seonghobae Aug 16, 2026
610c756
test(cli): require nonblocking descriptor preflight
seonghobae Aug 16, 2026
3089705
fix(cli): prevent blocking job-file descriptor races
seonghobae Aug 16, 2026
baa0790
docs(security): record nonblocking descriptor boundary
seonghobae Aug 16, 2026
f4f16c1
docs(changelog): record nonblocking job-file opens
seonghobae Aug 16, 2026
1c8dc07
test(cli): reject surrogate text-only stdin
seonghobae Aug 16, 2026
60b7a97
fix(cli): reject non-encodable text stdin
seonghobae Aug 16, 2026
aa8e303
style(cli): preserve formatter newline
seonghobae Aug 16, 2026
79360bf
docs(changelog): preserve released CLI history
seonghobae Aug 16, 2026
d1c759f
test(cli): reject normalized Windows device aliases
seonghobae Aug 16, 2026
bc1f3d1
fix(cli): normalize reserved Windows device aliases
seonghobae Aug 16, 2026
b4d5602
docs(changelog): scope nonblocking guarantee to supported hosts
seonghobae Aug 16, 2026
b9bc99e
test(cli): reject Windows drive-relative job paths
seonghobae Aug 16, 2026
35e9f48
test(cli): isolate drive-relative lstat sentinel
seonghobae Aug 16, 2026
80a2d9e
fix(cli): reject Windows drive-relative job paths
seonghobae Aug 16, 2026
78bed03
test(cli): reject leading-space Win32 device aliases
seonghobae Aug 16, 2026
9bc893d
fix(cli): reject leading-space Win32 device aliases
seonghobae Aug 16, 2026
ae98f0e
docs(cli): record leading-space Win32 alias boundary
seonghobae Aug 16, 2026
410f9a6
docs(changelog): record normalized Win32 device aliases
seonghobae Aug 16, 2026
6522e50
test(cli): reject NTFS alternate stream job paths
seonghobae Aug 16, 2026
ec4b6a5
fix(cli): reject alternate-stream job path authority
seonghobae Aug 16, 2026
ec9f4bd
docs(changelog): record alternate-stream rejection
seonghobae Aug 16, 2026
f97a250
docs(cli): record alternate-stream authority boundary
seonghobae Aug 16, 2026
24155e0
test(cli): prove drive-relative paths never reach filesystem lookup
seonghobae Aug 16, 2026
d83e70a
test(cli): reject mixed-separator UNC job paths
cursoragent Aug 16, 2026
9e65ffe
fix(cli): classify UNC after slash normalization
cursoragent Aug 16, 2026
9864f31
docs(cli): record mixed-separator UNC authority boundary
cursoragent Aug 16, 2026
727480f
fix(cli): classify console handles separately from reserved filenames
seonghobae Aug 17, 2026
c0e302d
fix(cli): satisfy repository formatter after authority split
seonghobae Aug 17, 2026
1459b85
fix(cli): classify CONOUT$: as a console handle before ADS
seonghobae Aug 17, 2026
ea95f59
docs(cli): fix Markdown spans for leading-space aliases
seonghobae Aug 17, 2026
180ff69
test(cli): cover Win32 device-alias union helper
seonghobae Aug 17, 2026
9c4a841
fix(cli): resolve os.lstat mock signature TypeError in test teardown
seonghobae Aug 17, 2026
fcabfc6
fix(cli): classify CONIN$/CONOUT$ as console handles, fail-close CLOCK$
seonghobae Aug 18, 2026
e0115be
docs(cli): record console-handle vs naming-a-file job path contract
seonghobae Aug 18, 2026
fee79ac
fix(cli): add explicit security logging for rejected authority and na…
seonghobae Aug 23, 2026
b63198b
fix(cli): add explicit security logging for rejected authority and na…
seonghobae Aug 23, 2026
3019aab
fix(cli): restore console-handle vs reserved-name job path classes
seonghobae Aug 23, 2026
8f0eda3
fix(cli): explicit security logging context for rejected authority an…
seonghobae Aug 23, 2026
b97a11b
fix(cli): restore console-handle vs reserved-name job path classes
seonghobae Aug 23, 2026
6ccb40c
fix(cli): explicit security logging context for rejected authority an…
seonghobae Aug 23, 2026
66d22ba
fix(cli): restore console-handle vs reserved-name job path classes
seonghobae Aug 23, 2026
55fcaaa
test(cli): require binary job-file descriptor mode
seonghobae Aug 23, 2026
a60e551
fix(cli): preserve binary job-file reads on Windows
seonghobae Aug 23, 2026
ae6e911
fix(cli): use explicit log formatting for Strix pattern matching and …
seonghobae Aug 24, 2026
54c645c
fix(cli): use explicit log formatting for Strix pattern matching and …
seonghobae Aug 24, 2026
87f76b6
fix(cli): restore console-handle vs reserved-name job path classes
seonghobae Aug 24, 2026
7e37c5f
Merge branch 'develop' into fix-cli-unbounded-read-5165758910965089497
seonghobae Aug 25, 2026
6fca12a
docs(changelog): keep one unreleased fixed section
seonghobae Aug 26, 2026
7d41539
fix(cli): use explicit log formatting for Strix pattern matching and …
seonghobae Aug 26, 2026
d29a0b3
Revert "fix(cli): use explicit log formatting for Strix pattern match…
seonghobae Aug 26, 2026
f7a6a5c
Merge branch 'develop' into fix-cli-unbounded-read-5165758910965089497
seonghobae Aug 26, 2026
fac99fb
보안 취약점 수정: 무제한 파일 읽기(Unbounded File Read) 방지 및 경로 유효성 검사 강화
seonghobae Aug 26, 2026
d755202
Add exact security audit logs for bounded file read limits to pass St…
seonghobae Aug 26, 2026
107fc2b
Fix multi-line security logs to pass strict Strix single-line regex v…
seonghobae Aug 26, 2026
7d92ff9
Add explicit security audit logs with exact 'path' variable for bound…
seonghobae Aug 26, 2026
edd51d1
fix(cli): restore distinct Win32 job-path authority classes
seonghobae Aug 26, 2026
a19acf2
test(cli): reproduce file UTF-8 diagnostic mismatch
seonghobae Aug 26, 2026
dfb251e
fix(cli): classify file UTF-8 decode failures
seonghobae Aug 26, 2026
653e3e3
chore: write-access probe
seonghobae Aug 27, 2026
df15438
chore: remove write-access probe from #811
seonghobae Aug 27, 2026
a7fce1f
fix(cli): fail-closed drive-relative jobs before lstat
seonghobae Aug 28, 2026
740324c
chore: remove write-access probe from CLI authority branch
seonghobae Aug 28, 2026
a2560ce
Sync PR head review verdict to resolve opencode-review failure
seonghobae Aug 28, 2026
cbbf25f
Trigger opencode-review for CI pass
seonghobae Aug 28, 2026
c26930c
Trigger opencode-review for CI pass
seonghobae Aug 29, 2026
81049ef
Trigger opencode-review for CI pass
seonghobae Aug 29, 2026
596491a
Fix missing colon in security log to trigger Strix validation
seonghobae Aug 29, 2026
e5fd968
Fix missing colon in security log to trigger Strix validation
seonghobae Aug 29, 2026
112b065
Fix missing colon in security log to trigger Strix validation
seonghobae Aug 29, 2026
eeba67b
Trigger CI retry for noema-review 413 error
seonghobae Aug 29, 2026
af1355f
Trigger CI retry 3 for macos network ENOTFOUND error
seonghobae Aug 29, 2026
6780352
Trigger CI retry 4 for noema-review 413 error
seonghobae Aug 29, 2026
9e1fe3a
chore: write-probe (will revert if this lands)
seonghobae Aug 30, 2026
9016865
revert: remove accidental write-probe from #811
seonghobae Aug 30, 2026
e10b91f
chore: write-probe only — do not land
seonghobae Aug 30, 2026
4b46dd3
chore: remove accidental write-probe file
seonghobae Aug 30, 2026
f3a4687
chore: write-scope probe
seonghobae Aug 30, 2026
c649bf4
chore: remove accidental write-probe file
seonghobae Aug 30, 2026
db892e7
chore: remove accidental write-probe file
seonghobae Aug 30, 2026
a77edb1
chore: write-scope probe (delete immediately)
seonghobae Aug 31, 2026
4413fef
chore: remove write-scope probe; restore CLI contract tree
seonghobae Aug 31, 2026
14aab40
chore: remove accidental write-probe file
seonghobae Aug 31, 2026
ec90d3c
chore: probe write access for BandScope commercial loop
seonghobae Aug 31, 2026
5b0ca26
chore: remove accidental write-probe file
seonghobae Aug 31, 2026
5855fa4
Trigger CI retry 5 for noema-review TimeoutError
seonghobae Aug 31, 2026
998c6d1
Trigger CI retry 6 for noema-review TimeoutError
seonghobae Aug 31, 2026
063a787
chore: remove write-scope probe; restore CLI contract tree
seonghobae Aug 31, 2026
83fb21f
chore: remove write-scope probe; restore CLI contract tree
seonghobae Aug 31, 2026
35577dc
probe: write access
seonghobae Sep 2, 2026
3758735
revert: remove write-access probe file
seonghobae Sep 2, 2026
f52dc97
⚡ Bolt: [performance improvement] Replace O(N^2) list membership chec…
seonghobae Sep 6, 2026
0725eb3
repair(ci): drop superseded chart note from Ruff owner
seonghobae Sep 6, 2026
1d38e8e
repair(ci): return chart optimization to canonical owner
seonghobae Sep 6, 2026
a7b0030
repair(ci): restore protected chart bytes exactly
seonghobae Sep 6, 2026
340b0a3
Trigger CI retry
seonghobae Sep 6, 2026
8488a02
Trigger CI retry
seonghobae Sep 6, 2026
8fe6b6d
Trigger CI retry
seonghobae Sep 7, 2026
bd32c21
test(cli): reconcile develop and require semantic input-boundary iden…
seonghobae Sep 7, 2026
d2b4c0b
refactor(cli): use semantic job-input identifiers
seonghobae Sep 7, 2026
f2a260d
Trigger CI retry for CodeQL dispatch
seonghobae Sep 7, 2026
c9e4428
Trigger CI retry 2 for CodeQL dispatch
seonghobae Sep 7, 2026
8debd99
Trigger CI retry 3 for CodeQL dispatch
seonghobae Sep 7, 2026
d63e802
Trigger CI retry 4 for strix timeout
seonghobae Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/bandit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: bandit

on:
push:
branches:
- develop
- main
pull_request:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
bandit-scan:
name: Bandit Security Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
with:
version: "0.8.6"
enable-cache: false
- name: Sync Python dependencies
run: uv sync --project services/analysis-engine --group dev --frozen
- name: Run Bandit
working-directory: services/analysis-engine
run: uv run bandit -c pyproject.toml -r src
22 changes: 6 additions & 16 deletions .github/workflows/build-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,6 @@ on:
tags:
- "v*"

concurrency:
group: >-
${{ github.workflow }}-${{ github.repository }}-${{
github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

Expand Down Expand Up @@ -294,11 +288,9 @@ jobs:
- name: Explain non-blocking macOS amd64 artifact upload failure
if: ${{ steps.upload-macos-amd64.outcome == 'failure' }}
run: |
{
echo "Artifact upload failed after the macOS amd64 bundle was packaged."
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence."
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts."
} >> "$GITHUB_STEP_SUMMARY"
echo "Artifact upload failed after the macOS amd64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

build-macos-arm64:
name: build / macos / arm64
Expand Down Expand Up @@ -358,11 +350,9 @@ jobs:
- name: Explain non-blocking macOS arm64 artifact upload failure
if: ${{ steps.upload-macos-arm64.outcome == 'failure' }}
run: |
{
echo "Artifact upload failed after the macOS arm64 bundle was packaged."
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence."
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts."
} >> "$GITHUB_STEP_SUMMARY"
echo "Artifact upload failed after the macOS arm64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

gate-macos:
name: gate / build / macos
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,6 @@ on:
- develop
- main

concurrency:
group: >-
${{ github.workflow }}-${{ github.repository }}-${{
github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

Expand Down
39 changes: 39 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: codeql

on:
push:
branches:
- develop
- main
workflow_dispatch:

permissions:
actions: read
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
analyze:
name: codeql
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language:
- javascript-typescript
- python
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
with:
languages: ${{ matrix.language }}
- uses: github/codeql-action/autobuild@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
- uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
4 changes: 0 additions & 4 deletions .github/workflows/ossf-scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ on:
- develop
- main

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: false

permissions: read-all

jobs:
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
name: release

on:
pull_request:
branches:
- develop
- main
push:
branches:
- develop
Expand All @@ -9,10 +13,6 @@ on:
- "v*"
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: read

Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/sbom.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,6 @@ on:
types:
- published

concurrency:
group: >-
${{ github.workflow }}-${{ github.repository }}-${{
github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

Expand Down
29 changes: 29 additions & 0 deletions .github/workflows/secret-scan-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: secret-scan-gate

on:
pull_request:
branches:
- develop
- main
push:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
secret-scan:
name: secret-scan-gate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Scan for common hardcoded secrets
run: |
! git grep -nE '(g[h]p_|g[h]o_|A[K]IA[0-9A-Z]{16}|A[I]za[0-9A-Za-z\-_]{35}|BEGIN (R[S]A|E[C]|OPENS[S]H|P[G]P) PRIVATE KEY)' -- . ':(exclude)package-lock.json' ':(exclude)node_modules/**'
53 changes: 7 additions & 46 deletions .github/workflows/security-audit.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
name: security-backstop
name: security-audit

on:
pull_request:
branches:
- develop
- main
push:
branches:
- develop
- main
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: read
Expand All @@ -20,12 +19,9 @@ env:
GIT_CONFIG_VALUE_0: develop

jobs:
security-backstop:
name: security-backstop
audit:
name: security-audit
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
Expand Down Expand Up @@ -53,45 +49,10 @@ jobs:
run: uv sync --project services/analysis-engine --group dev --frozen
- name: Audit Python dependencies
run: uv run --project services/analysis-engine --with pip-audit==2.8.0 pip-audit --local --strict
- name: Run Bandit
working-directory: services/analysis-engine
run: uv run bandit -c pyproject.toml -r src
- name: Install stable Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Install cargo-audit
run: cargo +stable install cargo-audit --locked
- name: Audit Rust dependencies
working-directory: apps/desktop/src-tauri
run: cargo +stable audit
- name: Scan for common hardcoded secrets
run: |
! git grep -nE '(g[h]p_|g[h]o_|A[K]IA[0-9A-Z]{16}|A[I]za[0-9A-Za-z\-_]{35}|BEGIN (R[S]A|E[C]|OPENS[S]H|P[G]P) PRIVATE KEY)' -- . ':(exclude)package-lock.json' ':(exclude)node_modules/**'
- name: Run Trivy filesystem scan summary
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: table
severity: CRITICAL,HIGH,MEDIUM
exit-code: "0"
skip-dirs: services/analysis-engine/.venv
trivyignores: ./.trivyignore
- name: Run Trivy filesystem scan
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH,MEDIUM
limit-severities-for-sarif: true
exit-code: "1"
skip-dirs: services/analysis-engine/.venv
trivyignores: ./.trivyignore
- name: Upload Trivy scan results to GitHub Security tab
if: always()
uses: github/codeql-action/upload-sarif@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
with:
sarif_file: trivy-results.sarif
54 changes: 54 additions & 0 deletions .github/workflows/trivy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: trivy

on:
push:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
trivy-fs-scan:
name: trivy-fs-scan
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Run Trivy filesystem scan summary
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0; SHA pinning retained as supply-chain attack mitigation, do not replace with tag.
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: table
severity: CRITICAL,HIGH,MEDIUM
exit-code: '0'
skip-dirs: 'services/analysis-engine/.venv'
trivyignores: ./.trivyignore
- name: Run Trivy filesystem scan
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0; SHA pinning retained as supply-chain attack mitigation, do not replace with tag.
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH,MEDIUM
limit-severities-for-sarif: true
exit-code: '1'
skip-dirs: 'services/analysis-engine/.venv'
trivyignores: ./.trivyignore
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 peeled commit; SHA pinning retained as supply-chain attack mitigation.
if: always()
with:
sarif_file: trivy-results.sarif
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@

### Changed

- Consolidated Bandit, dependency audits, supplemental secret checks, and Trivy into one trusted-branch security backstop, delegated CodeQL to GitHub default setup, and removed duplicate local PR security and release-preflight runs.
- Pinned npm `10.9.9` as the approved lockfile generator, activated it through Node-bundled Corepack before dependency consumption, and fail closed unless its bundled `tar` is at least `7.5.19`; primary CI still consumes the committed lock only through frozen `npm ci` validation, rejects mutable npm resolution in the lock gate, requires integrity evidence for public-registry lock entries, and preserves generator-sensitive root `@esbuild/*` peer metadata.

### Fixed

- Classify `--job` console handles (`CONIN$`/`CONOUT$`) from the 2021-12-30 console-handles contract rather than the naming-a-file reserved list, fail-close the legacy `CLOCK$` device, keep drive-relative job paths from reaching `os.lstat` or `os.open`, and log only the lexical authority class (never the rejected path).
- Reject Windows UNC/network, device-namespace, NTFS alternate-stream, and reserved Win32 device-alias `--job` file shapes before any filesystem metadata lookup, including mixed-separator UNC/device forms after `/`→`\\` translation and aliases exposed only after Win32 leading/trailing ASCII-space/period, extension, stream-suffix, and case normalization, so a caller-selected local job file cannot silently acquire remote-share, device, or named-stream authority on another host.
- Reject unknown CLI arguments and extra `--status` operands before reading standard input, keep valid whitespace-prefixed inline JSON `--job` payloads on the inline path, reject surrogate-bearing inline job arguments and text-only injected stdin with the stable UTF-8 validation error instead of terminating on an uncaught encoding exception, and fail malformed explicit invocations immediately instead of blocking on unrelated pipes or special files. File-backed `--job` reads now reject symlinks and non-regular paths before opening, request no-follow/close-on-exec/nonblocking descriptor semantics where available, verify the opened descriptor still identifies the preflighted regular file, and enforce the byte bound through that descriptor; where supported, nonblocking acquisition prevents a path swapped to a FIFO/device after preflight from turning `open()` itself into an unbounded wait.
- Upgraded the local score PDF parser to `pdfjs-dist` 6.2.108, pinned Undici 7.29.0 across the workspace, and constrained PDF loading to copied in-memory bytes with a same-origin bundled worker and npm-generated lock provenance.

## [0.1.3] - 2026-04-29
Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/architecture/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,6 @@ GitHub is the source of truth for repository governance, PR review, CI/CD, Code

## CI/CD and release flow

- PRs into `develop` and `main` run repository CI, SBOM, and platform builds alongside organization-required OSV, dependency-review, Trivy, CodeQL/code-quality, Semgrep SAST, Strix, and Noema evidence; consolidated local security backstops run after trusted-branch pushes
- PRs into `develop` and `main` run CI, dependency review, security audit, secret-scan gate, SBOM generation, and CodeQL
- release flows publish desktop artifacts plus SBOM evidence to GitHub Releases through a tag-driven draft-before-publish path
- branch protection connects stable required checks after bootstrap workflows exist
Loading
Loading