chore: prepare Appwrite 1.9.8 security patch by ChiragAgg5k · Pull Request #14726 · appwrite/appwrite · GitHub
Skip to content

chore: prepare Appwrite 1.9.8 security patch - #14726

Merged
ChiragAgg5k merged 3 commits into
1.9.xfrom
release/1.9.8
Oct 21, 2026
Merged

ChiragAgg5k merged 3 commits into
1.9.xfrom
release/1.9.8

Conversation

@ChiragAgg5k

@ChiragAgg5k ChiragAgg5k commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

Appwrite 1.9.8 is a security patch for self-hosted deployments following the eMudhra certificate compromise. It retains Console 8.7.37 for compatibility with the 1.9 server APIs. Upgrading from 1.9.7 keeps the existing migration class and introduces no schema changes.

Highlights

  • Refresh outbound TLS trust so Appwrite rejects the compromised eMudhra certificate chains. TLS verification remains enabled.
  • Update the SVG sanitizer to 1.1.1 to address its reported security advisories.

Fixes

Under the hood

  • Require ca-certificates and ca-certificates-bundle at 20261020-r0 or newer and regenerate the certificate store.
  • Map 1.9.8 to migration V25, the same class as 1.9.7; no migration class is added.

Removed

No environment variables, collections, or public APIs are removed.

Install

docker run -it --rm \
    --publish 20080:20080 \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="install" \
    appwrite/appwrite:1.9.8

Upgrade

Back up your database and persistent storage before upgrading. From the parent directory of an existing 1.9.7 installation, run:

docker run -it --rm \
    --publish 20080:20080 \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="upgrade" \
    appwrite/appwrite:1.9.8
cd appwrite
docker compose exec appwrite migrate

The patch reuses migration V25. No new configuration is required. Outbound HTTPS endpoints that still present a compromised certificate chain will fail verification; those endpoints must replace their certificate chain.

Full Changelog: 1.9.7...1.9.8

Release preparation and validation

  • Prepared from 1.9.x; candidate commit 709b5674f2. The exact release SHA must be recorded again after the prep PR merges.
  • Legacy metadata checks pass: version constant, three install snippets in each README, compatible Console pin, V25 mapping, CHANGES.md, unchanged environment-variable definitions, and maintenance latest=false publishing guard. This branch predates bin/release and its installer reads the root Compose file; app/views/install/compose.phtml does not exist.
  • Production image builds locally on arm64 with VERSION=1.9.8; runtime APP_VERSION_STABLE reports 1.9.8.
  • Both patched CA packages resolve to 20261020-r0. Normal HTTPS succeeds and the compromised chains are rejected in the candidate images. Initial network timeouts were distinguished from TLS rejections and the affected probes were retried.
  • Composer security audit reports no vulnerability advisories; Docker build checks, PHP syntax checks, and git diff --check pass.
  • No schema migration or API metadata changes. APP_CACHE_BUSTER stays unchanged as required by current docs/releases.md; TLS trust changes do not alter cached response output.

Required before publishing

  • Prep PR CI is green and the reviewed prep is merged into the maintenance branch.
  • Fresh install gate with realistic data, unit tests, General and service E2E.
  • Upgrade gate from 1.9.7 with persisted volumes and non-default ports; migration run twice; seeded data verified through public APIs.
  • Record the final tested release SHA and gate evidence in the release test record.
  • Review and merge the corresponding console/docs PR after the server release; regenerate the existing versioned specs from the published tag.

No GitHub release or version tag has been created. Publishing, release-branch merge-back, specs dispatch/merges, Console publishing, and upgrading oss.appwrite.org remain separate steps under docs/releases.md.

Console compatibility review: retain 8.7.37. Newer legacy Console versions introduce MFA policy and OAuth provider controls whose server endpoints are absent on 1.9.x. The old pinned Console is retained rather than exposing unsupported controls in a security backport.

Related: appwrite-labs/cloud#6671

Console/docs preparation: #14733.

@tenki-reviewer

tenki-reviewer Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

@ChiragAgg5k ChiragAgg5k self-assigned this Oct 21, 2026
@hansi-codes

hansi-codes Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

🟢 Tier S · Ready to merge

The cache-buster change updates the value consumed by Appwrite's response-cache key, and I found no actionable defects in the incremental changes.

Prepares Appwrite 1.9.8 as a maintenance security release, carrying the outbound TLS trust and SVG sanitizer updates into release notes, installation examples, and migration metadata while retaining compatibility with Console 8.7.37 and migration V25. The follow-up increments the response-cache buster so cached avatar and preview responses are regenerated after the sanitizer update.

Latest changes: The follow-up increments APP_CACHE_BUSTER from 4327 to 4328 and documents invalidation of cached avatar and preview responses in CHANGES.md.

Verdict New comments Fixed Still open
✅ Approved 0 0 0
📂 Walkthrough · 5
File Change
CHANGES.md Documents the 1.9.8 security fixes, compatibility notes, migration reuse, and cache invalidation.
README.md Updates the self-hosted installation examples to use Appwrite 1.9.8.
README-CN.md Updates the Chinese self-hosted installation examples to use Appwrite 1.9.8.
app/init/constants.php Sets the stable version to 1.9.8 and increments the response-cache buster.
src/Appwrite/Migration/Migration.php Maps Appwrite 1.9.8 to the existing V25 migration.

Reviewed the commits since 709b567 · Details · Comment @hansi-codes review to re-run, or mention @hansi-codes with a question.

@hansi-codes hansi-codes Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Tier S · Looks good to merge. Summary

@tenki-reviewer tenki-reviewer Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Patch-release bump to 1.9.8 with updated install tags, console image, migration map entry, and changelog.

Key findings

Comment thread app/init/constants.php Outdated
@@ -51,7 +51,7 @@
const APP_FILE_ACCESS = 24 * 60 * 60; // 24 hours
const APP_CACHE_UPDATE = 24 * 60 * 60; // 24 hours
const APP_CACHE_BUSTER = 4327;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 bug · medium

Bump APP_CACHE_BUSTER alongside the version update

The patch bumps APP_VERSION_STABLE to 1.9.8 and the console image to 8.9.2 but leaves APP_CACHE_BUSTER at 4327 (app/init/constants.php:53). The release checklist explicitly requires incrementing APP_CACHE_BUSTER in the same step as the version bump, and it participates in the response cache key (src/Appwrite/Utopia/Request.php:246). Stale cached responses keyed under the old buster can be served after the upgrade.

📋 Prompt for AI Agents

In app/init/constants.php line 53, change const APP_CACHE_BUSTER = 4327; to const APP_CACHE_BUSTER = 4328;. The patch-release checklist requires incrementing the cache buster whenever APP_VERSION_STABLE is bumped; it also keys the response cache in src/Appwrite/Utopia/Request.php, so bumping it invalidates stale cached responses after the 1.9.8 upgrade.

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

✨ Benchmark results

Comparing 1.9.x (before) to release/1.9.8 (after).

Before

Scenario P50 (ms) P95 (ms) Requests RPS
API total 13.99 130.24 185 32.8
Account 29.74 197.04 35 6.87
TablesDB 14.09 24.48 35 7.97
Storage 11.89 122.77 75 16.78
Functions 25.69 32.55 40 9

After

Scenario P50 (ms) P95 (ms) Requests RPS
API total 14.74 135.34 185 32.53
Account 31.38 181.43 35 6.82
TablesDB 14.18 20.69 35 7.97
Storage 11.71 124.69 75 16.79
Functions 23.62 32.95 40 9.05

Delta

Scenario P95 delta (ms)
API total +5.1
Account -15.61
TablesDB -3.79
Storage +1.91
Functions +0.4
Top API waits
API request Max wait (ms)
account.logs.list 452.51
account.password.update 181.3
account.sessions.email.create 139.57

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant