관리 메뉴

백엔드 엔지니어 이재혁

gemini-cli: 보안과 샌드박스 본문

흥미로운 것들

gemini-cli: 보안과 샌드박스

alex00728 2025. 9. 23. 16:40

gemini-cli 설치 및 실행 방법은 글을 쉽게 찾을 수 있어 "샌드박스" 기능에 집중해 작성하겠습니다.

 

gemini-cli는 터미널에서 실행할 수 있는 명령이라면 무엇이든지 실행이 가능하다.

그래서 강력하기는 하지만... 보안 위험성이 떠올랐는데, 보안에 문제가 없을까?

 

보안 위험 가능성 확인

실험1. notepad++를 실행해달라고 한다.

  1. PATH 환경 변수에 등록되어 있지 않아 이름만으로는 실행이 불가능했다.
  2. 이어서 직접 해당 프로그램을 검색하는 시도를 했다.
  3. 하지만 `Search path ("C:\Program Files (x86)") resolves outside the allowed workspace directories` 라며 검색 기능이 막혔다.

"보안 제약"으로 인해 시스템 폴더 검색이 제한되었다고 말한다.

의외로 안전한걸지도?

 

하지만 뒤에 "Notepad++가 설치된 전체 경로를 알려주시겠어요?"라는 말을 했다.

그래, 경로를 한 번 알려줘보자.

 

실험2. notepad++의 경로를 제시해준다.

 

notepad++의 경로를 알려줬더니 실제로 실행이 됐다! (따로 스크린샷에 담지는 않았습니다.)

 

실험3. notepad를 실행한다.

아까 PATH에 등록되어 있지 않아서 바로 실행하지 못했던 응답을 고려해서 이번엔 notepad를 실행하도록 해봤다.

 

이번에는 경로를 알 필요 없이 바로 `notepad`를 실행할 수 있었기에 바로 실행이 됐다.

 

결론

gemini-cli는 경로 탐색이 현재 실행 디렉토리로 제한되지만, 실행은 경로 제약없이 자유롭게 가능하다.

특히, PATH에 경로가 등록되는 프로그램을 일반 사용자 권한 수준에서 아주 자유롭게 실행할 수 있기 때문에 위험성이 분명히 존재한다고 생각한다.

 

샌드박스

gemini-cli는 이런 보안 문제를 고려해 "sandbox" 모드를 제공한다.

실행 방법

`gemini-cli -s`와 같이 `-s` (혹은 `--sandbox`) 옵션을 주면 샌드박스로 실행이 가능한데, 컨테이너 환경에서 실행하게 된다.

Docker가 실행된 상태라면 이렇게 `gemini-cli/sandbox`가 컨테이너로 띄워진다.

 

Docker 실행 확인

컴퓨터에 Docker가 실행 중이어야 한다.

Docker가 실행 중이지 않으면 에러가 나니 참고 (실제 로그는 아래 더 보기 확인)

더보기
Loaded cached credentials.
hopping into sandbox (command: docker) ...
Checking for sandbox image: us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5
Sandbox image us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5 not found locally.
Attempting to pull image us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5 using docker...
error during connect: Post "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.51/images/create?fromImage=us-docker.pkg.dev%2Fgemini-code-dev%2Fgemini-cli%2Fsandbox&tag=0.5.5": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.
Failed to pull image us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5. 'docker pull us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5' exited with code 1.
Failed to obtain sandbox image us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5 after check and pull attempt.
Fatal error: Failed to relaunch the CLI process. FatalSandboxError: Sandbox image 'us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.5.5' is missing or could not be pulled. Please check the image name, your network connection, or notify gemini-cli-dev@google.com if the issue persists.
    at start_sandbox (file:///C:/Users/JH/AppData/Roaming/npm/node_modules/@google/gemini-cli/dist/src/utils/sandbox.js:319:19)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async relaunchOnExitCode (file:///C:/Users/JH/AppData/Roaming/npm/node_modules/@google/gemini-cli/dist/src/gemini.js:78:30)
    at async main (file:///C:/Users/JH/AppData/Roaming/npm/node_modules/@google/gemini-cli/dist/src/gemini.js:267:13) {
  exitCode: 44
}

 

실행 화면

 

실행하고 나면, 위와 같이 sandbox 모드라는 것을 확인할 수 있다.

 

컨테이너로 격리시킨다는 것을 알겠는데, 그럼 로컬 파일 시스템은 어떻게 접근하는걸까?

 

샌드박스에 마운트된 경로

 

gemini-cli를 실행했을 때 위치를 기준으로, 호스트 컴퓨터의 디렉토리를 함께 마운트한다.

그리고 .gemini 디렉토리와 Temp 디렉토리도 같이 마운트하네요.

 

이렇게 격리된 컨테이너 환경에서도 현재 작업 중인 디렉토리는 공유하는 방식을 통해

"실행 환경"은 분리하면서도 "작업 경로"는 공유하는 방식으로 작동한다.

 

 

실험1. 현재 디렉토리에 있는 파일들의 전체 크기 확인

 

리눅스 셸 명령어를 활용해 44GB라는 응답을 줬다. 실제로도 44GB 정도가 맞았다.

 

디렉토리에 정상적으로 접근할 수 있는 것을 확인했다.

 

실험2. notepad 실행하기

 

컨테이너는 리눅스 환경으로 구동되기 때문에 notepad를 실행하지 못했다. 애초에 파일 접근도 못했을 것이라 생각된다.

 

실험3. notepad++ 파일 크기 확인하기

 

notepad++ 파일의 크기를 알려달라는 것도 당연히 불가능했다. 파일 접근이 불가능하다.

 

외부 어플리케이션 연동

샌드박스 내부에서는 로컬에서 실행 중인 다른 어플리케이션에 접근할 때, `localhost` 대신 `host.docker.internal`을 사용해야 한다. (Linux 환경에서는 `host-gateway`)

예를 들어, MySQL을 사용하는 Spring 소스코드를 작성하고 디버깅한다고 해보자. MySQL은 `localhost:3306` 포트에서 구동 중인데, gemini 샌드박스에서는 `host.docker.internal:3306`로 접근해야 한다.

 

단점

Java가 설치되어 있지 않아서 샌드박스 내부에서 디버깅을 하기 어렵다. 보안 제약으로 인해 Java를 새로 설치하는 것도 막혀있다고 한다.

 

대안

정말 강력한 CLI Agent 환경을 구성하고 싶다면...

  1. 전용 컨테이너를 하나 생성
    현재 프로젝트 디렉토리를 공유하도록 디스크 볼륨 공유 설정 (`-v` 옵션)
  2. 필요한 어플리케이션을 직접 설치 (Java 등)
  3. gemini-cli를 컨테이너 내부에 설치
  4. 컨테이너 내부에서 일반 모드로 gemini-cli 실행

 

결론

gemini-cli의 샌드박스는 호스트 컴퓨터와 격리된 환경에서, 작업 디렉토리만 공유하며 실행한다.

CLI Agent의 강력한 기능을 활용하면서도 내가 원하는 만큼만 격리된 환경을 제공하고 싶다면, 샌드박스 기능을 활용해보자.