Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions .jules/sentinel.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,8 @@
**Vulnerability:** Known high-severity vulnerabilities discovered by the audit in `js-yaml` and `nanoid` packages.
**Learning:** Deeply nested dependencies (`js-yaml` via `eslint`, `nanoid` via `vitest/vite`) may expose the application to DoS or logic loops.
**Prevention:** Use `pnpm.overrides` in the root `package.json` to enforce patched versions across all transitive paths in a pnpm workspace.

## 2025-02-18 - [μž„μ‹œ 파일의 μ·¨μ•½ν•œ λ‚œμˆ˜ 생성]
**Vulnerability:** `Math.random()`을 μ‚¬μš©ν•˜μ—¬ μž„μ‹œ 파일 μ΄λ¦„μ˜ μž„μ˜μ„±μ„ μƒμ„±ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€ (`Math.random().toString(36).slice(2)`).
**Learning:** `Math.random()`은 μ•”ν˜Έν•™μ μœΌλ‘œ μ•ˆμ „ν•˜μ§€ μ•Šμ€ μ˜μ‚¬ λ‚œμˆ˜ 생성기(PRNG)μž…λ‹ˆλ‹€. μž„μ‹œ 파일 이름 생성 λ“± λ³΄μ•ˆ κ΄€λ ¨ μ‹λ³„μž 생성에 μ‚¬μš©λ  경우, 예츑 κ°€λŠ₯μ„±μœΌλ‘œ 인해 λ³΄μ•ˆ μœ„ν—˜(예: Temp file name collision, predictable temp file)을 μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
**Prevention:** λ³΄μ•ˆμ΄ μ€‘μš”ν•˜κ±°λ‚˜ 예츑 λΆˆκ°€λŠ₯성이 보μž₯λ˜μ–΄μ•Ό ν•˜λŠ” 랜덀 값이 ν•„μš”ν•  λ•ŒλŠ” 항상 Node.js의 `crypto.randomBytes()`와 같은 μ•”ν˜Έν•™μ μœΌλ‘œ μ•ˆμ „ν•œ λ‚œμˆ˜ 생성기(CSPRNG)λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
2 changes: 1 addition & 1 deletion packages/cli/src/lib/event-sender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export function buildSelfHealScript({
// Step 10: Merge new orgId/orgSlug, preserving all other fields and key order
`const updated={...latest,orgId:body.project.orgId,orgSlug:body.project.orgSlug};`,
// Step 11: Atomic write via tmp + renameSync
`atomicTmp=${projectJsonPathJson}+'.tmp.'+process.pid+'.'+Math.random().toString(36).slice(2);`,
`atomicTmp=${projectJsonPathJson}+'.tmp.'+process.pid+'.'+require('crypto').randomBytes(8).toString('hex');`,
`fs.writeFileSync(atomicTmp,JSON.stringify(updated,null,2),'utf8');`,
`fs.renameSync(atomicTmp,${projectJsonPathJson});`,
`}catch{try{if(atomicTmp)fs.unlinkSync(atomicTmp);}catch{}}finally{try{fs.rmdirSync(lockDir);}catch{}}`,
Expand Down
Loading