# 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 기반)