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

3.3 KiB

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.csQueryWithNlAsync (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 기반)