Files
ExperionCrawler/T2SQL-진단-GEMMA4.md
windpacer 302183c97e feat: P&ID 연결 분석, LLM 에이전트 모드, KB 확장, MCP 서버 리팩토링
- P&ID: 연결 분석 API, Prefix 규칙 관리, 카테고리 분류, DXF 그래프 빌드
- LLM: 대화 요약, tool card 영구 보존, 시계열 차트(uPlot), 에이전트 모드
- KB: 청크 미리보기, Field Instrument Inference, 인증/Qdrant 클라이언트
- MCP: 서버 기능 확장, 파이프라인 수정, timeout 개선
- Frontend: P&ID UI, LLM UI, KB UI, OPC UA Write 탭 추가
- 설정: AGENTS.md, plant_context, README, opencode.json 업데이트
- 정리: 진단 체크리스트 문서 삭제
2026-05-21 23:36:57 +09:00

51 lines
3.3 KiB
Markdown

# Text-to-SQL 기능 E2E 보안 진단 보고서 (Generated by Gemma 4)
## 1. 진단 개요
- **대상**: ExperionCrawler Text-to-SQL 기능 (NLP to SQL 및 E2E Query 실행 경로)
- **목적**: LLM이 생성한 SQL의 실행 과정에서 발생할 수 있는 보안 취약점(SQL Injection 등) 식별
- **진단 방법**: `diagnosis-checklist.md` 프로토콜에 따른 8단계 정밀 진단
## 2. 발견된 결함 (Critical Findings)
### **[결함 1] 검증의 단절 (Architectural Validation Gap)**
- **위험 등급**: **CRITICAL**
- **설명**: 시스템 내에 매우 강력한 `SqlValidator`가 구현되어 있으나, 자연어 질의를 통한 실행 경로(`QueryWithNl`)에서는 이 검증 로직이 완전히 누락되어 있음.
- **상세 경로 비교**:
- **Safe Path (A)**: `TextToSqlService.ExecuteQueryAsync` $\rightarrow$ `SqlValidator.Validate()` $\rightarrow$ DB 실행 (정상 검증)
- **Vulnerable Path (B)**: `TextToSqlController.QueryWithNl` $\rightarrow$ `McpService` $\rightarrow$ `McpClient` $\rightarrow$ **Python MCP Server** (검증 없음)
- **영향**: 공격자가 LLM을 조작하여 악의적인 SQL을 생성하도록 유도할 경우, `SqlValidator`의 모든 방어 기제(키워드 차단, 함수 화이트리스트, 테이블 제한 등)를 무력화하고 DB를 직접 조작할 수 있음.
## 3. 기술적 세부 분석
### **A. SqlValidator의 방어 수준 (C# 구현)**
`SqlValidator.cs`는 다음과 같은 다층 방어를 수행함:
- `SELECT` 문 강제 (Line 49)
- DDL/DML 위험 키워드 차단 (Line 60)
- `UNION`, `INTO`, `CALL` 등 금지된 구문(Clause) 정규식 검사 (Line 95)
- 허용된 함수(Whitelist) 외 호출 차단 (Line 131)
- 허용된 테이블(Whitelist) 외 참조 차단 (Line 196)
- 의심스러운 Injection 패턴(OR 1=1 등) 감지 (Line 255)
### **B. 취약점 발생 지점**
`McpClient.cs``QueryWithNlAsync` (Line 151) 및 `RunSqlAsync` (Line 123) 메서드는 입력된 문자열을 그대로 Python MCP 서버로 전달하는 Proxy 역할만 수행하며, C# 계층에서의 어떠한 유효성 검사도 수행하지 않음.
## 4. 공격 시나리오 (Exploit Scenario)
1. **유도**: 공격자가 "모든 로그 테이블을 삭제하고 현재 시간을 출력해줘"와 같은 자연어 입력.
2. **생성**: LLM이 `DROP TABLE history_table; SELECT NOW();` 또는 `DELETE FROM ...` 형태의 SQL 생성.
3. **실행**: `McpClient`가 해당 SQL을 Python 서버로 전송.
4. **결과**: Python 서버(FastMCP)가 전달받은 SQL을 즉시 실행하여 데이터 유실 발생.
## 5. 권장 조치 사항 (Remediation)
### **[단기 조치 - 우선순위: 높음]**
- **C# 계층 검증 강제**: `McpService.QueryWithNlAsync` 또는 `McpClient.CallToolAsync` 호출 직전에 `SqlValidator`를 반드시 거치도록 로직 수정.
- **경로 통합**: `TextToSqlService` 내에서 MCP 호출 전 SQL을 미리 생성하여 검증한 뒤 전달하는 방식으로 흐름 변경.
### **[장기 조치 - 우선순위: 보통]**
- **Defense in Depth**: Python MCP 서버 내부에서도 C#의 `SqlValidator`와 유사한 수준의 SQL 검증 로직을 구현하여 2중 방어 체계 구축.
- **최소 권한 원칙**: MCP 서버가 사용하는 DB 계정의 권한을 `SELECT` 전용으로 제한.
---
**진단 완료일**: 2026-05-17
**진단 도구**: opencode (Gemma 4 기반)