Repository navigation
Linux AppImage v2.4.4: frostdart.so absent from official release #1399
Description
Context
WalletScrutiny is an independent security research project that verifies whether Bitcoin and cryptocurrency wallet binaries can be reproduced from their public source code. We recently completed reproducible build verification for the Stack Wallet Linux AppImage v2.4.4 (sw-v2.4.4-linux.AppImage, SHA256 ae6f3f31c2c894384aa54bd481506ee6cc133a8de1d61aa18e96722b8d1c8809).
During this work we identified a discrepancy between what the build system produces and what is packaged in the official AppImage.
Finding
The official sw-v2.4.4-linux.AppImage does not contain frostdart.so in its lib/ directory.
We confirmed this by extracting the squashfs from the AppImage and listing its contents:
unsquashfs -o 944632 -d squashfs-root sw-v2.4.4-linux.AppImage
ls squashfs-root/lib/ | grep frost
# (no output)
When we build from the public source at commit edc19aa6a23052de854be0318190f82bdcc0a765 (the commit embedded in the official binary's libapp.so), with Rust 1.71.0 installed, the build produces frostdart.so at:
crypto_plugins/frostdart/scripts/linux/build/frostdart.so
The frostdart Flutter plugin's linux/CMakeLists.txt unconditionally installs this file into the bundle:
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/build/frostdart.so"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)There is no OPTIONAL flag and no if(EXISTS ...) guard on this install directive. Our local build includes frostdart.so in the bundle; the official AppImage does not.
Related: Rust 1.71.0 not documented
crypto_plugins/frostdart/scripts/linux/build_all.sh hardcodes:
cargo +1.71.0 build --release ...However, docs/building.md lists only rustup install 1.89.0 1.85.1 1.81.0 — Rust 1.71.0 is not mentioned anywhere in the documentation. Anyone following the official build instructions exactly will fail to compile frostdart for Linux.
Questions
-
Was the omission of
frostdart.sofrom the official AppImage intentional? For example, is FROST threshold signature functionality intentionally disabled or not supported on Linux desktop? -
If not intentional: what was the environment used to produce the official AppImage? Was
frostdartcompiled as part of that build? Is it possible the AppImage was packaged from a bundle wherefrostdart.sohad not yet been built? -
Should
docs/building.mdlist Rust 1.71.0? We plan to submit a PR with several corrections todocs/building.md(including the Flutter version, missingrsyncdependency, and the Ubuntu 24.04 meson install method). We'd like to know whether to include Rust 1.71.0 in that PR, or whether it's intentionally absent from the Linux build path.
Thanks for the open-source work. We're happy to share our full build log or verification script if that's useful.
— WalletScrutiny team
Activity
fix(docs): correct Flutter version, add Rust 1.71.0, fix Ubuntu 24.04…
fix(docs): correct Flutter version, add Rust 1.71.0, fix meson instal…
danrmiller commentedon Jun 5, 2026
Thanks for the detailed analysis.
No, it was a bug. crypto_plugins/frostdart/linux/CMakeLists.txt (at the v2.4.4 commit) set:
set(frostdart_bundled_libraries "" PARENT_SCOPE)Flutter's Linux build system iterates over each plugin's *_bundled_libraries variable to determine which .so files to copy into the bundle. Because this was empty, frostdart.so was never added to the copy list, regardless of whether it had been built. The
install(FILES ...) block you found in the same file is a copy of the main app's install rules; it does not fire through the standard Flutter bundling path and was effectively dead code.
The fix is in frostdart PR #23 (cypherstack/frostdart#23), which sets frostdart_bundled_libraries to the actual .so path. This is included in frostdart v0.2.1, which the current staging branch pins. The next release will include frostdart.so.
The official v2.4.4 build did compile frostdart, so frostdart.so existed on the build machine. However, the AppImage was packaged directly from the Flutter bundle, which did not include frostdart.so due to the empty frostdart_bundled_libraries described above. A workaround for this was in place for the Flatpak artifact but not the AppImage, which is why the AppImage was missing it.
We'll be moving to rust 1.89.0, see #1401 and cypherstack/frostdart#25
Thanks for the thorough reproducibility verification and write-up, and the PR.