Skip to content

Zeek

v8.2.0 Breaking

This release includes 7 breaking changes for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

bro dfir ndr network-monitoring nsm pcap
+2 more
security zeek

Affected surfaces

breaking_upgrade

ReleasePort's take

Light signal
editorial:auto 13d

In Zeek v8.2.0 the C++ Packet API now treats VLAN members as optional VlanTag structs, and enum types have become nominally typed causing mixed‑enum usage to error.

Why it matters: Update any code that assumes mandatory VLAN fields or mixes enums before deploying; otherwise compilation will fail on v8.2.0.

Summary

AI summary

Minimum ZeroMQ version raised to 4.3.0 and enum types now nominally typed.

Changes in this release

Breaking High

FreeBSD is no longer an officially‑supported platform (best‑effort only).

FreeBSD is no longer an officially‑supported platform (best‑effort only).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Breaking Medium

Packet C++ vlan members changed to optional VlanTag struct.

Packet C++ vlan members changed to optional VlanTag struct.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

Enum types are now nominally typed; mixing different enums errors.

Enum types are now nominally typed; mixing different enums errors.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

BifEnum namespace moved into zeek namespace for consistency.

BifEnum namespace moved into zeek namespace for consistency.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

JSON control character escaping reverted from \uXXXX to \xXX.

JSON control character escaping reverted from \uXXXX to \xXX.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

MetricsAddress default changed from 0.0.0.0 to 127.0.0.1.

MetricsAddress default changed from 0.0.0.0 to 127.0.0.1.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

Btest Traces library now uses .pcap and .pcapng suffixes.

Btest Traces library now uses .pcap and .pcapng suffixes.

Source: llm_adapter@2026-05-21

Confidence: high

Breaking Medium

FreeBSD support removed from official support, best-effort only.

FreeBSD support removed from official support, best-effort only.

Source: llm_adapter@2026-05-21

Confidence: low

Breaking Medium

Minimum ZeroMQ version requirement increased to 4.3.0.

Minimum ZeroMQ version requirement increased to 4.3.0.

Source: llm_adapter@2026-05-21

Confidence: low

Feature High

ZeroMQ cluster communication can now be encrypted using the CURVE mechanism (key generation, automatic config).

ZeroMQ cluster communication can now be encrypted using the CURVE mechanism (key generation, automatic config).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Medium

Windows support significantly improved with btest suite passing.

Windows support significantly improved with btest suite passing.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Added &publish_on_change attribute for efficient table change publishing.

Added &publish_on_change attribute for efficient table change publishing.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

connection_timing_out hook prevents connection timeout via break.

connection_timing_out hook prevents connection timeout via break.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Analyzer ports now configurable via redef directive.

Analyzer ports now configurable via redef directive.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

X.509 parsing supports additional key types including ML-DSA.

X.509 parsing supports additional key types including ML-DSA.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

@load directive now supports loading shared object files.

@load directive now supports loading shared object files.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

DNS log now includes DNS notification messages with opcode 4.

DNS log now includes DNS notification messages with opcode 4.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

&on_change attribute now accepts variable argument functions.

&on_change attribute now accepts variable argument functions.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

bifcl accepts missing return types, creating void functions.

bifcl accepts missing return types, creating void functions.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

Zeek documentation redesigned with new tutorial and reference sections.

Zeek documentation redesigned with new tutorial and reference sections.

Source: llm_adapter@2026-05-21

Confidence: high

Feature Medium

ZeroMQ cluster communication supports CURVE encryption mechanism.

ZeroMQ cluster communication supports CURVE encryption mechanism.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

New IGMP analyzer added with events for IGMP message types.

New IGMP analyzer added with events for IGMP message types.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

ZeroMQ cluster metrics exposed for XPUB/XSUB message throughput.

ZeroMQ cluster metrics exposed for XPUB/XSUB message throughput.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

Added modulo BiF with different behavior from % for negatives.

Added modulo BiF with different behavior from % for negatives.

Source: llm_adapter@2026-05-21

Confidence: low

Feature Medium

ZeroMQ cluster XPUB/XSUB metrics exposed: zeek_cluster_zeromq_proxy_{frontend,backend}_{bytes,messages}_{sent,received}.

ZeroMQ cluster XPUB/XSUB metrics exposed: zeek_cluster_zeromq_proxy_{frontend,backend}_{bytes,messages}_{sent,received}.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Medium

modulo BiF added; behaves differently from % for negative numbers.

modulo BiF added; behaves differently from % for negative numbers.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Feature Medium

New IGMP analyzer imported with events for each IGMP message type (no log).

New IGMP analyzer imported with events for each IGMP message type (no log).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Deprecation High

Broker::create_master(), Broker::create_clone(), and Cluster::create_store() are deprecated; use &publish_on_change or storage framework instead (fatal error with ZeroMQ backend).

Broker::create_master(), Broker::create_clone(), and Cluster::create_store() are deprecated; use &publish_on_change or storage framework instead (fatal error with ZeroMQ backend).

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Deprecation Medium

Broker cluster functions deprecated; use &publish_on_change instead.

Broker cluster functions deprecated; use &publish_on_change instead.

Source: llm_adapter@2026-05-21

Confidence: low

Bugfix Medium

to_subnet() IPv6 parsing aligns with script literal parsing.

to_subnet() IPv6 parsing aligns with script literal parsing.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

VLAN IDs of 0 are now properly handled and not discarded.

VLAN IDs of 0 are now properly handled and not discarded.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

Spicy parsers suppress analyzer violations on gaps without recovery.

Spicy parsers suppress analyzer violations on gaps without recovery.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

detect-protocols script respects violations to prevent false detections.

detect-protocols script respects violations to prevent false detections.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

SMTP analyzer forwards gaps during RFC 822 message analysis.

SMTP analyzer forwards gaps during RFC 822 message analysis.

Source: llm_adapter@2026-05-21

Confidence: high

Bugfix Medium

SSL pre-shared key events now work independently.

SSL pre-shared key events now work independently.

Source: llm_adapter@2026-05-21

Confidence: low

Bugfix Medium

SSL pre‑shared key events (client_hello and server_hello) can be handled independently.

SSL pre‑shared key events (client_hello and server_hello) can be handled independently.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Refactor Low

SSL analyzer variables renamed to SSL::ssl_ports and SSL::dtls_ports for clarity.

SSL analyzer variables renamed to SSL::ssl_ports and SSL::dtls_ports for clarity.

Source: granite4.1:30b@2026-05-23-audit

Confidence: low

Full changelog

We'd like to thank Aaron J. Scantlin (@scantlina), Aashish Sharma (@initconf),
AbdolRashid Forghani (@soorooghadim), Anthony Alayo (@anthonyalayo), Bauti
Peirone (@bautipeirone), @Breppe, @cccs-graeme, @cccs-will, Connor
(@agent-connor), Craig Leres (@leres), @dagecko, Doğukan Çağatay
(@dogukancagatay), Fatema Bannat Wala (@fatemabw), François De Keersmaeker
(@fdekeers), Jan Grashöfer (@J-Gras), Klemens Nanni (@klemensn), Maor Hamami
(@mamaorha), Martin Camara (@martincmr), Michael Peters (@MP-Corelight), Mohan
Dhawan (@Mohan-Dhawan), Octave Charrin (@OctaveCharrin), Peter Cullen
(@pbcullen), @RageAgainstTheOrganic, @siavashta, Steve Smoot (@stevesmoot),
Stefan Götz (@stefangotz), @timo-mue and Zach Robinette (@zrobinette12) for
their contributions to this release.

Breaking Changes

  • The minimum version requirement for ZeroMQ is now 4.3.0. This version has
    been released at the end of 2018 - a good 7 years ago.

  • Enums are now nominally typed. Zeek will produce warnings of the following form
    if you have scripts where enum types are mixed.

    Remove in v9.1. Mixing incompatible enum types color and city will become an error.

    With version 9.1, these warnings will become errors. Previously, all enum types were
    compatible with each other, resulting in quirks and making certain optimizations more
    difficult than they should be.

  • The BifEnum namespace was moved to be part of the zeek namespace for consistency
    with the other namespaces generated by bifcl (BifType, BifConst, etc).

  • The MetricsAddress option in zeekctl.cfg default was changed from 0.0.0.0 to
    127.0.0.1. If you've been using a remote Prometheus server for metrics scraping
    or run Zeek in a container environment, you'll now need to explicitly set MetricsAddress
    to 0.0.0.0 (or the appropriate listen address) in zeekctl.cfg.

  • The packet captures in the btest Traces library have standardized on .pcap and .pcapng
    file suffixes. This may cause breakage in plugins that were using the old .trace suffix.

  • The public vlan and inner_vlan members within C++ Packet has changed from
    uint32_t to an optional VlanTag struct. The corresponding dei and pcp
    members have been removed and merged into the VlanTag struct. This does not change
    scripts. In order to access the ID as before, check the optional first:

    if ( packet.vlan )
    my_vlan = packet.vlan->id;

    This allows Zeek to properly handle VLAN IDs of 0, which before were handled as if
    there was no VLAN.

  • Reverted the change that went into Zeek 8.1 where ASCII control characters < 32
    were encoded as \u00XX in JSON strings to the prior \xXX style. The escaping style
    will become configurable to allow for reliably representing the contained bytes
    in strings with Zeek 9.0.

    See the discussion at https://github.com/zeek/zeek/discussions/5240 for more background
    and feel free to chime in with feedback.

  • FreeBSD is no longer an officially-supported platform. We will make our best efforts to
    provide fixes to reported issues, like any other platform, but will not longer do
    regular builds on our CI provider.

New Functionality

  • Added a new attribute &publish_on_change for global tables and sets as an
    alternative to the Broker-specific and deprecated &backend and &broker_store
    synchronization attributes. The &publish_on_change attribute allows efficient
    publishing of selected table changes as remote events to a configurable cluster topic.
    Other cluster nodes by default apply received changes to their local table instances.

    Publish any new entry as Cluster::table_change_infos() event to /zeek/table/endpoints

    global endpoints: set[addr, addr] &write_expire=5min &publish_on_change=[
    changes=set(TABLE_ELEMENT_NEW),
    ];

    See the online documentation for a detailed description and further examples:

    https://docs.zeek.org/en/master/reference/zeekscript/attributes.html#attr-&publish_on_change

  • Well-known ports of built-in analyzers can now be configured via redef. For example:

    redef HTTP::ports += { 8181/tcp };

    For protocol analyzers, the variable name is generally Analyzer_Module::ports,
    but in certain cases (SSL, QUIC, RDP, ...) the variable name includes the protocol
    name to distinguish different internal analyzers. SSL::ssl_ports and SSL::dtls_ports
    as a concrete example. Check the analyzer module's export section or online documentation.
    For packet analyzers, the analyzer name is included in the variable name for historical
    reasons. Example:

    redef PacketAnalyzer::VXLAN::vxlan_ports += { 4711/udp };

  • The dns.log now also contains information about DNS notifications (RFC 1996).
    The opcode is set to 4 and opcode_code name will be "notify".

  • ZeroMQ cluster communication can now be encrypted using the CURVE mechanism built
    into ZeroMQ. This requires a pair of keys, one for the server role and one for
    the client role. The central XPUB/XSUB sockets and LOG pull sockets are configured
    as CURVE servers, all other sockets (the connecting Zeek nodes) as CURVE clients.

    You can generate Z85-encoded keypair as follows with Zeek:

    $ zeek -e 'print to_json(Cluster::Backend::ZeroMQ::generate_keypair())' | jq
    {
    "public": "}}6zuTySXq(C(6dF#D3Kvt@A5D}LcFlOgVav5{%)",
    "secret": "h.<[iyv]O#cWdO%2yuLiEJQ}6tC)@HxN6Hp?![td"
    }

    When using ZeekControl, keys are automatically generated and configured when a multi-node
    cluster based on node IP addresses is detected. To force encryption to be always on, set
    the following ZeroMQ specific setting in zeekctl.cfg (default is "auto"):

    cluster_backend_zeromq.use_curve_encryption = 1

    More details and background is available in the
    policy/frameworks/cluster/backend/zeromq/main.zeek script documentation.

  • The number of messages and bytes processed by the central ZeroMQ XPUB/XSUB
    cluster component is now exposed as metrics of the form:

    zeek_cluster_zeromq_proxy_{frontend,backend}{bytes,messages}{sent,received}

    by the process running this component in a cluster. Note that Zeek uses multipart
    messages for events: Publishing a single event currently counts as four messages
    as we're simply exposing ZeroMQ's low-level zmq::proxy_steerable() statistics.

  • The @load directive now supports loading shared object files. This can
    be leveraged to experiment with alternative package and plugin directory layouts
    where a __load__.zeek file in a directory loads the required shared object
    explicitly rather than the current "magic discovery" via ZEEK_PLUGIN_PATH
    and __zeek_plugin__ files.

    Files are expected to end with .so regardless of the platform and need to
    be explicitly loaded with the suffix provided:

    @load ./plugin.so

    Such shared objects should instantiate a single zeek::plugin::Plugin instance at
    load time. The zeek::plugin::Plugin() will register it accordingly.

  • bifcl now accepts missing return types in functions signatures, creating
    void functions rather than complaining. The C++ signature will continue
    to have a ValPtr return type and the implementation should return a Val::nil,
    but the Zeek script function signature will have a void return type.

  • The &on_change attribute for tables or sets now accepts variable argument functions.

  • Added the modulo BiF, which behaves differently from Zeek's % operator
    for negative numbers.

  • Added the connection_timing_out hook which, if break is used within, will
    prevent Zeek from timing out a particular connection. The motivation is to align
    a shunted connection's timeout with Zeek. Since Zeek does not see packets from
    a shunted connection, it needs special handling to keep the connection alive while
    shunted.

  • The Zeek documentation has received a major refresh. A new tutorial walks newcomers
    through setup, basic Zeek invocations, the use of Zeek packages, ZeekControl for cluster
    maintenance, the basics of Zeek's logs, as well as scripting in Zeek's own language as
    well as JavaScript. A new reference section houses the introduction to common logs, the
    Zeek scripting language, Zeek's frameworks, and the scripting index.

  • A new analyzer for IGMP was imported from an external project, originally written by
    François De Keersmaeker (@fdekeers). It adds new events for each of the types of IGMP
    messages, but does not add a new log.

  • Windows support has been greatly improved, thanks to a raft of contributions from an
    engineering team at Microsoft. The btest suite now runs on CI builds. The great majority
    of btests pass, with a small number skipped for various documented reasons.

Changed Functionality

  • Protocol parsers implemented in Spicy now suppress analyzer violations when
    a gap occurs and the parser doesn't implement error recovery. The most user
    visible aspect is that the analyzer's identifier is not removed from the
    service column in the conn.log.

  • The to_subnet() built-in function's parsing of IPv6 subnets was changed
    to align with how IPv6 subnet literals are parsed in Zeek scripts. Previously,
    any subnet containing the ::ffff:0:0/96 IPv4-mapped prefix would produce
    an IPv4 subnet, even if provided prefix was shorter than the required 96 bits.

    Internally, the behavior of the IPPrefix::ConvertString() API was changed
    to accommodate for this.

  • The policy/frameworks/analyzer/detect-protocols script now respects analyzer
    violations to suppress Server_Found or Protocol_Found for connections which
    first had an analyzer confirmation, but later a analyzer violation happened. Previously,
    Zeek would report a HTTP server when a client issued a HTTP request to an SSH servers,
    or SSL when a client sent a TLS Client Hello to a HTTP server.

  • The events ssl_extension_pre_shared_key_server_hello and ssl_extension_pre_shared_key_client_hello
    can now be used independently. Previously, both had to have a handler implemented for
    either of them to actually be invoked due to some logic confusion in the analyzer.

  • Zeek new properly handles VLAN IDs of 0. Before, these were simply discarded.

  • X.509 parsing now supports additional key types that were not handled previously. The
    certificate key length field will now be filled for additional ciphers, if supported by
    your OpenSSL version (like ML-DSA). Similarly, the key_type field will be filled out for
    additional ciphers, if supported by OpenSSL.

  • The SMTP analyzer now forwards the first gap encountered during RFC 822 message analysis
    to the file object. This allows to determine if message analysis stopped due to a gap by
    inspecting the missing_bytes field during file_state_remove(), or in files.log.

    The SMTP analyzer tears down the active file upon encountering a gap, so the reported
    missing bytes will the gap length only.

Deprecated Functionality

  • The Broker::create_master(), Broker::create_clone() and Cluster::create_store()
    builtin functions have been deprecated. Consider using the new &publish_on_change
    attribute on tables for distributing table entries, explicit Cluster::publish() calls
    with remote events, or using the storage framework for persistence.

    When ZeroMQ is selected as cluster backend, calling any of the above functions
    results in a fatal error as these are all Broker specific.

Breaking Changes

  • Minimum ZeroMQ version requirement increased to 4.3.0.
  • Enums are now nominally typed; mixing incompatible enum types will become an error in v9.1.
  • BifEnum namespace moved into zeek namespace for consistency with other generated namespaces.
  • MetricsAddress default in zeekctl.cfg changed from 0.0.0.0 to 127.0.0.1, requiring explicit override for remote scraping.
  • btest Traces library packet captures now use .pcap/.pcapng suffixes; plugins using old .trace suffix may break.
  • Packet::vlan and Packet::inner_vlan changed from uint32_t to optional VlanTag struct; dei and pcp members removed.
  • FreeBSD is no longer an officially-supported platform.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Zeek

Get notified when new releases ship.

Sign up free

About Zeek

Zeek is a powerful network analysis framework that is much different from the typical IDS you may know.

All releases →

Related context

Beta — feedback welcome: [email protected]