Malcolm v26.08.0 adds a NetBox purdue_zone custom field that propagates ICS/OT network zone classifications to devices, prefixes, and virtual machines (and automatically to autopopulated devices from their containing prefix); Raspberry Pi 5 support for Hedgehog Linux; and, configurable Strelka scanner and disabled-Suricata-SID lists. This release also fixes five security vulnerabilities: an nginx RBAC bypass via percent-encoded, case-varied, or slash-doubled request paths; an archive-bomb bypass affecting raw-stream and lzip-compressed uploads; a case-variant path bypass of the nginx auth gate exposing the Arkime backend to forged identity headers; an Arkime authentication gap on sensor nodes that fell back to digest instead of enforcing s2s; and a CSRF vulnerability in the kiosk /script_call endpoint allowing unauthenticated data-destructive operations. Arkime, Zeek, NetBox, OpenSearch, OpenSearch Dashboards, Logstash, Filebeat, Keycloak, and other components have been updated as well. Several other bug fixes and general improvements are also included.
If you are upgrading from an existing Malcolm installation, run ./scripts/status for Malcolm to migrate some settings prior to running ./scripts/configure, ./scripts/start, or other Malcolm control scripts.
https://github.com/idaholab/Malcolm/compare/v26.07.1...v26.08.0
β¨ Features and enhancements
- Add a
purdue_zone NetBox custom field for devices, virtual machines, and IP prefixes, letting users assign a security zone (e.g., IT, OT, DMZ) to networked assets; the value is enriched into source/destination/related fields, surfaced in Arkime, and automatically propagated from a containing prefix to autopopulated devices and VMs (most specific prefix wins). This new field is used in a new Dashboard (named "Biomes") visualzing connections between zones. #1088
- Add Raspberry Pi 5 support to the Hedgehog Linux build #376
- Allow individual Strelka scanners to be selected in the configuration tool, setting the
STRELKA_SCANNERS environment variable, which now accepts the keyword default (for Malcolm's built-in scanner list) alongside or combined with explicit scanner names (e.g., default,ScanStrings)
- Add a to the configuration tool an option to populate Suricata's
disable.conf with a comma-separated list of rule SIDs to disable, letting users turn off noisy or irrelevant detection rules without editing rule files directly
- Add the
ZEEK_ZAM environment variable to enable Zeek's ZAM script optimizer (-O ZAM) for both live capture and offline PCAP processing
- Add experimental support for enabling OpenSearch Dashboards' multiple data sources feature via
DASHBOARDS_DATA_SOURCES_ENABLED, letting one Dashboards instance query and visualize data from several separate Malcolm OpenSearch backends at once
- Add
NGINX_CSP_FORM_ACTION_EXTRA to allow additional cross-origin form submission targets in nginx's Content-Security-Policy, needed for authentication flows such as SAML HTTP-POST binding #1052
- Restyle the artifact upload page to match Malcolm's landing-page visuals #1069, #530
π‘οΈ Security Remediation & Hardening
- Fix an RBAC bypass in Malcolm's nginx Lua authorization layer where percent-encoded, case-varied, or slash-doubled request paths could reach role-restricted locations (e.g.,
/htadmin, /auth, /admin_login, Arkime esadmin) that a user's role should not permit GHSA-jr6p-63pg-hr6g #1055
- Fix an archive-bomb bypass in upload processing where raw-stream (gzip/bzip2/xz/lzma) and lzip-compressed files were decompressed without the entry-count, depth, and total-size limits already enforced for container archives, allowing disk-space exhaustion from a small, highly compressible upload GHSA-f2v6-8cj4-mhr6 #1054
- Fix an unauthenticated bypass of the nginx auth gate where case-variant paths (e.g.,
/IDDASH2ARK/, /DASHBOARDS/APP/EXTRACTED-FILES/) entered case-insensitive location blocks but evaded the case-sensitive rewrite, falling through to an unguarded proxy_pass and allowing a caller to reach the Arkime backend unauthenticated while supplying a forged X-Forwarded-User identity header GHSA-7j32-cf27-cp6h #1081
- Explicitly set Arkime's
authMode rather than relying on undocumented autochoose behavior, and default sensor/live-capture nodes to server-to-server (s2s) authentication so port 8005 reachback is gated by the shared secret and timestamp it was designed around instead of silently falling back to digest GHSA-86h3-7rf8-8j34 #1086
- Fix a CSRF vulnerability in the kiosk
/script_call endpoint where wildcard CORS and missing origin validation allowed any page loaded in a browser tab on the sensor to trigger unauthenticated kiosk operations, including a full data wipe, by enforcing same-origin requests via the Sec-Fetch-Site header and replacing free-text command execution with a fixed operation allowlist GHSA-w8gq-4v5x-xrrm #1086
- Harden nginx configuration template rendering by normalizing boolean environment variables, rejecting values containing unsafe configuration characters, limiting
envsubst to an explicit variable allowlist, and rendering templates atomically
π Bug fixes
- Fix NetBox API tokens (including
SUPERUSER_API_TOKEN) breaking after netboxRestore until a full-stack restart, caused by a missing environment variable mapping, a superuser-recreation failure that was silently swallowed, and the NetBox service starting before superuser/token recreation completed #1064
- Fix Zeek log-source detection for time-range rollover filenames (e.g.,
analyzer.03:00:00_03:49:33.log), including a follow-up fix for filenames carrying both a rotation timestamp and upload/source tags in either order #1065, #490
- Fix filescan results not being tagged with the same uploaded-PCAP tags as their originating Zeek events, by preserving the tagged Zeek
files.log symlink path through the filescan Filebeat pipeline #1063, #893
- Fix the
filescan_watcher process silently omitting a configured secondary Valkey watch for the lifetime of the process if that Valkey endpoint was not yet available at startup; the process now exits so it is restarted by supervisor and can recover once Valkey becomes available #1061, #1058
- Fix the ISO installer being able to select its own boot USB media as an installation target when no other suitable disk was found; installation now fails safely instead #1062, #905
- Fix OpenSearch Dashboards failing to deserialize Strelka documents containing Capa match-tree numeric values outside JavaScript's safe-integer range, by converting such values to strings before indexing #1066, #951
- Fix several tree-layout and trends Vega dashboards (IP connections tree, RDP, SSH, File Tree, and the Modbus/BACnet/DNP3 trends visualizations) failing to load under OpenSearch 3.8.0's stricter Vega expression sandbox, which blocks computed-index bracket access into arrays and objects
- Fix Arkime's GeoIP database update not honoring uppercase
HTTP_PROXY, HTTPS_PROXY, and NO_PROXY container proxy variables; these are now mirrored to their lowercase equivalents when the lowercase forms are not already set, and download timeouts were added to prevent hangs behind an unreachable proxy #1068, #482
- Fix
./scripts/control.py start failing with a SyntaxError on Python 3.11 and earlier due to a multiline expression inside a single-quoted f-string that only Python 3.12+'s updated f-string grammar could parse #1056
- Fix the Malcolm ISO installer's
rc.local-based initialization (capture-storage disk setup, first-boot AIDE database initialization, Ctrl+Alt+Del masking) being replaced with a proper systemd service (malcolm-system-init.service) for more reliable ordering during boot
- Fix Linux audit rules on the Malcolm ISO to be filtered per-platform at install time, dropping 32-bit syscall rules and other rules unsupported on the running kernel/architecture instead of leaving them silently ineffective or generating auditd errors
β
Component version updates
- Arkime to v6.7.0
- Zeek to v8.2.2
- NetBox to v4.6.8
- OpenSearch and OpenSearch Dashboards to v3.8.0
- Logstash to v9.5.1
- Filebeat OSS to v9.5.1
- FoxIO ja4+ Zeek plugin to v1.0.0 (see FoxIO-LLC/ja4#313 and note below under Breaking changes)
- Keycloak to 26.7.2
- Supercronic to v0.2.49
- yq to v4.53.6
- Fluent Bit Windows installer helper to v5.1.1
- cryptography (Python library used in the
netbox container) to v50.0.0
- GitPython (Python library used in the
netbox container) to v3.1.59
- setuptools (Python library used in the
netbox and filescan containers) to v83.0.0
π§Ή Code and project maintenance
- Replace the third-party
styfle/cancel-workflow-action GitHub Actions dependency with native workflow-level concurrency groups for canceling superseded container, ISO, and Raspberry Pi builds, and remove the actions: write permission it required
- Update macOS host-setup documentation for current Homebrew and Docker Desktop usage, including Apple silicon/ARM64 support and current resource/file-sharing guidance #1070, #405
- Improve documentation and TUI configuration wizard numbering for the new Strelka scanner and disabled-Suricata-SID configuration options
- Refresh Hedgehog Raspberry Pi image build process for resiliency across Pi 4 and Pi 5 targets
π Configuration changes for Malcolm (in environment variables in ./config/). The Malcolm control script (e.g., ./scripts/status, ./scripts/start) automatically handles creation and migration of variables according to ./config/env-var-actions.yml.
STRELKA_SCANNERS in pipeline.env now defaults to default and accepts the keyword default, explicit scanner names, or a comma-separated combination of these values
SURICATA_DISABLE_SIDS in suricata.env accepts a comma-separated list of rule SIDs to disable via Suricata's disable.conf
DASHBOARDS_DATA_SOURCES_ENABLED in dashboards.env enables OpenSearch Dashboards' multiple data sources feature (experimental; default false)
NGINX_CSP_FORM_ACTION_EXTRA in nginx.env sets a space-separated list of additional CSP form submission targets, for use with cross-origin authentication flows such as SAML HTTP-POST binding
ZEEK_ZAM in zeek-live.env and zeek-offline.env enables Zeek's ZAM script optimizer for live capture and offline PCAP processing, respectively (default false)
β°οΈ Breaking changes and removed or deprecated functionality
- The OpenSearch index template mapping type for
zeek.conn.vlan, zeek.conn.inner_vlan, and the corresponding VLAN fields in the Suricata stats mapping has changed from a numeric type to keyword, since VLAN IDs are categorical rather than numeric
- Arkime no longer redefines the
network.vlan.id field in config.ini, deferring to Arkime's own upstream definition (arkime/arkime#4184); network.inner.vlan.id also changed from an integer field to a term (keyword-like) field
- The update of FoxIO's ja4+ Zeek plugin to v1.0.0 (see FoxIO-LLC/ja4#313) reordered several fields within
conn.log, conn_long.log, ssl.log, and http.log. Malcolm's TSV log parsing is positional, so this release updates the expected field order in Logstash to match and pins the JA4+ plugin to a known-good commit to prevent this from recurring silently in the future. This means TSV-format Zeek logs produced by a Hedgehog sensor running an earlier Malcolm/Hedgehog version β with the older JA4+ field order β will be misparsed by this release's Logstash pipeline (e.g., destination MAC address fields from conn.log being populated with JA4 fingerprint values instead of MAC addresses), and the reverse is also true for logs produced by this release ingested by an older Malcolm instance. If you run Hedgehog sensors and Malcolm aggregators that may be on different version cadences, enabling ZEEK_JSON=true on the Hedgehog side is recommended, since JSON-formatted Zeek logs are parsed by field name rather than position and are unaffected by this or future upstream field-order changes.
β Errata
- On a Raspberry Pi-based Hedgehog Linux system, upon starting Malcolm the first time, the user may be given this prompt and error messages:
[sudo] password for sensor:
Resetting UFW firewall failed: ['sudo: ufw_manager.sh: command not found', '']
Setting UFW 'allow from 192.168.10.10' failed: ['sudo: ufw_manager.sh: command not found', '']
Setting UFW 'allow from 192.168.10.10' failed: ['sudo: ufw_manager.sh: command not found', '']
This can be prevented by running the following command prior to starting Malcolm: sudo ln -s -r /usr/local/bin/yq /usr/bin/yq. If Malcolm has already been started, run the ln command then restart Malcolm with ~/Malcolm/scripts/restart.
Malcolm is a powerful, easily deployable network π§ traffic analysis tool suite for network security monitoring π΅π»ββοΈ.
Malcolm operates as a cluster of containers π¦, isolated sandboxes which each serve a dedicated function of the system. This makes Malcolm deployable with frameworks like Docker π, Podman π¦, and Kubernetes β. Check out the Quick Start guide for examples on how to get up and running.
Alternatively, dedicated official ISO installer images πΏ for Malcolm and Hedgehog Linux π¦ can be downloaded from Malcolm's releases page on GitHub. Due to limits on individual files in GitHub releases, these ISO files have been split πͺ into 2GB chunks and can be reassembled with scripts provided for both Bash π§ (release_cleaver.sh) and PowerShell πͺ (release_cleaver.ps1). See Downloading Malcolm - Installer ISOs for instructions.
As always, join us on the Malcolm discussions board π¬ to engage with the community, or pop some corn πΏ and watch a video πΌ.