Python package for finding and parsing indicators of compromise from text.
Last release 2 months ago
17 Jun 2026
Ships unpredictably
gaps range from 9 days to 3.2 years
Some releases are documented
notes for 28 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
71 releases · first in 2018
Release timeline
71 releases since 2018One column per quarter.
Releases
- 9.4.117 Jun 2026
Release notes
Open source →Fixed
- Fixed quadratic-time (ReDoS) behavior in the email-address candidate prefilter. The old
(?:local+)@domaincandidate regex restarted and re-walked the local part at every offset, so a long run of local-part characters (e.g. a base64/hex blob) causedfind_iocsto hang — two 100 KB blobs took ~16 minutes each. The prefilter now anchors on@and expands outward in linear time (_email_candidate_spans), with the domain tail matched by an anchored.match(); the pyparsing email grammar remains the precise validator and detection results are unchanged (#389).
Changed
- Bumped the
ioc-fangerdependency floor to5.1.1(range>=5.1.1,<5.2).
- Fixed quadratic-time (ReDoS) behavior in the email-address candidate prefilter. The old
- 9.4.015 Jun 2026
Additional notes
Open source →Added
- Added a
parse_unicode_iocsoption tofind_iocs(and a--parse_unicode_iocsCLI flag), defaultFalse(#298). When enabled, domain labels may contain non-ASCII (Unicode) characters — e.g.warrıors.com(note the dotlessı) is now parsed, as is the domain part of email, URL, and XMPP IOCs. The TLD itself stays ASCII (IANA stores internationalized TLDs in theirxn--punycode form), as do email/URL/XMPP local parts and URL paths. The ASCII and Unicode grammar variants are generated from a single builder (ioc_grammars._build_domain_layer) so they can't drift.
- Added a
- 9.3.05 Jun 2026
Additional notes
Open source →Changed
- Sped up domain name parsing by bypassing pyparsing for the standalone domain parser: candidate spans from the cheap regex are now validated against a TLD set directly, picking the rightmost TLD that leaves ≥1 preceding label. The
domain_namegrammar is still used as a sub-grammar inside email/url/xmpp parsers, where its inner label loop has been collapsed into a singleRegex(replacing theOneOrMore(label + "." + FollowedBy(...))construction). - The
scheme_less_urlandscheme_less_url_completegrammars no longer also match URLs with a scheme; they only match URLs without one (#244).parse_urlsandparse_urls_completenow run the scheme-ful grammar first and mask each matched URL before running the scheme-less grammar, so user-facing output offind_iocsis unchanged but embedded scheme-less hosts inside a scheme-ful URL's query (e.g.https://shortener.com/?url=foo.com/bar) no longer surface as a second URL.
Fixed
urls_completenow accepts@in URL paths, matching the RFC 3986pchardefinition (e.g.https://example.com/users/@aliceis now captured in full).parse_user_agentsno longer absorbs a trailing token likeTLPfrom input such asMozilla/4.0 (...) TLP:RED. A bare (version-less) platform token must not be immediately followed by:. Versioned platforms (e.g.Chrome/91.0) are unaffected. (#227)
Added
- New
socket_addressesIOC type with a matchingparse_socket_addresseshelper (#248). Acceptsipv4:portand bracketed[ipv6]:portshapes with a1..65535port range. IPv6 host validation reuses the existing_is_valid_ipv6helper so the same shortened forms accepted byparse_ipv6_addressesare accepted here too. Observed text is preserved verbatim (no leading-zero normalization). Port0is intentionally excluded as IANA-reserved. - New
ipv6_cidrsIOC type with a matchingparse_ipv6_cidrshelper (#121). It accepts the same shortened/::/trailing-::forms as the existing IPv6 address parser plus a/0..128bit range, and integrates with the existing CIDR-vs-URL andparse_address_from_cidrhandling. CIDR parsing runs against the pre-fang text so the standard fanger (which rewrites::/to://) cannot silently swallow indicators like2001:db8::/32. - Added structured logging throughout the library using the standard
loggingmodule (#287). The package follows the standard library convention of attaching aNullHandlerso consumers see no output unless they configure logging.find_iocsemitsINFOat start/finish (text length, IOC type count),WARNINGwhen unsupported types are passed viaincluded_ioc_types(they are now ignored rather than silently treated as misses), andDEBUGfor per-type result counts and lower-level transforms (text fanging, URL cleaning). Apps can opt in with e.g.logging.getLogger("ioc_finder").setLevel(logging.DEBUG).
- Sped up domain name parsing by bypassing pyparsing for the standalone domain parser: candidate spans from the cheap regex are now validated against a TLD set directly, picking the rightmost TLD that leaves ≥1 preceding label. The
- 9.2.01 May 2026
Additional notes
Open source →Added
- Added regex prefiltering to all observable types (both default and non-default)
Changed (Internal)
- Switched fully over to UV.
- Changed Dependabot to the
uvecosystem sopyproject.tomlanduv.lockare updated atomically. - Removed the generated
requirements.txt/requirements_dev.txtcompatibility exports and themake export-requirementstarget. Contributors should useuv sync --locked --group devto set up a dev environment.
- Changed Dependabot to the
- 9.1.129 Apr 2026
Additional notes
Open source →Fixed
parse_imphashes_andparse_authentihashes_no longer return the same hash multiple times when the input labels it with different separators (e.g.imphash: <h>,imphash <h>,imphash - <h>). The deduplication now runs on the extracted hash itself rather than the full keyword+separator+hash match string. (#213)
- 9.1.029 Apr 2026
Additional notes
Open source →Added
- Added regex pre-filter for all default indicator types to speed parsing of defaults.
Fixed
- IPv6 parser now accepts
::(the unspecified address) and trailing-::forms (e.g.1::), which were previously rejected by the grammar.
- 9.0.029 Apr 2026
Additional notes
Open source →Changed
- Extended the regex pre-filter approach (introduced for the domain and ATT&CK parsers) to the remaining hot-path parsers.
parse_complete_email_addresses,parse_email_addresses,parse_ipv6_addresses,parse_imphashes_,parse_authentihashes_,parse_urls,parse_urls_complete,parse_mac_addresses,parse_user_agents, andparse_file_pathsnow use cheap candidate regexes to narrow where the pyparsing grammar runs, dropping benchmark mean from ~7.1s to ~2.4s on the long benchmark article. Theparse_domain_namesand ATT&CK helpers were folded onto the same shared_scan_candidateshelper (no behavior change). - Added
scripts/find_hotspots.pyto reproduce per-grammar timings and a cProfile drill-down for future tuning. - Breaking:
DEFAULT_IOC_TYPEShas been reduced from 30 entries to 9 common indicator types (domains,urls,ipv4s,ipv6s,email_addresses,md5s,sha1s,sha256s,cves) to speed up parsing in the typical case. Callers that relied on default-parsing of obscure types (e.g.bitcoin_addresses,attack_techniques,imphashes,urls_complete, etc.) must now passincluded_ioc_types=SUPPORTED_IOC_TYPES(or an explicit subset) to get them. The CLI parses the common defaults by default; pass--allto parse every supported type. (#340)
Added
- New
SUPPORTED_IOC_TYPESconstant exposing the full list of parseable IOC types. BothDEFAULT_IOC_TYPESandSUPPORTED_IOC_TYPESare now exported from theioc_finderpackage. (#340) - New
--allCLI flag to parse every supported indicator type instead of the common defaults. (#340)
Removed
- Breaking: Removed the deprecated
parse_imphashesandparse_authentihasheskeyword arguments fromfind_iocs(), along with the--no_import_hashesand--no_authentihashesCLI flags. To disable parsing of these hash types, omit"imphashes"/"authentihashes"fromincluded_ioc_typesinstead. (#333)
- Extended the regex pre-filter approach (introduced for the domain and ATT&CK parsers) to the remaining hot-path parsers.
- 8.1.029 Apr 2026
Additional notes
Open source →Changed
- The domain parser has been sped up with a regex pre-filter to identify possible candidate domains before using the grammar (#335)
- The enterprise/mobile/pre-attack mitigation, tactic, and technique parsers now use a regex pre-filter to identify candidate ATT&CK-ID spans before running the grammar, significantly improving performance on large inputs (#238)
- 8.0.229 Apr 2026
Release notes
Open source →Deprecated
- The
parse_imphashesandparse_authentihasheskeyword arguments tofind_iocs(), and the corresponding--no_import_hashes/--no_authentihashesCLI flags, are now deprecated in favor of omitting"imphashes"/"authentihashes"fromincluded_ioc_types. Passing these arguments emits aDeprecationWarning(CLI flags print a notice to stderr). They will be removed in a future release. (#225)
Documentation
- Documented known limitation where bitcoin address grammar may match file hashes (MD5s starting with
1/3, and MD5/SHA1/SHA256 hashes starting withbc1) (#226)
- The
- 8.0.116 Mar 2026
Release notes
Open source →Changed
- Migrated from pip/setuptools to uv for dependency management and packaging
- Switched build backend from setuptools to hatchling
- Replaced flake8, black, isort, and pylint with ruff for linting and formatting
- Switched PyPI publishing to trusted publishing (OIDC) — no more username/password secrets
- Updated Dockerfile base image from
python:3.10.2-bustertopython:3.14-slim-bookworm - Updated CI, Docker, Makefile, and docs to use uv throughout
- Relaxed benchmark regression threshold from 10% to 15% to reduce flaky CI failures
Removed
setup.py,setup.cfg, andmypy.ini(configuration consolidated intopyproject.toml)
- 7.3.022 Dec 2022
Release notes
Open source →Changed
- To speed URL parsing, we no longer parse URLs with
userinfo "@"in the authority (see URL syntax guide for more details)- Our reasoning is that userinfo is rarely present
- If you have concerns about this change or would like to see it added back in (it could be optionally enabled), please raise an issue
- To speed URL parsing, we no longer parse URLs with
- 7.2.425 Aug 2022
Release notes
Open source →Fixed
- URL boundary to better respect the conventions of human language regarding quotation marks and parentheses (#130)
- 7.2.314 Jul 2022
Release notes
Open source →Fixed
- Update required version of ioc-fanger which fixes issues with non-http(s) URL schemes (#255)
- 7.2.28 Jul 2022
- 7.2.15 Jul 2022
- 7.2.020 Jun 2022
Release notes
Open source →Changed
- Possible breaking change: Update required pyparsing version to v3
- Although there are no public API changes associated with this version, this may be a breaking change if you are using ioc-finder and have pyparsing pinned to a version less than v3
- I've chosen to release this as a new minor version b/c I think requirement version updates w/ no API changes and no system requirement changes constitute a minor version change
- Updated parsing of Google Analytics Tracker IDs so that matches must be all lower-cased or all upper-cased (e.g.
ua-...andUA-...will be matched, butuA-...will not) (this makes the parsing consistent with how Google Adsense Publisher IDs are parsed)
- Possible breaking change: Update required pyparsing version to v3
- 7.1.013 Jun 2022
Release notes
Open source → - 7.0.027 May 2022
- 6.0.19 Jun 2021
Release notes
Open source →Fixed
- ASN grammar improved to reduce false positives by not matching on lower-case
"as "(#136)
- ASN grammar improved to reduce false positives by not matching on lower-case
- 6.0.020 May 2021
Release notes
Open source →Changed
- Made all boolean arguments keyword-only arguments (#108)
- Converting data from lists to tuples (#110)
- Made
_prepare_textfunction public (prepare_text) (#114) - Renamed
no_urls_without_schemestoparse_urls_without_scheme(#109) - Moved from MIT License to GNU Lesser General Public License v3.0 (#113)
Fixed
- Unquoting URLs appropriately (#104)
- Pinned specific ioc-fanger version (this prevents an error where ioc-fanger was removing a URL in the query parameter of another URL - see #104)
- 5.0.39 Apr 2021
Release notes
Open source →Fixed
- Unquoting URLs appropriately (#104)
- Pinned specific ioc-fanger version (this prevents an error where ioc-fanger was removing a URL in the query parameter of another URL - see #104)
- 5.0.22 Apr 2021
- 5.0.111 Jan 2021
Release notes
Open source →Changed
- Improved word boundary (specifically of MAC address and IP address grammars)
- 5.0.025 Sept 2020
- 4.0.323 Sept 2020
Nothing published for this version
- 4.0.218 Sept 2020
Release notes
Open source →Added
- Added parsing Monero addresses (see #94)
Changed
- Simplifying
_remove_url_paths(a function used behind the scenes by the ioc finder - see #70) - Created a function to update top level domains (see #10)
- Updating top level domains (which are used in grammars to find network observables)
- 4.0.111 Sept 2020
Release notes
Open source →Changed
- You can now ingest text using the cli. For example, this now works:
cat foo.text | ioc-finder. - We now have 100% code coverage!!!
- Adding more keywords so this package is easier to find in pypi
- You can now ingest text using the cli. For example, this now works:
- 4.0.09 Sept 2020
Release notes
Open source →Changed
- We are now parsing observables from URL paths by default (see https://github.com/fhightower/ioc-finder/issues/87). If you would like to disable this functionality, you may do so by setting the
parse_from_url_pathkeyword argument toFalsewhen calling thefind_iocsfunction (e.g.parse_from_url_path=False).
- We are now parsing observables from URL paths by default (see https://github.com/fhightower/ioc-finder/issues/87). If you would like to disable this functionality, you may do so by setting the
- 3.1.227 Aug 2020
- 3.1.13 Aug 2020
Nothing published for this version
- 3.1.026 Jun 2020
Nothing published for this version
- 3.0.013 Jun 2020
Nothing published for this version
- 2.1.126 Feb 2020
Nothing published for this version
- 2.1.011 Feb 2020
Nothing published for this version
- 2.0.139 Jan 2020
Nothing published for this version
- 2.0.122 Jan 2020
Nothing published for this version
- 2.0.94 Dec 2019
Nothing published for this version
- 2.0.822 Nov 2019
Nothing published for this version
- 2.0.730 Oct 2019
Nothing published for this version
- 2.0.69 Oct 2019
Nothing published for this version
- 2.0.418 Sept 2019
Nothing published for this version
- 2.0.311 Sept 2019
Nothing published for this version
- 2.0.211 Sept 2019
Nothing published for this version
- 2.0.14 Sept 2019
Nothing published for this version
- 2.0.04 Jul 2019
Nothing published for this version
- 1.2.187 Jun 2019
Nothing published for this version
- 1.2.1624 Apr 2019
Nothing published for this version
- 1.2.1518 Apr 2019
Nothing published for this version
- 1.2.1412 Apr 2019
Nothing published for this version
- 1.2.1312 Apr 2019
Nothing published for this version
- 1.2.108 Apr 2019
Nothing published for this version
- 1.2.85 Apr 2019
Nothing published for this version
- 1.2.723 Mar 2019
Nothing published for this version
- 1.2.613 Mar 2019
Nothing published for this version
- 1.2.514 Feb 2019
Nothing published for this version
- 1.2.48 Feb 2019
Nothing published for this version
- 1.2.26 Feb 2019
Nothing published for this version
- 1.2.123 Jan 2019
Nothing published for this version
- 1.2.023 Jan 2019
Nothing published for this version
- 1.1.019 Jan 2019
Nothing published for this version