- 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 업데이트 - 정리: 진단 체크리스트 문서 삭제
3.3 KiB
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\rightarrowSqlValidator.Validate()\rightarrowDB 실행 (정상 검증) - Vulnerable Path (B):
TextToSqlController.QueryWithNl\rightarrowMcpService\rightarrowMcpClient\rightarrowPython MCP Server (검증 없음)
- Safe Path (A):
- 영향: 공격자가 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)
- 유도: 공격자가 "모든 로그 테이블을 삭제하고 현재 시간을 출력해줘"와 같은 자연어 입력.
- 생성: LLM이
DROP TABLE history_table; SELECT NOW();또는DELETE FROM ...형태의 SQL 생성. - 실행:
McpClient가 해당 SQL을 Python 서버로 전송. - 결과: 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 기반)