AI 지원 작업에서 발생하는 대부분의 비밀 정보 유출은 사용자가 입력한 문장 속에서 발생하지 않습니다. 그것들은 그 문장을 둘러싼 도구 체인(tooling) 내에서 발생합니다. 원격 서버에 놓여 있는 .env 파일, 아무도 지우지 않는 쉘 히스토리, 채팅 패널에 붙여넣어진 스택 트레이스, 그리고 아무도 건드리라고 요청하지 않은 환경 변수를 반향하는 생성된 헬퍼 스크립트 등이 그 예입니다. 만약 모델 호출을 보호 체인(chain of custody) 내의 한 단계로 모델링한다면, 유용한 질문은 더 이상 "내가 프롬프트에 무엇을 넣었는가"가 아니라 "이 값이 물리적으로 어디까지 이동할 수 있으며, 도착했을 때 누가 읽을 수 있는가"로 바뀝니다.
이러한 관점 설정은 두 가지 저렴하고 테스트 가능한 제어 장치를 제공하며, 둘 다 단 하루 만에 구현할 수 있습니다. 첫 번째는 어떤 것이든 기기를 떠나기 전에 실패하면 닫히는 게이트(gate)이며, 두 번째는 세션이 생성한 모든 아티팩트(artifact)를 대상으로 실행되는 검사(sweep)입니다. 이 검사가 더 흥미로운 부분인데, 가짜 자격 증명(fake credential)을 심어놓고 탐지기가 그것을 포착하는 것을 지켜봄으로써 작동 여부를 입증할 수 있기 때문입니다.
비밀 정보가 실제로 거칠 수 있는 네 가지 경로
작업을 호스팅된 모델로 보낼 때, 우리가 신경 써야 할 값은 리포지토리 밖으로 나가는 여러 경로를 가집니다. 그 값은 의도적으로 첨부한 컨텍스트(context) 안에 타고 이동할 수도 있고, 임대한 기기에서 실행되는 프로세스에 의해 읽힐 수도 있으며, 생성된 코드나 오류 텍스트 내부에 반향될 수도 있고, 심지어 우리가 보관할 의도가 전혀 없었던 전사 기록(transcript)이나 로그에 영구 저장될 수도 있습니다. 이 각각은 다른 독자(reader)를 가진 별개의 신뢰 경계(trust boundary)이므로, 단일한 "비밀 정보 붙여넣기 금지" 규칙으로는 첫 번째 경로만 커버할 수 있습니다.
| 경계 (Boundary) | 누가 읽을 수 있는가 | 일반적인 실수로 인한 전파 매체 (Typical accidental carrier) |
|---|
| 로컬 리포지토리에서 번들(bundle)로 | 번들을 받는 모든 사람 | .env, fixtures, 테스트 스냅샷 |
| ... | | |
문제가 발생했을 때는 표를 아래에서 위로 읽으십시오. 마지막 행이 보통 원인이 됩니다. 왜냐하면 디스크에 한 번 유출된 값은 이미 존재하던 어떤 백업 또는 스냅샷 작업에 의해 계속 복사되기 때문입니다. 로테이션(Rotation)은 시간을 벌어주지만, 전파 매체(carrier)를 찾는 것이 출혈을 멈추게 합니다.
실패 시 폐쇄되는 관문
이 관문은 하나의 임무를 가집니다: 추적된 파일의 명시적인 허용 목록(explicit allowlist)으로부터 전송 가능한 번들(sendable bundle)을 조립한 다음, 그 번들 내의 어떤 것이든 자격 증명(credential)처럼 보이면 계속 진행하는 것을 거부합니다. 이 스크립트는 사용자의 기기에서 실행되며, 0이 아닌 종료 코드를 반환하고, 의도에 대해 영리하려고 시도하지 않습니다. 아래 내용은 가상 코드가 아니라 실제로 작동하는 스크립트입니다.
#!/usr/bin/env bash
# preflight.sh — 사용자의 기기를 떠나는 번들을 빌드하고 검증합니다
set -euo pipefail
...
정규 표현식(regex)보다 더 중요한 두 가지 세부 사항이 있습니다. 첫째, git ls-files는 의도적입니다. 왜냐하면 이 명령어는 무시된 파일(ignored files)을 조용히 제외하는데, 대부분의 .env 파일이 여기에 존재하기 때문입니다. 단순한 cp -r은 그것들을 기꺼이 가지고 갈 것입니다. 둘째, set -euo pipefail은 grep의 종료 코드를 장식적인 것이 아니라 치명적으로 만듭니다. 따라서 부분 일치(partial match)가 발생하면 조언을 출력하는 대신 실행 자체가 중단됩니다.
식재된 카나리로 스스로를 증명하는 스윕
스윕(sweep)은 탐지기이며, 탐지기는 조용히 부패하기 때문에 자체 테스트를 수행해야 합니다. 고유한 접두사(prefix)가 붙은 값을 심고, 워크플로우를 실행하게 한 다음, 스윕이 이를 보고하는지 확인합니다. 그런 다음 그 값(plant)을 제거하고 아무것도 보고하지 않는지 확인합니다. 한 번도 작동하는 것을 본 적 없는 탐지기는 단지 구문만 있는 주석에 불과합니다.
#!/usr/bin/env bash
# sweep.sh — 아티팩트를 자격 증명 형태의 문자열로 스캔합니다
set -uo pipefail
...
실제 작업에 대한 출력을 신뢰하기 전에 자체 테스트를 실행하십시오. 셸에서 카나리 값을 내보내고, 아무것도 모르는(unsuspecting) 스크립트가 로그 파일에 기록하는 방식대로 이를 작성한 다음, 그 디렉토리를 스윕의 대상으로 지정합니다.
export MC_CANARY_TOKEN="MC_CANARY_d3adb33f"
mkdir -p notes && echo "token=$MC_CANARY_TOKEN" >> notes/session.log
./sweep.sh notes; echo "exit=$?" # 1개의 히트, 종료 코드=1을 예상합니다
...
실제 유출(hit)이 발생하면 파일을 먼저 정리하고 싶은 충동을 억제하세요. 자격 증명(credential)을 로테이션(rotate)한 다음, 테이블의 어느 경계가 그것을 전파했는지 물어보세요. 왜냐하면 전달 매체(carrier)를 이해하기 전에 증거를 삭제하는 것은 다음 주에 반복되는 문제를 보장하기 때문입니다. 실제로는 전달 매체가 환경 변수를 파일로 덤프(dump)한 명령어이거나, stdin과 stdout을 트랜스크립트(transcript)로 전송한 set -x 추적일 때가 대부분입니다.
무료 티어(free tier)가 적합한 곳과 그렇지 않은 곳
무료 서버 옵션은 사용자를 테이블의 세 번째 행으로 이동시키는데, 이는 이제 소유하지도 않고 디스크 수준에서 검사할 수도 없는 기계에서 코드를 실행하기 때문입니다. 이것이 피해야 할 이유가 되지는 않지만, 그 기계에 공개 이슈(public issue)에 붙여넣지 않을 것은 아무것도 두지 말아야 할 이유는 됩니다. 무료 모델 접근 역시 같은 형태를 가집니다. 엔드포인트(endpoint)가 사용자의 신뢰 경계(trust boundary) 밖에 있기 때문에, 게이트와 스윕(sweep)은 그 뒤가 아니라 앞에 위치해야 합니다. 공개 고지: 본 문서는 MonkeyCode의 제품 아웃리치(product outreach)의 일환으로 작성되었습니다.
이 프로젝트는 무료 모델 접근과 무료 서버 옵션을 광고하며, 현재 프로모션에서는 토큰 할당량(token allowance)을 언급하고 있습니다. 게시된 모든 숫자는 홍보용으로 간주하고 약관을 다시 읽어보세요. 왜냐하면 할당량(quota)과 조건은 변경되기 때문입니다. 변하지 않는 것은 워크플로우입니다: preflight.sh로 번들(bundle)을 구축하고, 전송한 다음, 무언가를 아카이브(archive)하기 전에 sweep.sh를 사용하여 작업 공간, 트랜스크립트, 로그를 스윕해야 합니다.
이것이 보호하지 못하는 것들
정규 표현식(regex) 스윕은 보증이 아닌 연기 감지기일 뿐이며, 불투명한 세션 토큰(opaque session tokens), base64로 인코딩된 블롭(blobs), 그리고 학습시키지 않은 모든 자격 증명의 형태는 놓치게 됩니다. 또한 이는 사용자가 패턴을 약화시키도록 유혹하는 거짓 양성(false positives)도 생성하며, 이것이 바로 감지기가 조용히 실패하기 시작하는 순간입니다. 만약 워크로드가 감사 추적(audit trails), 요청별 기여도(per-request attribution), 또는 데이터 상주권 보장(data residency guarantees)을 요구한다면, 정답은 무료 티어보다는 조직의 감사된 인프라가 되어야 하며, 아무리 많은 로컬 스크립팅(local scripting)이 그것을 바꿀 수는 없습니다.
오늘 하나(one)의 카나리아를 심고 하나의 탐지기(detector)가 작동하게 함으로써 시작하세요. 왜냐하면 당신이 한 번 작동하는 것을 지켜본 게이트(gate)는 단지 읽기만 한 정책(policy)보다 더 가치가 크기 때문입니다.