<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hartwork Blog</title><link>https://blog.hartwork.org/</link><description>Free Software, Music, Chinese Chess</description><atom:link href="https://blog.hartwork.org/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:sebastian@pipping.org"&gt;Sebastian Pipping&lt;/a&gt; </copyright><lastBuildDate>Fri, 22 May 2026 15:02:01 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Expat 2.8.1 released, CVE-2026-45186 and CVSS unreliability</title><link>https://blog.hartwork.org/posts/expat-2-8-1-released/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://libexpat.github.io/"&gt;libexpat&lt;/a&gt; is a fast streaming XML parser.
Alongside libxml2, Expat is one of the
&lt;a href="https://libexpat.github.io/doc/users/"&gt;most widely used&lt;/a&gt;
software libre XML parsers written in C, specifically C99.
It is cross-platform and licensed under
&lt;a href="https://opensource.org/licenses/MIT"&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/libexpat/libexpat/releases/tag/R_2_8_1"&gt;Expat 2.8.1&lt;/a&gt;
was released
yesterday.
The key motivation for cutting a release and doing so now
was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixing vulnerability
  &lt;a href="https://github.com/libexpat/libexpat/pull/1216"&gt;CVE-2026-45186&lt;/a&gt;
  that allows
  &lt;a href="https://en.wikipedia.org/wiki/Denial-of-service_attack"&gt;easy denial of service&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The vulnerability was reported to me responsibly about eight months ago
by &lt;a href="https://github.com/nwellnhof"&gt;Nick Wellnhofer&lt;/a&gt;,
the long-time and past maintainer of
&lt;a href="https://gitlab.gnome.org/GNOME/libxml2"&gt;libxml2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The attack relies on Expat &amp;lt;2.8.1 using an
&lt;a href="https://en.wikipedia.org/wiki/Big_O_notation"&gt;&lt;code&gt;O(n²)&lt;/code&gt; runtime&lt;/a&gt; algorithm
— a &lt;code&gt;for&lt;/code&gt; loop — to check for collisions among attribute names.
It takes nothing more than dialing up XML document…&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE d [&lt;/span&gt;
&lt;span class="cp"&gt;  &amp;lt;!ATTLIST e a0 CDATA "" a1 CDATA "" a2 CDATA ""&amp;gt;&lt;/span&gt;
]&amp;gt;
&lt;span class="nt"&gt;&amp;lt;d/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;…from 3 attributes to a number big enough for the specific target of the attack.&lt;/p&gt;
&lt;p&gt;It should be noted that a layer of
&lt;a href="https://en.wikipedia.org/wiki/Data_compression"&gt;compression&lt;/a&gt;
around XML can significantly reduce the minimum attack
&lt;a href="https://en.wikipedia.org/wiki/Payload_(computing)"&gt;payload&lt;/a&gt; size.&lt;/p&gt;
&lt;p&gt;There is an &lt;a href="https://github.com/libexpat/libexpat/pull/1216"&gt;attack payload generator&lt;/a&gt;
available for download: &lt;strong&gt;please use it responsibly!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/berkayurun"&gt;Berkay Eren Ürün&lt;/a&gt; and I teamed up
for a fix. It uses a &lt;a href="https://en.wikipedia.org/wiki/Hash_table"&gt;hash table&lt;/a&gt;
instead of a linear loop to detect collisions,
which turns overall runtime from &lt;code&gt;O(n*n)&lt;/code&gt; into &lt;code&gt;O(n)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For some numbers (from older ThinkPad X220 hardware):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: right;"&gt;Count&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Runtime unfixed&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Runtime fixed&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Payload size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt; &lt;/td&gt;
&lt;td style="text-align: right;"&gt;(seconds)&lt;/td&gt;
&lt;td style="text-align: right;"&gt;(seconds)&lt;/td&gt;
&lt;td style="text-align: right;"&gt;(uncompressed, bytes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;10,000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.17&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.03&lt;/td&gt;
&lt;td style="text-align: right;"&gt;135,615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;100,000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;13.22&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.24&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1,395,615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;200,000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;59.71&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.49&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2,795,615&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right;"&gt;400,000&lt;/td&gt;
&lt;td style="text-align: right;"&gt;253.18&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1.04&lt;/td&gt;
&lt;td style="text-align: right;"&gt;5,708,119&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;And a quick graph:&lt;/p&gt;
&lt;center&gt;
&lt;img alt="" src="https://blog.hartwork.org/__images/cve-2026-45186_runtime.png"&gt;
&lt;/center&gt;

&lt;p&gt;It is worth noting that after I filed a CVE request with Mitre,
someone turned my classification as &lt;code&gt;remote&lt;/code&gt; (i.e. parsing from the wire)
to mistaken &lt;code&gt;local&lt;/code&gt; (i.e. local account access needed) and also to
"Attack complexity: High" when it is a simple as shown above
and with an attack payload generator being public.
That results is an unrealistically low current
&lt;a href="https://en.wikipedia.org/wiki/Common_Vulnerability_Scoring_System"&gt;CVSS&lt;/a&gt;
score "2.9 of 10" &lt;a href="https://github.com/advisories/GHSA-r396-2q2c-pjhr"&gt;on GitHub&lt;/a&gt;…&lt;/p&gt;
&lt;center&gt;
&lt;img alt="" src="https://blog.hartwork.org/__images/cve-2026-45186_cvss.png"&gt;
&lt;/center&gt;

&lt;p&gt;…and also &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-45186"&gt;in NVD&lt;/a&gt;.
A more realastic score than
&lt;a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L&amp;amp;version=3.1"&gt;2.9&lt;/a&gt; would be
&lt;a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L&amp;amp;version=3.1"&gt;5.3&lt;/a&gt; to
&lt;a href="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H&amp;amp;version=3.1"&gt;7.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have requested a fix from Mitre in the meantime, but that's not fixing the core issue.
This could serve as both a concrete example and a reminder that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CVSS scores are unreliable&lt;/strong&gt;:
  they are often over- or (worse) underestimating risk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://daniel.haxx.se/blog/2025/01/23/cvss-is-dead-to-us/"&gt;CVSS scores (and CVE reports) are edited&lt;/a&gt;
  by individuals that may or may not
  know better than the reporting individuals and/or the maintainers upstream.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CVSS score is not a metric to base decisions about vulnerabilities on.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to everyone who contributed to this release of Expat!&lt;/p&gt;
&lt;p&gt;For more details about this release, please
&lt;a href="https://github.com/libexpat/libexpat/blob/R_2_8_1/expat/Changes"&gt;check out the change log&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;em&gt;you&lt;/em&gt; maintain Expat packaging,
a bundled copy of Expat, or
a pinned version of Expat,
please update to version 2.8.1. Thank you!&lt;/p&gt;
&lt;p&gt;Sebastian Pipping&lt;/p&gt;</description><category>Expat</category><category>Security</category><category>XML</category><guid>https://blog.hartwork.org/posts/expat-2-8-1-released/</guid><pubDate>Mon, 11 May 2026 17:12:00 GMT</pubDate></item><item><title>Steven, please fix the 1% loss/gain graph!</title><link>https://blog.hartwork.org/posts/steven-please-fix-the-1-loss-gain-graph/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;Back in December 2023, I got curious about Steven Bartlett's then-new book
&lt;a href="https://stevenbartlett.com/the-book.html"&gt;The Diary of a CEO: The 33 laws of business and life&lt;/a&gt;
and ordered a copy for myself.
I dived right in.
On page 184 this graph hit me:&lt;/p&gt;
&lt;center&gt;
&lt;img alt="" src="https://blog.hartwork.org/__images/1_percent_loss_gain_steven_bartlett.jpg"&gt;
&lt;/center&gt;

&lt;p&gt;It is meant to be about how 100 USD develop over time
with either constant 1% loss or 1% gain per day.&lt;/p&gt;
&lt;p&gt;It puzzles and amazes me to this day how this graph — with all the things wrong
about it, even for a schematic graph — made its way into a published book:
It feels unreal. In particular:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The loss curve is "bending the wrong way":
  It is presented as &lt;a href="https://en.wikipedia.org/wiki/Concave_function"&gt;concave&lt;/a&gt;
  when it should be &lt;a href="https://en.wikipedia.org/wiki/Convex_function"&gt;convex&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The placement of 0 (zero) on the Y-axis is &lt;em&gt;wild&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The graph has a log scale but seems to want to still live in the linear world.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is what that graph could have been with matplotlib
(&lt;a href="https://gist.github.com/hartwork/9e7593e25664477efa4c06fd38203f78"&gt;source code Gist in Python&lt;/a&gt;),
either with a linear scale or with a truly logarithmic scale:&lt;/p&gt;
&lt;center&gt;
&lt;img alt="" src="https://blog.hartwork.org/__images/1_percent_loss_gain_sebastian_pipping.png"&gt;
&lt;/center&gt;

&lt;p&gt;For comparision, here is how James Clear,
the author of &lt;a href="https://jamesclear.com/atomic-habits"&gt;the book Atomic Habits&lt;/a&gt;,
turns this into a working schematic graph
for &lt;a href="https://jamesclear.com/continuous-improvement#title_1"&gt;an article of his&lt;/a&gt;:&lt;/p&gt;
&lt;center&gt;
&lt;img alt="" src="https://blog.hartwork.org/__images/1_percent_loss_gain_james_clear.jpg"&gt;
&lt;/center&gt;

&lt;p&gt;Steven, if you read this, please fix the 1% loss/gain graph for
the next edition of the book — thank you!&lt;/p&gt;
&lt;p&gt;-- Sebastian Pipping&lt;/p&gt;</description><category>Learn from me</category><guid>https://blog.hartwork.org/posts/steven-please-fix-the-1-loss-gain-graph/</guid><pubDate>Sun, 03 May 2026 23:37:20 GMT</pubDate></item><item><title>Fwd: Karen Hao interview at DOAC</title><link>https://blog.hartwork.org/posts/fwd-karen-hao-interview-at-doac/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;Original title: &lt;a href="https://www.youtube.com/watch?v=Cn8HBj8QAbk"&gt;"AI Whistleblower: We Are Being Gaslit By AI Companies, They’re Hiding The Truth! - Karen Hao"&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://karendhao.com/"&gt;Karen Hao's book "Empire of AI"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karendhao.com/home"&gt;Karen Hao's website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Cn8HBj8QAbk?si=qt3FIq7XWMHJWWeH" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;</description><category>AI</category><category>Interviews</category><guid>https://blog.hartwork.org/posts/fwd-karen-hao-interview-at-doac/</guid><pubDate>Wed, 29 Apr 2026 16:11:48 GMT</pubDate></item><item><title>Expat 2.8.0 released, includes security fixes</title><link>https://blog.hartwork.org/posts/expat-2-8-0-released/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://libexpat.github.io/"&gt;libexpat&lt;/a&gt; is a fast streaming XML parser.
Alongside libxml2, Expat is one of the
&lt;a href="https://libexpat.github.io/doc/users/"&gt;most widely used&lt;/a&gt;
software libre XML parsers written in C, specifically C99.
It is cross-platform and licensed under
&lt;a href="https://opensource.org/licenses/MIT"&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/libexpat/libexpat/releases/tag/R_2_8_0"&gt;Expat 2.8.0&lt;/a&gt;
was released
two days ago.
The key motivation for cutting a release and doing so now
was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Addressing security issue &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-41080"&gt;CVE-2026-41080&lt;/a&gt;
  — insufficient entropy (&lt;a href="https://cwe.mitre.org/data/definitions/331.html"&gt;CWE-331&lt;/a&gt;) —,
  and also&lt;/li&gt;
&lt;li&gt;Getting support for entropy extractor
  &lt;a href="https://pubs.opengroup.org/onlinepubs/9799919799/functions/getentropy.html"&gt;&lt;code&gt;getentropy(3)&lt;/code&gt;&lt;/a&gt;
  as well as bugfixes in the hands of users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, a summary "entropy and bugfixes" would be on point for the theme of this release.&lt;/p&gt;
&lt;p&gt;What is entropy, and what does Expat need it for?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Entropy_(information_theory)"&gt;Entropy&lt;/a&gt;
(in computing) is the amount of information that an attacker &lt;em&gt;does not know&lt;/em&gt;.
If your banking card pin has four decimal digits,
from 0000 to 9999, that's 10,000 possible combinations;
that's roughly 14 bits or less than two bytes
of entropy — &lt;code&gt;import math; math.ceil(math.log2(10_000) / 8)&lt;/code&gt; in Python —
that the attacker is missing.&lt;/p&gt;
&lt;p&gt;Expat needs high-quality entropy for a &lt;a href="https://en.wikipedia.org/wiki/Salt_(cryptography)"&gt;salt&lt;/a&gt;
with its internal &lt;a href="https://en.wikipedia.org/wiki/Hash_table"&gt;hash tables&lt;/a&gt;.
Without an unknown-to-the-attacker hash salt, a hash table can be attacked
using &lt;a href="https://en.wikipedia.org/wiki/Collision_attack#Hash_flooding"&gt;hash flooding&lt;/a&gt;,
allowing &lt;a href="https://en.wikipedia.org/wiki/Denial-of-service_attack"&gt;denial of service&lt;/a&gt;
attacks through crafted XML documents.&lt;/p&gt;
&lt;p&gt;Now Expat 2.8.0 uses more entropy than past releases
— 16 bytes rather than previously 4 to 8 bytes (depending on architecture) —,
starts supporting entropy provider &lt;a href="https://pubs.opengroup.org/onlinepubs/9799919799/functions/getentropy.html"&gt;&lt;code&gt;getentropy(3)&lt;/code&gt;&lt;/a&gt;
in the many systems that offer it
(including WASI, that lacks all other previously supported providers like
&lt;a href="https://man7.org/linux/man-pages/man2/getrandom.2.html"&gt;&lt;code&gt;getrandom&lt;/code&gt;&lt;/a&gt; or 
&lt;a href="https://man.freebsd.org/cgi/man.cgi?query=arc4random"&gt;&lt;code&gt;arc4random&lt;/code&gt;&lt;/a&gt;),
and also offers a new API function
&lt;a href="https://libexpat.github.io/doc/api/latest/#XML_SetHashSalt16Bytes"&gt;&lt;code&gt;XML_SetHashSalt16Bytes&lt;/code&gt;&lt;/a&gt;
that overcomes the limitations of its predecessor
&lt;a href="https://libexpat.github.io/doc/api/latest/#XML_SetHashSalt"&gt;&lt;code&gt;XML_SetHashSalt&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For implementing the new cross-platform
&lt;a href="https://pubs.opengroup.org/onlinepubs/9799919799/functions/getentropy.html"&gt;&lt;code&gt;getentropy(3)&lt;/code&gt;&lt;/a&gt;
support, I teamed up with &lt;a href="https://github.com/korli"&gt;Jérôme Duval&lt;/a&gt;.
The bug fixes were contributed by &lt;a href="https://github.com/Smattr"&gt;Matthew Fernandez&lt;/a&gt;:
the maintainer of &lt;a href="https://www.graphviz.org/"&gt;Graphviz&lt;/a&gt;.
Thanks to everyone who contributed to this release of Expat!&lt;/p&gt;
&lt;p&gt;For more details about this release, please
&lt;a href="https://github.com/libexpat/libexpat/blob/R_2_8_0/expat/Changes"&gt;check out the change log&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;em&gt;you&lt;/em&gt; maintain Expat packaging,
a bundled copy of Expat, or
a pinned version of Expat,
please update to version 2.8.0. Thank you!&lt;/p&gt;
&lt;p&gt;Sebastian Pipping&lt;/p&gt;</description><category>Expat</category><category>Security</category><category>XML</category><guid>https://blog.hartwork.org/posts/expat-2-8-0-released/</guid><pubDate>Sun, 26 Apr 2026 14:53:00 GMT</pubDate></item><item><title>Expat 2.7.5 released, includes security fixes</title><link>https://blog.hartwork.org/posts/expat-2-7-5-released/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://libexpat.github.io/"&gt;libexpat&lt;/a&gt; is a fast streaming XML parser.
Alongside libxml2, Expat is one of the
&lt;a href="https://libexpat.github.io/doc/users/"&gt;most widely used&lt;/a&gt;
software libre XML parsers written in C, specifically C99.
It is cross-platform and licensed under
&lt;a href="https://opensource.org/licenses/MIT"&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/libexpat/libexpat/releases/tag/R_2_7_5"&gt;Expat 2.7.5&lt;/a&gt;
was released
earlier today.
The key motivation for cutting a release and doing so now
is three security fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-32776"&gt;CVE-2026-3277&lt;strong&gt;6&lt;/strong&gt;&lt;/a&gt;
  — &lt;code&gt;NULL&lt;/code&gt; pointer dereference
  (&lt;a href="https://cwe.mitre.org/data/definitions/476.html"&gt;CWE-476&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-32777"&gt;CVE-2026-3277&lt;strong&gt;7&lt;/strong&gt;&lt;/a&gt;
  — infinite loop
  (&lt;a href="https://cwe.mitre.org/data/definitions/835.html"&gt;CWE-835&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-32778"&gt;CVE-2026-3277&lt;strong&gt;8&lt;/strong&gt;&lt;/a&gt;
  — &lt;code&gt;NULL&lt;/code&gt; pointer dereference
  (&lt;a href="https://cwe.mitre.org/data/definitions/476.html"&gt;CWE-476&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first &lt;code&gt;NULL&lt;/code&gt; pointer dereference was reported and fixed by
&lt;a href="https://bertolaccini.dev/"&gt;Francesco Bertolaccini&lt;/a&gt;
of &lt;a href="https://trailofbits.com/"&gt;Trail of Bits&lt;/a&gt; with help from their AI tool
&lt;a href="https://github.com/trailofbits/buttercup"&gt;Buttercup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The infinite loop
&lt;a href="https://en.wikipedia.org/wiki/Denial-of-service_attack"&gt;denial of service&lt;/a&gt;
issue was uncovered by
&lt;a href="https://github.com/google/clusterfuzz"&gt;Google ClusterFuzz&lt;/a&gt; through
continuesly fuzzing with &lt;a href="https://github.com/libexpat/libexpat/pull/950"&gt;&lt;code&gt;xml_lpm_fuzzer&lt;/code&gt;&lt;/a&gt;
that &lt;a href="https://github.com/c01db33f"&gt;Mark Brand&lt;/a&gt; of &lt;a href="https://projectzero.google/"&gt;Project Zero&lt;/a&gt;
and I teamed up on in the past for Expat 2.7.0.
&lt;a href="https://github.com/berkayurun"&gt;Berkay Eren Ürün&lt;/a&gt; and I teamed up
for analysis and a fix under a 90 day disclosure deadline.&lt;/p&gt;
&lt;p&gt;The second &lt;code&gt;NULL&lt;/code&gt; pointer dereference was reported by
&lt;a href="https://github.com/Laserbear"&gt;Christian Ng&lt;/a&gt;, and he and I teamed up on a fix.&lt;/p&gt;
&lt;p&gt;So much for the &lt;em&gt;fixed&lt;/em&gt; vulnerabilities.
There are also three &lt;em&gt;known unfixed&lt;/em&gt; security issues remaining in libexpat,
and there is a
&lt;a href="https://github.com/libexpat/libexpat/issues/1160"&gt;GitHub issue listing known unfixed security issues in libexpat&lt;/a&gt;
for anyone interested.&lt;/p&gt;
&lt;p&gt;Thanks to everyone who contributed to this release of Expat!&lt;/p&gt;
&lt;p&gt;For more details about this release, please
&lt;a href="https://github.com/libexpat/libexpat/blob/R_2_7_5/expat/Changes"&gt;check out the change log&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;em&gt;you&lt;/em&gt; maintain Expat packaging,
a bundled copy of Expat, or
a pinned version of Expat,
please update to version 2.7.5. Thank you!&lt;/p&gt;
&lt;p&gt;Sebastian Pipping&lt;/p&gt;</description><category>Expat</category><category>Security</category><category>XML</category><guid>https://blog.hartwork.org/posts/expat-2-7-5-released/</guid><pubDate>Tue, 17 Mar 2026 18:26:00 GMT</pubDate></item><item><title>Learn from me!</title><link>https://blog.hartwork.org/posts/learn-from-me/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;Not too long ago, someone literally asked me what they "could learn from me",
and that question has stuck with me since.&lt;/p&gt;
&lt;p&gt;One thing it made me do was
label about 30 earlier blog posts in a new
&lt;a href="https://blog.hartwork.org/topics/learn-from-me/"&gt;blog topic "Learn from me"&lt;/a&gt;
that contains posts I consider to
be teaching something,
be at least somewhat timeless,
and be somewhat unique to this blog of mine — posts like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.hartwork.org/posts/my-approach-to-code-review/"&gt;My Approach to Code Review&lt;/a&gt; and&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.hartwork.org/posts/how-much-security-is-in-long-term-support/"&gt;How much security is in long-term support (LTS)?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe more importantly though,
&lt;strong&gt;there are some non-IT learnings that I would like to share with you now&lt;/strong&gt;
for a draft answer to that question
"What can you (potentially) learn from me?"
below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sometimes "throwing 50 bucks at it" is a good solution to a problem if you can.&lt;/strong&gt;&lt;br&gt;
  Especially when you experienced poverty or near-poverty and
  were lucky to grew out of it later, there can be learned resistance to spend
  (reasonable) amounts of money to solve a problem.
  When you have an okay salary, spending ten hours on a problem,
  that does not give you joy and could be solved by spending
  (or giving up on gaining) 50 bucks can be worth reconsideration.
  (There is one particular person that learned this from me.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pay attention to what people did &lt;em&gt;not&lt;/em&gt; say.&lt;/strong&gt;&lt;br&gt;
  Sometimes people use particular wording or omit things where
  a closer look reveals that their omission, them not saying it differently,
  reveals a hidden truth that they did not intend to share.
  Ask yourself: Why did they say it this way? What is that difference saying?
  What are they not saying?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Meaning&lt;/em&gt; depends on the right level of zoom.&lt;/strong&gt;&lt;br&gt;
  What do I mean?
  Activities like watering a plant can have meaning if your zoom level is a garden
  or the humans around that plant every day. If you zoom out too far or even
  up to universe level, the plant and these humans become
  a bunch of cells that lack any meaning. Zooming out to far
  destroys meaning and zooming in allows finding or creating
  meaning. Be mindful of the right zoom level.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;You can be one in a hundred and still not be wrong.&lt;/strong&gt;&lt;br&gt;
  Just because everyone else says something is true does not make it true.
  Just because it's written in a book or told by a professor does not make
  it true. Trust in that possibility that you could be right.
  (From personal experience.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be kind to service personnel.&lt;/strong&gt;&lt;br&gt;
  It takes five positive things to outweigh one negative, and
  then… who is making up for the bad-day customers before you?
  Authentically be that someone if you can,
  &lt;a href="https://en.wikipedia.org/wiki/Pay_It_Forward_(novel)"&gt;pay it forward.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The word "must" is hardly ever true.&lt;/strong&gt;&lt;br&gt;
  When someone says they "must" do something, it's almost always they "want"
  or decide to do it but are afraid to take responsibility.
  Pay attention to use of the word "must" (and its siblings "have to",
  "must not" and "cannot") and try to be true about what you "must" or "want" to do.
  (Learned from &lt;a href="https://en.wikipedia.org/wiki/Marshall_Rosenberg"&gt;Marshall B. Rosenberg&lt;/a&gt;.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you learned something here or would like to share your own answer,
please find me at &lt;a href="mailto:sebastian@pipping.org"&gt;sebastian@pipping.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I will likely edit this post over time.
Please be invited to &lt;a href="https://blog.hartwork.org/posts/learn-from-me/#"&gt;bookmark it&lt;/a&gt; and return later 👋&lt;/p&gt;
&lt;p&gt;Best, Sebastian&lt;/p&gt;</description><category>Learn from me</category><guid>https://blog.hartwork.org/posts/learn-from-me/</guid><pubDate>Sun, 08 Feb 2026 14:41:56 GMT</pubDate></item><item><title>Expat 2.7.4 released, includes security fixes</title><link>https://blog.hartwork.org/posts/expat-2-7-4-released/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://libexpat.github.io/"&gt;libexpat&lt;/a&gt; is a fast streaming XML parser.
Alongside libxml2, Expat is one of the
&lt;a href="https://libexpat.github.io/doc/users/"&gt;most widely used&lt;/a&gt;
software libre XML parsers written in C, specifically C99.
It is cross-platform and licensed under
&lt;a href="https://opensource.org/licenses/MIT"&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/libexpat/libexpat/releases/tag/R_2_7_4"&gt;Expat 2.7.4&lt;/a&gt;
was released
earlier today.
The key motivation for cutting a release and doing so now
is two security fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-24515"&gt;CVE-2026-24515&lt;/a&gt;
  — &lt;code&gt;NULL&lt;/code&gt; pointer dereference
  (&lt;a href="https://cwe.mitre.org/data/definitions/476.html"&gt;CWE-476&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-25210"&gt;CVE-2026-25210&lt;/a&gt;
  — integer overflow
  (&lt;a href="https://cwe.mitre.org/data/definitions/190.html"&gt;CWE-190&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;NULL&lt;/code&gt; pointer dereference finding and fix were contributed by
&lt;a href="https://artiphishell.com/"&gt;Artiphishell Inc.&lt;/a&gt;, and originated in AI.&lt;/p&gt;
&lt;p&gt;Another highlight in this release is the introduction of (off-by-default)
&lt;a href="https://gcc.gnu.org/wiki/SymbolVersioning"&gt;symbol versioning&lt;/a&gt;
which &lt;a href="https://github.com/gordonmessmer/"&gt;Gordon Messmer&lt;/a&gt;
of &lt;a href="https://www.fedoraproject.org/"&gt;Fedora&lt;/a&gt;
and I teamed up for. If you have seen things like &lt;code&gt;@@GLIBC_2.42&lt;/code&gt; before,
it's that same kind of symbol versioning.
The rest of the release consists of a mix of minor improvements and fixes,
particularly to
both build systems,
documentation, and
infrastructure.&lt;/p&gt;
&lt;p&gt;Thanks to everyone who contributed to this release of Expat!&lt;/p&gt;
&lt;p&gt;For more details about this release, please
&lt;a href="https://github.com/libexpat/libexpat/blob/R_2_7_4/expat/Changes"&gt;check out the change log&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;em&gt;you&lt;/em&gt; maintain Expat packaging,
a bundled copy of Expat, or
a pinned version of Expat,
please update to version 2.7.4. Thank you!&lt;/p&gt;
&lt;p&gt;Sebastian Pipping&lt;/p&gt;</description><category>Expat</category><category>Security</category><category>XML</category><guid>https://blog.hartwork.org/posts/expat-2-7-4-released/</guid><pubDate>Sat, 31 Jan 2026 12:44:12 GMT</pubDate></item><item><title>Fwd: The "60 Minutes" segment about the CECOT prison that was pulled last minute</title><link>https://blog.hartwork.org/posts/fwd-the-60-minutes-segment-about-cecot-prison-that-was-pulled-last-minute/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;When I tried watching &lt;a href="https://www.youtube.com/watch?v=jiehEMlNiCI"&gt;The 60 Minutes Story The Trump Administration Doesn't Want You To See&lt;/a&gt; from my bookmarks today, I got error…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Video unavailable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This video is no longer available due to a copyright claim by Paramount Global companies[.]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;…and so below you can find a re-upload if you also are curious what the pulled video is about:&lt;/p&gt;
&lt;p&gt;Original title: &lt;a href="https://www.youtube.com/watch?v=FY259aS6ot8"&gt;The 60 Minutes story the Trump regime did not want you to see&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/FY259aS6ot8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;p&gt;For additional context:&lt;/p&gt;
&lt;p&gt;Original title: &lt;a href="https://www.youtube.com/watch?v=WKLhd__VYXw"&gt;Chris Murphy: Trump Has Taken 'Editorial Control Of CBS' After 60 Minutes Pulls Critical Segment&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/WKLhd__VYXw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;</description><category>Documentary</category><category>USA</category><guid>https://blog.hartwork.org/posts/fwd-the-60-minutes-segment-about-cecot-prison-that-was-pulled-last-minute/</guid><pubDate>Wed, 31 Dec 2025 20:24:47 GMT</pubDate></item><item><title>Fwd: In memory of GM Daniel "Danya" Naroditsky</title><link>https://blog.hartwork.org/posts/fwd-in-memory-of-gm-daniel-naroditsky/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;Wikipedia: &lt;a href="https://en.wikipedia.org/wiki/Daniel_Naroditsky"&gt;Daniel Naroditsky&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Original title: &lt;a href="https://www.youtube.com/watch?v=r-e8x1t_lhY"&gt;In memory of Daniel Naroditsky ❤️&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/r-e8x1t_lhY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;hr&gt;

&lt;p&gt;Original title: &lt;a href="https://www.youtube.com/watch?v=5s0qcOZHPGw&amp;amp;t=32s"&gt;David Howell on his friend Daniel Naroditsky passing away&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/5s0qcOZHPGw?start=32" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;

&lt;hr&gt;

&lt;p&gt;Original title: &lt;a href="https://www.youtube.com/watch?v=j3BWzaNXW8Q"&gt;Justice for Grandmaster Daniel Naroditsky.&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/j3BWzaNXW8Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;</description><category>Chess</category><category>Documentary</category><guid>https://blog.hartwork.org/posts/fwd-in-memory-of-gm-daniel-naroditsky/</guid><pubDate>Wed, 29 Oct 2025 00:35:33 GMT</pubDate></item><item><title>Fwd: Python: The Documentary | An origin story</title><link>https://blog.hartwork.org/posts/fwd-python-the-documentary-an-origin-story/</link><dc:creator>Sebastian Pipping</dc:creator><description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=GfH4QL4VqJ0"&gt;Python: The Documentary | An origin story&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/GfH4QL4VqJ0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/center&gt;</description><category>Documentary</category><category>Python</category><guid>https://blog.hartwork.org/posts/fwd-python-the-documentary-an-origin-story/</guid><pubDate>Fri, 03 Oct 2025 22:59:02 GMT</pubDate></item></channel></rss>