Homebrew 7.0.0 공개, 병렬 설치·샌드박스·취약점 검사까지 한 번에 강화
Homebrew 7.0.0이 나왔다. 한 줄로 요약하면 설치와 업그레이드가 빨라졌고, 샌드박스가 두터워졌으며, 취약점 검사와 권고 데이터베이스가 기본으로 들어왔다. 여기에 네이티브 macOS 앱이 더해졌고, macOS 10.15 지원은 끝났으며 인텔 맥은 Tier 3로 내려갔다. 기존 설치본은 자동 업데이트나 직접 실행한 brew update로 7.0.0이 된다.
성능 개선의 핵심은 병렬화다. brew install, brew reinstall, brew upgrade가 패키지 준비와 다운로드를 서로 겹쳐서 진행하고, brew bundle로 여러 패키지를 한꺼번에 설치할 때도 같은 방식으로 대기 시간을 줄인다. brew config는 컴파일러·운영체제·저장소 점검을 동시에 돌리고, brew tap-info --installed --json=v1은 탭 메타데이터를 병렬 수집하면서도 스크립트가 기대하는 출력 순서는 유지한다. brew cleanup은 캐시 스캔 반복을 없앴고, brew fetch는 bottle과 cask의 URL·체크섬을 API 메타데이터에서 바로 읽어 패키지 정의 전체를 로드하지 않는다. brew update는 이후 명령이 빠르게 뜨도록 Ruby 캐시를 미리 준비한다. 파싱된 API 데이터는 재사용하되 서명 검증은 매 로드마다 수행하고, 시작 시 서브프로세스 수를 줄였으며 터미널 크기를 직접 읽어 uutils stty 관련 멈춤도 피한다.
보안 쪽에서는 여덟 건의 권고가 정리됐다. 가장 심각한 High 등급 문제는 서명되지 않은 cask 제거 메타데이터가 sudo 권한으로 명령을 실행할 수 있었던 건으로 6.0.12에서 수정됐고, 관련 복구 코드와 API 접근자는 삭제됐다. 7.0.0에서 고친 Moderate 등급 문제는 악성 cask가 LaunchServices를 통해 macOS 설치 샌드박스 밖에서 코드를 실행할 수 있었던 건이며, 이제 애플리케이션 실행과 Mach 서비스, 유닉스 소켓 연결이 제한된다. 같은 등급의 또 다른 문제는 macOS 설치 프로그램이 prefix 소유 Git 설정을 무시하지 않아 루트 권한으로 프로그램이 실행될 수 있었던 건이다. Low 등급으로는 livecheck 리다이렉트를 제한한 SSRF 방어, 다운로드 리다이렉트 시 비밀 헤더가 다른 호스트로 전달되지 않도록 한 조치, Git 리다이렉트가 tap 제한을 우회하지 못하게 한 수정, Subversion 외부 URL이 명령 옵션으로 해석되지 않게 한 처리, patch 대상이 스테이징 소스 트리를 벗어나지 못하게 한 수정이 포함된다.
설치 보호는 샌드박스를 중심으로 재편됐다. 설정이 서명된 데이터로 전달되고 formula·cask 작업이 샌드박스 안에서 돌아가면서 임의 Ruby 실행과 반복적인 패키지 로딩이 줄었다. 의존성 다운로드를 fetch 단계로 옮기는 작업도 진행 중이다. 이전이 끝난 formula는 네트워크 접근과 쓰기 가능한 캐시를 가진 상태로 내려받고, 설치 단계에서는 네트워크를 끄고 캐시를 읽기 전용으로 만든다. 샌드박스 안에서 홈 디렉터리를 읽는 동작은 기본 차단되며, 빌드 도구끼리 통신할 수 있도록 사설 임시 디렉터리를 제공한다. real UID와 effective UID가 어긋난 setuid 래퍼는 설정을 읽기 전에 거부한다.
플랫폼 지원 구도도 바뀌었다. macOS 10.15는 지원이 끝났고, 인텔 맥은 Tier 3로 밀려나 bottle과 .pkg 설치를 쓰려면 Sequoia 15 이상으로 올려야 한다. Apple Silicon에서 돌아가는 macOS Golden Gate 27은 사전 빌드 bottle과 함께 Tier 1 완전 지원이다. 컨테이너 이미지는 기존 것을 내리고 ghcr.io/homebrew/brew로 옮겨야 한다. CI에서 Homebrew/actions를 @master나 @main으로 참조하던 방식은 더 이상 통하지 않으니 CalVer 릴리스나 전체 SHA로 고정해야 한다. 서드파티 formula의 post_install과 cask flight 블록은 deprecated가 됐고 *_steps로 옮겨야 하며, brew style --fix가 흔한 훅은 자동 변환해 준다.
명령줄 경험도 손봤다. brew install --dry-run은 formula와 cask를 함께 미리 보여주고, brew list --no-installed-on-request는 의존성으로 딸려온 formula를 골라낸다. brew info는 설치 불가 패키지를 ⊘, 미설치 패키지를 ✘로 구분하고 운영체제·아키텍처 요구사항 충족 여부를 표시한다. brew services는 $HOMEBREW_USER_CONFIG_HOME/services/<formula>.env에서 영구 오버라이드를 읽어 패키지 업그레이드 후에도 설정이 살아남게 하고, 새로 시작하거나 재시작한 서비스는 macOS와 리눅스 모두 sh.brew.<formula> 이름을 쓴다. brew bundle은 Cargo Git 저장소·경로와 uv 원격 도구의 source: 선언을 복원하고, Brewfile에 언어 도구 출처가 함께 기록된다. brew doctor --json은 자동화용 구조화 진단을 내놓고 PATH에서 다른 brew가 현재 설치를 가리는 경우도 경고한다. brew deps --brewfile, brew untap의 패키지 동반 제거 제안, 자동 업데이트 세부 출력을 숨기는 HOMEBREW_AUTO_UPDATE_QUIET, 자식 프로세스로 BUNDLER_VERSION을 내보내지 않는 변경도 포함된다.
동작이 달라지는 지점도 있다. formula와 cask가 같은 명령을 제공하면 formula 링크가 우선하고, cask 링크를 되살리는 방법이 경고로 안내된다. brew upgrade는 호환되지 않는 cask를 건너뛰고 호환되는 앱만 올리며, brew upgrade와 brew outdated 모두 HOMEBREW_NO_UPGRADE_AUTO_UPDATES_CASKS를 존중해 자체 업데이트 앱의 선택을 유지한다. brew uninstall은 API에서 사라진 cask의 기록을 정리하면서 남은 파일 가능성을 경고하고, 파일이 이미 현재 사용자 소유라면 불필요한 암호 입력을 요구하지 않는다. brew link와 brew unlink는 --cask/--casks를 받는다.
전제도 분명히 해둔다. 악성 서드파티 cask를 막는 1차 방어선은 여전히 tap 신뢰이며, 샌드박스는 주로 사고로 인한 피해 범위를 줄이고 설치 안전장치를 더하는 역할이다. 신뢰할 수 없는 소프트웨어를 안전하게 만들어 주지는 못한다. 애플리케이션은 사용자 권한으로 실행되고, 벤더가 제공하는 .pkg 설치 프로그램은 샌드박스 밖에서 돌며 sudo를 요구할 수 있다.