From 60a80b6bc1160d220e819af7dd66dadd58d12c1c Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 3 Sep 2026 10:12:24 +0000 Subject: [PATCH] fix: do not load webxdc icon if it has too large dimensions BREAKING CHANGE: get_webxdc_blob() may fail to load icon.png or icon.jpg if image dimensions are too large. The issue is discovered by https://github.com/Sergei768 --- deltachat-jsonrpc/src/api.rs | 3 ++ src/webxdc.rs | 25 ++++++++- src/webxdc/webxdc_tests.rs | 54 +++++++++++++++++++ test-data/webxdc/with-broken-png-icon.xdc | Bin 0 -> 346 bytes test-data/webxdc/with-too-large-png-icon.xdc | Bin 0 -> 33894 bytes 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 test-data/webxdc/with-broken-png-icon.xdc create mode 100644 test-data/webxdc/with-too-large-png-icon.xdc diff --git a/deltachat-jsonrpc/src/api.rs b/deltachat-jsonrpc/src/api.rs index f2432c1be6..bf22251698 100644 --- a/deltachat-jsonrpc/src/api.rs +++ b/deltachat-jsonrpc/src/api.rs @@ -2227,6 +2227,9 @@ impl CommandApi { /// Get blob encoded as base64 from a webxdc message /// /// path is the path of the file within webxdc archive + /// + /// If the file is `icon.png` or `icon.jpg`, + /// loading it may fail if dimensions are unexpectedly large. async fn get_webxdc_blob( &self, account_id: u32, diff --git a/src/webxdc.rs b/src/webxdc.rs index 9ca1e0f278..f26c23b6f1 100644 --- a/src/webxdc.rs +++ b/src/webxdc.rs @@ -20,6 +20,7 @@ mod maps_integration; use std::cmp::max; use std::collections::HashMap; +use std::io::Cursor; use std::path::Path; use anyhow::{Context as _, Result, anyhow, bail, ensure, format_err}; @@ -27,6 +28,7 @@ use anyhow::{Context as _, Result, anyhow, bail, ensure, format_err}; use async_zip::tokio::read::seek::ZipFileReader as SeekZipFileReader; use deltachat_contact_tools::sanitize_bidi_characters; use deltachat_derive::FromSql; +use image::{ImageFormat, ImageReader}; use mail_builder::mime::MimePart; use rusqlite::OptionalExtension; use serde::{Deserialize, Serialize}; @@ -875,6 +877,9 @@ impl Message { /// Currently, this works only if the message is an webxdc instance. /// /// `name` is the filename within the archive, e.g. `index.html`. + /// + /// If the file is `icon.png` or `icon.jpg`, + /// loading it may fail if dimensions are unexpectedly large. pub async fn get_webxdc_blob(&self, context: &Context, name: &str) -> Result> { ensure!(self.viewtype == Viewtype::Webxdc, "No webxdc instance."); @@ -903,7 +908,25 @@ impl Message { )); } - get_blob(&mut archive, name).await + let blob = get_blob(&mut archive, name).await?; + if name == "icon.png" || name == "icon.jpg" { + let image_reader = ImageReader::new(Cursor::new(&blob)) + .with_guessed_format() + .context("Reading from Cursor must never fail")?; + match image_reader.format() { + None => bail!("Unable to determine image format"), + Some(ImageFormat::Png) | Some(ImageFormat::Jpeg) => { + // We accept PNG named icon.jpg and JPEG named icon.png + // to avoid incompatibilities, but no unexpected formats like GIF. + } + Some(format) => bail!("Unexpected icon format {format:?}"), + } + let (width, height) = image_reader + .into_dimensions() + .context("Failed to determine icon dimensions")?; + ensure!(width <= 4096 && height <= 4096, "Icon is too large"); + } + Ok(blob) } /// Return info from manifest.toml or from fallbacks. diff --git a/src/webxdc/webxdc_tests.rs b/src/webxdc/webxdc_tests.rs index 9a3fb43264..79bdb49d95 100644 --- a/src/webxdc/webxdc_tests.rs +++ b/src/webxdc/webxdc_tests.rs @@ -1080,6 +1080,60 @@ async fn test_get_webxdc_blob() -> Result<()> { Ok(()) } +/// Tests that valid webxdc icon can be loaded. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_get_webxdc_blob_icon() -> Result<()> { + let mut tcm = TestContextManager::new(); + let alice = &tcm.alice().await; + let chat_id = create_group(alice, "chat").await?; + + { + let mut instance = create_webxdc_instance( + alice, + "with-png-icon.xdc", + include_bytes!("../../test-data/webxdc/with-png-icon.xdc"), + )?; + send_msg(alice, chat_id, &mut instance).await?; + let buf = instance.get_webxdc_blob(alice, "icon.png").await?; + assert_eq!(buf.len(), 103); + } + + { + let mut instance = create_webxdc_instance( + alice, + "with-jpg-icon.xdc", + include_bytes!("../../test-data/webxdc/with-jpg-icon.xdc"), + )?; + send_msg(alice, chat_id, &mut instance).await?; + let buf = instance.get_webxdc_blob(alice, "icon.jpg").await?; + assert_eq!(buf.len(), 286); + } + + { + // Webxdc with icon.png than is in fact a text file. + let mut instance = create_webxdc_instance( + alice, + "with-broken-png-icon.xdc", + include_bytes!("../../test-data/webxdc/with-broken-png-icon.xdc"), + )?; + send_msg(alice, chat_id, &mut instance).await?; + assert!(instance.get_webxdc_blob(alice, "icon.png").await.is_err()); + } + + { + // Webxdc with icon.png than is a 9999x9999 PNG image. + let mut instance = create_webxdc_instance( + alice, + "with-too-large-png-icon.xdc", + include_bytes!("../../test-data/webxdc/with-too-large-png-icon.xdc"), + )?; + send_msg(alice, chat_id, &mut instance).await?; + assert!(instance.get_webxdc_blob(alice, "icon.png").await.is_err()); + } + + Ok(()) +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_get_webxdc_blob_default_icon() -> Result<()> { let t = TestContext::new_alice().await; diff --git a/test-data/webxdc/with-broken-png-icon.xdc b/test-data/webxdc/with-broken-png-icon.xdc new file mode 100644 index 0000000000000000000000000000000000000000..4b7733b0fa47e4b6a8eb8ddd8609baeba287bfdd GIT binary patch literal 346 zcmWIWW@h1H0D(g(%CWcC*>dp!*&xipAj6QEoS&yxke41B!pXp_oi#H{4v0%DxEUB( zUNAE-fC)eU5Cum+1y5&xKdu0{Y5XNBAu27r*F}IPfiM@yw7itm3cZYy+#IlZwNY0R z#WBsZQFQTl4v7qKRRF29W@1#MNjnMm7!8 hoyey7flNbkHPAeet1--DWdqsE1cdW|^fC~K0RW<&L<9f; literal 0 HcmV?d00001 diff --git a/test-data/webxdc/with-too-large-png-icon.xdc b/test-data/webxdc/with-too-large-png-icon.xdc new file mode 100644 index 0000000000000000000000000000000000000000..132f37b7ac6dfc387eb6bc8968049f7f35b1d541 GIT binary patch literal 33894 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 literal 0 HcmV?d00001