
ICS 피싱(악성 캘린더 초대장)을 차단하는 오픈소스 도구
이 키트는 악성 캘린더 초대장을 치료하기 위한 것으로, 이러한 공격을 기본적으로 치료하지 않는 이메일 보안 솔루션을 사용하는 팀을 돕기 위해 설계되었습니다.
Sublime을 사용 중이라면 이 키트가 필요하지 않습니다. 치료 기능이 기본적으로 지원되기 때문입니다.
스택별 독립형 스크립트(예: proofpoint-microsoft365.py, mimecast-google-workspace.py)는 각 이메일 보안 제공업체와 캘린더 제공업체의 조합에 대해 제공됩니다.
이메일 보안 제공업체:
캘린더 제공업체:
빠른 시작으로 바로 이동하세요!
원하는 스택이 보이지 않나요? [email protected]으로 지원을 원하는 스택을 알려주시기 바랍니다.
이 스크립트는 이미 ICS 피싱 이메일을 탐지하고 있지만 해당 이메일을 통해 생성된 캘린더 이벤트는 제거하지 않는 이메일 보안 솔루션이 필요합니다.
ICS 피싱을 탐지하는 이메일 보안 솔루션이 없다면, Sublime Core는 무료로 자체 호스팅 가능한 이메일 보안을 제공하며, 내장된 ICS 피싱 탐지 및 자동 캘린더 치료 기능을 포함합니다.
ICS 피싱은 사용자의 받은 편지함과 캘린더에 동시에 악성 페이로드를 전달하는 양방향 공격입니다. 이 공격 벡터는 2025년 1분기부터 4분기까지 약 100배 증가했으며, Sublime의 2026 이메일 위협 연구 보고서에 따르면 4분기 콜백 피싱 공격의 20% 이상이 캘린더 초대를 전달 메커니즘으로 사용했습니다.
중요한 보안 격차: 캘린더 이벤트는 이메일 보안 솔루션이 악성 이메일을 격리하거나 삭제한 후에도 유지됩니다. 이는 보안 이메일 게이트웨이(SEG)와 API 기반 이메일 보안 솔루션 모두에 영향을 미치며, 대부분 2026년 2월 기준으로 악성 캘린더 이벤트를 정리하지 않습니다.
악성 캘린더 이벤트에 대한 Sublime의 기본 치료를 기반으로, 이 Python 스크립트는 이메일 보안 솔루션이 ICS 피싱 이메일을 격리할 때 악성 이벤트를 삭제합니다. 스크립트는:
.ics 캘린더 첨부 파일 및 기타 iCalendar 호환 첨부 파일을 추출합니다.순수 Python으로, Tines, Splunk SOAR, Cortex XSOAR를 포함한 많은 SOAR에서 이 스크립트를 실행할 수 있습니다.
또한 SOAR별 가이드도 준비 중입니다. 도움이 필요하거나 특정 SOAR에 대한 문서가 게시될 때 알림을 받고 싶다면 [email protected]으로 문의해 주세요.
각 독립형 스크립트에는 다음이 필요합니다.
다음 환경에서 이 스크립트를 실행할 수 있습니다.
requirements.txt에 나열된 PyPI 패키지(requests 및 PyJWT) 설치 지원프로덕션 배포의 경우, cron 작업 등을 통해 스크립트를 정기적으로 실행하도록 예약하는 것이 좋습니다.
스크립트는 기본적으로 드라이 런(dry-run) 모드로 실행되어 실수로 이벤트가 삭제되는 것을 방지합니다. 삭제를 활성화하고 악성 초대 및 이벤트 발견에 대응하여 사용자 정의 로직을 구현하는 방법은 구성 옵션을 참조하세요.
export PROOFPOINT_CLIENT_ID="your-client-id"
export PROOFPOINT_CLIENT_SECRET="your-client-secret"
PROOFPOINT_CLIENT_ID: Proofpoint Cloud Threat Response API용 OAuth 2.0 클라이언트 IDPROOFPOINT_CLIENT_SECRET: OAuth 2.0 클라이언트 시크릿export MIMECAST_CLIENT_ID="your-client-id"
export MIMECAST_CLIENT_SECRET="your-client-secret"
export MIMECAST_REGION="global" # 옵션: global, us, uk (기본값: global)
MIMECAST_CLIENT_ID: Mimecast API 2.0용 OAuth 2.0 클라이언트 IDMIMECAST_CLIENT_SECRET: OAuth 2.0 클라이언트 시크릿MIMECAST_REGION: API 지역 엔드포인트 (선택 사항, 기본값: global)필요한 API 권한:
Services | Threat Remediation | ReadGateway | Tracking | ReadArchive | Readexport ABNORMAL_API_KEY="your-api-key"
ABNORMAL_API_KEY: Abnormal Security 플랫폼의 API 키# 옵션 1: 서비스 계정 파일
export GOOGLE_SERVICE_ACCOUNT_FILE="/path/to/service-account.json"
# 옵션 2: 서비스 계정 JSON (인라인)
export GOOGLE_SERVICE_ACCOUNT_JSON='{"type":"service_account",...}'
GOOGLE_SERVICE_ACCOUNT_FILE: 서비스 계정 JSON 키 파일 경로GOOGLE_SERVICE_ACCOUNT_JSON: 인라인 서비스 계정 자격 증명 (JSON 문자열)필요한 설정:
https://www.googleapis.com/auth/calendar.eventsexport MICROSOFT_CLIENT_ID="your-client-id"
export MICROSOFT_CLIENT_SECRET="your-client-secret"
export MICROSOFT_TENANT_ID="your-tenant-id"
MICROSOFT_CLIENT_ID: Azure AD 애플리케이션(클라이언트) IDMICROSOFT_CLIENT_SECRET: Azure AD 애플리케이션 클라이언트 시크릿MICROSOFT_TENANT_ID: Azure AD 디렉터리(테넌트) ID필요한 API 권한: Calendars.ReadWrite (애플리케이션 권한)
export ICS_PHISHING_REMEDIATION_MODE="dry_run" # "dry_run"이 기본값입니다
export MESSAGE_LOOKBACK_MINUTES=10
export PROOFPOINT_CLIENT_ID="your-client-id"
export PROOFPOINT_CLIENT_SECRET="your-secret"
export MICROSOFT_TENANT_ID="your-tenant"
export MICROSOFT_CLIENT_ID="your-client"
export MICROSOFT_CLIENT_SECRET="your-secret"
python3 proofpoint-microsoft365.py
기본적으로 모든 스크립트는 드라이 런 모드로 실행되어 실수로 삭제되는 것을 방지합니다. 이 모드에서 스크립트는:
이를 통해 실제 삭제를 활성화하기 전에 스크립트가 올바르게 작동하는지 확인할 수 있습니다.
캘린더 이벤트를 실제로 삭제하려면 ICS_PHISHING_REMEDIATION_MODE 환경 변수를 설정하세요.
export ICS_PHISHING_REMEDIATION_MODE="delete_events"
유효한 값:
dry_run (기본값) - 삭제 없이 작업 미리보기delete_events - 일치하는 캘린더 이벤트 실제 삭제잘못된 값은 오류를 발생시켜 잘못된 구성을 방지합니다.
모든 스크립트는 구성 가능한 시간 창 내에서 격리된 메시지를 검색합니다.
export MESSAGE_LOOKBACK_MINUTES=10 # 선택 사항, 기본값: 5분
중요: 이 값은 cron 일정 빈도와 일치해야 하며, 약간의 버퍼를 두어 메시지가 누락되지 않도록 해야 합니다. 예를 들어, 5분마다 실행하는 경우 조회 시간 창을 10분으로 설정하세요.
로깅 시스템 또는 모니터링 도구와 같은 추가 통합을 위해, 스크립트에서 사용자 정의 콜백을 구현하여 delete_events_from_remediated_emails 함수에 전달할 수 있습니다.
on_invitation_found_callback(invitation: CalendarInvitation) - 격리된 메시지에서 캘린더 초대장이 발견된 경우 호출됩니다.on_event_found_callback(invitation: CalendarInvitation, event: CalendarEvent) - 일치하는 각 캘린더 이벤트에 대해 호출됩니다.예제:
def log_invitation(invitation):
print(f"Found malicious invitation for {invitation.user_id}, UID: {invitation.ics_uid}")
def log_event(invitation, event):
print(f"Found calendar event {event.id} matching invitation {invitation.ics_uid}")
fetcher = ProofpointCloudFetcher()
deleter = GoogleWorkspaceEventDeleter()
delete_events_from_remediated_emails(
fetcher,
deleter,
mode="delete_events", # 기본 드라이 런 모드 재정의
on_invitation_found_callback=log_invitation,
on_event_found_callback=log_event
)
참고: 콜백의 오류는 기록되지만 이벤트 처리가 중단되지는 않습니다.
모든 스크립트는 common.py에 정의된 공통 패턴을 따릅니다.
class MessageFetcher:
def yield_remediated_emails(self) -> Iterator[Message]:
"""이메일 보안 솔루션에서 격리된 메시지를 가져옵니다."""
class EventDeleter:
def delete_matching_events(
self,
invitation: CalendarInvitation,
mode: Mode,
on_event_found_callback: Optional[Callable[[CalendarInvitation, CalendarEvent], None]]
) -> None:
"""ICS 첨부 파일과 일치하는 캘린더 이벤트를 삭제합니다."""
스택별 구현은 API 인증 및 제공업체별 로직을 처리합니다.