CVE-2026-73249 Overview
Calibre is an open-source e-book management application that includes a Content Server for remote library access. CVE-2026-73249 is a missing authorization vulnerability [CWE-862] in the Content Server endpoint POST /book-update-annotations/{library_id}/{book_id}/{fmt}. The handler in src/calibre/srv/books.py omits the needs_db_write=True flag, so Router.dispatch() skips ctx.check_for_write_access() before invoking update_annotations(). A readonly user, or any anonymous user on an unauthenticated deployment, can persist unauthorized book annotation changes. The issue is fixed in Calibre version 9.12.0.
Critical Impact
Unauthenticated or read-only network attackers can overwrite persisted book annotations, tampering with library integrity without any user interaction.
Affected Products
- Calibre Content Server versions prior to 9.12.0
- Deployments exposing /book-update-annotations/ over the network
- Anonymous (unauthenticated) Calibre Content Server deployments
Discovery Timeline
- 2026-08-11 - CVE-2026-73249 published to NVD
- 2026-08-12 - Last updated in NVD database
Technical Details for CVE-2026-73249
Vulnerability Analysis
The Calibre Content Server uses a decorator-based routing model. Each endpoint declares its capability requirements, and Router.dispatch() enforces them before invoking the handler. Write endpoints must declare needs_db_write=True so the router calls ctx.check_for_write_access() and validates the caller's permissions.
The update_annotations endpoint accepts a POST request with attacker-controlled JSON and forwards it to db.merge_annotations_for_book(). Because the endpoint decorator lacked needs_db_write=True, the write-access check was never invoked. Any request reaching the route, whether authenticated as a read-only user or unauthenticated on an open deployment, was permitted to mutate annotation state.
Root Cause
The root cause is a missing authorization declaration on a state-changing HTTP handler. The endpoint mutates persisted annotation data but was registered as if it were a read-only operation, so the router's authorization gate never fired for this route.
Attack Vector
Exploitation requires only network reachability to the Calibre Content Server. An attacker sends a crafted POST request to /book-update-annotations/{library_id}/{book_id}/{fmt} with a JSON body containing arbitrary annotation content. The server merges the attacker-supplied annotations into the database via merge_annotations_for_book(), persisting them without checking the caller's write privileges.
return ans
-@endpoint('/book-update-annotations/{library_id}/{book_id}/{+fmt}', types={'book_id': int}, methods=('POST',))
+@endpoint('/book-update-annotations/{library_id}/{book_id}/{+fmt}', types={'book_id': int}, methods=('POST',), needs_db_write=True)
def update_annotations(ctx, rd, library_id, book_id, fmt):
db = get_db(ctx, rd, library_id)
user = rd.username or '*'
Source: GitHub Commit 71295e8b. The patch adds needs_db_write=True so the router enforces check_for_write_access() before dispatch.
Detection Methods for CVE-2026-73249
Indicators of Compromise
- HTTP POST requests to /book-update-annotations/ paths originating from unauthenticated sessions or read-only user accounts.
- Unexpected modifications to book annotations in the Calibre library database, particularly on entries not previously annotated.
- Requests to the annotations endpoint from IP addresses outside the expected administrator population.
Detection Strategies
- Review Calibre Content Server access logs for POST /book-update-annotations/ entries and correlate against the authenticated user's assigned role.
- Alert on any successful POST to the annotations endpoint where the session token maps to a read-only account.
- On unauthenticated deployments, treat every request to /book-update-annotations/ as suspicious until the server is upgraded to 9.12.0 or later.
Monitoring Recommendations
- Forward Calibre Content Server HTTP logs to a centralized log platform and retain them long enough to reconstruct annotation tampering incidents.
- Baseline normal annotation-write volume per user and alert on statistical deviations.
- Monitor the Calibre process for outbound connections and configuration file changes that would indicate broader post-exploitation activity.
How to Mitigate CVE-2026-73249
Immediate Actions Required
- Upgrade Calibre to version 9.12.0 or later, which enforces needs_db_write=True on the annotations endpoint.
- Restrict network exposure of the Content Server to trusted networks or place it behind an authenticating reverse proxy.
- Audit user accounts and disable anonymous access unless explicitly required by the deployment.
Patch Information
The fix is included in Calibre release v9.12.0. Technical details are documented in the GitHub Security Advisory GHSA-5x64-w63v-x2g6, and the code change is available in commit 71295e8b.
Workarounds
- Block the /book-update-annotations/ path at an upstream reverse proxy or web application firewall until the upgrade is deployed.
- Require authentication on the Content Server and remove any read-only accounts that do not need annotation access.
- Deploy the Content Server on a private network segment reachable only via VPN or authenticated tunnel.
# Example nginx rule to block the vulnerable endpoint until patched
location ~ ^/book-update-annotations/ {
return 403;
}
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

