본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

샌드박스에서 opt out, 일부러 그리고 그물을 갖고

~14 min · self-contained, sandbox, security, tradeoff

Level 0릴 입문자
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"직접 배포 앱은 App-Sandbox 안 돼. Recall-해석 마운트-NAS 경로가 사용자 picker 없이 열리려면 필요해. 읽기 전용 처리, hardened runtime, 플러그인/헬퍼 없음, 엄격한 검증으로 보완해."

끄는 보호는 진지한 이유를 받을 자격이 있어

App Sandbox 는 macOS 의 제일 좋은 보호 중 하나야. 앱을 사용자가 명시적으로 건네는 파일로만 가두거든. 그걸 끄는 건 어깨 으쓱이 아니야. 이름 붙이고, 정당화하고, 보완해야 하는 보안 결정이지. Ashen Reel 은 opt out 하는데, 그 이유가 앱의 목적 전체에 구워져 있어.

샌드박스는 사용자가 고른 scope 로 파일 접근을 줘. open panel, drag-drop, 저장된 북마크 같은 거. 근데 Recall 딥링크는 사용자가 panel 에서 절대 안 고른 경로를 해석해. 파일 다이얼로그가 아니라 자막 검색에서 왔거든. 샌드박스된 앱은 그 경로에 대한 보안 scope 가 없어서 그냥 못 열어. 샌드박스를 켜는 건 앱이 제공하려고 존재하는 바로 그 handoff 를 깨는 거야. 그러니 opt-out 은 편의가 아니라 핵심 기능의 값이야.

보호는 이름 붙은 이유랑 보완 컨트롤이 있을 때만 꺼. '샌드박스 껐어' 는 조용할 땐 위험 신호지만, 적힌 이유랑 포기한 보호를 대체하는 게 뭔지 목록과 함께 오면 방어 가능한 엔지니어링 결정이야. opt-out 이랑 보완은 한 세트고.

샌드박스를 대체하는 것

샌드박스를 포기하는 게 안전을 포기하는 건 아니야. 관련 보호를 손으로 다시 짓는다는 거지. Ashen Reel 의 보완 컨트롤은 구체적이야. 소스 미디어는 엄격히 읽기 전용으로 처리돼(Track 5). hardened runtime 이 켜진 채라 서명 안 된 코드는 주입될 수가 없고. 플러그인도, privileged helper 도, 임의 쉘도, 공격할 listening 서비스도 없어. 그리고 Recall 이 해석한 경로는 전부 허용 루트에 대해 독립적으로 다시 검증되고(Track 3). 샌드박스가 하던 일이 폭발 반경을 제한하는 거였는데, 이 컨트롤들이 다른 방식으로 그걸 제한하는 거야.

tradeoff 가 못 숨게 적어둔 posture 야.

생각 없는 opt-out 이 진짜 위험이야. 문제는 절대 'sandbox off' 그 자체가 아니야. 자리에 아무것도 안 놓고 이유도 기록 안 한 'sandbox off' 지. 많은 앱이 경고 하나 없애려고 보호를 끄고 조용히 물렁한 타겟이 돼. 규율은, 진짜 요구사항이 강제할 때만 opt out 하고, 없앤 보호 하나하나에 대해 코드베이스한테 보완 컨트롤을 빚지는 거야.

왜 이게 정직한 엔지니어링인가

tradeoff 를 숨기는 대신 이름 붙이는 데 진정성이 있어. Ashen Reel 은 샌드박스가 문제 아닌 척하거나, 왜인지 안 말하고 조용히 약한 앱을 낼 수도 있었어. 대신 아키텍처 문서가 opt-out 을 밝히고, 이유를 밝히고, 보완을 나열해. 미래의 reader 가, 미래의 너까지 포함해서, 그 결정에 걸려 넘어지는 대신 감사할 수 있게. 읽고 이의 제기할 수 있는 보안 posture 가, 그냥 이번 주에 우연히 참인 것보다 강하거든.

Code

entitlements posture. 숨기지 않고 적어둔 tradeoff·text
Entitlements posture (a decision, written down):

  com.apple.security.app-sandbox                    = false  # opt OUT, on purpose
  hardened runtime (codesign --options runtime)      = ON     # keep other guards
  com.apple.security.cs.disable-library-validation   = false  # no unsigned code
  JIT / unsigned executable memory / dyld env overrides = none

WHY sandbox is off:
  A Recall deep link resolves a NAS path the user never picked in an open
  panel. A sandboxed app has no security scope for that path, so the core
  handoff cannot open the file. Sandbox on = the app's reason to exist, broken.

COMPENSATING CONTROLS (what replaces the sandbox's protection):
  - read-only media handling (Track 5): never writes the source
  - no plugins, no privileged helper, no arbitrary shell, no listening port
  - independent Recall-root + canonical-file validation (Track 3)
  - hardened runtime: still no unsigned code injection, no risky dyld env

External links

Exercise

네 프로젝트가 끄거나 느슨하게 한 보안 기본값을 찾아. 비활성 샌드박스, 느슨한 CORS 정책, 관대한 파일 권한, 건너뛴 인증서 검사, 'allow all' 방화벽 규칙 같은 거. 그 하나에 대해 두 가지를 적어. opt-out 을 강제한 구체적 요구사항, 그리고 없앤 보호를 대체하는 구체적 보완 컨트롤. 둘 다 못 채우면, tradeoff 가 아니라 정당화 안 된 약점을 가진 거야.
Hint
방어 가능한 opt-out 은 항상 양쪽 반을 가져. 진짜 이유('핵심 기능이 그거 켜곤 문자 그대로 작동 못 함')랑 보완('대신 이게 폭발 반경을 제한함'). 이유가 '경고를 뱉어서' 고 보완 칸이 비어 있으면, 그건 엔지니어링 tradeoff 가 아니야. 발견되길 기다리는 물렁한 타겟이지.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.