
وكيل كشف خفيف لنظام macOS مبني على بيانات Endpoint Security الخاصة بـ Santa.

مكوّن جانبي خفيف لاكتشاف macOS لـ Santa يقيّم بيانات قياس أمان نقطة النهاية محليًا باستخدام قواعد CEL ويُرسل إشارات الكشف المطابقة فقط إلى خادم خلفي.
تجريبي. صُمم للمختبرات المنزلية والفرق الصغيرة. إصدار مبكر – توقع وجود أخطاء وتغييرات في الواجهة البرمجية.
يقرأ Santamon تدفق قياسات protobuf الخاص بـ Santa، ويقيّم قواعد الكشف باستخدام تعبيرات CEL، ويُرسل الإشارات الأمنية إلى خادم خلفي. تبقى القياسات الأولية على نقطة النهاية—يتم إرسال عمليات الكشف فقط.
القدرات الأساسية:
Santamon هو مكوّن جانبي للكشف خاص بـ Santa، وليس عميل ESF آخر.
يتطلب بناء أداة ESF مخصصة صلاحيات Apple المقيدة وملفات التزويد والتعامل الدقيق مع أحداث أمان نقطة النهاية عالية الحجم. يقوم Santa بذلك بالفعل وقد خضع لاختبارات قاسية في الإنتاج.
قيمة Santamon:
يتولى Santa الجزء الأثقل من استهلاك أحداث أمان نقطة النهاية بشكل موثوق وآمن؛ بينما يركز Santamon على منطق الكشف وجودة الإشارات.
Santa Spool → Watcher → Decoder → Rules Engine → Signal Generator → Shipper → Backend
↓ ↓
┌────────────────────────┐
│ State DB (BoltDB) │
│ • Correlation windows │
│ • Baseline tracking │
│ • Signal queue │
└────────────────────────┘
Process lineage: in-memory cache (1h TTL, 50K max)
تدفق البيانات:
/var/db/santa/spool/new/) بحثًا عن ملفات protobuf جديدةدورة حياة الطابور:
santa.archive_dir (الافتراضي: /var/lib/santamon/spool_hits)سلالة العمليات:
tcc_modification تتطلب macOS 15+)configs/examples/santa-config.mobileconfigيجب تكوين Santa لكتابة أحداث protobuf. استخدم ملف التكوين المقدم:
# Review and customize, then install via System Settings
open configs/examples/santa-config.mobileconfig
# Verify
santactl status | grep "Log Type"
# Should show: Log Type | protobuf
git clone https://github.com/0x4d31/santamon.git
cd santamon
make build
sudo make install
يتم تثبيت ما يلي:
/usr/local/bin/santamon/etc/santamon/config.yaml و rules.yaml/Library/LaunchDaemons/com.santamon.plist/var/lib/santamon/عدّل /etc/santamon/config.yaml:
shipper:
endpoint: "https://your-backend.example.com:8443/ingest"
api_key: "${SANTAMON_API_KEY}"
عيّن مفتاح API في ملف LaunchDaemon plist:
# Generate strong API key
openssl rand -hex 32
# Edit LaunchDaemon
sudo nano /Library/LaunchDaemons/com.santamon.plist
# Add under EnvironmentVariables:
<key>SANTAMON_API_KEY</key>
<string>your-generated-key-here</string>
# Start service
sudo make start
# Monitor logs
make logs
الإعداد الرئيسي: /etc/santamon/config.yaml
agent:
id: "${HOSTNAME}"
shipper:
endpoint: "https://backend.example.com:8443/ingest"
api_key: "${SANTAMON_API_KEY}"
santa:
spool_dir: "/var/db/santa/spool" # Santa spool location
archive_dir: "/var/lib/santamon/spool_hits" # Archive spool files that produced alerts
stability_wait: "2s" # Wait before reading new files
rules:
path: "/etc/santamon/rules.yaml" # File or directory
state:
db_path: "/var/lib/santamon/state.db"
sync_writes: true # Fsync after writes (safer but slower)
first_seen:
max_entries: 10000 # LRU cache for baseline rules
windows:
max_events: 1000 # Max events per correlation window
shipper:
batch_size: 100 # Signals per batch
flush_interval: "30s" # Time between flushes
timeout: "10s" # HTTP request timeout
tls_skip_verify: false # NEVER true in production
راجع configs/santamon.yaml لجميع الخيارات مع تعليقات مفصلة.
القواعد هي تعبيرات CEL تقيّم أحداث Santa. ثلاثة أنواع مدعومة: بسيطة، ارتباطية، وخط أساس.
rules:
- id: SM-014
title: "Non-interactive process invoking curl/wget"
description: |
Non-terminal, non-package-manager process launching curl or wget.
expr: |
kind == "execution" &&
event.execution.target.executable.path in ["/usr/bin/curl", "/usr/bin/wget"] &&
// Exclude interactive shells
!(
event.execution.instigator.executable.path.startsWith("/bin/bash") ||
event.execution.instigator.executable.path.startsWith("/bin/zsh") ||
event.execution.instigator.executable.path.startsWith("/bin/sh")
) &&
// Exclude Homebrew / package-manager helpers that legitimately use curl frequently
!(
event.execution.instigator.executable.path.startsWith("/opt/homebrew/") ||
event.execution.instigator.executable.path.contains("/Homebrew/")
)
severity: high
tags: ["T1105", "command-and-control"]
extra_context: ["event.execution.args"]
include_process_tree: true
enabled: true
correlations:
- id: SM-COR-001
title: "Process touching multiple credential stores"
description: "Single process accessing 3+ credential stores within 5 minutes."
expr: |
kind == "file_access" &&
event.file_access.policy_name in [
"ChromeCookies", "CometCookies", "SSHPrivateKeys",
"BrowserPasswords", "KeychainDB"
]
window: "5m"
group_by: ["event.file_access.instigator.executable.path"]
count_distinct: "event.file_access.policy_name"
threshold: 3
severity: critical
tags: ["T1539", "T1552", "credential-access"]
enabled: true
baselines:
- id: SM-BASE-001
title: "First-time unsigned binary executed from user paths"
description: "First time an unsigned binary executes from /Users paths."
expr: |
kind == "execution" &&
event.execution.decision == DECISION_ALLOW &&
event.execution.target.executable.path.startsWith("/Users/") &&
(
!has(event.execution.target.code_signature) ||
!has(event.execution.target.code_signature.team_id) ||
event.execution.target.code_signature.team_id == ""
)
track: ["event.execution.target.executable.cdhash"]
learning_period: "720h"
severity: high
tags: ["T1204.002", "initial-access"]
enabled: true
تنظيم القواعد: ملف واحد (/etc/santamon/rules.yaml) أو بنية دليل متعدد الملفات.
تحقق قبل النشر:
santamon rules validate
راجع RULES.md للدليل الشامل.
يتطلب Santamon خادمًا خلفيًا لاستقبال الإشارات. يتضمن المشروع خادم FastAPI بسيطًا في backend/.
ما يفعله:
POST /ingest (يتطلب مفتاح API)GET /signals, GET /stats)POST /agents/heartbeat)بدء سريع:
cd backend
pip install fastapi uvicorn
# Set API key
export SANTAMON_API_KEY="your-key-here"
# Run (uses HTTPS if cert.pem exists, otherwise HTTP)
python backend.py

راجع backend/README.md.
# Run agent (foreground, verbose mode)
santamon run --verbose
# Validate rules
santamon rules validate
# Show status
santamon status
# Database operations
santamon db stats # Show statistics
santamon db compact # Compact database
# Version
santamon version