Skip to content

Add CrowdStrike IOC publishing workflow action - #946

Merged
adulau merged 2 commits into
mainfrom
codex/crowdstrike-ioc-publish
Oct 18, 2026
Merged

adulau merged 2 commits into
mainfrom
codex/crowdstrike-ioc-publish

Conversation

@adulau

@adulau adulau commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Add crowdstrike_ioc_publish, a workflow action that creates and renews Falcon custom IOCs directly from supplied MISP events and object attributes. It supports MD5, SHA-256, domains/hostnames, IPv4/IPv6, domain/IP composites, and the hash component of supported file composites.

The action requires explicit Falcon host-group or global scope, publishes only IDS-marked non-deleted attributes, validates and normalizes supported values (including Falcon's 200-character domain limit after IDNA encoding), and deduplicates by type/value while returning all contributing source references. detect is the default action; prevent is restricted to file hashes. Expiration is configurable from 1 to 365 days.

Before writing, it looks up the exact IOC and updates only records whose source namespace and fixed module ownership tag both match. Foreign, parent, ambiguous or incomplete matches fail without overwriting those records. Updates preserve existing Falcon tags. Errors, warnings, missing acknowledgements, rate limits and uncertain outcomes are reported per indicator, with a top-level failure and counts when publication is partial. Writes are not automatically retried and absent MISP data does not cause deletions.

Credentials stay on the module server in CROWDSTRIKE_CLIENT_ID and CROWDSTRIKE_CLIENT_SECRET; the region selects a fixed commercial Falcon endpoint. Includes a dry-run mode, limits of 100 unique indicators and a processing time budget, and a setup guide explaining scope, ownership, workflow return behavior and lifecycle limitations. Workflow filters are explicitly unsupported, and extracted/filter payloads are rejected rather than ignored.

Validation:

  • All 99 publisher tests pass, including creation, owned updates, conflict protection, normalization, composites, object attributes, dry runs, scope, expiry, failure reporting and time limits.
  • The real FalconPy client is exercised through mocked HTTP transport for both POST creation and PATCH updates; discovery and execution are also tested through the real misp-modules HTTP handlers.
  • Black, isort, flake8 and git diff --check pass; generated module documentation matches metadata.

No live Falcon tenant was contacted or modified. crowdstrike-falconpy is already an optional dependency, so no dependency change is needed. Existing strict file and domain-ip object templates work without extensions; no misp-objects PR is required.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-18T17:48:13.760791Z 8424a58 PR opened
🔒 Security Review ✅ Completed 2026-10-18T17:50:38.518949Z 8424a58 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8424a584bf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

address = ipaddress.ip_address(value)
return f"ipv{address.version}", str(address)
domain = value.rstrip(".").encode("idna").decode("ascii").lower()
if len(domain) > 253 or any(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject domains above Falcon's 200-character limit

For a syntactically valid DNS name between 201 and 253 characters, this validation accepts the value and proceeds to the Falcon lookup/create call, although CrowdStrike documents custom domain IOCs as having a maximum length of 200 characters in the IOC API reference. The provider rejection then marks the invocation as failed—and can leave other indicators partially published—instead of classifying the attribute as malformed before network access; use Falcon's 200-character limit here.

Useful? React with 👍 / 👎.

@adulau
adulau merged commit e21f878 into main Oct 18, 2026
13 of 14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant