원문 캡처 · github.com
원문 캡처 · github.com

NoVul은 맥 메뉴 막대에서 실행되는 오픈소스 앱으로, 맥에 설치된 소프트웨어의 보안 문제를 찾아 수정 방법을 안내한다. Apple Silicon을 탑재한 맥에서 macOS 13 이상을 사용해야 설치할 수 있다.

NoVul은 프로젝트의 잠금 파일에 기록된 패키지, Homebrew 패키지, 언어 런타임과 전역 패키지, AI 코딩 도구를 확인한다. 프로젝트 폴더와 일반적인 설정 파일에서 API 키와 토큰도 찾아낸다. 문제별 우선순위와 수정 명령을 보여주며, Claude Code나 Codex에 문제를 한 번에 전달하는 기능도 제공한다.

확인하는 항목과 우선순위

확인 영역세부 내용
프로젝트 패키지npm, pnpm, Yarn, Bun, uv, Poetry, Pipenv, PDM, requirements*.txt, Composer, Go, Cargo, Bundler, Dart/Flutter, Mix의 잠금 파일을 확인한다. Python 프로젝트에 .venv가 있고 잠금 파일이 없으면 가상 환경에 설치된 버전을 읽는다.
Homebrew설치된 formulae를 brew vulns로 확인한다.
전역 패키지npm, pnpm, Bun 전역 패키지, pipx 및 uv 도구, cargo install 패키지, Go 바이너리, Ruby gem을 확인한다.
런타임Node, Python, PHP, Go, Ruby, Java를 확인하며 지원 종료된 버전도 포함한다.
AI·개발 도구Claude Code, Codex, OpenCode, pi, Ollama, Bun과 이들에 포함된 런타임을 확인한다.
노출된 비밀 정보gitleaks로 프로젝트 폴더와 일반적인 설정 파일에서 API 키와 토큰을 찾는다. 키 자체는 표시하지 않고 위치와 안전하게 옮기는 방법을 보여준다.

취약점 정보는 OSV.dev, GitHub 보안 권고, endoflife.date에서 가져온다. 문제는 악성 패키지, CISA KEV에 올라온 실제 악용 취약점, 그 밖의 취약점 순으로 우선순위를 매긴다. 나머지 취약점은 심각도가 높은 순으로 표시하고, 심각도가 같으면 EPSS 점수가 높은 항목을 먼저 둔다. 최근 공개 데이터 유출이 발생한 서비스의 키도 더 높은 우선순위로 표시한다.

설치와 사용

최신 NoVul 다운로드에서 DMG 파일을 받아 열고, NoVul을 Applications 폴더로 옮긴 뒤 실행한다. 다른 버전은 Releases에서 확인할 수 있다. 처음 실행할 때 코드가 들어 있는 폴더를 선택하면 NoVul이 발견한 코드 폴더를 보여주고 첫 검사를 시작한다.

패키지 검사 결과는 약 1~2분 안에 표시된다. 이어서 노출된 비밀 정보를 확인한다. NoVul은 메뉴 막대에만 나타나며 Dock에는 표시되지 않는다. 검사하지 않을 때 메모리 사용량은 약 20MB다. 각 검사는 낮은 우선순위의 별도 프로세스에서 실행되며, 검사가 끝나면 프로세스가 종료된다.

NoVul은 30분마다, 그리고 잠금 파일이 바뀔 때 다시 검사한다. 중요 문제만 알림으로 전달한다. 스크린샷에는 NoVul의 데모 데이터가 표시돼 있다.

코딩 에이전트와 연동

NoVul에는 CLI와 MCP 서버가 있어 Claude Code, Codex 또는 다른 에이전트가 저장소의 문제를 읽고 수정한 뒤 NoVul에 재검사를 요청할 수 있다. NoVul 자체는 AI를 사용하지 않으며 API 키도 사용하지 않는다.

차트 위의 Fix with agent 버튼을 누르면 Claude Code나 Codex에 전달할 프롬프트를 복사하거나 터미널에서 열 수 있다. 이 프롬프트는 에이전트가 NoVul에서 문제를 읽고, 각 프로젝트의 문제를 수정하고, 테스트를 실행한 다음 NoVul에 다시 검사하도록 요청한다. 한 프로젝트의 문제만 전달하려면 먼저 차트에서 해당 프로젝트를 선택한다.

모든 세션에서 에이전트를 NoVul에 연결하려면 다음 명령을 실행한다.

text
claude mcp add novul -- /Applications/NoVul.app/Contents/MacOS/novul mcp

터미널의 현재 폴더에 있는 프로젝트의 문제를 보려면 다음 명령을 실행한다.

text
/Applications/NoVul.app/Contents/MacOS/novul findings --project "$PWD"

터미널에서 전체 검사를 실행하려면 novul scan --all을 사용한다. 메뉴 막대의 Scan Now와 같은 방식으로 프로젝트, 이 맥, 비밀 정보 순서로 검사한다. Codex, OpenCode, Claude Code skill 및 AGENTS.md 예시는 agent/setup.md에서 확인할 수 있다.

개인정보 보호와 검사 방식

NoVul은 계정이나 서버가 필요하지 않고 원격 측정 데이터를 보내지 않는다. CISA의 악용 취약점 목록, 모든 CVE에 대한 FIRST EPSS 점수, 알려진 런타임의 지원 종료 날짜, 알려진 AI 도구의 GitHub 보안 권고, Have I Been Pwned의 데이터 유출 목록을 전체 목록으로 내려받는다. 이 다운로드는 맥의 데이터를 전송하지 않는다.

기본 설정인 Standard 모드에서는 온라인으로 OSV.dev 데이터베이스에서 패키지 이름과 버전을 조회한다. 여기에는 Homebrew 패키지와 AI 도구도 포함된다. requirements.txt 프로젝트의 버전을 찾을 때는 deps.dev도 사용한다. 새 보안 권고는 30분 이내에 표시된다.

Settings에서 Private mode를 선택하면 OSV 데이터베이스를 언어별로 내려받아 맥에서 패키지를 확인한다. 데이터베이스는 하루 한 번 내려받으며, 최초 다운로드 용량은 약 250MB다. 프로젝트에 관한 데이터는 맥 밖으로 나가지 않는다. 새 권고가 표시되기까지 최대 하루가 걸릴 수 있고, 온라인 연결이 필요한 brew vulns를 사용해야 하므로 Homebrew 패키지는 검사하지 않는다.

NoVul은 소스 코드, 파일 내용, 파일 경로, 비밀 정보를 전송하지 않는다. 검사 결과는 맥의 ~/Library/Application Support/dev.novul.app/에 있는 SQLite 데이터베이스에 저장한다.

소스 빌드와 라이선스

소스에서 빌드하려면 Rust와 Bun이 필요하다.

text
bun install
scripts/fetch-sidecars.sh
bun run tauri dev

fetch-sidecars.sh는 osv-scanner와 gitleaks의 해당 버전을 내려받고, 각 파일을 sidecars/SHA256SUMS와 비교한다. bun run tauri build는 앱과 DMG 파일을 빌드한다. scripts/release.sh는 앱과 DMG 파일을 빌드하고 서명·공증하며, 실행하려면 Apple Developer ID가 필요하다. 테스트를 실행하려면 src-tauri로 이동해 cargo test --lib를 실행한다.

NoVul의 라이선스는 Apache License 2.0이다. NoVul에는 Apache 2.0 라이선스의 osv-scanner와 MIT 라이선스의 gitleaks가 포함된다. OSV.dev, CISA, FIRST, Have I Been Pwned(CC BY 4.0), endoflife.date의 데이터를 사용한다. 자세한 내용은 NOTICE와 THIRD_PARTY_LICENSES.md에서 확인할 수 있다.