# 보안

> Agent NAS는 프롬프트 인젝션을 막지 못합니다. 인젝션 이후에 일어나는 일을 제한합니다. 좁은 리스가 실행이 건드릴 수 있는 범위를 묶고, 브랜치가 실수를 되돌릴 수 있게 하며, Rule of Two가 신뢰할 수 없는 콘텐츠를 읽은 세션이 민감한 데이터와 외부로 나가는 경로를 함께 갖지 못하게 하고, 추적 가능한 기록이 남습니다.

## 범위와 신뢰 가정

- **우리가 지키는 것:** NAS 안의 데이터와 이력, 권한의 경계, 기록의 무결성, 메모리의 추적 가능성.
- **우리가 지키지 않는 것:** 에이전트가 NAS 밖에서 하는 일, 컴퓨팅 자체의 격리(샌드박스의 몫), 모델 제공자 쪽에서 일어나는 모든 일.
- **신뢰 가정:** 신뢰 컴퓨팅 기반(TCB)은 NAS 게이트웨이, 정책 엔진, 기록 서비스입니다. 호스트는 침해되지 않았고, 샌드박스는 컴퓨팅을 격리합니다. TCB가 침해되면 이 페이지의 보장은 더 이상 성립하지 않습니다.

## Rule of Two: 세션 불변식

세 가지 속성이 있습니다. **[A]** 세션이 신뢰할 수 없는 콘텐츠를 읽었다, **[B]** 리스가 민감한 데이터를 읽도록 허용한다, **[C]** 리스가 보호된 상태를 바꾸거나 외부와 통신하도록 허용한다. 한 세션에서 셋이 모두 성립하면 C를 일으키는 호출은 자동으로 통과시키지 않습니다.

| 시나리오 | A | B | C | 결과 |
| --- | --- | --- | --- | --- |
| 웹 페이지를 요약해 브랜치에 노트로 남긴다 | 예 | 예 | 아니오 (브랜치뿐) | 자동: 브랜치 안의 쓰기는 C로 치지 않습니다. |
| 웹 페이지를 읽은 뒤 `main`에 병합을 제안한다 | 예 | 예 | 예 | Human Gate. |
| 공개 데이터만 읽고 임시 영역에 쓴다 | 예 | 아니오 | 아니오 | 자동. |
| 외부 이메일을 읽은 뒤 이메일을 보낸다(외부 전송) | 예 | 예 | 예 | 게이트. `secret`이 관련되면 거부. |

이것은 Meta의 [Agents Rule of Two](https://ai.meta.com/blog/practical-ai-agent-security/)를 **스토리지 경계**에서 구현한 것입니다. Meta 스스로도 이것이 위험을 줄이기 위한 경험칙이지 종착점이 아니며 최소 권한의 대체물이 아니라고 강조하는데, 우리도 같은 방식으로 씁니다. 메커니즘은 [Trust Labels](https://agentnas.com/ko/concepts/trust-labels/)에 있습니다.

## 위협 모델

| 위협 | NAS가 강제할 수 있는 것 | NAS가 할 수 없는 것 | 남는 위험 |
| --- | --- | --- | --- |
| T1 간접 프롬프트 인젝션(파일, 웹 페이지, 이메일을 통한) | Rule of Two, 리스 범위 제한, 브랜치, 게이트. | 인젝션이 일어나는 것을 막거나, 일어난 뒤 리스 안에서 벌어지는 악의적인 행동을 막는 것. | 리스 안에서의 오용. |
| T2 자격 증명 유출(에이전트가 장기 키를 읽음) | 장기 자격 증명은 실행의 손에 들어가지 않습니다. 시크릿 스캐너가 `secret`으로 표시하고, TTL은 짧습니다. | 에이전트가 리스 안에서 데이터를 승인된 외부 전송 경로로 보내는 것을 막는 것. | 리스 안에서 빠져나가는 데이터. |
| T3 과도한 권한과 실수 | 좁은 리스, 브랜치, 소프트 삭제, 모든 리스 바깥의 스냅샷. | NAS 밖의 부작용을 되돌리는 것. | NAS를 넘어서는 결과. |
| T4 메모리 오염(역할 간 확산 포함) | 출처와 오염 표시, 격리, 검토된 것만 자동 로드, 롤백. | 틀렸지만 그럴듯해 보이는 사실을 알아보는 것. | 검토자가 통과시킨 오염. |
| T5 도난되거나 재생된 리스 | 짧은 TTL, 취소 가능, 선택적인 보유자 바인딩(DPoP, mTLS). | TTL 안에서의 악용을 막는 것. | TTL의 시간 창. |
| T6 승인 피로와 형식적 승인 | 드문 게이트, NAS가 diff를 직접 렌더링, 다이제스트에 묶인 승인, 승인율 모니터링. | 사람이 꼼꼼히 보게 만드는 것. | 사람의 실수. |
| T7 로그 변조 | 해시 체인, 선택적인 외부 앵커링. | 앵커링이 없을 때 root가 로그를 파괴하는 것을 막는 것. | 악의적인 관리자. |
| T8 데이터 유출(외부 전송, 공유, 검색 결과) | 외부 전송에는 리스 동작과 게이트가 필요하고, `secret`은 나갈 수 없으며, 파생물은 라벨을 물려받습니다. | 사람이 승인한 뒤의 유출과 은닉 채널을 막는 것. | 승인 이후의 유출. |
| T9 공급망(스킬, MCP 서버, 플러그인, 모델) | 스킬과 외부 MCP 서버의 콘텐츠는 `external`로 취급하고, 스킬 디렉터리는 커밋에 고정할 수 있으며, 런타임 매니페스트는 기록에 남습니다. | 서드파티 코드가 무해함을 보장하는 것. | 고정된 악성 버전. |
| T10 자원 고갈(브랜치 폭탄, 소진된 예산, 읽기 루프) | 쿼터, TTL, 예산, 서킷 브레이커. | 정당한 대규모 작업과 폭주를 구분하는 것. | 국지적인 서비스 거부. |

## 통제

- **정책 엔진:** 결정론적(Cedar나 Rego 방식)이며 기본은 거부이고, 거부할 때는 읽을 수 있는 이유와 일치한 규칙을 제시합니다. **LLM을 호출하지 않습니다.**
- **자격 증명 브로커:** 장기 키는 브로커에 남고, 승인된 외부 전송 동작 안에서만 실행에 수명이 짧은 하위 토큰을 발급합니다.
- **격리와 키:** 역할마다 홈과 경로 공간이 따로 있고, `sensitive` 보존 등급은 별도의 키 도메인을 씁니다.
- **공급망:** 스킬, MCP 서버, 플러그인의 콘텐츠는 `external`로 취급하며, 실행을 시작할 때 쓰인 스킬과 버전을 기록에 남깁니다.

## 솔직한 한계

1. 프롬프트 인젝션에 대한 방어가 **아닙니다.** 결과를 제한하고 눈에 보이게 할 뿐입니다.
2. 리스 안의 정당한 권한도 오용될 수 있습니다.
3. NAS 밖의 부작용에 대해서는 할 수 있는 것이 없습니다. 이미 보낸 이메일, 이미 호출한 API 같은 것입니다.
4. 은닉 채널과 부채널은 범위 밖입니다.
5. TCB가 침해되면 보장은 무너집니다.
6. 사람도 실수합니다. 게이트는 그 위험을 낮출 뿐 없애지는 못합니다.
7. 오염 표시는 보수적이어서 마찰과 오탐을 낳습니다. 조정과 눈에 보이는 거부 이유가 필요합니다.
8. 암호학적 파기는 우리가 통제하는 사본만 보호합니다.

## 사고 대응

- **서킷 브레이커:** `revoke_run`과 `revoke_role`이 리스를 즉시 취소하고 브랜치를 동결합니다.
- **롤백:** 영향받은 트리를 이전 커밋으로 되돌립니다.
- **추적:** 읽기 매니페스트와 기록 체인으로 실행이 무엇을 읽고 무엇을 썼으며 어떤 노트를 건드렸는지 찾습니다.
- **정리:** [Cascade Forget](https://agentnas.com/ko/concepts/cascade-forget/)으로 영향받은 파생물을 삭제하고 보고서를 발급합니다.

## 관측성과 감사

- **세 가지 데이터:** 기록(이벤트), 읽기 매니페스트(입력의 집합), 메트릭과 트레이스.
- **`explain(commit)`:** 커밋을 만든 실행과 리스, 거친 게이트, 읽은 것, 의존하는 입력을 반환합니다.
- **기존 관측성과의 통합:** 하나의 실행은 하나의 OpenTelemetry GenAI 스팬에 대응하고 리스와 게이트는 이벤트로 붙습니다. 기록은 JSON Lines로 내보내거나 SIEM에 보낼 수 있습니다.
- **메트릭:** 리스 발급률과 거부율, 게이트 대기열 길이와 승인율과 승인 지연, 브랜치 수와 나이, 인덱스 최신성, 예산 소비, 기록 체인 검증 결과.
- **프라이버시와 보존:** 기본적으로 메타데이터만 기록하고 콘텐츠는 기록하지 않습니다. 기록의 보존과 콘텐츠의 삭제는 독립적이며, 기록 자체를 읽으려면 리스가 필요합니다.

---

표준 URL: https://agentnas.com/ko/security/
최종 수정: 2026-11-11 · 명세 초안 v0.2 · CC BY 4.0
