Skip to content

🟠[P1] fix(api): proxy and upload routes leak error.message verbatim to clients #68

Description

@teddylee777

μ»¨ν…μŠ€νŠΈ 블둝

Key Value
Category api
Checklist ISS-API-03 β€” Error responses leak stack traces or sensitive internal paths
Priority P1 🟠
Scan Date 2026-04-16
Flagged By @api-explorer

μš”μ•½

  • WHAT: μ—¬λŸ¬ API λΌμš°νŠΈκ°€ 500 μ—λŸ¬ 응닡에 error.messageλ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ β€” Node.js fetch μ—λŸ¬μ— ν¬ν•¨λœ λ‚΄λΆ€ 호슀트λͺ…/포트/파일 μ‹œμŠ€ν…œ κ²½λ‘œκ°€ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 유좜
  • WHY: admin λΌμš°νŠΈλ“€μ€ "Internal server error" λ¬Έμžμ—΄λ‘œ λ§ˆμŠ€ν‚Ήν•˜μ§€λ§Œ ν”„λ‘μ‹œ/μ—…λ‘œλ“œ/langsmith λΌμš°νŠΈλŠ” λ§ˆμŠ€ν‚Ή λˆ„λ½ β€” 일관성 λΆ€μž¬
  • WHERE: frontend/src/app/api/[..._path]/route.ts:160, frontend/src/app/api/upload/route.ts:112, frontend/src/app/api/admin/upload/route.ts:102, frontend/src/app/api/langsmith/runs/route.ts:142
  • SEVERITY: HIGH β€” 인프라 ν† ν΄λ‘œμ§€ 정보 유좜 + 곡격자 μ •μ°° 지원

Evidence

# File Line Finding Flagged By Confidence
1 frontend/src/app/api/[..._path]/route.ts 160 return NextResponse.json({ error: error.message }, { status: 500 }) β€” ν”„λ‘μ‹œ 라우트, fetch μ—λŸ¬μ— λ‚΄λΆ€ 호슀트 포함 κ°€λŠ₯ @api-explorer High
2 frontend/src/app/api/upload/route.ts 112 Failed to upload file: ${error.message} β€” fs μ—λŸ¬μ˜ μ ˆλŒ€κ²½λ‘œ 유좜 @api-explorer High
3 frontend/src/app/api/admin/upload/route.ts 102 동일 νŒ¨ν„΄ @api-explorer High
4 frontend/src/app/api/langsmith/runs/route.ts 142 LangSmith SDK μ—λŸ¬μ˜ API ν‚€ 쑰각/URL 유좜 κ°€λŠ₯ @api-explorer High

영ν–₯ 뢄석

영ν–₯ λ²”μœ„

  • ν”„λ‘μ‹œλ₯Ό ν†΅ν•œ LangGraph 호좜 μ‹€νŒ¨ 응닡 (κ°€μž₯ λΉˆλ²ˆν•œ 경둜)
  • 파일 μ—…λ‘œλ“œ μ‹€νŒ¨ μ‹œ μ„œλ²„μ˜ UPLOAD_DIR 경둜 λ…ΈμΆœ
  • LangSmith 런 쑰회 μ‹€νŒ¨ μ‹œ trace URL/API ν‚€ μ•žμžλ¦¬ λ…ΈμΆœ

μž₯μ•  μ‹œλ‚˜λ¦¬μ˜€

  1. κ³΅κ²©μžκ°€ ν”„λ‘μ‹œ λΌμš°νŠΈμ— μ˜λ„μ μœΌλ‘œ 잘λͺ»λœ νŽ˜μ΄λ‘œλ“œ 전솑
  2. Node.js fetchκ°€ connect ECONNREFUSED 10.0.0.5:8123 같은 μ—λŸ¬ 생성
  3. ν΄λΌμ΄μ–ΈνŠΈ 응닡에 λ‚΄λΆ€ λ„€νŠΈμ›Œν¬ ν† ν΄λ‘œμ§€ λ…ΈμΆœ β†’ λ‚΄λΆ€ IP/포트 μ •μ°° 성곡
  4. λ˜λŠ” μ—…λ‘œλ“œ μ—λŸ¬ μ‹œ ENOENT: no such file /var/www/uploads/... μ‘λ‹΅μœΌλ‘œ μ„œλ²„ 파일 μ‹œμŠ€ν…œ ꡬ쑰 νŒŒμ•…

긴급도

μ œμ•ˆ ν•΄κ²° λ°©μ•ˆ

μ ‘κ·Ό 방법

곡톡 μ—λŸ¬ 둜거 + λ§ˆμŠ€ν‚Ή 헬퍼 λ„μž… (frontend/src/lib/api/error-response.ts μ‹ κ·œ):

export function internalErrorResponse(error: unknown, context: string) {
  console.error(\`[api] ${context}\`, error); // μ„œλ²„ μ‚¬μ΄λ“œ 둜그
  return NextResponse.json(
    { error: \"Internal server error\" },
    { status: 500 }
  );
}

λ„€ ꡰ데 라우트 λͺ¨λ‘ 이 ν—¬νΌλ‘œ μΉ˜ν™˜. development ν™˜κ²½μ—μ„œλ§Œ 상세 λ©”μ‹œμ§€ ν—ˆμš©ν•˜λ €λ©΄ process.env.NODE_ENV === \"development\" λΆ„κΈ° μΆ”κ°€.

λŒ€μ•ˆ

  • μ—λŸ¬ μ½”λ“œ μ‹œμŠ€ν…œ λ„μž…: { code: \"FETCH_UPSTREAM_FAILED\", requestId: \"...\" } λ°˜ν™˜ ν›„ μ„œλ²„ λ‘œκ·Έμ—μ„œ 상세 확인 β†’ 더 λ‚˜μ€ μž₯κΈ° μ„€κ³„μ§€λ§Œ μŠ€μ½”ν”„ ν™•λŒ€
  • RFC 9457 Problem Details μ€€μˆ˜: ν‘œμ€€ ν˜•μ‹ μ€€μˆ˜ β†’ λ§ˆμ°¬κ°€μ§€λ‘œ μŠ€μ½”ν”„ ν™•λŒ€

수용 κΈ°μ€€

  • 4개 라우트 λͺ¨λ‘ 500 μ‘λ‹΅μ—μ„œ error.message 제거
  • μ„œλ²„ 둜그(stdout/stderr)μ—λŠ” 전체 μŠ€νƒνŠΈλ ˆμ΄μŠ€ μœ μ§€
  • e2e ν…ŒμŠ€νŠΈλ‘œ μ˜λ„μ  μ—λŸ¬ 유발 ν›„ 응닡 λ°”λ”” 검증
  • ν…ŒμŠ€νŠΈ μ»€λ§¨λ“œ: cd frontend && pnpm test

μ°Έμ‘°

μž¬ν˜„ 방법

사전 쑰건

  • dev μ„œλ²„ μ‹€ν–‰

단계

  1. LangGraph μ„œλ²„λ₯Ό μ€‘μ§€ν•œ μƒνƒœλ‘œ ν”„λ‘μ‹œ 라우트 호좜: curl http://localhost:3000/api/invalid/path
  2. 응닡 λ°”λ””μ˜ error ν•„λ“œ 확인

κΈ°λŒ€ κ²°κ³Ό

{ \"error\": \"Internal server error\" }

μ‹€μ œ κ²°κ³Ό

{ \"error\": \"fetch failed: connect ECONNREFUSED 127.0.0.1:8123\" } (λ‚΄λΆ€ 포트 λ…ΈμΆœ)

κ΄€λ ¨ μ½”λ“œ μ»¨ν…μŠ€νŠΈ

File Role Relevance
frontend/src/app/api/[..._path]/route.ts LangGraph ν”„λ‘μ‹œ μ—”λ“œν¬μΈνŠΈ μˆ˜μ • λŒ€μƒ
frontend/src/app/api/upload/route.ts μ‚¬μš©μž 파일 μ—…λ‘œλ“œ μˆ˜μ • λŒ€μƒ
frontend/src/app/api/admin/upload/route.ts admin μžμ‚° μ—…λ‘œλ“œ μˆ˜μ • λŒ€μƒ
frontend/src/app/api/langsmith/runs/route.ts LangSmith trace 쑰회 μˆ˜μ • λŒ€μƒ

Detected by oh-my-braincrew `omb:issue` scan
Category: api | Scan date: 2026-04-16
`omb-issue-scan category=api checklist=ISS-API-03`

Metadata

Metadata

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions