Skip to content
이 페이지는 AI의 도움으로 작성 및 번역되었습니다. 부정확한 내용이 있으면 개선에 참여해 주세요. GitHub에서 편집

셸 실행 ​

shell 도구는 PRX의 세 가지 핵심 도구 중 하나로, default_tools()와 all_tools() 레지스트리 모두에서 사용할 수 있습니다. 설정 가능한 샌드박스 내에서 OS 수준 명령 실행을 제공하여 에이전트가 시작한 명령이 엄격한 격리, 시간 제한, 출력 제약 하에서 실행되도록 합니다.

LLM이 셸 명령을 실행해야 한다고 판단하면 -- 패키지 설치, 코드 컴파일, 시스템 상태 쿼리, 스크립트 실행 -- shell 도구를 명령 문자열과 함께 호출합니다. PRX는 설정된 샌드박스 백엔드로 실행을 래핑하고, 60초 기본 타임아웃을 강제하며, 출력을 1 MB로 제한하고, 자식 프로세스를 스폰하기 전에 민감한 환경 변수를 제거합니다.

셸 도구는 일반적으로 PRX에서 가장 강력하고 가장 제한된 도구입니다. 보안 정책 엔진의 주요 대상이며, 대부분의 배포에서 실행 전 사람의 승인을 요구하는 supervised로 표시합니다.

설정 ​

셸 도구 자체는 전용 설정 섹션이 없습니다. 동작은 보안 샌드박스와 리소스 제한을 통해 제어됩니다:

toml
[security.sandbox]
enabled = true
backend = "auto"         # "auto" | "landlock" | "firejail" | "bubblewrap" | "docker" | "none"

# 커스텀 Firejail 인자 (backend = "firejail"일 때)
firejail_args = ["--net=none", "--noroot"]

[security.sandbox.docker]
image = "prx-sandbox:latest"
network = "none"
memory_limit = "256m"
cpu_limit = "1.0"

[security.sandbox.bubblewrap]
allow_network = false
writable_paths = ["/tmp"]
readonly_paths = ["/usr", "/lib"]

[security.resources]
max_memory_mb = 512
max_cpu_time_seconds = 60
max_subprocesses = 10
memory_monitoring = true

셸을 감독 모드로 표시하려면(호출당 승인 필요):

toml
[security.tool_policy.tools]
shell = "supervised"

샌드박스 백엔드 ​

PRX는 5개의 샌드박스 백엔드를 지원합니다. backend = "auto"일 때 PRX는 다음 우선순위로 사용 가능한 백엔드를 탐색하고 첫 번째 것을 선택합니다:

백엔드플랫폼격리 수준오버헤드참고
LandlockLinux (5.13+)파일시스템 LSM최소커널 네이티브, 추가 의존성 없음. 커널 수준에서 파일시스템 경로를 제한.
FirejailLinux전체 (네트워크, 파일시스템, PID)낮음유저 스페이스 샌드박스. 네트워크 격리를 위한 --net=none, PID 네임스페이스, seccomp 필터링 지원.
BubblewrapLinux, macOS네임스페이스 기반낮음유저 네임스페이스 사용. 설정 가능한 쓰기/읽기 전용 경로 목록.
Docker모든 플랫폼전체 컨테이너높음일회용 컨테이너 내에서 명령 실행. 최대 격리이지만 최고 지연.
None모든 플랫폼애플리케이션 계층만없음OS 수준 격리 없음. PRX가 여전히 타임아웃과 출력 제한을 강제하지만 프로세스가 전체 OS 접근 가능.

Landlock ​

Landlock은 커널 5.13+에서 사용 가능한 Linux 보안 모듈입니다. 루트 권한 없이 커널 수준에서 파일시스템 접근을 제한합니다. PRX는 Landlock을 사용하여 셸 명령이 읽고 쓸 수 있는 경로를 제한합니다.

Firejail ​

Firejail은 Linux 네임스페이스와 seccomp를 통해 종합적인 샌드박싱을 제공합니다. firejail_args를 통해 커스텀 인자를 전달할 수 있습니다:

toml
[security.sandbox]
backend = "firejail"
firejail_args = ["--net=none", "--noroot", "--nosound", "--no3d"]

Bubblewrap ​

Bubblewrap(bwrap)은 유저 네임스페이스를 사용하여 최소한의 샌드박스 환경을 생성합니다. Firejail보다 가볍고 일부 macOS 설정에서도 작동합니다:

toml
[security.sandbox.bubblewrap]
allow_network = false
writable_paths = ["/tmp", "/home/user/workspace"]
readonly_paths = ["/usr", "/lib", "/bin"]

Docker ​

Docker는 완전한 컨테이너 격리를 제공합니다. 각 명령이 설정된 이미지를 기반으로 새 컨테이너에서 실행됩니다:

toml
[security.sandbox.docker]
image = "prx-sandbox:latest"
network = "none"
memory_limit = "256m"
cpu_limit = "1.0"

사용법 ​

셸 도구는 에이전틱 루프 중 LLM에 의해 호출됩니다. 에이전트 대화에서 LLM은 다음과 같은 도구 호출을 생성합니다:

json
{
  "name": "shell",
  "arguments": {
    "command": "ls -la /home/user/project"
  }
}

CLI에서 에이전트 출력의 셸 도구 호출을 관찰할 수 있습니다. 도구 호출은 실행되는 명령과 사용 중인 샌드박스 백엔드를 표시합니다.

실행 흐름 ​

  1. LLM이 command 인자와 함께 shell 도구 호출을 생성
  2. 보안 정책 엔진이 호출이 허용, 거부 또는 감독 필요인지 확인
  3. 감독 모드이면 PRX가 사용자에게 진행 전 승인을 요청
  4. 샌드박스 백엔드가 적절한 격리 계층으로 명령을 래핑
  5. 환경 변수가 정리됨 (아래 참조)
  6. 60초 타임아웃으로 명령 실행
  7. stdout과 stderr가 캡처되고, 필요하면 1 MB로 잘림
  8. 결과가 성공/실패 상태와 함께 ToolResult로 LLM에 반환

파라미터 ​

파라미터타입필수기본값설명
commandstring예--실행할 셸 명령. /bin/sh -c (또는 동등)에 전달됨.

도구는 다음을 포함하는 ToolResult를 반환합니다:

필드타입설명
successbool명령이 코드 0으로 종료되면 true
outputstringstdout과 stderr 결합, 1 MB로 잘림
errorstring?명령이 실패하거나 타임아웃되면 오류 메시지

환경 정리 ​

셸 도구는 자식 프로세스에 엄격한 화이트리스트의 환경 변수만 전달합니다. 이는 데몬 환경에 존재할 수 있는 API 키, 토큰, 시크릿의 우발적 유출을 방지합니다.

허용된 환경 변수:

변수용도
PATH실행 파일 검색 경로
HOME사용자 홈 디렉토리
TERM터미널 유형
LANG로케일 언어
LC_ALL로케일 재정의
LC_CTYPE문자 유형 로케일
USER현재 사용자 이름
SHELL기본 셸 경로
TMPDIR임시 디렉토리

API_KEY, AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN, OPENAI_API_KEY 및 커스텀 변수를 포함한 다른 모든 변수는 자식 프로세스 환경에서 제거됩니다. 이것은 설정을 통해 재정의할 수 없는 하드코딩된 보안 경계입니다.

리소스 제한 ​

제한기본값설정 가능설명
타임아웃60초security.resources.max_cpu_time_seconds명령당 최대 벽시계 시간
출력 크기1 MB--최대 stdout + stderr 결합
메모리512 MBsecurity.resources.max_memory_mb명령당 최대 메모리 사용
서브프로세스10security.resources.max_subprocesses스폰되는 최대 자식 프로세스

명령이 타임아웃을 초과하면 PRX가 SIGTERM을 보내고 유예 기간 후 SIGKILL을 보냅니다. 도구 결과는 타임아웃을 오류로 보고합니다.

출력이 1 MB를 초과하면 잘리고 잘림을 나타내는 참고가 추가됩니다.

보안 ​

  • 샌드박스 격리: 명령이 설정된 샌드박스 백엔드 내에서 실행되어 파일시스템, 네트워크, 프로세스 접근을 제한
  • 환경 정리: 9개의 화이트리스트된 환경 변수만 자식 프로세스에 전달
  • 정책 엔진: 모든 셸 호출이 실행 전에 보안 정책 엔진을 통과
  • 감사 로깅: security.audit.enabled = true일 때 모든 셸 명령과 결과가 감사 로그에 기록
  • 감독 모드: 셸 도구를 도구 정책에서 supervised로 표시하여 각 실행 전 명시적 사용자 승인 필요
  • 리소스 제한: 타임아웃, 메모리, 출력 크기, 서브프로세스 수에 대한 엄격한 제한으로 리소스 고갈 방지

위협 완화 ​

셸 도구는 프롬프트 인젝션 공격의 주요 벡터입니다. 공격자가 LLM의 추론에 영향을 줄 수 있다면(예: 악성 문서 내용을 통해) 셸 도구가 명령 실행에 사용됩니다. PRX는 다음을 통해 이를 완화합니다:

  1. 샌드박스 격리 -- 악성 명령이 실행되더라도 제한된 파일시스템과 네트워크 접근으로 실행
  2. 환경 제거 -- API 키와 시크릿이 자식 프로세스에서 사용 불가
  3. 감독 모드 -- 사람이 각 명령을 실행 전에 검토 가능
  4. 감사 추적 -- 모든 명령이 포렌식 검토를 위해 로그됨

관련 페이지 ​

Released under the Apache-2.0 License.