안전하지 않은 MCP 데모
개요
이 프로젝트는 취약한 MCP 서버와 여러 클라이언트(개념 증명 공격 클라이언트와 우수한 클라이언트 포함)를 시연합니다. MCP 서버의 잠재적 보안 취약점을 보여주기 위한 교육 목적으로 설계되었습니다.
프로젝트 구조
vuln-mcp.py
: 안전하지 않은 도구를 노출시키는 취약한 MCP 서버입니다.good-mcp-client.py
: 일반적인 상호작용(레코드 삽입/쿼리)에 적합한 우수한 클라이언트입니다.attack-mcp-client.py
: 서버 취약점을 악용하는 방법을 보여주는 자동화된 공격 클라이언트입니다.requirements.txt
: 프로젝트에 대한 Python 종속성입니다.
특징 및 취약점
노출된 서버 도구
- 삽입_레코드
- 이름/주소 레코드를 데이터베이스에 삽입합니다.
- 취약점: 사용자 입력을 SQL 쿼리에 직접 문자열로 삽입하여 SQL 주입에 취약합니다.
- 쿼리_레코드
- 데이터베이스의 모든 레코드를 나열합니다.
- 취약점: 인증이나 액세스 제어 없이 모든 데이터가 노출됩니다.
- 실행_sql
- 클라이언트가 제공한 임의의 SQL 쿼리를 실행합니다.
- 취약점: 파괴적인 명령(예: 데이터 유출, 스키마 변경)을 포함한 모든 SQL 명령을 허용합니다.
- get_env_variable
- 요청된 모든 환경 변수의 값을 반환합니다.
- 취약점: 민감한 환경 변수(예: 비밀, API 키)가 유출됩니다.
달리는 방법
1. 종속성 설치
지엑스피1
2. 서버와 Good Client를 시작합니다.
한 터미널에서:
Copy
프롬프트에 따라 대화형으로 레코드를 삽입/쿼리합니다.
3. 공격 클라이언트 실행
다른 터미널에서는:
Copy
이렇게 하면 자동으로 다음이 수행됩니다.
- SQL 주입 공격 시도
- 임의의 SQL 쿼리 실행
- 여러 가지 일반적인 환경 변수를 읽으려고 시도합니다.
출력 예
- 공격 클라이언트는 어떤 페이로드가 성공하고 실패하는지 보여주고, 접근 가능한 경우 데이터베이스 내용과 환경 변수 값을 출력합니다.
입증된 취약점
- SQL 주입: 사용자 입력이 검증되지 않아 공격자가 SQL 논리를 조작하고 임의의 데이터를 삽입할 수 있습니다.
- 임의 코드 실행:
execute_sql
도구를 사용하면 공격자가 모든 SQL 명령을 실행할 수 있으며, 여기에는 데이터 도난이나 파괴도 포함됩니다. - 민감한 데이터 노출:
get_env_variable
도구를 사용하면 공격자가 비밀과 구성 값을 읽을 수 있습니다. - 접근 제어 부족: 누구나 인증 없이 모든 도구를 실행하고 모든 데이터에 접근할 수 있습니다.
완화 전략
실제 MCP 서버를 보호하려면 다음을 수행해야 합니다.
- 매개변수화된 쿼리 사용:
- SQL 쿼리에 문자열 보간 대신 매개변수 대체를 항상 사용하면 삽입을 방지할 수 있습니다.
- 예(보안):Copy
- 위험한 도구 제한:
execute_sql
및get_env_variable
과 같은 도구를 제거하거나 엄격하게 제한합니다.- 필요한 기능만 공개합니다.
- 인증 및 권한 부여 구현:
- 민감한 도구나 데이터에 대한 액세스를 허용하기 전에 사용자에게 인증과 권한 확인을 요구합니다.
- 입력 검증 및 정리:
- 모든 사용자 입력, 특히 데이터베이스나 시스템과 상호 작용하는 입력을 확인하고 정리합니다.
- 환경 변수 액세스 제한:
- 민감하지 않은 변수에만 액세스를 허용하거나 이 도구를 완전히 제거하세요.
- 감사 및 모니터링 사용:
- 모든 도구 호출을 기록하고 의심스럽거나 부적절한 행동을 모니터링합니다.
- 최소 권한의 원칙:
- 최소한의 권한으로 서버를 실행하고 데이터베이스와 OS 액세스를 최대한 제한합니다.
부인 성명
이 프로젝트는 교육 및 데모 목적으로만 사용됩니다. 이 코드를 프로덕션 환경에 배포하지 마십시오.
질문이나 추가 개선 사항이 있으시면 이슈를 등록하거나 프로젝트 관리자에게 문의하세요.
This server cannot be installed
교육 목적으로 클라이언트가 데이터베이스와 상호 작용할 수 있도록 의도적으로 취약한 MCP 서버로, SQL 주입, 임의 코드 실행, 중요 데이터 노출 등의 보안 취약성을 보여줍니다.