VoidAccess
VoidAccess는 한 질문으로 보안 피드를 병렬 검색해 지표를 돌려준다
MacSentry는 Swift로 만든 오픈소스 macOS 모니터이다
An open-source macOS monitor in Swift: a root daemon, an Endpoint Security helper and a menu bar app that report remote access, persistence and tampering to Telegram before anyone can clean up.
보안Swift · ShellGitHub @vuminhhoa온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Security alerts for your Mac, delivered to Telegram: remote access, persistence, tampering and posture changes, watched by a root daemon and Endpoint Security.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Security alerts for your Mac, delivered to Telegram.
English · Tiếng Việt
MacSentry watches a Mac for remote access, persistence, tampering and security posture changes, and sends each finding to Telegram as it happens, so the record leaves the machine before anyone can clean it up. It is built for people who look after their own Mac, or a few machines, and want to know when something changes without running a full EDR stack.
[!NOTE] The app is available in English and Vietnamese (it follows the system language, or pick one in Settings). Telegram alerts from the daemon are still in Vietnamese; help translating them is welcome (see Contributing).
sudoers, PAM, authorized_keys, shell rc files, with diffs of
what changed and secrets masked.curl | sh and
disabling SIP, Gatekeeper or the firewall./etc/macsentry.agents.kill -9 is reported, the log is append-only, and an optional heartbeat lets an outside service tell you
when the Mac goes quiet.See docs/detections.md for the full list.
| Events | Connection history |
|---|---|
| Trusted IPs | Settings |
Screenshots use sample data and documentation IP ranges.
flowchart LR
ES["macsentry-es<br/>(root, Endpoint Security<br/>via eslogger)"] -- spool --> D
D["macsentryd<br/>(root LaunchDaemon)"] --> LOG[("/var/log/macsentry.log<br/>append-only")]
D -- shared scan --> APP["MacSentry.app<br/>(menu bar, per user)"]
APP -. watches .-> D
D --> TG(["Telegram bot"])
APP --> TG
D -. heartbeat .-> HC(["Healthchecks-style<br/>monitor (optional)"])
| Component | Runs as | Role |
|---|---|---|
MacSentry.app | user (LaunchAgent, restarted if killed) | Remote access popups, screen lock/unlock, camera and microphone, sleep; history, trusted IPs, event viewer and settings. |
macsentryd | root (LaunchDaemon, from boot) | Most detections, the append-only log, Telegram delivery, the daily report and the heartbeat. |
macsentry-es | root (LaunchDaemon, needs Full Disk Access) | Reads Endpoint Security events through /usr/bin/eslogger and hands them to the daemon. It never holds the Telegram token. |
More detail is in docs/architecture.md.
MacSentry is built from source.
git clone https://github.com/vuminhhoa/macsentry.git
cd MacSentry
./build.sh # builds and installs ~/Applications/MacSentry.app, then starts it
daemon/install.sh --auto): macOS asks for an
administrator password once, no Terminal needed. If you cancel, click Install Now under
Monitoring Components./usr/local/libexec/macsentry-es and /usr/local/libexec/macsentryd:
System Settings → Privacy & Security → Full Disk Access → + → press ⌘⇧G
and paste the path. The daemon reminds you on Telegram until this is done.For a separate daemon bot (recommended, see Security model), a heartbeat URL, or to turn off
process execution monitoring, run sudo ./daemon/install.sh --reconfigure.
[!TIP] If you have an Apple Development certificate in your keychain,
build.shsigns with it, so macOS keeps Local Network and Full Disk Access permissions across rebuilds. Otherwise the binaries are signed ad hoc and the permissions must be granted again after each rebuild.
The app checks GitHub for a new release once a day and notifies you. Settings → Updates → Update Now runs
git pull and ./build.sh in the source folder, reinstalls the daemon (one password prompt), replaces the app and
restarts it. Your settings and /etc/macsentry.* are kept. To do it by hand:
git pull
./build.sh && sudo ./daemon/install.sh
./uninstall.sh # removes the daemon (asks for sudo) and the app; keeps your data and the log
./uninstall.sh --purge # also removes history, trusted IPs and the Telegram settings
The log at /var/log/macsentry.log is append-only by design. Remove it with
sudo chflags nosappnd /var/log/macsentry.log && sudo rm /var/log/macsentry.log.
| File | Purpose |
|---|---|
/etc/macsentry.conf | Daemon settings (root only): TOKEN, CHAT, HEARTBEAT_URL, ES_EXEC, FIM |
/etc/macsentry.trusted | Hosts a shell may connect to without a reverse shell alert |
/etc/macsentry.agents | Extra agents to watch, on top of the built-in catalog |
/etc/macsentry.allow | Regex allowlist for command alerts from the Endpoint Security helper |
~/Library/Application Support/MacSentry/ | App settings, connection history and trusted IPs (mode 0700) |
Every option is described in docs/configuration.md.
MacSentry is a tripwire, not a shield. It tells you quickly and from outside the machine that something changed; it does not block anything.
MacSentry has no server of its own and sends no analytics. Alerts go only to the Telegram chat you configure.
Alert text can include host names, user names, IP addresses, command lines and (masked) file diffs, so treat
the chat as sensitive. To describe remote peers, the daemon runs whois and reverse DNS for their IPs, which
sends those IPs to the relevant registries and resolvers. The heartbeat, if set, is a plain request to the URL
you choose.
Measured on a busy development Mac (IDE, builds, many processes):
| Component | CPU (one core) | Notes |
|---|---|---|
macsentryd | ~0.4-0.8% | Event driven; the earlier shell version used ~4.5% |
macsentry-es + eslogger | ~2% | Mostly exec events; set ES_EXEC=0 to turn them off |
MacSentry.app | ~0.2% | Reuses the daemon's scan; camera and microphone through listeners |
Both root jobs run with ProcessType=Background and LowPriorityIO, so macOS throttles them in favour of
your work. Alerts may arrive a few seconds late while the machine is busy.
./build.sh --no-install # build into build/ without touching the installed app
ARCHS="arm64 x86_64" ./build.sh --no-install # universal build, as CI does
Run the daemon without root and without sending anything:
DRYRUN=1 CONF=./test.conf LOG=./test.log STATE=./state PUB_DIR=./pub build/macsentryd
Replay recorded Endpoint Security events through the helper:
STATE=./state build/macsentry-es --replay < events.jsonl
Inspect what the daemon's readers see, without sending anything: sudo /usr/local/libexec/macsentryd --check.
The source layout and how to add a new check are described in docs/architecture.md.
Write-ups on how MacSentry is built and why, on vuminhhoa.com:
Bug reports, false positive reports, new detections and translations are welcome. Please read CONTRIBUTING.md first, and report vulnerabilities privately as described in SECURITY.md. This project follows the Contributor Covenant.
MIT © 2026 Vũ Minh Hoà