Skip to main content
Glama

Veil

CI License: Apache 2.0 Python 3.11+

AI 에이전트가 자격 증명 값을 전혀 수신하지 않으면서도 자격 증명 배치를 조율할 수 있고, 신뢰할 수 있는 사람이 제어하는 인터페이스가 해당 자격 증명이 전송될 위치를 독립적으로 승인합니다.

이 문장이 전체 약속입니다. Veil은 MCP 서버와 안전한 입력 브로커를 결합한 것입니다. 에이전트가 "Stripe 프로덕션 키를 Google Secret Manager에 넣어" 라고 말하면, 사람은 정확히 어떤 프로젝트와 시크릿에 기록될지 보고 Veil 자체 창에 값을 입력하며, 값은 대상으로 직접 전송됩니다. 모델은 절대 값을 보유하지 않습니다.

SPEC.md에서 구현되었습니다.


Veil이 해결하는 문제

에이전트가 시크릿을 알고 있음으로 인해 발생하는 전체 오류 클래스를 제거합니다. Veil이 중재하면 자격 증명은 다음을 통과하지 않습니다:

  • LLM 프롬프트 또는 대화 기록

  • MCP 도구 인수 또는 도구 결과

  • 에이전트 메모리 또는 생성된 코드

  • 셸 명령 인수 또는 프로세스 argv

  • 로그, 디버그 추적 또는 원격 측정

  • URL

  • 모델이 볼 수 있는 명령 출력

Veil이 해결하지 않는

Veil은 AI 에이전트를 신뢰할 수 있게 만들지 않으며, "안전한 AI"도 아닙니다. 에이전트가 올바른 대상을 선택했는지, 사용자를 이해했는지, 프롬프트 인젝션이 없는지, 대상 자체가 안전한지, 사용자 머신이 손상되지 않았는지, 또는 자격 증명이 나중에 합법적으로 수신하는 소프트웨어에 의해 오용되지 않을 것인지를 보장하지 않습니다.

여기에는 두 가지 별개의 문제가 있습니다:

질문

Veil의 답변

에이전트가 시크릿을 알아야 하는가?

아니요.

에이전트가 시크릿이 갈 곳을 혼자 결정해야 하는가?

사람의 승인 없이는 안 됩니다.

Veil은 이 두 가지에 답합니다. 나머지에 대한 답을 주장하지 않습니다.


신뢰 모델

Trusted with the credential value:

  The human at the keyboard
  Veil's secure input UI          (loopback only, in your control)
  Veil's secure input broker      (this process)
  The selected destination adapter
  The destination provider        (e.g. Google Secret Manager)

NOT trusted with the credential value:

  The LLM
  The agent / MCP client
  The conversation
  The prompt and any repository content it read
  Generated code
  Logs, telemetry, crash reports

이 다이어그램은 신뢰된 구성 요소가 무적이라고 주장하지 않습니다. 자격 증명이 존재하도록 허용된 위치를 나타냅니다. Veil은 보안에 민감한 소프트웨어입니다. Veil 자체가 악의적이거나 손상되면 경계는 사라집니다. 그 소스, 종속성 및 릴리스는 자격 증명 처리 도구에 기대하는 수준의 조사를 받을 가치가 있습니다.


두 가지 흐름

시크릿 흐름 — 사람의 경로, 모델이 관찰할 수 없음:

Human ─▶ Veil secure UI (127.0.0.1) ─▶ Broker ─▶ Adapter ─▶ Destination

에이전트 흐름 — 모델이 보는 모든 것:

LLM ─▶ MCP client ─▶ Veil MCP server ─▶ non-sensitive result metadata

MCP 도구 스키마에는 자격 증명을 전달할 수 있는 속성이 없습니다. 이는 프롬프트 지시가 아닌 구조적인 것입니다. 남용할 수 있는 value, secret_value, password, token, content 또는 raw_secret 필드가 없으며, 닫힌 스키마는 알 수 없는 속성을 거부하고, 인수는 파싱되기 전에 자격 증명 형태의 값이 있는지 점검됩니다.

에이전트가 호출하는 것

{
  "destination": "gcp-secret-manager",
  "name": "STRIPE_SECRET_KEY",
  "target": { "project": "my-production-project", "secret": "STRIPE_SECRET_KEY" },
  "write_mode": "new-version",
  "environment": "production",
  "description": "Stripe production API key"
}

Veil은 request_id, 위험 분류 및 정규화된 대상과 함께 응답하고 — 사용자 머신에서 자체 승인 창을 엽니다. 에이전트는 secret.status를 폴링합니다.

에이전트는 승인 링크를 받지 않습니다. 그 링크는 기능입니다. 링크를 보유한 모든 것이 사람의 흐름 절반을 완료할 수 있으며, 셸이나 HTTP 도구가 있는 에이전트가 바로 위협 모델입니다. Veil은 링크를 브라우저에 전달하고 자체 콘솔에 출력합니다. 설정에서 에이전트가 링크를 중계해야 하는 경우(예: 원격 또는 헤드리스 세션) VEIL_DISCLOSE_AUTHORIZATION_URL=true를 설정하십시오. 단, 이렇게 하면 손상된 에이전트가 자체 요청을 승인할 수 있다는 점을 이해해야 합니다.

도구

목적

secret.store

자격 증명 요청 생성. 민감하지 않은 메타데이터와 요청 ID 반환.

secret.status

요청 폴링. 자격 증명 자료를 절대 반환하지 않음.

secret.cancel

보류 중인 요청 취소. 입력된 값은 모두 폐기됨.

secret.revise

승인 무효화 및 새 승인 시작. 제자리 편집 없음.

secret.destinations

대상 및 각 대상이 예상하는 대상 필드 나열.

사람이 보는 것

A 단계에서는 자격 증명 이름, 대상 제공자, 프로젝트/계정, 리소스, 작업 및 위험을 값이 입력되기 전에 보여줍니다. 고위험 작업(프로덕션 덮어쓰기, 일반 텍스트 저장, 애플리케이션 데이터베이스, 자격 증명 교체)은 B 단계에서, 입력 후 및 쓰기 전에 두 번째 확인이 필요합니다. 값은 절대 다시 표시되지 않습니다.

사람이 읽는 페이지와 실행자가 수행하는 작업은 동일한 불변 객체입니다. 별도의 "표시 대상"은 없습니다. 대상, 프로젝트, 시크릿 이름, 작업, 쓰기 모드 또는 어댑터를 변경하면 승인이 무효화되고 새 승인이 필요합니다.


지원되는 어댑터

어댑터

클래스

참고

gcp-secret-manager

secret-store

권장. veil-mcp[gcp] 필요. create, new-version, replace (이전 버전 비활성화).

env-file

local-plaintext

경로 제한, 심볼릭 링크 거부, 원자적 0600 쓰기. Git 추적 파일은 기본적으로 차단됨.

firestore

remote-application-storage

veil-mcp[firestore] 필요. 항상 경고; 항상 B 단계 필요.

arbitrary-network 대상(일반 HTTP POST, 웹훅)은 구현되지 않았으며, 어댑터 레지스트리는 등록을 거부합니다.


보안 가정 및 제한 사항

자신을 과대 포장하는 보안 도구는 없는 것보다 나쁘기 때문에 명확히 설명합니다:

  • 브로커 프로세스는 시크릿을 봅니다. 그것이 요점입니다. 무언가는 봐야 저장이 가능합니다. 최소한의 신뢰된 전송 및 대상 구성 요소만 본다는 것이 보장입니다.

  • CPython은 메모리를 안정적으로 지울 수 없습니다. SecretBuffer는 소유한 가변 버퍼를 지우지만, 퍼센트 디코딩, str/bytes 변환 및 제공자 SDK는 인터프리터가 GC까지 유지할 수 있는 불변 복사본을 만듭니다. Veil은 이를 최소화하고 이 보장을 조작하지 않습니다.

  • UI는 루프백 HTTP입니다. 사용자 머신에서 사용자로 실행되는 모든 프로세스가 UI에 도달할 수 있으며, 그러한 프로세스는 UI를 모방할 수도 있습니다. 각 Veil 프로세스는 해당 페이지에 표시되는 무작위 식별 문구를 출력합니다(스푸핑 방지 지원, 암호화 제어는 아님). 에이전트로부터 링크를 숨기는 것은 기준을 높이는 것이지, Veil의 콘솔 출력을 읽거나, 브라우저의 argv를 나열하거나, 루프백 포트를 스캔할 수 있는 프로세스를 막지는 않습니다.

  • Veil은 대상을 감사하지 않습니다. Firestore 문서에 자격 증명을 승인하면 Veil은 거기에 쓰고 나쁜 생각이라고 알리지만, 막지는 않습니다.

  • 사전 점검은 최선의 노력입니다. 사전 점검 시 제공자에 연결할 수 없으면 추측하는 대신 사용 불가로 보고됩니다.

  • 충돌 의미론. 제공자 쓰기와 응답 사이에 충돌이 발생하면 성공에 대한 로컬 기록 없이 자격 증명이 기록될 수 있습니다. Veil은 요청을 실패로 보고하며, 대상이 진실 공급원입니다.


로컬 개발

uv venv
uv pip install -e ".[dev]"

# run the server the way an MCP client would
uv run veil serve

# with optional providers
uv pip install -e ".[dev,gcp,firestore]"

구성은 Veil 자체 환경에서 읽습니다. 도구 인수에서는 절대 읽지 않습니다:

변수

기본값

의미

VEIL_REQUEST_TTL_SECONDS

300

요청 만료 시간.

VEIL_ADAPTER_TIMEOUT_SECONDS

30

단일 대상 쓰기의 상한.

VEIL_STAGE_B_FOR_MEDIUM

true

중간 위험 작업에 대해 확인 필요.

VEIL_UI_HOST / VEIL_UI_PORT

127.0.0.1 / 임시

보안 UI 바인드 주소.

VEIL_OPEN_BROWSER

true

승인 창을 자동으로 엽니다.

VEIL_DISCLOSE_AUTHORIZATION_URL

false

승인 링크를 에이전트에 반환합니다.

VEIL_ENV_ALLOWED_ROOTS

현재 디렉토리

.env 어댑터가 내부에 쓸 수 있는 루트입니다.

VEIL_ALLOW_GIT_TRACKED_ENV

false

Git 추적 env 파일에 쓰기 허용.

VEIL_ENABLED_ADAPTERS

모두

쉼표로 구분된 허용 목록.

MCP 클라이언트 구성

{
  "mcpServers": {
    "veil": { "command": "uv", "args": ["run", "veil", "serve"] }
  }
}

테스트

uv run pytest                  # everything
uv run pytest tests/security   # the adversarial suite only
uv run ruff check .
uv run mypy

보안 제품군은 요구 사항이지 선택 사항이 아닙니다. 모든 관찰 가능한 채널에 걸친 카나리 누출 감지, 악의적인 에이전트 테스트, 프롬프트 인젝션 픽스처, TOCTOU 및 재생 테스트, 100방향 동시성 스트레스, 경쟁 조건, 충돌 경로, 제공자 실패 시뮬레이션, UI 검사 및 퍼징을 포함합니다. 카나리 누출, 승인 우회 성공, 승인 후 변이 성공, 완료된 요청 재생 가능, 시크릿이 요청 경계를 넘음, 원시 제공자 오류가 MCP에 도달함, 또는 고위험 작업이 확인을 건너뛰는 경우 릴리스가 차단됩니다.

불변성 대 테스트 맵은 docs/SECURITY_MODEL.md를 참조하십시오.

프로젝트 상태

버전 0.1.0, SPEC.md에 따라 구축되었으며, 이는 의도된 동작에 대한 권위 있는 설명으로 저장소에 남아 있습니다. 모든 주요 모듈과 테스트는 구현하는 섹션을 인용하므로, 검토자는 요약이 아닌 요구 사항에 대해 코드를 확인할 수 있습니다.

MVP가 완료되었으며 적대적 제품군을 포함한 전체 제품군이 통과합니다. 누군가가 실제로 의존하기 전에 남은 것은: 독립적인 검토, 확인 UI의 인간 요소 테스트(SPEC.md §35), 서명된 릴리스 아티팩트(§43)입니다.

기여

여기서 보안이 제품이므로 변경 기준은 관료적이기보다는 구체적입니다:

  • 자격 증명 처리, 승인 또는 MCP 표면에 영향을 미치는 변경은 영향을 미치는 불변성을 깨뜨리려고 시도하는 테스트가 필요하며, 작동을 보여주는 테스트만으로는 충분하지 않습니다.

  • 제품군을 통과시키기 위해 보안 테스트를 약화시키지 마십시오. 테스트가 아키텍처 결함을 드러내면 아키텍처가 변경됩니다.

  • 핵심의 새로운 런타임 종속성은 기본적으로 반대합니다. 브로커는 자격 증명 자료에 대한 신뢰된 컴퓨팅 기반입니다. 제공자 SDK는 선택적 추가 기능 뒤에 있어야 합니다.

  • 풀 리퀘스트를 열기 전에 ruff check ., ruff format --check ., mypypytest를 실행하십시오.

취약점을 발견하셨습니까? 공개 이슈를 여는 대신 GitHub의 보안 권고를 통해 비공개로 신고해 주십시오.

라이선스

Apache License 2.0 © 2026 Eduardo Rosostolato.

-
license - not tested
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rosostolato/veil-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server