<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Rebuilding an app doesn't pick up Ubuntu security fixes from the base image — an observation and what I do in my own packages]]></title><description><![CDATA[<p dir="auto">While building a small vulnerability monitor for my own Cloudron servers, I noticed something about the app images that I found interesting, so I thought I'd share it. To be clear upfront: I'm not reporting anything exploitable. These are containers, apps don't run as root, and most of what I found are medium CVEs in tools an app never even calls. So this is about hygiene (and about what security scanners flag), not an emergency.</p>
<p dir="auto">What I did: I compared the <code>dpkg</code> package lists of the 41 Cloudron images running on my servers (34 apps plus the addon containers like mail, mysql, postgresql, redis, sftp, turn) with Ubuntu's <code>-security</code> pocket, and looked up the fixed CVEs per package via OSV.</p>
<p dir="auto">What stood out is that an app's OS layer is exactly as old as its base image, no matter when the app itself was built. For example, an app built on 22 September has the same backlog as the plain <code>cloudron/base:5.1.0</code> from 7 August, because none of the Dockerfiles I looked at run <code>apt-get upgrade</code> and the base itself isn't refreshed.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Base image</th>
<th>Images on my servers</th>
<th>Source packages behind <code>-security</code></th>
<th>Fixed CVEs still in the image</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cloudron/base:5.0.0</code> (Feb 2025)</td>
<td>8 apps (OnlyOffice, Jellyfin, Pretix, Taiga, MicroBin, IP2Location, Release Bell, IT Tools)</td>
<td>~105</td>
<td>12 high, ~750 medium</td>
</tr>
<tr>
<td><code>cloudron/base:5.1.0</code> (Aug 2026)</td>
<td>26 apps + all addon images</td>
<td>~36</td>
<td>0 high, ~160 medium</td>
</tr>
<tr>
<td><code>cloudron/base:6.0.0</code> (Sep 2026)</td>
<td>7 apps</td>
<td>~5</td>
<td>0 high, 34 medium</td>
</tr>
</tbody>
</table>
<p dir="auto">So in practice the OS layer follows the release rhythm of the app: an app that doesn't get a new upstream version for a while keeps the base of that moment. The 5.0.0 group still contains the fixes for sudo (CVE-2025-32463), git (CVE-2025-48384) and inetutils (CVE-2026-24061), which are on the CISA KEV list. Inside a container that's mostly theoretical, I know, but it's the first thing a scanner or an auditor points at. The addon images are on 5.1.0, e.g. the postgresql addon has 16.14 while 16.15 is in <code>noble-security</code>.</p>
<p dir="auto">In my own packages I solved it with two lines in the Dockerfile, so every build pulls in the current security fixes:</p>
<pre><code class="language-dockerfile">FROM cloudron/base:6.0.0@sha256:...
ARG BUILD_DATE=unknown
RUN echo "update base packages (${BUILD_DATE})" \
 &amp;&amp; apt-get update \
 &amp;&amp; DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
 &amp;&amp; apt-get install -y --no-install-recommends &lt;packages&gt; \
 &amp;&amp; rm -rf /var/lib/apt/lists/*
</code></pre>
<p dir="auto">and I always deploy with <code>cloudron update --app &lt;domain&gt; --build-arg BUILD_DATE=$(date +%F)</code>. The build argument is only there to break the Docker layer cache, otherwise the upgrade step is reused and does nothing. My monitor tells me when an image falls behind <code>-security</code>, and then I simply rebuild. The trade-off is that builds are a bit less reproducible, which I'm fine with for my own apps.</p>
<p dir="auto">I also noticed that on master several apps already move to date-tagged bases like <code>node-base:24-20260920</code> and <code>python-base:3.14-20260920</code>, which looks like it's heading in this direction. Is the idea to rebuild those regularly (and then the apps on top)? If so, this more or less solves itself, and I'm curious how you plan to handle it.</p>
<p dir="auto">Happy to share the scripts if anyone wants to check their own server.</p>
]]></description><link>https://forum.cloudron.io/topic/16010/rebuilding-an-app-doesn-t-pick-up-ubuntu-security-fixes-from-the-base-image-an-observation-and-what-i-do-in-my-own-packages</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 06:10:46 GMT</lastBuildDate><atom:link href="https://forum.cloudron.io/topic/16010.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Sep 2026 07:18:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rebuilding an app doesn't pick up Ubuntu security fixes from the base image — an observation and what I do in my own packages on Fri, 25 Sep 2026 09:10:07 GMT]]></title><description><![CDATA[<p dir="auto">Good point, I hadn't thought about the layer sharing. I measured it: an <code>apt-get upgrade</code> on top of <code>cloudron/base:5.1.0</code> today is 136 packages and a 677 MB extra layer per image, so with 30 apps that really adds up. On top of <code>6.0.0</code> (5 days old) it's only 16 packages and 28 MB.</p>
<p dir="auto">So for my 7 own apps the per-app upgrade is fine, but for the whole catalog it clearly belongs in the base rather than in every app. If the dated bases (like <code>node-base:24-20260920</code>) get refreshed regularly and apps pick up the latest one when they're rebuilt, the sharing stays intact and the backlog never grows big. The numbers above also show that the older the base gets, the bigger both the security backlog and the upgrade layer become.</p>
]]></description><link>https://forum.cloudron.io/post/129987</link><guid isPermaLink="true">https://forum.cloudron.io/post/129987</guid><dc:creator><![CDATA[imc67]]></dc:creator><pubDate>Fri, 25 Sep 2026 09:10:07 GMT</pubDate></item><item><title><![CDATA[Reply to Rebuilding an app doesn't pick up Ubuntu security fixes from the base image — an observation and what I do in my own packages on Fri, 25 Sep 2026 08:07:51 GMT]]></title><description><![CDATA[<p dir="auto">The way docker is... the builds are not "reproducible" . Meaning, you and I build with the same instructions, it will give us different images. This breaks the "sharing" between app images. I don't have a solution, just wanted to point that out.</p>
]]></description><link>https://forum.cloudron.io/post/129984</link><guid isPermaLink="true">https://forum.cloudron.io/post/129984</guid><dc:creator><![CDATA[girish]]></dc:creator><pubDate>Fri, 25 Sep 2026 08:07:51 GMT</pubDate></item></channel></rss>