<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cowrie Releases</title><description>New features, fixes and breaking changes in every Cowrie release</description><link>https://cowrie.org</link><language>en-us</language><item><title>Cowrie 3.0.15</title><link>https://cowrie.org/changelog#v3-0-15</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-15</guid><description>Cowrie 3.0.15</description><pubDate>Mon, 21 Sep 2026 03:13:19 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Fix Earley shell-parser blow-up (#40597): unambiguous grammar, real pipelines and redirections (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40611&quot;&gt;#40611&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;accept an empty password in userdb.txt (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40521&quot;&gt;#40521&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;parse /etc/passwd by line in finger (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40525&quot;&gt;#40525&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;prevent AlreadyQuit on clean shutdown for sqlite, mysql, postgresql plugins (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40592&quot;&gt;#40592&lt;/a&gt; by @I-am-Krish)&lt;/li&gt;&lt;li&gt;report a malformed cut field list instead of crashing (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40529&quot;&gt;#40529&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;use explicit collection_id for VirusTotal collections (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40580&quot;&gt;#40580&lt;/a&gt; by @jarihu)&lt;/li&gt;&lt;li&gt;annotate the finger test&amp;#39;s passwd helper so mypy passes (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40613&quot;&gt;#40613&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;store directory modes, not decimal or file modes, for created directories (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40612&quot;&gt;#40612&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;raise ENOENT from fs.rmdir when the directory does not exist (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40614&quot;&gt;#40614&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;make fs.islink look at the entry instead of its target (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40615&quot;&gt;#40615&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report an empty cp/mv destination instead of indexing it (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40534&quot;&gt;#40534&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;drop the unused backend_pool ping helper (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40616&quot;&gt;#40616&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;name the commit in the package version instead of a stale release number (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40618&quot;&gt;#40618&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;add setuptools-scm to the dev extra (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40620&quot;&gt;#40620&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;name the commit in the package version instead of a stale release number (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40622&quot;&gt;#40622&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 5 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.14</title><link>https://cowrie.org/changelog#v3-0-14</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-14</guid><description>Cowrie 3.0.14</description><pubDate>Mon, 14 Sep 2026 03:15:33 GMT</pubDate><content:encoded>&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;keep exec command usable when it is not valid UTF-8 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40520&quot;&gt;#40520&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;register cowrie.urlhaus.submitted event id (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40584&quot;&gt;#40584&lt;/a&gt; by @jarihu)&lt;/li&gt;&lt;li&gt;rmdir and touch process all arguments (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40596&quot;&gt;#40596&lt;/a&gt; by @nkbeast)&lt;/li&gt;&lt;li&gt;space-separate ps COMMAND arguments (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40549&quot;&gt;#40549&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;write the shell prompt as UTF-8 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40544&quot;&gt;#40544&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;escape attacker text in telegram messages (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40543&quot;&gt;#40543&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;decode the line buffer leniently for tab completion (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40537&quot;&gt;#40537&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle unknown curl content length (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40445&quot;&gt;#40445&lt;/a&gt; by @cyphercodes)&lt;/li&gt;&lt;li&gt;guard tab-completion against a missing client window size (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40434&quot;&gt;#40434&lt;/a&gt; by @Sanjays2402)&lt;/li&gt;&lt;li&gt;publish and reset the prometheus source-IP windows (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40542&quot;&gt;#40542&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;tolerate more malformed LLM prompt templates (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40552&quot;&gt;#40552&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;accept grep -m max-count (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40594&quot;&gt;#40594&lt;/a&gt; by @AzazelSensei)&lt;/li&gt;&lt;li&gt;guard printf against a malformed escape (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40535&quot;&gt;#40535&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/nkbeast&quot;&gt;@nkbeast&lt;/a&gt;, &lt;a href=&quot;https://github.com/cyphercodes&quot;&gt;@cyphercodes&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sanjays2402&quot;&gt;@Sanjays2402&lt;/a&gt;, &lt;a href=&quot;https://github.com/AzazelSensei&quot;&gt;@AzazelSensei&lt;/a&gt;. Thank you.&lt;/p&gt;&lt;p&gt;Plus 9 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.13</title><link>https://cowrie.org/changelog#v3-0-13</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-13</guid><description>Cowrie 3.0.13</description><pubDate>Mon, 24 Aug 2026 01:06:31 GMT</pubDate><content:encoded>&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;add URLhaus output plugin (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40568&quot;&gt;#40568&lt;/a&gt; by @jarihu)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;release integrity, ssh_proxy parity and DNS-rebinding in outbound downloads (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40510&quot;&gt;#40510&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;sqlite output drops file uploads and session input (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40511&quot;&gt;#40511&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;close the upload descriptor before renaming the temp file (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40553&quot;&gt;#40553&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;decode ttylog data leniently when converting to asciinema (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40548&quot;&gt;#40548&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;print real UTC in dig&amp;#39;s WHEN line (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40530&quot;&gt;#40530&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;fall back to the default width on a non-numeric COLUMNS (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40536&quot;&gt;#40536&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;read rethinkdblog event timestamps as UTC (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40538&quot;&gt;#40538&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;log the proxy backend address as a string (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40550&quot;&gt;#40550&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;encode base64 interactive input as UTF-8 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40528&quot;&gt;#40528&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;reassemble proxied SFTP messages by their length prefix (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40557&quot;&gt;#40557&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;keep the ftpget download running through CTRL-C (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40556&quot;&gt;#40556&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;expand an empty $@ / $* to no words (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40554&quot;&gt;#40554&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle a bare trailing CR in telnet proxy auth (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40551&quot;&gt;#40551&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;apply createfs&amp;#39;s -v and -p flags (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40547&quot;&gt;#40547&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;reject a non-numeric uid/gid in fsctl chown/chgrp (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40546&quot;&gt;#40546&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;release misp session tracking when the session closes (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40541&quot;&gt;#40541&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report an invalid grep pattern instead of raising re.error (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40533&quot;&gt;#40533&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;escape CEF extension values (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40527&quot;&gt;#40527&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report whole days and years from durationHuman (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40526&quot;&gt;#40526&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;release dshield session state when the session closes (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40540&quot;&gt;#40540&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;append to the jsonlog logfile instead of truncating it (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40524&quot;&gt;#40524&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;let virustotal submit URLs it has never seen before (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40522&quot;&gt;#40522&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;hold a single sqlite connection in the output pool (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40523&quot;&gt;#40523&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report the real size of an SFTP upload (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40555&quot;&gt;#40555&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;never stop an output plugin that failed to start (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40576&quot;&gt;#40576&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report IPv6 download targets as unreachable (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40582&quot;&gt;#40582&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report a malformed URL port in curl and wget (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40545&quot;&gt;#40545&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;survive an empty -c argument and non-UTF-8 stdin in sh (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40531&quot;&gt;#40531&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;decode bytes IP in ssh_proxy connect_to_backend for clean logging (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40518&quot;&gt;#40518&lt;/a&gt; by @abhi-0203)&lt;/li&gt;&lt;li&gt;catch OSError and process all arguments (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40583&quot;&gt;#40583&lt;/a&gt; by @I-am-Krish)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;satisfy mypy on four test modules (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40578&quot;&gt;#40578&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;pin the auth answer the telnet proxy password test depends on (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40577&quot;&gt;#40577&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;pin the container&amp;#39;s uid (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40579&quot;&gt;#40579&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;keep event ids, emitters, consumers and docs in step (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40575&quot;&gt;#40575&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/jarihu&quot;&gt;@jarihu&lt;/a&gt;, &lt;a href=&quot;https://github.com/abhi-0203&quot;&gt;@abhi-0203&lt;/a&gt;, &lt;a href=&quot;https://github.com/I-am-Krish&quot;&gt;@I-am-Krish&lt;/a&gt;. Thank you.&lt;/p&gt;&lt;p&gt;Plus 11 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.12</title><link>https://cowrie.org/changelog#v3-0-12</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-12</guid><description>Cowrie 3.0.12</description><pubDate>Tue, 04 Aug 2026 05:22:12 GMT</pubDate><content:encoded>&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;cap the size of shell input fed to the parser (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40441&quot;&gt;#40441&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;strip pip, setuptools and wheel from the runtime venv (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40446&quot;&gt;#40446&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 6 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.11</title><link>https://cowrie.org/changelog#v3-0-11</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-11</guid><description>Cowrie 3.0.11</description><pubDate>Mon, 03 Aug 2026 02:32:59 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;fingerprinting with CI (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/2791&quot;&gt;#2791&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;share the honeyfs tree across sessions (copy-on-write) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40387&quot;&gt;#40387&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Wait for async commands (wget/curl) in command substitution (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40425&quot;&gt;#40425&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Give each shell its own working directory (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40428&quot;&gt;#40428&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Output plugin cleanups: remove crashreporter, fix slack client reuse and timestamp option (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40426&quot;&gt;#40426&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Give each shell its own user identity (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40429&quot;&gt;#40429&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Feed a pipeline stage that finishes asynchronously (wget URL | sh) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40431&quot;&gt;#40431&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Keep a command&amp;#39;s stdio wiring on the command (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40430&quot;&gt;#40430&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;read stdin in grep when no files are given (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40371&quot;&gt;#40371&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;support the HAProxy PROXY protocol (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40372&quot;&gt;#40372&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;add a nix flake (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40433&quot;&gt;#40433&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;run long pipelines flat instead of recursing per stage (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40373&quot;&gt;#40373&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle GreyNoise request failures instead of erroring (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40374&quot;&gt;#40374&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle failed HTTP requests in output plugins (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40375&quot;&gt;#40375&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;flush buffered frontend packets in proxy mode (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40376&quot;&gt;#40376&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;survive terminalProtocol teardown mid-dataReceived (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40268&quot;&gt;#40268&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;ignore CHANNEL_WINDOW_ADJUST for already-closed channels (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40378&quot;&gt;#40378&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;treat a bare = as a command name, not an assignment (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40379&quot;&gt;#40379&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;abort downloads that exceed download_limit_size (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40380&quot;&gt;#40380&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;treat an empty symlink target as a broken link (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40398&quot;&gt;#40398&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;re-authenticate returning attackers in AuthRandom (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40400&quot;&gt;#40400&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;use posixpath for emulated-filesystem paths (Windows support) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40403&quot;&gt;#40403&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;make the outbound rate limiter case-insensitive per host (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40406&quot;&gt;#40406&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;apply rate limit, size limit and outbound bind to ftpget (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40407&quot;&gt;#40407&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;move wget/curl/nc rate-limit options to [shell] and document them (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40408&quot;&gt;#40408&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;harden DB output plugins against error-handler crashes and NULL-string rows (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40409&quot;&gt;#40409&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;harden scp upload parsing against crashes and file floods (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40410&quot;&gt;#40410&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;don&amp;#39;t crash on attacker-controlled bytes that aren&amp;#39;t valid UTF-8 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40412&quot;&gt;#40412&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;harden telnet subsystem against malformed client input (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40411&quot;&gt;#40411&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;harden the LLM backend against attacker input and runaway API use (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40413&quot;&gt;#40413&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;refuse an out-of-sequence keyboard-interactive INFO_RESPONSE (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40414&quot;&gt;#40414&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;cache reversedns results instead of spent Deferreds (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40417&quot;&gt;#40417&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;reconcile event id consumers with the ids Cowrie emits (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40420&quot;&gt;#40420&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;ignore CHANNEL_REQUEST for an unknown or closed channel (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40419&quot;&gt;#40419&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;tftp IPv6 crash, missing rate limiter, unenforced size limit, and resolution TOCTOU (#40394) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40422&quot;&gt;#40422&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;name temp backing files with a prefix and uuid (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40421&quot;&gt;#40421&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;nc no longer blocks the reactor with stdlib sockets (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40424&quot;&gt;#40424&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;declare ILogObserver on the log observer factory (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40427&quot;&gt;#40427&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;pin all GitHub Actions to full commit SHAs (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40363&quot;&gt;#40363&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;add security policy (SECURITY.md) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40366&quot;&gt;#40366&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;add changelog and issues project URLs (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40367&quot;&gt;#40367&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;reproducible build metadata and runtime hardening (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40364&quot;&gt;#40364&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;add pip-audit dependency vulnerability scanning (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40365&quot;&gt;#40365&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;dispatch docker and pypi publish workflows from weekly release (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40377&quot;&gt;#40377&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;make pyright usable, then fix everything it finds (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40392&quot;&gt;#40392&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;plain-language overhaul of the documentation tree (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40418&quot;&gt;#40418&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;prune vacuous, tautological, and duplicate tests (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40432&quot;&gt;#40432&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 10 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.10</title><link>https://cowrie.org/changelog#v3-0-10</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-10</guid><description>Cowrie 3.0.10</description><pubDate>Mon, 27 Jul 2026 12:29:30 GMT</pubDate><content:encoded>&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;kafka output based on aiokafka (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40355&quot;&gt;#40355&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;kafka output based on aiokafka (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40326&quot;&gt;#40326&lt;/a&gt; by @rwakulszowa)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;accept bare-CR line endings at the telnet login prompt (PuTTY) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40344&quot;&gt;#40344&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;stop logging a traceback for malformed telnet IAC traffic (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40345&quot;&gt;#40345&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/rwakulszowa&quot;&gt;@rwakulszowa&lt;/a&gt;. Thank you.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.9</title><link>https://cowrie.org/changelog#v3-0-9</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-9</guid><description>Cowrie 3.0.9</description><pubDate>Wed, 22 Jul 2026 16:49:05 GMT</pubDate><content:encoded>&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;prevent session hang from IPv4-embedded IPv6 download URLs (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40336&quot;&gt;#40336&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle TCP connect timeout in curl and wget downloads (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40337&quot;&gt;#40337&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;derive OptionParsingError from Exception (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40339&quot;&gt;#40339&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;resolve tftp target hostname before UDP I/O (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40340&quot;&gt;#40340&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;drop OpenSSH host-key rotation requests in ssh proxy (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40341&quot;&gt;#40341&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;run a shell reading channel stdin when bash is the exec command (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40342&quot;&gt;#40342&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;bind outbound downloads to out_addr so they don&amp;#39;t leak the server IP (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40343&quot;&gt;#40343&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;bump mypy to 2.3.0 and mypy-zope to 1.0.16 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40338&quot;&gt;#40338&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 3 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.8</title><link>https://cowrie.org/changelog#v3-0-8</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-8</guid><description>Cowrie 3.0.8</description><pubDate>Mon, 20 Jul 2026 15:17:27 GMT</pubDate><content:encoded>&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;block IPv4-mapped and embedded-IPv4 IPv6 addresses in outbound filter (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40329&quot;&gt;#40329&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;block non-globally-routable outbound targets (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40330&quot;&gt;#40330&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title>Cowrie 3.0.7</title><link>https://cowrie.org/changelog#v3-0-7</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-7</guid><description>Cowrie 3.0.7</description><pubDate>Mon, 20 Jul 2026 11:49:54 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;fix broken postgresql output (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40313&quot;&gt;#40313&lt;/a&gt; by @dongdigua)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;support the exec shell builtin (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40308&quot;&gt;#40308&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;guard against None transport in sendPacket (#40324) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40325&quot;&gt;#40325&lt;/a&gt; by @fazalpsinfo-cmyk)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/fazalpsinfo-cmyk&quot;&gt;@fazalpsinfo-cmyk&lt;/a&gt;, &lt;a href=&quot;https://github.com/dongdigua&quot;&gt;@dongdigua&lt;/a&gt;. Thank you.&lt;/p&gt;&lt;p&gt;Plus 9 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.6</title><link>https://cowrie.org/changelog#v3-0-6</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-6</guid><description>Cowrie 3.0.6</description><pubDate>Mon, 13 Jul 2026 12:11:26 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;reduce duplicate-download logging to one congruent message (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40270&quot;&gt;#40270&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Session-scoped event pipeline: attribute events at emission, delete the log-observer path (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40286&quot;&gt;#40286&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;config-driven log levels and per-class twisted.logger diagnostics (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40312&quot;&gt;#40312&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;clean up unhandled wget error logging (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40259&quot;&gt;#40259&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;release file handle before renaming captured logs on Windows (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40260&quot;&gt;#40260&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;reset exec idle timeout on inbound stdin (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40261&quot;&gt;#40261&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;capture exec-channel stdin in cat redirect output (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40262&quot;&gt;#40262&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;report bundled-resource directory reads as FileNotFoundError (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40263&quot;&gt;#40263&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle empty path in resolve_path and file tests (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40266&quot;&gt;#40266&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;avoid ZeroDivisionError in wget speed calculation (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40267&quot;&gt;#40267&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;drop and log malformed SSH packets instead of crashing (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40264&quot;&gt;#40264&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;annotate treq header dicts to match the expected type (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40272&quot;&gt;#40272&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;run async commands in scripts sequentially without cmdstack corruption (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40273&quot;&gt;#40273&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;keep the session alive when exit runs inside a command substitution (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40276&quot;&gt;#40276&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;make late tftp download callbacks safe after session close (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40280&quot;&gt;#40280&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;parse input queued while a command is running (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40299&quot;&gt;#40299&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;log telnet process end as an exit status, not a Failure repr (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40300&quot;&gt;#40300&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;write each jsonlog event in a single call to survive rotation (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40301&quot;&gt;#40301&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;survive a late second exit() from pending download callbacks (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40274&quot;&gt;#40274&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;queue mid-command input on the innermost shell (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40303&quot;&gt;#40303&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;ignore channel EOF/CLOSE for already-closed SSH channels (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40305&quot;&gt;#40305&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;resolve CNAME chains and AAAA records in communication_allowed (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40307&quot;&gt;#40307&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;upgrade treq to 26.7.0 and drop requests/urllib3 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40271&quot;&gt;#40271&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;register the fake async command without shadowing the ClassVar (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40302&quot;&gt;#40302&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;build bcrypt from git on free-threaded 3.15 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40304&quot;&gt;#40304&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;capture late download events through the session EventLog (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40306&quot;&gt;#40306&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 15 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.5</title><link>https://cowrie.org/changelog#v3-0-5</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-5</guid><description>Cowrie 3.0.5</description><pubDate>Mon, 29 Jun 2026 13:11:11 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Real command exit status: $?, &amp;amp;&amp;amp; / ||, and exec exit-status (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40222&quot;&gt;#40222&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Translate emulated-filesystem errors at the SFTP boundary (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40223&quot;&gt;#40223&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Report &amp;quot;Bad file descriptor&amp;quot; for an out-of-range redirect fd (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40224&quot;&gt;#40224&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Register backing files for command-less output redirections (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40226&quot;&gt;#40226&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Discard data that arrives after the terminal protocol is torn down (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40227&quot;&gt;#40227&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Remove empty download artifacts on early wget/curl exits (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40228&quot;&gt;#40228&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Report &amp;quot;Is a directory&amp;quot; instead of disconnecting on a directory command (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40229&quot;&gt;#40229&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Reject binary files passed to sh/bash instead of parsing their bytes (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40230&quot;&gt;#40230&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Log a failed DNS lookup at info level, not as an &amp;quot;Unhandled Error&amp;quot; (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40231&quot;&gt;#40231&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Comment on and collect VirusTotal uploads by file hash, not analysis id (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40234&quot;&gt;#40234&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Log each telnet option negotiation once per connection (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40232&quot;&gt;#40232&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Added OCSF output (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40233&quot;&gt;#40233&lt;/a&gt; by @JustSamAgain)&lt;/li&gt;&lt;li&gt;Reuse an existing VirusTotal collection instead of re-creating it (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40235&quot;&gt;#40235&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;replace the shlex shell parser with a Lark grammar (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40219&quot;&gt;#40219&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;add su command for switching user identity (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40212&quot;&gt;#40212&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;emulate shell flow control (for/if/while/until/case, functions, test/[) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40243&quot;&gt;#40243&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;disconnect cleanly on duplicate KEXINIT during key exchange (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40206&quot;&gt;#40206&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;check init before stop/force-stop/status (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40236&quot;&gt;#40236&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;handle invalid IAC byte in telnet without crashing (#40218) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40239&quot;&gt;#40239&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;escape non-printable bytes in logged untrusted input (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40240&quot;&gt;#40240&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;correct ConnectingDone typo in wget error handling (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40242&quot;&gt;#40242&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;tftp downloads produce empty hashes and crash the VirusTotal output (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40241&quot;&gt;#40241&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;type telnet transport protocol mock in test (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40245&quot;&gt;#40245&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;publish the docker image only from release tags (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40220&quot;&gt;#40220&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/JustSamAgain&quot;&gt;@JustSamAgain&lt;/a&gt;. Thank you.&lt;/p&gt;&lt;p&gt;Plus 5 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.4</title><link>https://cowrie.org/changelog#v3-0-4</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-4</guid><description>Cowrie 3.0.4</description><pubDate>Mon, 22 Jun 2026 14:44:25 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;recording &amp;quot;last command&amp;quot; for DShield (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40162&quot;&gt;#40162&lt;/a&gt; by @jullrich)&lt;/li&gt;&lt;li&gt;Update requirements-output.txt (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40155&quot;&gt;#40155&lt;/a&gt; by @TrueDru)&lt;/li&gt;&lt;li&gt;Fix/cmdstack leak no input (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40170&quot;&gt;#40170&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Address pyright diagnostics: real bugs and noise reduction (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40190&quot;&gt;#40190&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Report directory and missing path-like commands with shell-accurate errors (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40194&quot;&gt;#40194&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;implement chpasswd command simulation with logging (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40144&quot;&gt;#40144&lt;/a&gt; by @Sanchitha408)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;send bare LF on PTY-less exec channels (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40169&quot;&gt;#40169&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;persist shell variables and separate exported environment (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40171&quot;&gt;#40171&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;count nested subshells in command substitution (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40173&quot;&gt;#40173&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;emit session and TTY-log duration as integer milliseconds (duration_ms) (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40175&quot;&gt;#40175&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;look up MISP malware samples by MD5 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40191&quot;&gt;#40191&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;save scp uploads as file content, not SCP wire framing (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40196&quot;&gt;#40196&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;stop telnet negotiation retries from crashing connection teardown (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40198&quot;&gt;#40198&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;deliver SSH session connectionLost exactly once on teardown (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40200&quot;&gt;#40200&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;skip stdin-log save when exec session sent no input (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40199&quot;&gt;#40199&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;honour output redirection for busybox-dispatched applets (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40202&quot;&gt;#40202&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;ignore NUL bytes in interactive shell instead of logging a warning (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40201&quot;&gt;#40201&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;restore initial NAWS negotiation for telnet connections (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40204&quot;&gt;#40204&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;resolve mypy errors in MISP output plugin and tests (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40203&quot;&gt;#40203&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;remove orphaned temp file on failed wget/curl download (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40205&quot;&gt;#40205&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/TrueDru&quot;&gt;@TrueDru&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sanchitha408&quot;&gt;@Sanchitha408&lt;/a&gt;. Thank you.&lt;/p&gt;&lt;p&gt;Plus 7 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.3</title><link>https://cowrie.org/changelog#v3-0-3</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-3</guid><description>Cowrie 3.0.3</description><pubDate>Mon, 15 Jun 2026 15:18:12 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Add Signal messenger notification output plugin (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40154&quot;&gt;#40154&lt;/a&gt; by @Aryan-Shastri)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/Aryan-Shastri&quot;&gt;@Aryan-Shastri&lt;/a&gt;. Thank you.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.2</title><link>https://cowrie.org/changelog#v3-0-2</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-2</guid><description>Cowrie 3.0.2</description><pubDate>Mon, 08 Jun 2026 13:10:21 GMT</pubDate><content:encoded>&lt;p&gt;No changes recorded in the release notes. &lt;a href=&quot;https://github.com/cowrie/cowrie/releases/tag/v3.0.2&quot;&gt;See the release on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Plus 8 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.1</title><link>https://cowrie.org/changelog#v3-0-1</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-1</guid><description>Cowrie 3.0.1</description><pubDate>Mon, 01 Jun 2026 15:25:43 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Honor txtcmds_path for text commands (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40143&quot;&gt;#40143&lt;/a&gt; by @t3chn0m4g3)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;First contribution from &lt;a href=&quot;https://github.com/t3chn0m4g3&quot;&gt;@t3chn0m4g3&lt;/a&gt;. Thank you.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 3.0.0</title><link>https://cowrie.org/changelog#v3-0-0</link><guid isPermaLink="true">https://cowrie.org/changelog#v3-0-0</guid><description>Cowrie 3.0.0</description><pubDate>Tue, 26 May 2026 09:15:05 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Port dshield to treq, adopt modern submitapi, fix enrichment race (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40119&quot;&gt;#40119&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;pip-installable cowrie state directory model (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40138&quot;&gt;#40138&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;fix mypy on Python 3.15 stubs; drop unused tftpy dependency (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40141&quot;&gt;#40141&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 4 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 2.9.20</title><link>https://cowrie.org/changelog#v2-9-20</link><guid isPermaLink="true">https://cowrie.org/changelog#v2-9-20</guid><description>Cowrie 2.9.20</description><pubDate>Mon, 25 May 2026 12:35:09 GMT</pubDate><content:encoded>&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;embed file contents into bundled fs.pickle (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40137&quot;&gt;#40137&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;read issue.net banner as UTF-8 with replacement (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40136&quot;&gt;#40136&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;delay non-security updates with 7-day cooldown (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40129&quot;&gt;#40129&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 9 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 2.9.19</title><link>https://cowrie.org/changelog#v2-9-19</link><guid isPermaLink="true">https://cowrie.org/changelog#v2-9-19</guid><description>Cowrie 2.9.19</description><pubDate>Mon, 18 May 2026 12:35:32 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Bump default emulated OS fingerprint to Debian 12 / kernel 6.1 (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40090&quot;&gt;#40090&lt;/a&gt; by @Bierchermuesli)&lt;/li&gt;&lt;li&gt;Realign tests for Debian 12 fs.pickle; promote dump tool to cowrie.scripts.dumpfs (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40101&quot;&gt;#40101&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Clean up artifacts that leaked through #40101 squash-merge (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40102&quot;&gt;#40102&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;license: add SPDX headers and REUSE compliance (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/2935&quot;&gt;#2935&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Bump Twisted to 26.4.0 and adopt its stricter typing (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40117&quot;&gt;#40117&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;li&gt;Port malshare and cuckoo output plugins to treq (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40118&quot;&gt;#40118&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;type test_tftp.py and test_ftpget.py properly for mypy (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/40111&quot;&gt;#40111&lt;/a&gt; by @micheloosterhof)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 13 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 2.9.18</title><link>https://cowrie.org/changelog#v2-9-18</link><guid isPermaLink="true">https://cowrie.org/changelog#v2-9-18</guid><description>Cowrie 2.9.18</description><pubDate>Mon, 04 May 2026 11:07:41 GMT</pubDate><content:encoded>&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;LLM Anthropic support + Configurable context prompt (&lt;a href=&quot;https://github.com/cowrie/cowrie/pull/38602&quot;&gt;#38602&lt;/a&gt; by @Bierchermuesli)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plus 6 dependency updates.&lt;/p&gt;</content:encoded></item><item><title>Cowrie 2.9.17</title><link>https://cowrie.org/changelog#v2-9-17</link><guid isPermaLink="true">https://cowrie.org/changelog#v2-9-17</guid><description>Cowrie 2.9.17</description><pubDate>Mon, 13 Apr 2026 10:50:19 GMT</pubDate><content:encoded>&lt;p&gt;No changes recorded in the release notes. &lt;a href=&quot;https://github.com/cowrie/cowrie/releases/tag/v2.9.17&quot;&gt;See the release on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Plus 1 dependency update.&lt;/p&gt;</content:encoded></item></channel></rss>