본문으로 건너뛰기
SECURITY & TELEMETRY

이 링크를 보안팀에 그대로 넘기세요

도입 검토에서 막히는 자리는 대체로 정해져 있습니다. 코드가 나가는가, 프롬프트가 저장되는가, 끌 수 있는가, 끄면 무엇이 달라지는가. 아래가 그 답이고, 확인해 드릴 수 없는 항목은 확인할 수 없다고 적었습니다.

검증 가능 범위

오케스트레이션 엔진은 비공개입니다. 그래서 '코드를 읽어보라'는 답은 드릴 수 없습니다. 대신 네트워크 모니터로 확인하실 수 있게 아웃바운드 호스트를 전부 적어뒀고, 에이전트가 소비하는 자산은 전부 평문으로 공개돼 있습니다. 제3자 프라이버시 감사는 받은 적이 없습니다.

SCOPE

무엇이 나가고 무엇이 안 나가는가

앱은 실행 중일 때 약 10초 주기로 이벤트 배치를 자사 Google Cloud 프로젝트(BigQuery)로 보냅니다. 그 배치에 들어가는 것과 들어가지 않는 것을 그대로 적습니다.

전송 안 함

소스 코드 · 저장소 · diff · 파일 경로

기본 경로 어디에서도 나가지 않습니다. 에이전트 CLI 가 로컬 디스크에서 읽고 쓰며, Marblo 는 그 CLI 를 사용자 머신의 하위 프로세스로 띄울 뿐입니다. 로그에 섞여 들어올 수 있는 사용자 홈 경로(/Users/*, /home/*, C:\Users\*)는 스크러버가 <USER_HOME> 으로 치환합니다.

전송 안 함

프롬프트 · 모델 응답 · 터미널 출력

prompt · initialPrompt · message · userInput · content · raw_input 이라는 이름의 필드는 마스킹이 아니라 큐에 들어가기 전에 통째로 삭제됩니다. 자연어를 부분적으로 가리는 방식은 신뢰할 수 없다고 봐서 아예 실리지 않게 했습니다. 티켓 제목과 설명, 채팅 메시지도 이벤트 스트림에는 들어가지 않습니다(아래 여섯 번째 항목과 구분해서 읽으셔야 합니다).

전송 안 함

API 키 · 자격증명 · 개인 식별정보

sk-ant-* · sk-* · AIza* 형태의 키, 그리고 *_KEY · *_TOKEN · *_SECRET · ANTHROPIC_* · OPENAI_* 처럼 이름부터 비밀로 보이는 필드는 <REDACTED> 로 바뀝니다. 이메일은 <EMAIL>, 전화번호는 <PHONE> 으로 치환됩니다. Marblo 는 모델 트래픽을 프록시하지 않고 CLI 로그인 정보를 보관하지도 않습니다.

기본 켜짐

비식별 운영 이벤트

이벤트명(agent:spawned, task:completed 같은 생명주기 지점), 모델 id, 에이전트 역할, 티켓 상태 전이, 소요 시간(ms), 입출력 토큰 수, 추정 비용, 프로세스 종료 코드, 앱 버전, 플랫폼, 그리고 익명 install id 입니다. 실패 이벤트에는 오류 범주(cli_auth, runtime_crash 등)와 스크러버를 통과한 짧은 메시지가 붙습니다. 목적은 운영 품질입니다 — 어떤 하네스와 모델 조합이 죽는지, 온보딩이 어디서 멈추는지, 이번 릴리스가 무엇을 되돌렸는지.

기본 꺼짐

크래시 리포트

켜면 크래시 스택 트레이스와 PII 가 가려진 오류 메시지, OS · 앱 버전이 Sentry 로 갑니다(미국 호스팅, 90일 보관). 앱이 보낼 수 있는 유일한 제3자이며 켤 때 국외 이전 동의를 따로 묻습니다. 같은 스크러버가 이 경로에도 돕니다. GA4 나 Mixpanel 같은 분석 벤더로는 앱에서 아무것도 나가지 않습니다 — marblo.app 웹사이트가 자체 쿠키 동의 아래 GA4 를 쓰는 것은 앱이 아니라 웹사이트 이야기입니다.

제품 데이터

계정에 동기화되는 것

티켓 제목과 설명, 활동 로그, 에이전트 · 보드 상태, 채팅 메시지, 비용 롤업은 계정 아래 Firestore 에 동기화됩니다. 팀이 같은 보드를 실시간으로 보는 제품이라 그렇습니다. 이건 비식별이 아니고 분석 토글의 영향도 받지 않습니다 — 호스팅 이슈 트래커에 올리는 데이터와 같은 범주로 취급하시면 됩니다. 티켓 설명에 비밀을 적지 마십시오.

SETTINGS → PRIVACY

스위치는 세 개, 위치는 Settings → Privacy

기본값을 그대로 적습니다. 한 번의 클릭으로 끌 수 있다는 사실이 기본 켜짐을 opt-in 으로 바꿔주지는 않습니다.

자사 분석

기본 켜짐

위 네 번째 항목의 비식별 운영 이벤트를 지배합니다. 끄면 즉시 반영되고 재시작 후에도 유지됩니다.

크래시 리포트

기본 꺼짐

Sentry 전송. 켤 때 국외 이전 동의를 별도로 묻고, SDK 의 user 객체는 전송 전에 비웁니다.

학습 데이터 기여

기본 꺼짐

켜면 본인 에이전트 턴의 원본 프롬프트와 응답 텍스트가 저장돼 Marblo 자체 모델 학습에 쓰입니다. 원문 텍스트라 코드와 개인정보가 들어갈 수 있고, 그래서 묶음 동의가 아니라 별도의 기본 꺼짐 스위치입니다. 비식별 이벤트와 다른 BigQuery 데이터셋에 쓰여 IAM 레벨에서 접근이 분리됩니다.

끄면 생기는 손해 한 가지

자사 분석 스위치가 비용 롤업 쓰기까지 함께 지배합니다. 끄면 Usage 탭에 새로운 지출 이력이 쌓이지 않습니다. 그 외 앱 동작은 동일합니다.

SUPPLY CHAIN

스토어에서 설치되는 것은 안전한가

스토어는 사용자 머신에서 실행되는 것을 설치합니다. 그래서 레지스트리를 공급망 표면으로 취급합니다.

외부 항목은 고정됩니다
외부 항목은 source.ref 를 태그나 커밋 SHA 로 선언해야 하고 움직이는 브랜치는 허용되지 않습니다. 매니페스트 스키마가 그 형태를 강제합니다.
복사해 오지 않습니다
제3자 코드를 이 리포에 베끼지 않고 고정된 ref 에서 상위 저장소를 가져옵니다. 라이선스와 소유권이 원저자에게 그대로 남습니다.
권한 선언이 필수입니다
실행되는 항목 유형(skill · agent · workflow · mcp-server · harness)은 요청하는 권한을 반드시 선언해야 합니다. 빈 목록은 유효하고 의미 있는 답이지만 생략은 허용되지 않아서, 아무 말 없는 항목이 무해한 항목처럼 보일 수 없습니다.
커뮤니티 항목은 원클릭이 아닙니다
설치 계약이 있는 community 항목은 '검토되지 않은 콘텐츠' 경고를 사용자가 확인해야만 설치되고, 그 확인은 UI 가 아니라 메인 프로세스에서 강제됩니다. 원클릭은 '우리가 읽어봤다'는 뜻이고 동의 게이트는 '고정하고 검증은 했지만 저자를 믿는 쪽은 당신'이라는 뜻입니다.

아직 사실이 아닌 것

이 목록을 빼면 위의 항목들도 같이 못 믿게 됩니다. 리포의 SECURITY.md 에 적힌 내용을 그대로 옮깁니다.

  • 권한은 공시이지 강제가 아닙니다. Marblo 는 사용자 본인의 자격증명으로 CLI 하위 프로세스를 띄웁니다. 항목이 무엇을 필요로 한다고 말했는지는 보여줄 수 있지만, 설치된 뒤 그 항목이 실제로 무엇을 하는지 제한할 수는 없고 그렇게 주장하지도 않습니다.
  • 고정은 재현성을 사는 것이지 최신성을 사는 것이 아닙니다. 커밋을 고정하면 상위 저장소의 수정이 레지스트리가 핀을 옮기기 전까지 사용자에게 닿지 않습니다. 상위 저장소의 릴리스 · 보안 권고 · 삭제 · 보관 · 라이선스 변경 · 강제 이동된 태그를 감시하는 작업은 아직 돌지 않습니다. 그때까지 핀은 얼어 있는 것으로 보셔야 합니다.
  • status: revoked 의 앱 측 강제는 아직 출시되지 않았습니다. 필드와 권고 파일은 어휘를 미리 맞춰두려고 존재합니다. CI 검증도 의도적으로 좁습니다 — 스키마 · id · 필수 권한 · 라이선스 · 불변 소스 핀 · 저장소 도달 가능성까지만 보고, 상위 저장소의 라이선스 본문 확인과 외부 페이로드의 시크릿 스캔은 메인테이너 검토의 몫으로 남아 있습니다.
FOR SECURITY REVIEW

보안 검토에서 실제로 받는 질문

답에 우리에게 불리한 항목을 남겨뒀습니다. 어차피 검토 과정에서 나올 질문이고, 먼저 적어두는 편이 서로 시간을 아낍니다.

Marblo 가 우리 모델 트래픽을 중계합니까?
아닙니다. Marblo 는 Claude · Codex · Grok CLI 를 하위 프로세스로 띄울 뿐이고 각 CLI 는 자기 벤더와 직접 통신합니다. 자격증명도 사용자 본인 것이고 AI 사용료도 사용자 계정에 청구됩니다. 다만 정직하게 덧붙이면, 그 트래픽은 해당 벤더의 약관과 데이터 정책을 따릅니다. Marblo 를 검토하시는 것과 별개로 각 모델 벤더의 기업 약관을 함께 확인하셔야 합니다.
기본 설치에서 나가는 아웃바운드 호스트는 무엇입니까?
Google/Firebase(인증, Firestore, 그리고 이벤트 · 하트비트 · 비용 · 결과 배치를 받는 cloudfunctions.net callable), 업데이트 확인용 GitHub 릴리스 피드, 그리고 스토어에서 무언가를 설치할 때의 github.com 과 raw.githubusercontent.com 입니다. Little Snitch · LuLu · Charles 같은 도구로 직접 확인하실 수 있습니다. opt-in 없이 Sentry ingest 호스트가 보인다면 그건 버그이니 제보해 주십시오. 다른 분석 벤더는 어떤 경우에도 나타나면 안 됩니다.
우리 코드로 모델을 학습합니까?
기본 경로에서는 하지 않습니다. 학습 데이터 기여 스위치를 켠 계정에서만, 그것도 서버가 자격을 확인한 뒤에만 수집됩니다. 상태를 모르면 — 아직 못 가져왔거나, 조회에 실패했거나, 로그아웃 상태면 — 수집하지 않는 fail-closed 구조이고 매 삽입마다 서버가 동의를 다시 확인합니다. 현재 서버가 실제로 수락하는 계정은 운영자 본인 하나뿐이고, 다른 계정은 스위치를 켜도 아무것도 수집되지 않으며 그 사실이 스위치 아래 상태 줄에 표시됩니다. 수집된 원문은 Anthropic · OpenAI · xAI 를 포함해 어떤 모델 벤더에도 전달되지 않습니다.
이벤트가 익명입니까?
익명이 아니라 비식별입니다. 클라이언트는 계정 식별자를 보내지 않고 행 키는 익명 install id 이지만, 서버 측 함수가 저장 시 계정 id 를 행 메타데이터에 붙입니다. 한 사람의 반복 설치를 중복 제거하기 위해서입니다. 결과적으로 전송 중과 행 키 기준으로는 비식별이고, 자사 웨어하우스 안에서는 재연결이 가능합니다. 이걸 '익명'이라고 부르지는 않겠습니다.
수집된 데이터를 지울 수 있습니까?
앱 안에 셀프서브 삭제 버튼은 없습니다. team@marblo.app 으로 요청하시면 30일 내에 처리합니다. 한국 이용자에 대해서는 동의를 언제든 변경할 수 있고(개인정보보호법 제22조), 거부해도 제품 동작은 달라지지 않습니다(제15조 제3항). 제3자 프라이버시 감사는 받은 적이 없습니다 — 대신 위의 아웃바운드 호스트 목록과, 스위치를 끄면 10초 주기 배치가 실제로 멈추는지 직접 확인하는 방법을 제공합니다.

보안 검토용으로 더 필요한 자료가 있으면 정리해 드립니다. 온프레미스 배포 · SAML · 감사 로그가 필요한 경우도 같은 창구에서 답합니다.

Marblo 보안 · 전송 범위 | 무엇이 나가고 무엇이 안 나가는가 | Hypemarc