본문으로 건너뛰기

'lib.cpython-313-darwin.so'을(를) 열지 않음: macOS 게이트키퍼 경고창이 계속 뜨는 이유와 xattr로 끝내는 법

· 약 7분
Datapopcorn CEO / AI automation educator

'lib.cpython-313-darwin.so'을(를) 열지 않음 — 이 창 때문에 작업이 계속 멈췄던 분, 이 글 하나로 정리할 수 있습니다.

macOS는 프로그램이 아니라 파일 단위로 보안 검사를 합니다. 그래서 화면에는 lib.cpython-313-darwin.so처럼 아무것도 아닌 파일 이름이 뜨고, 사용자는 무슨 악성코드인지 알 수 없습니다. 실제로 이 파일은 Python의 shapely 패키지에 들어 있던 단순한 계산 라이브러리였습니다.

이 글에서 다룬 실제 측정치는 이렇습니다. 한 디렉터리에서 격리 표시가 붙은 파일이 172,164개였고, 해제 후 같은 경로의 잔여 개수는 0개였습니다.

이 글은 이런 분께 필요합니다​

다음 중 하나라도 해당된다면 읽어주세요.

  • lib.cpython-313-darwin.so, rolldown-binding.darwin-arm64.node처럼 모르는 파일 이름이 적힌 경고창이 반복해서 뜹니다
  • 버튼이 "휴지통으로 이동" / "완료" 둘뿐인 창이 보입니다
  • 파이썬 패키지를 불러올 때(import pandas, import shapely), Node 도구를 실행할 때 창이 뜹니다
  • "완료"를 눌렀는데도 계속 다시 뜬다고 느낀 적이 있습니다

필요한 것은 macOS 기본 터미널과 기초적인 파일 탐색기뿐입니다. 별도 프로그램 설치는 필요 없습니다.

먼저, 왜 이 창이 계속 뜰까​

이 창은 macOS 게이트키퍼(Gatekeeper) 가 만드는 것입니다. 게이트키퍼는 외부에서 받은 파일에 com.apple.quarantine(격리)라는 표시를 남기고, 어떤 프로그램이 그 파일을 실제로 실행하거나 메모리에 올릴 때 안전 여부를 확인합니다.

핵심은 여기입니다.

격리 표시가 있는 파일을 실행하거나 불러오는 순간에만 창이 뜹니다. 그리고 버튼을 눌러도 그 파일의 격리 표시가 지워지지 않기 때문에, 다음에 또 불러올 때 다시 뜹니다.

그래서 "완료"를 누르는 것은 창만 닫을 뿐, 원인을 고치는 게 아닙니다. 진짜 해결은 격리 표시 자체를 지우는 것이고, 그게 xattr 명령 한 줄로 됩니다.

Step 1. 창에 나온 파일이 어디에 있는지 찾기​

경고창 제목에 적힌 파일명을 그대로 검색합니다.

find ~ -name "lib.cpython-313-darwin.so" 2>/dev/null

제가 실제로 확인한 경로는 두 곳이었습니다.

/Users/[사용자]/.aside/runtime/python/venv/lib/python3.13/site-packages/shapely/lib.cpython-313-darwin.so
/Users/[사용자]/.local/share/korean-law-mcp/node_modules/@rolldown/binding-darwin-arm64/rolldown-binding.darwin-arm64.node

즉 AI 에이전트가 사용하는 가상환경과 npm 프로젝트 폴더에서 나온 파일이 주원인이었습니다. AI 도구를 자주 쓰는 분들이라면 같은 패턴을 만나실 가능성이 높습니다.

Step 2. 그 파일에 격리 표시가 있는지 확인하기​

찾은 파일에 격리 표시가 붙어 있는지 확인합니다.

xattr -l "/Users/[사용자]/.aside/runtime/python/venv/lib/python3.13/site-packages/shapely/lib.cpython-313-darwin.so"

문제 있는 파일은 이렇게 나옵니다.

com.apple.provenance:
com.apple.quarantine: 00c1;6abcaa60;Aside;

com.apple.quarantine 줄이 있으면 그 파일이 경고창의 원인입니다. 없다면 이미 정리된 상태입니다.

폴더 하나에 붙어 있는 개수를 한 번에 세고 싶다면 다음을 쓰세요.

xattr -r ~/.aside 2>/dev/null | grep -c quarantine

제 환경에서는 이 값이 172164였습니다.

Step 3. 격리 표시 지우기​

아래 한 줄이 실제 해결 명령입니다.

xattr -dr com.apple.quarantine "~/.aside/runtime"
  • -r은 하위 폴더까지 재귀적으로 적용한다는 뜻입니다
  • 아래 경로들은 모두 실제로 정리했거나 잔여 개수를 확인한 경로입니다
xattr -dr com.apple.quarantine ~/.aside
xattr -dr com.apple.quarantine ~/.local
xattr -dr com.apple.quarantine ~/.cache
xattr -dr com.apple.quarantine ~/.npm
xattr -dr com.apple.quarantine ~/.colab
xattr -dr com.apple.quarantine ~/Downloads
xattr -dr com.apple.quarantine ~/Desktop
xattr -dr com.apple.quarantine ~/Documents
for a in /Applications/*.app; do xattr -dr com.apple.quarantine "$a" 2>/dev/null; done

주의: 격리 표시는 "이 파일은 외부에서 왔다"는 신호입니다. 지우면 Apple의 검사 신호가 사라집니다. 위 목록처럼 본인이 설치하고 관리하는 개발 도구 폴더에 한해서 사용해주세요. 출처를 알 수 없는 인터넷 실행 파일까지 대상으로 넓히지는 마세요.

Step 4. 남은 '실행 가능한' 격리 파일만 따로 확인하기​

데이터 파일(사진, 영상, JSON)에는 격리가 남아 있어도 창이 뜨지 않습니다. 실제 원인이 될 수 있는 네이티브 모듈과 실행 파일만 골라서 확인하는 방법입니다.

find ~/.local ~/.npm ~/.aside ~/.cache -type f \( -name "*.node" -o -name "*.so" -o -name "*.dylib" -o -perm -u+x \) 2>/dev/null \
| while IFS= read -r p; do
xattr -p com.apple.quarantine "$p" >/dev/null 2>&1 && echo "QUARANTINED: $p"
done

제 환경에서는 이 명령의 출력이 빈 줄이었습니다. 즉 더 이상 경고창을 유발할 파일이 없다는 뜻입니다.

어떤 폴더에 몇 개가 남았는지 숫자만 빠르게 보고 싶다면 다음을 씁니다.

xattr -r ~/.aside 2>/dev/null | grep -c quarantine

Step 5. 실제로 로드가 되는지 확인하기​

정리가 먹혔는지는 창이 사라졌는지가 아니라 실제로 모듈이 로드되는지로 확인하는 편이 정확합니다.

단, 어떤 파이썬으로 실행하느냐가 중요합니다. 원래 문제가 생긴 파일이 들어 있는 가상환경의 파이썬으로 실행해야 같은 라이브러리를 테스트할 수 있습니다. 다른 파이썬으로 실행하면 아래처럼 없는 모듈로 오류가 납니다.

ModuleNotFoundError: No module named 'shapely'

이 오류는 격리 문제가 아니라 다른 파이썬을 실행했다는 뜻입니다. 창이 안 뜬 것을 확인한 게 아니라, 엉뚱한 파이썬을 실행한 상황입니다.

먼저 문제 파일이 속한 가상환경의 파이썬 경로를 확인합니다.

ls -l "$(dirname "$(find ~ -name 'lib.cpython-313-darwin.so' 2>/dev/null | head -1)")"

bin/python3이 보이려면 그 옆 경로가 파이썬 실행 파일입니다. 제 환경에서는 다음과 같이 확인했습니다.

~/.aside/runtime/bin/python3 -c "import shapely, pandas, numpy; print('OK', shapely.__version__, pandas.__version__, numpy.__version__)"
OK shapely 2.1.2 pandas 3.0.6 numpy 2.5.3

이렇게 모듈이 실제로 로드되고 경고창이 뜨지 않아야 정리가 먹힌 것입니다.

로드를 다시 시도한 뒤 격리 표시가 되살아나지 않았는지도 확인해두면 좋습니다.

xattr -p com.apple.quarantine "$(find ~ -name 'lib.cpython-313-darwin.so' 2>/dev/null | head -1)"

아무것도 출력되지 않으면 정상입니다.

Node 도구를 쓰셨다면 같은 방식으로, 문제가 된 node_modules가 있는 프로젝트에서 실행해 보면 됩니다.

node -e "console.log('node 로드 정상')"

Step 6. 다시 뜨지 않게 주기적으로 정리하기 (선택)​

AI 도구를 계속 쓰면 패키지가 새로 설치되면서 격리 표시가 다시 붙습니다. 이걸 자동으로 해주는 스크립트와 예약 실행 설정입니다.

먼저 스크립트를 만듭니다.

mkdir -p ~/.aside/u/0/bin
cat > ~/.aside/u/0/bin/dequarantine.sh <<'EOF'
#!/bin/zsh
TARGETS=("$HOME/.aside" "$HOME/.local" "$HOME/.cache" "$HOME/.npm" "$HOME/.colab" "$HOME/Downloads" "$HOME/Desktop" "$HOME/Documents")
for t in $TARGETS; do
[ -e "$t" ] && xattr -dr com.apple.quarantine "$t" 2>/dev/null
done
for a in /Applications/*.app(N); do xattr -dr com.apple.quarantine "$a" 2>/dev/null; done
exit 0
EOF
chmod +x ~/.aside/u/0/bin/dequarantine.sh

그리고 ~/Library/LaunchAgents/com.user.aside-dequarantine.plist 에 아래 내용을 저장합니다. StartInterval 값은 초 단위입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>com.user.aside-dequarantine</string>
<key>ProgramArguments</key>
<array>
<string>/Users/[사용자]/.aside/u/0/bin/dequarantine.sh</string>
</array>
<key>StartInterval</key><integer>600</integer>
<key>RunAtLoad</key><true/>
</dict>
</plist>

문법이 맞는지 확인한 뒤, 일반 터미널에서 활성화합니다.

plutil -lint ~/Library/LaunchAgents/com.user.aside-dequarantine.plist
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.aside-dequarantine.plist
launchctl list | grep dequarantine

제가 확인한 범위와 하지 못한 범위: plutil -lint 통과까지는 확인했습니다. 다만 AI 에이전트가 실행되는 샌드박스 안에서는 launchctl 호출이 차단되어(Bootstrap failed: 5: Input/output error) 실제 예약 실행 동작까지는 검증하지 못했습니다. 위 launchctl bootstrap 명령은 반드시 직접 터미널에서 실행해주세요. launchctl list | grep dequarantine에서 잡히면 켜진 상태입니다. 못 잡히면 로그아웃 후 재로그인하면 등록된 플리스트가 자동으로 올라옵니다.

문제별 정리​

증상확인할 것조치
창에 lib.cpython-313-darwin.so가 뜬다xattr -l <파일>com.apple.quarantine 지우기 (Step 3)
창에 rolldown-binding...node가 뜬다find ~ -name "rolldown-binding*"해당 node_modules 상위 폴더에 Step 3 적용
"완료"를 눌렀는데 다시 뜬다격리 표시는 그대로 남아 있음버튼이 아니라 Step 3 명령으로 처리
정리했는데 계속 뜬다같은 파일이 다른 경로에 복제되어 있음Step 1 검색을 전체 경로로 돌려 재검색
정리 후에도 창이 뜬다게이트키퍼의 판정 기록이 캐시됨Mac 재시작으로 누적 알림과 캐시 초기화
No module named 'shapely'가 뜬다다른 파이썬으로 실행한 것문제가 된 파일이 있는 가상환경의 파이썬 경로로 다시 실행
xattr: Permission denied가 나온다일부 파일 소유권이 다름실행 권한 없는 데이터 파일이라 창과 무관, 무시 가능
No such file or directory가 나온다끊어진 심볼릭 링크무해, 무시 가능

마무리​

핵심은 한 문장입니다. "완료" 버튼은 창만 닫고, xattr -dr com.apple.quarantine가 원인을 지웁니다.

확인 방법은 화면을 보는 것이 아니라 Step 4와 Step 5의 출력입니다. 격리 표시가 붙은 실행 파일이 0건이고, 모듈이 정상 로드되면 끝난 것입니다.


같은 방식으로 여러 경로를 정리할 때는, 창에 떴던 파일명 하나로 좁히지 말고 경로 전체를 한 번에 정리하는 편이 빠릅니다.