
Linux에서 제한된 파일 시스템 뷰 내에서 모든 명령 실행
⚠️ 프로젝트 중단
이 프로젝트의 개발이 중단되었습니다. 다른 누군가가 같은 아이디어를 가지고 더 나은 솔루션을 구축했기 때문입니다.
다음을 확인하시길 적극 권장합니다: Use-Tusk의 Fence.참고: 이 저장소는 원래 FOSS HACK 2026을 위해 생성되었으나, 불행히도 기한 내에 완료하지 못했습니다.
그러나 Hackathena '26에서 유사한 프로젝트를 구축하여 3등상을 수상했습니다!
관심이 있으시다면 다음 저장소를 확인해주세요: A56-A5/lion.
Cordon은 Linux에서 제한된 파일 시스템 보기 내에서 모든 명령을 실행합니다. Linux 네임스페이스(bubblewrap을 통해)를 사용하여 프로세스에 필요하지 않은 모든 것(홈 디렉터리, SSH 키, AWS 자격 증명 등)을 숨기면서도 명령이 제대로 작동하도록 합니다.
cordon run --net=allow -- npm install
cordon run -- bash setup.sh
cordon run --profile python -- pip install -r requirements.txt
루트 권한 불필요. 컨테이너 불필요. 백그라운드에서 실행되는 데몬 없음.
npm install 또는 pip install을 실행하면 해당 코드가 전체 사용자 권한으로 실행됩니다. ~/.ssh/id_rsa를 읽고, 서버로 빼돌리고, 소유한 파일을 수정할 수 있습니다. 마치 패키지를 설치하는 것처럼 보이면서 말이죠.
이는 편집증이 아닙니다. 실제로 발생한 사례입니다:
Cordon의 해결책: 코드가 악의적이더라도 프로세스가 보면 안 되는 것을 보지 못하게 합니다.
각 cordon run은 새로운 격리된 환경을 생성합니다:
/usr, /bin, /lib는 읽기 전용으로 마운트됩니다 — 프로그램은 실행되지만 시스템을 망가뜨리지는 않습니다npm install이 node_modules/를 생성하고, 빌드가 작동합니다src/가 존재하면 읽기 전용입니다 — 소스 파일이 조용히 덮어쓰여지지 않습니다~/.ssh, ~/.aws, HOME — 기본적으로 전혀 마운트되지 않음--net=allow를 사용하여 내장된 도메인 허용 목록 프록시를 통해 필터링됩니다프로세스가 종료되면 샌드박스도 사라집니다. 아무것도 유지되지 않습니다.
--net=allow 모드는 내장된 Rust HTTP/HTTPS 프록시를 임의의 로컬호스트 포트에 띄우고 환경 변수(HTTP_PROXY, https_proxy, npm_config_proxy 등)를 통해 샌드박스에 주입합니다. CONNECT 터널을 가로채서 각 도메인을 허용 목록과 대조한 후 전달합니다.
기본 허용 목록에는 registry.npmjs.org, pypi.org, crates.io, github.com이 포함됩니다. 목록에 없는 것은 403을 반환합니다 — 패키지의 postinstall 스크립트가 외부로 통신을 시도하더라도 마찬가지입니다.
# npmjs.org와 그 CDN에만 접근 — 그 외에는 불가
cordon run --net=allow -- npm install
# 프라이빗 레지스트리용 도메인 추가
cordon run --net=allow --domain my.internal.registry -- npm install
선택적으로 시스템 콜 필터를 추가할 수 있습니다:
# ptrace, kexec_load, mount, perf_event_open, process_vm_* 차단
cordon run --seccomp basic --net=allow -- npm install
# 엄격한 허용 목록 — 알려진 안전한 시스템 콜만 허용
cordon run --seccomp strict -- python3 untrusted.py
이는 두 번째 방어선입니다. 파일 시스템 제한을 벗어난 경우에도 ptrace를 호출하여 다른 프로세스에 연결하거나 perf_event_open으로 부채널 공격을 할 수 없습니다.
git clone https://github.com/LORDv1shnu/Cordon
cd Cordon
bash install.sh # 릴리스 바이너리 빌드 → ~/.local/bin/cordon
또는 수동으로:
cargo build --release
cp target/release/cordon ~/.local/bin/
bubblewrap이 설치되어 있어야 합니다:
sudo apt install bubblewrap # Ubuntu/Debian
sudo dnf install bubblewrap # Fedora
sudo pacman -S bubblewrap # Arch
설치 후 첫 실행:
cordon scan # 시스템을 한 번 스캔, 약 30초 소요, ~/.config/cordon/system.toml에 기록
cordon check # 상태 확인 — 모든 것이 준비되었는지 확인
# 기본
cordon run -- echo "hello"
cordon run --net=allow -- npm install
cordon run --net=allow -- pip install -r requirements.txt
cordon run --net=full -- curl https://example.com # 제한 없음 (필터링 없음)
# Seccomp
cordon run --seccomp basic --net=allow -- npm install
# GUI 앱
cordon run --gui -- code .
cordon run --gui --optional audio_pipewire --optional dbus_session -- discord
# 내장 프로파일 (일반적인 런타임에 맞게 미리 구성됨)
cordon run --profile node -- npm install
cordon run --profile python -- python3 script.py
cordon run --profile rust -- cargo build
# 차단되는 항목 디버깅
cordon run --trace -- node server.js # strace 래퍼, 거부된 경로 보고
cordon add --from-trace ~/.config/cordon/logs/last-trace.log # 누락된 경로 일괄 추가
# 리소스 제한 (systemd 필요)
cordon run --mem 512M --cpu 2.0 --timeout 60 -- npm install
# Dry run / 자세한 출력
cordon run --dry-run -- npm install # bwrap 명령어 출력, 실행하지 않음
cordon run --verbose -- npm install # 각 bwrap 인수를 실행 시 출력
cordon.toml)cordon init # Cargo.toml / package.json / pyproject.toml 자동 감지
cordon set --net=allow # 플래그를 유지하여 매번 입력할 필요 없음
cordon add /path/to/assets --mode ro # 샌드박스에 추가 경로 노출
cordon edit # $EDITOR에서 cordon.toml 열기
cordon check # 상태 점검: bwrap, 네임스페이스, AppArmor, 모듈
cordon doctor # 상세 진단: 커널 버전, 배포판 특이사항, 정확한 수정 제안
cordon status # 현재 system.toml 내용 표시
cordon list # 다음 실행 시 활성화될 모든 마운트 표시
cordon log --errors # 마지막 실행 로그, 오류만 표시
cordon syscalls --preset basic # 각 seccomp 프리셋이 차단하는 내용 목록
# 이름 있는 프로파일 (~/.config/cordon/profiles.toml에 저장)
cordon profile create ci-node --net=allow --optional ld_so_cache
cordon run --profile ci-node -- npm test
# 재현 가능한 환경을 위한 Lockfile
cordon lock update # 모든 마운트 경로 SHA-256 해싱 → cordon.lock
cordon lock verify # 변경 사항 확인
# 팀과 샌드박스 구성 공유
cordon export > sandbox.json
cordon import sandbox.json
# 탭 완성
cordon completions zsh > ~/.zfunc/_cordon
# 투명 래퍼 — "npm"이 항상 샌드박스에서 실행되도록 함
cordon wrap npm
cordon wrap pip
npm install # 실제로 실행: cordon run -- npm install "$@"
cordon unwrap npm
# 매뉴얼 페이지
cordon man | man -l -
네 가지 구성 파일이 있으며, 순서대로 적용됩니다:
CLI 플래그가 항상 우선합니다. cordon.toml이 이름 있는 프로파일보다 우선합니다. 바이너리에 내장된 core.toml은 런타임에 수정할 수 없습니다.
bwrap 및 셸과 동일한 규칙입니다.
Cordon은 컨테이너, 안티바이러스, 또는 SELinux나 AppArmor의 대체품이 아닙니다. 파일 시스템 가시성과 네트워크 액세스를 제한합니다 — 악성코드를 탐지하려는 것이 아닙니다. 커널 익스플로잇이 있다면 탈출할 수 있습니다. 목표는 공급망 공격을 훨씬 어렵게 만드는 것이지, 불가능하게 만드는 것이 아닙니다.
또한: 현재 Linux x86_64 및 aarch64만 지원합니다. bubblewrap이 필요합니다.
Rust로 제작되었습니다. 네임스페이싱에 bubblewrap, BPF 필터 컴파일에 seccompiler, CLI에 clap, 구조화된 로깅에 tracing을 사용합니다. 도메인 필터링 프록시는 순수 Rust로 처음부터 작성되었습니다 (외부 프록시 도구 없음).
→ COMMANDS.md — 전체 플래그 참조
→ SCANNER_LOGIC.md — 시스템 스캐너 작동 방식
→ MODULE_INFO.md — 모든 소스 파일 설명
AI 도움(Gemini)을 받아 제작되었습니다. 아키텍처, 보안 모델 및 설계 결정은 저자의 작업입니다.
| 공격 | 수행한 작업 |
|---|
| LiteLLM (2024) | 악성 PyPI 패키지가 pip install 시 SSH 키와 환경 변수를 읽음 |
| xz-utils (2024) | 설치 중 make 단계를 통해 빌드 타임 백도어가 주입됨 |
| event-stream (npm, 2018) | 손상된 npm 패키지가 비트코인 지갑을 조용히 탈취 |
| SolarWinds | 빌드/업데이트 파이프라인을 통한 공급망 공격 |
| 계층 | 위치 | 작성자 |
|---|
core.toml | 바이너리에 내장됨 | 런타임에 편집 불가 (변조 방지) |
system.toml | ~/.config/cordon/ | cordon scan |
profiles.toml | ~/.config/cordon/ | cordon profile create |
cordon.toml | 프로젝트 디렉터리 | cordon init / cordon set / cordon add |
| 코드 | 의미 |
|---|
| 0 | 성공 |
| 1 | cordon 내부 오류 |
| 2 | 잘못된 CLI 사용법 |
| 125 | 샌드박스 설정 실패 (bwrap 누락 등) |
| 126 | 명령이 샌드박스 내에서 발견되었지만 실행 불가능 |
| 127 | 샌드박스 내에서 명령을 찾을 수 없음 |
| N | 샌드박스된 프로세스로부터 전달됨 |