<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blogs on Osservatorio Nessuno - Association for the promotion and protection of digital rights</title><link>/blog/</link><description>Recent content in Blogs on Osservatorio Nessuno - Association for the promotion and protection of digital rights</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 07 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Demystifying phone unlocking tools: A technical overview</title><link>/blog/2026/05/demystifying-phone-unlocking-tools-a-technical-overview/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>/blog/2026/05/demystifying-phone-unlocking-tools-a-technical-overview/</guid><description>&lt;p&gt;This post is a written description of a presentation titled &lt;em&gt;Phone unlocking tools and where to find them&lt;/em&gt; that we have delivered privately to different events and organizations, including &lt;a href="https://phacker.org/" aria-label="Primavera Hacker 25(opens in a new tab)" target="_blank"&gt;Primavera Hacker 25&lt;/a&gt;, the &lt;a href="https://freedom.press" aria-label="Freedom of the Press Foundation(opens in a new tab)" target="_blank"&gt;Freedom of the Press Foundation&lt;/a&gt;, and the &lt;a href="https://pitg.network" aria-label="Public Interest Technology Group(opens in a new tab)" target="_blank"&gt;Public Interest Technology Group&lt;/a&gt;. It provides a technical overview of how commercial forensic tools compromise mobile devices, focusing on the specific attack surfaces exploited at each stage of the device lifecycle. Further posts will focus on sample analysis, and defenses. See also the previous posts of this serie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://osservatorionessuno.org/blog/2025/03/cellebrite-and-the-routine-use-of-digital-surveillance-in-italy/" aria-label="Cellebrite and the routine use of digital surveillance in Italy(opens in a new tab)" target="_blank"&gt;Cellebrite and the routine use of digital surveillance in Italy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://osservatorionessuno.org/blog/2025/03/a-deep-dive-into-cellebrite-how-it-came-to-be/" aria-label="A deep dive into Cellebrite: How it came to be(opens in a new tab)" target="_blank"&gt;A deep dive into Cellebrite: How it came to be&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://osservatorionessuno.org/blog/2025/03/a-deep-dive-into-cellebrite-android-support-as-of-february-2025/" aria-label="A deep dive into Cellebrite: Android support as of February 2025(opens in a new tab)" target="_blank"&gt;A deep dive into Cellebrite: Android support as of February 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introduction"&gt;
 Introduction
&lt;/h2&gt;
&lt;p&gt;Commercial phone unlocking tools are not magic. They exploit the same classes of vulnerabilities that security researchers publish about at conferences and in academic papers. What makes them distinctive is not the novelty of the techniques, but the systematic commercialization of exploitation: acquiring or developing exploits for each hardware and software combination, and reaching a certain degree of stability, packaging them into automated workflows that require minimal operator expertise.&lt;/p&gt;
&lt;p&gt;This post aims to demystify the technical foundations of these tools. The attack vectors available to a forensic examiner with physical access to a device are constrained by well-understood boundaries: the boot chain, the trusted execution environment, the secure element (when present), and the kernel&amp;rsquo;s peripheral driver stack. This post mostly details Android internals, however iOS equivalent concepts are technically similar.&lt;/p&gt;
&lt;p&gt;Much of the background research referenced here comes from &lt;a href="https://www.quarkslab.com/" aria-label="Quarkslab(opens in a new tab)" target="_blank"&gt;Quarkslab&lt;/a&gt;, whose extensive publications on TEEs, and Android&amp;rsquo;s data encryption architecture have been invaluable to understand these tools. Their work, alongside reporting from &lt;a href="https://securitylab.amnesty.org/" aria-label="Amnesty International&amp;rsquo;s Security Lab(opens in a new tab)" target="_blank"&gt;Amnesty International&amp;rsquo;s Security Lab&lt;/a&gt; and other NGOs, and analysis by the &lt;a href="https://grapheneos.org/" aria-label="GrapheneOS(opens in a new tab)" target="_blank"&gt;GrapheneOS&lt;/a&gt; project, provides the empirical basis for the claims made in this post.&lt;/p&gt;
&lt;h2 id="hardware-security-architecture"&gt;
 Hardware security architecture
&lt;/h2&gt;
&lt;p&gt;Before examining attack vectors, it is necessary to understand the hardware security architecture of modern Android devices. The following sections describe the components that forensic tools must eventually hack or bypass.&lt;/p&gt;
&lt;h3 id="the-system-on-chip-normal-world-and-secure-world"&gt;
 The System-on-Chip: Normal World and Secure World
&lt;/h3&gt;
&lt;p&gt;Modern ARM-based mobile processors implement TrustZone™, a hardware security extension that partitions the processor into two execution environments: the &lt;strong&gt;Normal World&lt;/strong&gt; and the &lt;strong&gt;Secure World&lt;/strong&gt;. The Normal World runs the Android operating system, user applications, and the Linux kernel. The Secure World runs a separate, minimal operating system, the &lt;strong&gt;Trusted OS&lt;/strong&gt;, along with small, specialized applications known as &lt;strong&gt;Trusted Applications (TAs)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-05-01-demistifying-phone-unlocking-tools-soc.svg" alt="SoC diagram showing Normal World and Secure World partitions, with the TEE running Trusted Applications and communicating with an optional Secure Element over SPI"&gt;
 
 &lt;figcaption&gt;SoC diagram showing Normal World and Secure World partitions, with the TEE running Trusted Applications and communicating with an optional Secure Element over SPI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The two worlds share the same physical processor cores but are hardware-isolated: the Normal World cannot directly read or write Secure World memory. Communication between the two happens through a monitor, a piece of code running at the highest privilege level (EL3 on ARMv8), which handles context switches triggered by Secure Monitor Call (SMC) instructions. Each physical processor core effectively provides two virtual cores, with the Non-Secure bit in the Secure Configuration Register determining which world is active at any given time.&lt;/p&gt;
&lt;p&gt;The Trusted OS hosts critical security services. Two are directly relevant to device unlocking:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gatekeeper&lt;/strong&gt;: responsible for verifying user credentials (PIN, password, pattern). It implements rate-limiting to throttle brute-force attempts and, upon successful authentication, issues a signed authentication token.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keymaster&lt;/strong&gt;: the key management service that stores and operates on cryptographic keys. Some keys are &lt;em&gt;authentication-bound&lt;/em&gt;, meaning they can only be used after Gatekeeper has issued a valid token.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Different SoC vendors ship different TrustZone™ implementations. Google (and AOSP in general) uses &lt;a href="https://source.android.com/docs/security/features/trusty" aria-label="TrustyOS(opens in a new tab)" target="_blank"&gt;TrustyOS&lt;/a&gt;; Qualcomm uses QSEE; Samsung uses TEEGRIS (on both Exynos and MediaTek SoCs in Samsung devices); Huawei uses TrustedCore; Trustonic&amp;rsquo;s Kinibi is also often found on MediaTek and Exynos SoCs. The security properties vary between implementations.&lt;/p&gt;
&lt;h3 id="the-secure-element"&gt;
 The Secure Element
&lt;/h3&gt;
&lt;p&gt;A Secure Element (SE) is a physically separate, tamper-resistant hardware chip that provides an additional layer of security beyond the TEE. Unlike the Secure World, which runs on the same SoC as the Normal World, a Secure Element is an independent processor with its own boot chain, its own firmware, and its own cryptographic key storage.&lt;/p&gt;
&lt;p&gt;In the Android ecosystem, the Secure Element is exposed through the &lt;strong&gt;StrongBox&lt;/strong&gt; API (introduced in Android 9). Google&amp;rsquo;s Pixel phones, starting with the Pixel 3, include the &lt;strong&gt;Titan M&lt;/strong&gt; chip as their Secure Element, that was later upgraded with the &lt;strong&gt;&lt;a href="https://docs.cloud.google.com/docs/security/titan-hardware-chip" aria-label="Titan M2(opens in a new tab)" target="_blank"&gt;Titan M2&lt;/a&gt;&lt;/strong&gt; from Pixel 6 onward. On Apple devices, the equivalent is the &lt;strong&gt;Secure Enclave Processor (SEP)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The Secure Element&amp;rsquo;s role in device encryption is to hold key-encryption keys and enforce rate-limiting for credential verification in hardware that the main SoC cannot tamper with, even if fully compromised. This is an important distinction: on a device without a Secure Element, compromising the TEE is sufficient to extract or bypass credential-derived keys. On a device with a Secure Element, the attacker must additionally compromise a separate, hardened chip.&lt;/p&gt;
&lt;p&gt;Unfortunately, only flagship devices typically include a Secure Element. Most mid-range and budget devices rely solely on the TEE for credential protection. This architectural gap is the single most important factor determining the chances that a device has to resist forensic unlocking when powered off.&lt;/p&gt;
&lt;h3 id="the-boot-chain"&gt;
 The boot chain
&lt;/h3&gt;
&lt;p&gt;The boot chain establishes a &lt;em&gt;chain of trust&lt;/em&gt; from immutable hardware to the running operating system. Each stage verifies the integrity of the next before executing it.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-05-01-demistifying-phone-unlocking-tools-bootflow.svg" alt="Boot flow diagram showing Boot ROM → Preloader → Trusted OS and Monitor (Secure World) / Bootloader → OS (Normal World), with the Secure Element running its own boot chain"&gt;
 
 &lt;figcaption&gt;Boot flow diagram showing Boot ROM → Preloader → Trusted OS and Monitor (Secure World) / Bootloader → OS (Normal World), with the Secure Element running its own boot chain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The chain proceeds as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Boot ROM&lt;/strong&gt;: the first code executed at power-on. It is burned into silicon at manufacture and is, in principle, immutable and unpatchable (with a few &lt;a href="https://labs.taszk.io/articles/post/huawei_kirin990_bootrom_patch/" aria-label="modern exceptions to deploy patches for vulnerabilities(opens in a new tab)" target="_blank"&gt;modern exceptions to deploy patches for vulnerabilities&lt;/a&gt;). The Boot ROM verifies and loads the next stage (the preloader or secondary bootloader). It forms the hardware root of trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preloader/Secondary Bootloader (BL2)&lt;/strong&gt;: loaded and verified by the Boot ROM. On MediaTek SoCs, this is often called the &lt;em&gt;preloader&lt;/em&gt;. It initializes hardware, loads the Trusted OS into the Secure World, and loads the main bootloader into the Normal World.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trusted OS&lt;/strong&gt;: loaded into the Secure World by the preloader. It hosts Gatekeeper, Keymaster, and other Trusted Applications. Its integrity is verified by the preloader as part of the secure boot chain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bootloader (BL3)&lt;/strong&gt;: the Normal World bootloader (e.g., Little Kernel on MediaTek, ABL on Qualcomm). It enforces Android Verified Boot (AVB), anti-rollback protections, and device-state checks before loading the Android kernel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Android OS&lt;/strong&gt;: the Linux kernel and userspace. Verified Boot (dm-verity) ensures the integrity of system partitions at runtime.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When a Secure Element is present, it runs its own independent boot chain in parallel: &lt;em&gt;Boot ROM → Bootrom EXT → Bootloader → OS&lt;/em&gt;. The Secure Element&amp;rsquo;s boot chain is entirely separate from the SoC&amp;rsquo;s, providing the most isolation.&lt;/p&gt;
&lt;p&gt;If any stage in the boot chain is compromised, all subsequent stages are untrustworthy. This is why Boot ROM vulnerabilities are so devastating: they are often unpatchable, they undermine everything built on top, and they affect every device using the vulnerable silicon for its entire hardware lifetime.&lt;/p&gt;
&lt;h2 id="android-data-encryption"&gt;
 Android data encryption
&lt;/h2&gt;
&lt;p&gt;Understanding the attack vectors requires understanding what the attacker is ultimately trying to obtain: the decryption keys for the user&amp;rsquo;s data.&lt;/p&gt;
&lt;h3 id="full-disk-encryption-vs-file-based-encryption"&gt;
 Full Disk Encryption vs. File-Based Encryption
&lt;/h3&gt;
&lt;p&gt;Android has used two encryption schemes over its history:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full Disk Encryption (FDE)&lt;/strong&gt; encrypts the entire data partition with a single key, derived from the user&amp;rsquo;s credentials. The key must be available before the OS can boot, so the user is prompted for their PIN or password at boot time. FDE was the default until Android 6 and has been &lt;a href="https://source.android.com/docs/security/features/encryption/full-disk" aria-label="deprecated since Android 13(opens in a new tab)" target="_blank"&gt;deprecated since Android 13&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File-Based Encryption (FBE)&lt;/strong&gt; encrypts individual files with different keys, allowing more granular access control. FBE has been the default since Android 7 and is required since Android 10. It divides storage into two classes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Device Encrypted (DE) storage&lt;/strong&gt;: available immediately after boot, before the user authenticates. Used for system-critical functionality (alarms, phone dialer, Direct Boot). The DE key is derived without user credentials.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credential Encrypted (CE) storage&lt;/strong&gt;: available only after the user authenticates for the first time after boot. This is where all user data resides—messages, photos, application data. The CE key is derived from the user&amp;rsquo;s credentials, stretched through scrypt, and protected by keys held in the TEE (and, when present, the Secure Element).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ce-key-derivation-the-role-of-credentials"&gt;
 CE key derivation: The role of credentials
&lt;/h3&gt;
&lt;p&gt;Quarkslab&amp;rsquo;s &lt;a href="https://blog.quarkslab.com/android-data-encryption-in-depth.html" aria-label="Android Data Encryption in depth(opens in a new tab)" target="_blank"&gt;Android Data Encryption in depth&lt;/a&gt; provides the most detailed public analysis of how the CE key is derived. The process, in simplified form, proceeds as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The user&amp;rsquo;s credentials (PIN, password, or pattern) are stretched using &lt;strong&gt;scrypt&lt;/strong&gt;, a memory-hard key derivation function, with parameters and salt stored in DE-protected files under &lt;code&gt;/data/system_de/&amp;lt;uid&amp;gt;/spblob&lt;/code&gt;. The scrypt step is intentionally slow: it introduces a negligible delay for a single authentication attempt but makes brute-forcing computationally expensive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The stretched credentials are combined with other material to form a &lt;strong&gt;password blob&lt;/strong&gt;, which is sent to the &lt;strong&gt;Gatekeeper&lt;/strong&gt; Trusted Application in the TEE. Gatekeeper verifies the blob against a stored password handle using an HMAC with an internal key. If verification succeeds, Gatekeeper issues a signed &lt;strong&gt;authentication token&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The authentication token is presented to &lt;strong&gt;Keymaster&lt;/strong&gt;, which uses it to unlock an &lt;strong&gt;authentication-bound key&lt;/strong&gt;. This key is used to perform the first decryption of the &lt;strong&gt;Synthetic Password&lt;/strong&gt;, an intermediate secret stored in encrypted form on the filesystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Synthetic Password is decrypted a second time using a key derived from the user&amp;rsquo;s credentials (the &lt;code&gt;applicationId&lt;/code&gt;). This second decryption uses AES-GCM, which provides authenticated encryption: if the wrong credentials are supplied, the GCM tag will not match and decryption will fail. This is the cryptographic check that ultimately binds the CE key to the correct credentials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the Synthetic Password, the system derives the CE file encryption keys used by the Linux kernel&amp;rsquo;s &lt;code&gt;fscrypt&lt;/code&gt; subsystem to decrypt individual files.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The critical observation is that &lt;strong&gt;user credentials are cryptographically embedded in the key derivation chain&lt;/strong&gt;. There is no way to bypass them purely through software attacks: an attacker who compromises the TEE can bypass the authentication token check, but they still need to brute-force the credentials through scrypt to derive the correct key material.&lt;/p&gt;
&lt;h3 id="key-derivation-with-a-secure-element-weaver"&gt;
 Key derivation with a Secure Element (Weaver)
&lt;/h3&gt;
&lt;p&gt;On devices with a Secure Element, the key derivation process includes an additional step. Instead of relying solely on Gatekeeper in the TEE, the system uses &lt;a href="https://source.android.com/docs/security/features" aria-label="Weaver(opens in a new tab)" target="_blank"&gt;&lt;strong&gt;Weaver&lt;/strong&gt;&lt;/a&gt;, a service running on the Secure Element. Weaver stores a secret value that is released only upon correct credential verification and enforces its own independent rate-limiting.&lt;/p&gt;
&lt;p&gt;This means that even if an attacker fully compromises the TEE, or other Trusted Applications as shown by &lt;a href="https://www.synacktiv.com/publications/kinibi-tee-trusted-application-exploitation" aria-label="Synacktiv&amp;rsquo;s Kinibi TEE blogpost(opens in a new tab)" target="_blank"&gt;Synacktiv&amp;rsquo;s Kinibi TEE blogpost&lt;/a&gt;, they cannot extract the Weaver secret or bypass its throttling, if implemented properly. Brute-forcing must proceed online, at the rate the Secure Element permits, which, for a device like the Pixel with Titan M, means exponential backoff.&lt;/p&gt;
&lt;h2 id="attack-vectors"&gt;
 Attack vectors
&lt;/h2&gt;
&lt;p&gt;With the architecture established, we can now map the specific attack surfaces that forensic tools exploit. These fall into two main categories, corresponding to teo device states: powered off or powered on but never unlocked (BFU), and powered on and previously unlocked (AFU).&lt;/p&gt;
&lt;h3 id="bfu-attacks-on-devices-without-a-secure-element"&gt;
 BFU attacks on devices without a Secure Element
&lt;/h3&gt;
&lt;p&gt;The most complete form of BFU attack targets the boot chain itself. If an attacker can compromise the Boot ROM or the preloader, they can break the entire chain of trust, including the TEE.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-05-01-demistifying-phone-unlocking-tools-bootflow-attack-no-se.svg" alt="BFU attack diagram on a device without a Secure Element: the attacker exploits the Boot ROM or enters recovery mode, compromises the preloader and Trusted OS, extracts the scrypt hash, and performs offline brute force of the PIN"&gt;
 
 &lt;figcaption&gt;BFU attack diagram on a device without a Secure Element: the attacker exploits the Boot ROM or enters recovery mode, compromises the preloader and Trusted OS, extracts the scrypt hash, and performs offline brute force of the PIN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The attack proceeds as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Boot ROM exploitation&lt;/strong&gt;: the attacker connects to the device via USB and exploits a vulnerability in the Boot ROM (or uses a vendor-specific download/recovery mode, such as MediaTek&amp;rsquo;s Download Mode or Qualcomm&amp;rsquo;s EDL mode) to gain code execution before the bootloader runs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Boot chain patching&lt;/strong&gt;: with Boot ROM-level access, the attacker patches or replaces the preloader to disable secure boot verification of subsequent stages. This allows loading a modified Trusted OS and modified Trusted Applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TEE patching&lt;/strong&gt;: the attacker replaces or patches Gatekeeper to accept any credentials and issue valid authentication tokens regardless of input. They also patch or extract keys from Keymaster. As Quarkslab demonstrated in their proof-of-concept on Samsung A22 devices (MT6769V and MT6833V SoCs), this involved patching Samsung&amp;rsquo;s TEEGRIS operating system: first disabling verification of the root filesystem, then disabling TA signature verification, and finally patching Gatekeeper&amp;rsquo;s credential comparison to always succeed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key material extraction&lt;/strong&gt;: with a rooted Android system and a compromised TEE, the attacker extracts the encrypted Synthetic Password and the intermediate decryption result from Keymaster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Offline brute force&lt;/strong&gt;: the attacker now has all the material needed for offline brute-forcing. The brute-force loop is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate a candidate password&lt;/li&gt;
&lt;li&gt;Stretch it through scrypt with the stored parameters&lt;/li&gt;
&lt;li&gt;Derive the &lt;code&gt;applicationId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Attempt AES-GCM decryption of the Synthetic Password&lt;/li&gt;
&lt;li&gt;If the GCM tag matches, the correct credentials have been found&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because this brute-force runs entirely offline, on the attacker&amp;rsquo;s hardware, it is bounded only by computational resources and password complexity. A numeric PIN of six digits or fewer is trivially recoverable. Even longer numeric PINs fall quickly on dedicated hardware. Only a strong alphanumeric and symbols password provides meaningful resistance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MediaTek devices are particularly vulnerable&lt;/strong&gt; to this attack. Multiple MediaTek SoCs contain Boot ROM vulnerabilities that are publicly known and exploited by open-source tools such as &lt;a href="https://github.com/bkerler/mtkclient" aria-label="MTKClient(opens in a new tab)" target="_blank"&gt;MTKClient&lt;/a&gt;. Because Boot ROM code is immutable, these vulnerabilities cannot be patched: every device using the affected silicon is permanently compromised, regardless of Android version or security patch level. Quarkslab&amp;rsquo;s proof-of-concept targeted exactly this class of device, demonstrating the full chain from Boot ROM exploit to CE key recovery.&lt;/p&gt;
&lt;h3 id="bfu-attacks-on-devices-with-a-secure-element"&gt;
 BFU attacks on devices with a Secure Element
&lt;/h3&gt;
&lt;p&gt;When a Secure Element is present, the attack chain is fundamentally harder. Even if the attacker achieves everything described above, they still cannot extract the Weaver secret from the Secure Element, under normal circumstances. Chances of a Secure Element exploit are pretty low, especially as being distributed as part of a widely available forensics commercial suite.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-05-01-demistifying-phone-unlocking-tools-bootflow-attack-se.svg" alt="BFU attack diagram on a device with a Secure Element: the attacker can compromise the Boot ROM, preloader, and Trusted OS, but the Secure Element enforces rate-limited online brute force"&gt;
 
 &lt;figcaption&gt;BFU attack diagram on a device with a Secure Element: the attacker can compromise the Boot ROM, preloader, and Trusted OS, but the Secure Element enforces rate-limited online brute force&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As anticipated, the Secure Element runs its own independent boot chain on physically separate silicon. Its keys cannot be extracted by the main SoC, and its rate-limiting logic is enforced in hardware that the attacker does not control.&lt;/p&gt;
&lt;p&gt;The result is that brute-force can often only proceed &lt;strong&gt;online&lt;/strong&gt;: each attempt must query the Secure Element, which enforces some kind of backoff. This slows down the attack significantly. A ten-digit PIN that falls in seconds to offline brute-force may take a long time against a properly implemented Secure Element. An alphanumeric password becomes likely unbreakable.&lt;/p&gt;
&lt;p&gt;This is why, according to Cellebrite&amp;rsquo;s own February 2025 support matrix, brute-force capabilities are generally not available for Pixel devices with Titan M. The Secure Element is doing exactly what it was designed to do.&lt;/p&gt;
&lt;p&gt;That said, the Secure Element is not immune to vulnerabilities. Quarkslab demonstrated code execution on the Titan M chip through &lt;a href="https://blog.quarkslab.com/attacking-titan-m-with-only-one-byte.html" aria-label="CVE-2022-20233(opens in a new tab)" target="_blank"&gt;CVE-2022-20233&lt;/a&gt;, a single-byte out-of-bounds write in the Keymaster task that could be exploited to hijack execution flow. This vulnerability has since been patched, but it demonstrates that Secure Elements, while vastly more resistant than TEE-only configurations, can still have issues. Google is offering up to &lt;strong&gt;$1,500,000&lt;/strong&gt; for a zero-click vulnerabilities on the &lt;a href="https://bughunters.google.com/blog/evolving-the-android-chrome-vrps-for-the-ai-era" aria-label="Pixel Titan M2(opens in a new tab)" target="_blank"&gt;Pixel Titan M2&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="afu-attacks-the-lock-screen-is-just-ui"&gt;
 AFU attacks: The lock screen is just UI
&lt;/h3&gt;
&lt;p&gt;After the first unlock, the threat model fully changes. In AFU state, the CE decryption keys are loaded in memory and remain there. The lock screen is no longer a cryptographic barrier, it is just a user interface element, a screen overlay that prevents interaction but does not re-encrypt data.&lt;/p&gt;
&lt;p&gt;This means that an AFU attacker does not need to brute-force credentials at all. They need to achieve code execution in the kernel or a privileged process, at which point they have direct access to the decrypted filesystem. The lock screen is bypassed, and no encryption needs to be broken.&lt;/p&gt;
&lt;p&gt;The primary attack surface in AFU state is the &lt;strong&gt;USB interface&lt;/strong&gt;. When a device is locked but in AFU state, the USB controller remains active and exposes the device&amp;rsquo;s kernel to a substantial attack surface.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-05-01-demistifying-phone-unlocking-tools-usb.svg" alt="USB attack surface diagram: an attacker connects a peripheral emulator to the USB controller, which reaches approximately 200 kernel drivers (MTP, MSC, HID, Audio, CVC, and others) behind the lock screen"&gt;
 
 &lt;figcaption&gt;USB attack surface diagram: an attacker connects a peripheral emulator to the USB controller, which reaches approximately 200 kernel drivers (MTP, MSC, HID, Audio, CVC, and others) behind the lock screen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As the diagram illustrates, a peripheral emulator connected to a locked device&amp;rsquo;s USB port can interact with the kernel through approximately 200 reachable drivers, including MTP (Media Transfer Protocol), MSC (Mass Storage Class), HID (Human Interface Device), Audio, and CVC (Communication Voice Class) subsystems. Each of these drivers is a potential attack surface for memory corruption vulnerabilities.&lt;/p&gt;
&lt;p&gt;The exploit used by Cellebrite against a Serbian activist&amp;rsquo;s device in December 2024, as documented by &lt;a href="https://securitylab.amnesty.org/latest/2024/12/a-digital-prison-surveillance-and-the-suppression-of-civil-society-in-serbia/" aria-label="Amnesty International(opens in a new tab)" target="_blank"&gt;Amnesty International&lt;/a&gt;, attempted to use at least three Linux kernel USB driver vulnerabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2024-53104" aria-label="CVE-2024-53104(opens in a new tab)" target="_blank"&gt;CVE-2024-53104&lt;/a&gt;&lt;/strong&gt;: a vulnerability in the USB Video Class (UVC) driver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2024-53197" aria-label="CVE-2024-53197(opens in a new tab)" target="_blank"&gt;CVE-2024-53197&lt;/a&gt;&lt;/strong&gt;: an out-of-bounds write in the ALSA USB-audio driver, triggered when a malicious USB device provides a &lt;code&gt;bNumConfigurations&lt;/code&gt; value exceeding allocated memory. This vulnerability affects legacy code present since Linux kernel 2.6.26 (2008) and was confirmed by CISA to be actively exploited in the wild.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2024-50302" aria-label="CVE-2024-50302(opens in a new tab)" target="_blank"&gt;CVE-2024-50302&lt;/a&gt;&lt;/strong&gt;: a memory leak in the HID subsystem that exposes uninitialized kernel memory, including encryption keys and authentication tokens, when processing crafted USB HID reports.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Cellebrite Turbo Link device, a specialized hardware adapter that connects between the forensic workstation and the target device, likely functions as a peripheral emulator capable of presenting itself as multiple USB device types in rapid succession, probing for each vulnerability to achieve kernel-level code execution.&lt;/p&gt;
&lt;p&gt;Many of these USB drivers are loaded by default and remain reachable even when the device is locked. The kernel does not distinguish between a legitimate USB accessory and a malicious peripheral emulator, thus this is the main weakness that AFU exploitation often relies upon.&lt;/p&gt;
&lt;h3 id="afu-attacks-on-locked-devices-in-practice"&gt;
 AFU attacks on locked devices in practice
&lt;/h3&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-05-01-demistifying-phone-unlocking-tools-usb-attack.svg" alt="AFU attack flow: USB exploit achieves kernel code execution, bypassing the lock screen to access user processes and decrypted CE storage"&gt;
 
 &lt;figcaption&gt;AFU attack flow: USB exploit achieves kernel code execution, bypassing the lock screen to access user processes and decrypted CE storage&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Once the attacker achieves kernel code execution through USB driver exploitation, the lock screen is irrelevant. The attacker can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Directly read the decrypted filesystem, since CE keys are already in memory&lt;/li&gt;
&lt;li&gt;Perform a Full File System (FFS) extraction of all user data&lt;/li&gt;
&lt;li&gt;Access application data, messages, photos, credentials, and metadata&lt;/li&gt;
&lt;li&gt;Potentially install persistent backdoors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As we already knew, &lt;strong&gt;a device in AFU state is fundamentally less secure than a device in BFU state&lt;/strong&gt;, regardless of the strength of the user&amp;rsquo;s password or the presence of a Secure Element. The Secure Element protects credential-derived keys at boot; it does not protect already-decrypted data in memory after the first unlock.&lt;/p&gt;
&lt;p&gt;This is confirmed by Cellebrite&amp;rsquo;s February 2025 support matrix, which shows AFU extraction capabilities even for devices (including recent Pixels with stock Android) that resist BFU attacks. Notably, according to the same documentation, GrapheneOS on Pixel devices resists AFU extraction, probably thanks to the attack surface reduction and the USB restrictions that are implemented beyond stock Android.&lt;/p&gt;
&lt;h3 id="a-note-on-ios-checkm8-and-usb-restricted-mode"&gt;
 A note on iOS: checkm8 and USB Restricted Mode
&lt;/h3&gt;
&lt;p&gt;Apple devices face analogous attack surfaces. The &lt;strong&gt;checkm8&lt;/strong&gt; exploit, publicly released in 2019, targets an unpatchable Boot ROM vulnerability present in all Apple devices from the iPhone 4S through the iPhone X (A5 through A11 SoCs). Like MediaTek Boot ROM vulnerabilities, checkm8 cannot be fixed through software updates: every affected device is permanently exploitable.&lt;/p&gt;
&lt;p&gt;For newer Apple devices, AFU attacks rely on USB-based exploitation. Apple introduced &lt;strong&gt;USB Restricted Mode&lt;/strong&gt; in iOS 11.4.1 to mitigate this: if the device has been locked for more than one hour, the Lightning or USB-C port is restricted to charging only, disabling data connections that forensic tools require.&lt;/p&gt;
&lt;p&gt;However, Quarkslab&amp;rsquo;s &lt;a href="https://blog.quarkslab.com/first-analysis-of-apples-usb-restricted-mode-bypass-cve-2025-24200.html" aria-label="analysis of CVE-2025-24200 (reported by CitizenLab)(opens in a new tab)" target="_blank"&gt;analysis of CVE-2025-24200 (reported by CitizenLab)&lt;/a&gt; revealed that USB Restricted Mode was bypassable. The vulnerability, reported by Citizen Lab and patched in iOS 18.3.1, allowed a physical attacker to re-enable USB data connections on a locked device by exploiting a flaw in the Accessibility framework. The &lt;code&gt;profiled&lt;/code&gt; daemon, which handles device management settings, failed to check whether the device was locked before processing requests to disable USB Restricted Mode. In other words, &lt;strong&gt;the USB port was only soft-disabled&lt;/strong&gt;: something as simple as a logic bug in the policy enforcement allowed it to be re-enabled.&lt;/p&gt;
&lt;h2 id="defensive-implications"&gt;
 Defensive implications
&lt;/h2&gt;
&lt;p&gt;The attack vectors described above lead to a clear set of defensive priorities.&lt;/p&gt;
&lt;h3 id="bfu-is-your-best-defense"&gt;
 BFU is your best defense
&lt;/h3&gt;
&lt;p&gt;The most impactful single action when facing potential device seizure is to &lt;strong&gt;power the device off&lt;/strong&gt;. This returns it to BFU state, where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CE storage is encrypted and keys are not in memory&lt;/li&gt;
&lt;li&gt;USB driver exploitation cannot yield decrypted data&lt;/li&gt;
&lt;li&gt;The attacker must compromise the boot chain &lt;em&gt;and&lt;/em&gt; brute-force credentials&lt;/li&gt;
&lt;li&gt;On devices with a Secure Element, brute-force is rate-limited by hardware&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="auto-reboot-returning-to-bfu-automatically"&gt;
 Auto-reboot: returning to BFU automatically
&lt;/h3&gt;
&lt;p&gt;If a device cannot be manually powered off, an automatic reboot mechanism provides the next best defense. After a configurable period without user authentication, the device reboots, returning to BFU state and purging decryption keys from memory.&lt;/p&gt;
&lt;p&gt;GrapheneOS has implemented this feature for years. Apple introduced it in iOS 18. Stock Android on Pixel devices gained a limited version in Android 15, but its implementation remains less configurable and less aggressive than GrapheneOS&amp;rsquo;s. The feature is the most useful if the timeout is short (2-4 hours) and loses its value when its multiple days, as Google enforces likely as a result of negotiation with law enforcement.&lt;/p&gt;
&lt;h3 id="usb-port-restriction"&gt;
 USB port restriction
&lt;/h3&gt;
&lt;p&gt;Disabling USB data transfer when the device is locked directly eliminates the AFU attack surface described above. Android 15 introduces USB restriction options; iOS has had USB Restricted Mode since version 11. GrapheneOS provides more trustworthy and configurable USB restriction.&lt;/p&gt;
&lt;h3 id="password-strength"&gt;
 Password strength
&lt;/h3&gt;
&lt;p&gt;The brute-force analysis makes the case for strong passwords unambiguous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 4-digit PIN: trivially crackable offline, and crackable even online within hours to days&lt;/li&gt;
&lt;li&gt;A 6-digit PIN: trivially crackable offline; crackable online within days to weeks depending on rate-limiting implementation&lt;/li&gt;
&lt;li&gt;A pattern: equivalent to or weaker than a short PIN in entropy&lt;/li&gt;
&lt;li&gt;An alphanumeric password of 10+ characters with mixed case and symbols: computationally unlikely to brute-force offline through scrypt; almost impossible to brute-force online against a Secure Element&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The password is only required at boot. Biometric authentication (fingerprint, face recognition) handles daily unlocking, unless the user is in a jurisdiction where physical coercion is likely, whether lawfully or not. The marginal inconvenience of entering a strong password once after each reboot is minimal compared to the protection it provides.&lt;/p&gt;
&lt;h3 id="device-choice"&gt;
 Device choice
&lt;/h3&gt;
&lt;p&gt;According to Cellebrite&amp;rsquo;s own February 2025 documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MediaTek-based devices&lt;/strong&gt;: effectively no mitigation possible against BFU attacks due to unpatchable Boot ROM vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Most non-Pixel, non-Samsung Android devices&lt;/strong&gt;: considered unlockable, with few exceptions, due to a combination of delayed security updates, weak TEE implementations, and absent Secure Elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Samsung devices (Exynos)&lt;/strong&gt;: partial protection, varying by model and patch level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Pixel with stock Android&lt;/strong&gt;: resistant to BFU attacks on recent models, but AFU file system extraction is possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Pixel with GrapheneOS&lt;/strong&gt;: resistant to both BFU and AFU attacks on recent models (6a and newer). This is the strongest protection available on any Android device.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is worth noting that alternative Android distributions such as LineageOS or CalyxOS, while valuable for other reasons, do not meaningfully change the forensic unlocking picture from the stock or vendor ROM.&lt;/p&gt;
&lt;h3 id="application-level-encryption"&gt;
 Application-level encryption
&lt;/h3&gt;
&lt;p&gt;Applications that implement their own encryption layer with a separate password can provide defense-in-depth against full device compromise. Password managers&amp;rsquo; master password vaults are a good example: even if the entire device filesystem is extracted, the vault remains encrypted under a key that the forensic tool has not obtained.&lt;/p&gt;
&lt;p&gt;However, the effectiveness of application-level protection depends on several factors: whether the app actually implements its own encryption independently from the OS credential protection, whether decryption keys remain in memory after first unlock (making them vulnerable to AFU extraction), whether the app relies on the system biometric authentication (which, without a Secure Element, is broken along with the rest of the OS key hierarchy), and whether notifications or message previews are cached in plaintext outside the app&amp;rsquo;s encrypted storage.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;The way these tools operate is not magic nor secret. The more we collect samples, reverse engineer and read promotional and support material, the better we understand capabilities and defenses.&lt;/p&gt;
&lt;p&gt;As we said many times these tools simply shouldn&amp;rsquo;t commercially exist. The companies that build these tools are active participants in the zero-day vulnerability trade, stockpiling security flaws that weaken every device, for every user, everywhere. The technical defenses described here are effective but place the burden on individuals and communities.&lt;/p&gt;
&lt;h2 id="references"&gt;
 References
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Quarkslab, &amp;ldquo;&lt;a href="https://blog.quarkslab.com/android-data-encryption-in-depth.html" aria-label="Android Data Encryption in depth(opens in a new tab)" target="_blank"&gt;Android Data Encryption in depth&lt;/a&gt;&amp;rdquo; (2023)&lt;/li&gt;
&lt;li&gt;Quarkslab, &amp;ldquo;&lt;a href="https://blog.quarkslab.com/introduction-to-trusted-execution-environment-arms-trustzone.html" aria-label="Introduction to Trusted Execution Environment: ARM&amp;rsquo;s TrustZone™(opens in a new tab)" target="_blank"&gt;Introduction to Trusted Execution Environment: ARM&amp;rsquo;s TrustZone™&lt;/a&gt;&amp;rdquo; (2018)&lt;/li&gt;
&lt;li&gt;Quarkslab, &amp;ldquo;&lt;a href="https://blog.quarkslab.com/a-deep-dive-into-samsungs-trustzone-part-1.html" aria-label="A Deep Dive into Samsung&amp;rsquo;s TrustZone™(opens in a new tab)" target="_blank"&gt;A Deep Dive into Samsung&amp;rsquo;s TrustZone™&lt;/a&gt;&amp;rdquo; (series)&lt;/li&gt;
&lt;li&gt;Quarkslab, &amp;ldquo;&lt;a href="https://blog.quarkslab.com/attacking-titan-m-with-only-one-byte.html" aria-label="Attacking Titan M with Only One Byte(opens in a new tab)" target="_blank"&gt;Attacking Titan M with Only One Byte&lt;/a&gt;&amp;rdquo; (2022)&lt;/li&gt;
&lt;li&gt;Quarkslab, &amp;ldquo;&lt;a href="https://blog.quarkslab.com/first-analysis-of-apples-usb-restricted-mode-bypass-cve-2025-24200.html" aria-label="First analysis of Apple&amp;rsquo;s USB Restricted Mode bypass (CVE-2025-24200)(opens in a new tab)" target="_blank"&gt;First analysis of Apple&amp;rsquo;s USB Restricted Mode bypass (CVE-2025-24200)&lt;/a&gt;&amp;rdquo; (2025)&lt;/li&gt;
&lt;li&gt;Quarkslab, &amp;ldquo;&lt;a href="https://blog.quarkslab.com/reverse-engineering-samsung-s6-sboot-part-i.html" aria-label="Reverse Engineering Samsung S6 SBoot(opens in a new tab)" target="_blank"&gt;Reverse Engineering Samsung S6 SBoot&lt;/a&gt;&amp;rdquo; (series)&lt;/li&gt;
&lt;li&gt;Synacktiv, &amp;ldquo;&lt;a href="https://www.synacktiv.com/publications/kinibi-tee-trusted-application-exploitation" aria-label="Kinibi TEE: Trusted Application exploitation(opens in a new tab)" target="_blank"&gt;Kinibi TEE: Trusted Application exploitation&lt;/a&gt;&amp;rdquo; (2018)&lt;/li&gt;
&lt;li&gt;Amnesty International Security Lab, &amp;ldquo;&lt;a href="https://securitylab.amnesty.org/latest/2024/12/a-digital-prison-surveillance-and-the-suppression-of-civil-society-in-serbia/" aria-label="A Digital Prison: Surveillance and the suppression of civil society in Serbia(opens in a new tab)" target="_blank"&gt;A Digital Prison: Surveillance and the suppression of civil society in Serbia&lt;/a&gt;&amp;rdquo; (2024)&lt;/li&gt;
&lt;li&gt;Amnesty International Security Lab, &amp;ldquo;&lt;a href="https://securitylab.amnesty.org/latest/2025/02/cellebrite-zero-day-exploit-used-to-target-phone-of-serbian-student-activist/" aria-label="Cellebrite zero-day exploit used to target phone of Serbian student activist(opens in a new tab)" target="_blank"&gt;Cellebrite zero-day exploit used to target phone of Serbian student activist&lt;/a&gt;&amp;rdquo; (2025)&lt;/li&gt;
&lt;li&gt;GrapheneOS, &amp;ldquo;&lt;a href="https://discuss.grapheneos.org/d/14344-cellebrite-premium-july-2024-documentation" aria-label="Discussion on Cellebrite Premium July 2024 documentation(opens in a new tab)" target="_blank"&gt;Discussion on Cellebrite Premium July 2024 documentation&lt;/a&gt;&amp;rdquo; (2024)&lt;/li&gt;
&lt;li&gt;Samsung Knox, &amp;ldquo;&lt;a href="https://docs.samsungknox.com/admin/knox-platform-for-enterprise/kbas/kba-360039577713/" aria-label="Encryption systems description(opens in a new tab)" target="_blank"&gt;Encryption systems description&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Google, &amp;ldquo;&lt;a href="https://docs.cloud.google.com/docs/security/titan-hardware-chip" aria-label="Titan Hardware Chip documentation(opens in a new tab)" target="_blank"&gt;Titan Hardware Chip documentation&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Google, &amp;ldquo;&lt;a href="https://blog.google/products/pixel/titan-m-makes-pixel-3-our-most-secure-phone-yet/" aria-label="Titan M makes Pixel 3 our most secure phone yet(opens in a new tab)" target="_blank"&gt;Titan M makes Pixel 3 our most secure phone yet&lt;/a&gt;&amp;rdquo; (2018)&lt;/li&gt;
&lt;li&gt;Android Source, &amp;ldquo;&lt;a href="https://source.android.com/docs/security/features/encryption/file-based" aria-label="File-Based Encryption(opens in a new tab)" target="_blank"&gt;File-Based Encryption&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Android Source, &amp;ldquo;&lt;a href="https://source.android.com/docs/security/features/encryption/full-disk" aria-label="Full-Disk Encryption(opens in a new tab)" target="_blank"&gt;Full-Disk Encryption&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Bjoern Kerler, &amp;ldquo;&lt;a href="https://github.com/bkerler/mtkclient" aria-label="MTKClient(opens in a new tab)" target="_blank"&gt;MTKClient&lt;/a&gt;&amp;rdquo; — open-source tool exploiting MediaTek Boot ROM vulnerabilities&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Morpheus: A new Spyware linked to IPS Intelligence</title><link>/blog/2026/04/morpheus-a-new-spyware-linked-to-ips-intelligence/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>/blog/2026/04/morpheus-a-new-spyware-linked-to-ips-intelligence/</guid><description>&lt;p&gt;&lt;em&gt;If you are an activist or journalist concerned about the security of your devices, or if your device has been seized and you need technical assistance, &lt;a href="/contacts/"&gt;contact us&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We have analyzed a sample of a previously unknown Android spyware, likely developed in Italy. It is named &amp;ldquo;&lt;strong&gt;Morpheus&lt;/strong&gt;&amp;rdquo;, version &lt;strong&gt;2025.3.0&lt;/strong&gt;, and we describe its capabilities, including abusing accessibility features, automatically enabling ADB and issuing commands, disabling microphone and camera indicators, pairing additional WhatsApp devices, taking screenshots, recording audio and video, and more. We link part of the infrastructure to &lt;a href="/nascondino/ips/"&gt;IPS Intelligence&lt;/a&gt;, and discover some potentially related companies, Rever Servicenet and Iris Telecomunicazioni.&lt;/p&gt;
&lt;h2 id="the-spyware"&gt;
 The Spyware
&lt;/h2&gt;
&lt;h3 id="infection"&gt;
 Infection
&lt;/h3&gt;
&lt;p&gt;As reported many times both &lt;a href="https://osservatorionessuno.org/blog/2026/04/italian-spyware-maker-sio-still-developing-and-distributing-spyrtacus/" aria-label="by us(opens in a new tab)" target="_blank"&gt;by us&lt;/a&gt; and &lt;a href="https://arachidi.noblogs.org/" aria-label="other well-documented cases by activists and other sources(opens in a new tab)" target="_blank"&gt;other well-documented cases by activists and other sources&lt;/a&gt;, the infection mechanism is the usual for low cost spyware: deny a service to the target and then social engineer them to install an app in order to restore or obtain such service. This is often applied to mobile data, but not necessarily restricted to it. In this case, the person under attack received an SMS pointing to &lt;code&gt;assistenza-sim.it&lt;/code&gt;. The app impersonated the Fastweb ISP.&lt;/p&gt;
&lt;h3 id="first-stage-the-dropper"&gt;
 First Stage: The Dropper
&lt;/h3&gt;
&lt;p&gt;The dropper uses the &lt;code&gt;com.android.cored&lt;/code&gt; package name, with &lt;code&gt;versionCode=&amp;quot;1&amp;quot;&lt;/code&gt; and &lt;code&gt;versionName=&amp;quot;0.9.23&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The dropper application is a fork of &lt;a href="https://github.com/solrudev/SimpleInstaller" aria-label="solrudev&amp;rsquo;s SimpleInstaller(opens in a new tab)" target="_blank"&gt;solrudev&amp;rsquo;s SimpleInstaller&lt;/a&gt;, an open-source rudimentary Android package installer wrapper that makes it easy to install third-party apps.&lt;/p&gt;
&lt;p&gt;The code of the installer&amp;rsquo;s &lt;code&gt;io.github.solrudev.simpleinstaller.sampleapp.ui.MainActivity&lt;/code&gt; was edited to automate the installation of the second stage of the spyware. The second stage is directly embedded inside the APK at &lt;code&gt;/assets/mobile-config.apk&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once the person under surveillance executes the dropper:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It checks if the second stage is already installed querying for the &lt;code&gt;com.android.core&lt;/code&gt; package name&lt;/li&gt;
&lt;li&gt;If it is not the case, it copies the &lt;code&gt;mobile-config.apk&lt;/code&gt; from the &lt;code&gt;assets&lt;/code&gt; folder of the APK to the device storage&lt;/li&gt;
&lt;li&gt;If an external intent with action &lt;code&gt;action_gustavo&lt;/code&gt; is received, the dropper installs the second stage&lt;/li&gt;
&lt;li&gt;If the user has granted &lt;code&gt;REQUEST_INSTALL_PACKAGES&lt;/code&gt; and &lt;code&gt;READ_EXTERNAL_STORAGE&lt;/code&gt; permissions to the dropper, it installs the second stage&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-3_hu_eaaacb416e9524ee.webp" alt="Infection first stage: informing of an update"&gt;
 
 &lt;figcaption&gt;Infection first stage: informing of an update&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-4_hu_f26b984c9b8c9124.webp" alt="Infection first stage: second stage successfully installed"&gt;
 
 &lt;figcaption&gt;Infection first stage: second stage successfully installed&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="second-stage-the-agent"&gt;
 Second Stage: The Agent
&lt;/h3&gt;
&lt;p&gt;The agent uses the &lt;code&gt;com.android.core&lt;/code&gt; package name, with &lt;code&gt;versionCode=&amp;quot;1&amp;quot;&lt;/code&gt; and &lt;code&gt;versionName=&amp;quot;2025.3.0&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Inside of the &lt;code&gt;AndroidManifest.xml&lt;/code&gt; the application defines multiple activities, receivers and services.
The most interesting are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;com.android.main.SplashScreenActivity&lt;/code&gt; with label &lt;code&gt;Mobile Config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.FakeServiceActivity&lt;/code&gt; with label &lt;code&gt;Impostazioni microG&lt;/code&gt; alias of &lt;code&gt;SplashScreenActivity&lt;/code&gt;, posing as a fake &lt;a href="https://github.com/microg" aria-label="microG(opens in a new tab)" target="_blank"&gt;microG&lt;/a&gt; Settings icon.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.Launcher2Activity&lt;/code&gt; with label &lt;code&gt;PlayProtect&lt;/code&gt; alias of &lt;code&gt;SplashScreenActivity&lt;/code&gt;, posing as a fake &lt;a href="https://support.google.com/googleplay/answer/2812853" aria-label="Google Play Protect(opens in a new tab)" target="_blank"&gt;Google Play Protect&lt;/a&gt; icon.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.LauncherActivity&lt;/code&gt; with label &lt;code&gt;Mobile Config&lt;/code&gt; alias of &lt;code&gt;SplashScreenActivity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.MainActivity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.AboutAppActivity&lt;/code&gt;, showing a generic about UI.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.EmptyActivity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.main.ForcePermissionsActivity&lt;/code&gt;, forcing the user to enable the required permissions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.broadcast.CoreBroadcastReceiver&lt;/code&gt;, a receiver with &lt;code&gt;RECEIVE_BOOT_COMPLETED&lt;/code&gt; permission.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.admin.DeviceAdminSampleReceiver&lt;/code&gt;, a receiver with &lt;code&gt;BIND_DEVICE_ADMIN&lt;/code&gt; permission.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.core.CoreService&lt;/code&gt;, a service with &lt;code&gt;BIND_ACCESSIBILITY_SERVICE&lt;/code&gt; permission.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;CoreService&lt;/code&gt; handles all the &lt;a href="https://support.google.com/googleplay/android-developer/answer/10964491" aria-label="Accessibility(opens in a new tab)" target="_blank"&gt;Accessibility&lt;/a&gt; actions. &lt;strong&gt;Accessibility Services&lt;/strong&gt; are designed to help users with disabilities access their devices. Such applications can read the whole screen, click on graphical elements, interact with other applications. Unfortunately, this powerful capability is often exploited by malware, prompting Google to roll out a &lt;a href="https://www.malwarebytes.com/blog/mobile/2026/03/google-cracks-down-on-android-apps-abusing-accessibility" aria-label="series of mitigations(opens in a new tab)" target="_blank"&gt;series of mitigations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The sample declares &lt;a href="https://developer.android.com/reference/android/R.styleable#AccessibilityService_isAccessibilityTool" aria-label="isAccessibilityTool=&amp;quot;true&amp;quot;(opens in a new tab)" target="_blank"&gt;&lt;code&gt;isAccessibilityTool=&amp;quot;true&amp;quot;&lt;/code&gt;&lt;/a&gt; in the manifest to pose itself as a legitimate accessibility tool and to obtain the full Accessibility permission set.
Starting with Android 13, apps that are sideloaded (installed outside of Google Play) are blocked from obtaining Accessibility privileges due to the &lt;a href="https://techwiser.com/how-to-bypass-restricted-accessibility-settings-on-android-13-14/" aria-label="Restricted Settings(opens in a new tab)" target="_blank"&gt;Restricted Settings&lt;/a&gt; feature.
The dropper‑installation technique circumvents this restriction, allowing the malicious app to gain the needed permissions despite the intended protection.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;CoreBroadcastReceiver&lt;/code&gt; listens for the system’s boot‑completed broadcast, enabling the app to re‑launch automatically after a device reboot and thereby maintain &lt;strong&gt;persistence&lt;/strong&gt;. The &lt;code&gt;DeviceAdminSampleReceiver&lt;/code&gt; is the component that receives Device‑admin callbacks, allowing the application to acquire and manage &lt;strong&gt;Device‑admin privileges&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When the person under attack launches the app, they see a screen that offers to &lt;em&gt;scan&lt;/em&gt; for problems with either the &lt;strong&gt;SIM&lt;/strong&gt; or the &lt;strong&gt;network connection&lt;/strong&gt;, a phishing pretext designed to coerce them into cooperation.&lt;/p&gt;
&lt;p&gt;Once the scan finishes, the &lt;strong&gt;Update configurations&lt;/strong&gt; button becomes enabled; tapping it opens the Settings page where the app requests &lt;strong&gt;Accessibility&lt;/strong&gt; privileges.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-5_hu_bd4367ad1f632a83.webp" alt="The second stage (agent) welcome screen"&gt;
 
 &lt;figcaption&gt;The second stage (agent) welcome screen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="techniques"&gt;
 Techniques
&lt;/h2&gt;
&lt;h3 id="abusing-overlay--accessibility-to-bypass-biometric-authentication"&gt;
 Abusing Overlay &amp;amp; Accessibility to Bypass Biometric Authentication
&lt;/h3&gt;
&lt;p&gt;If the preceding &lt;em&gt;shenanigans&lt;/em&gt; weren&amp;rsquo;t alarming enough, the sheer number of permissions the app requests further confirms its malicious intent.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-6_hu_c09c499d7bdf5240.webp" alt="Permissions request from the second stage"&gt;
 
 &lt;figcaption&gt;Permissions request from the second stage&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://developer.android.com/reference/android/Manifest.permission#SYSTEM_ALERT_WINDOW" aria-label="SYSTEM_ALERT_WINDOW(opens in a new tab)" target="_blank"&gt;&lt;code&gt;SYSTEM_ALERT_WINDOW&lt;/code&gt;&lt;/a&gt; permission is extremely powerful as it lets a malicious app draw UI elements on top of every other app and even system components. This is &lt;a href="https://www.malwarebytes.com/blog/news/2024/06/explained-android-overlays-and-how-they-are-used-to-trick-people" aria-label="often abused by malware(opens in a new tab)" target="_blank"&gt;often abused by malware&lt;/a&gt; to trick the user into interacting with a legitimate-looking app while performing unwanted actions on a previously installed underlying app, such as WhatsApp.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This overlay is displayed above all other UI elements&lt;/strong&gt;, including system interfaces such as notifications, the status bar (battery indicator, time, etc.), volume level indicators, and the screenshot overlay.&lt;/p&gt;
&lt;p&gt;By analyzing where the spyware uses this overlay window we discovered that it implements various Accessibility &lt;strong&gt;Workflows&lt;/strong&gt;.
Each workflow consists of a sequence of steps that specify which Accessibility action to perform—e.g., clicking a button, locating a UI element by &lt;em&gt;XPath&lt;/em&gt; or by its visible text, and so on.&lt;/p&gt;
&lt;p&gt;After granting &lt;strong&gt;Accessibility&lt;/strong&gt; permissions, the spyware starts a &lt;strong&gt;Permission Workflow&lt;/strong&gt; that creates an overlay with a &lt;em&gt;fake update process&lt;/em&gt; and a &lt;em&gt;fake reboot screen&lt;/em&gt;. In background, the workflow performs all the steps to grant all the needed permissions. This includes &lt;strong&gt;enabling Developer Options&lt;/strong&gt;, turning on &lt;strong&gt;Wireless Debugging&lt;/strong&gt;, and &lt;strong&gt;locally pairing to the ADB daemon&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Conveniently, during the fake update the app &lt;a href="https://developer.android.com/reference/android/view/WindowManager.LayoutParams#FLAG_NOT_TOUCHABLE" aria-label="disables the touchscreen(opens in a new tab)" target="_blank"&gt;disables the touchscreen&lt;/a&gt; by setting &lt;code&gt;FLAG_NOT_TOUCHABLE&lt;/code&gt; on the whole full-screen overlay, leaving the user partially unable to respond to the infection.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-7_hu_209b9188f9d4c313.webp" alt="The second stage performing a fake software update"&gt;
 
 &lt;figcaption&gt;The second stage performing a fake software update&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-8_hu_555d3b8fde4e18fa.webp" alt="The second stage displaying a fake reboot overlay"&gt;
 
 &lt;figcaption&gt;The second stage displaying a fake reboot overlay&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-9_hu_b06f7ab5688c121.webp" alt="Code snippet showing the workflow for granting Device Admin capabilities"&gt;
 
 &lt;figcaption&gt;Code snippet showing the workflow for granting Device Admin capabilities&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;After the fake update, the spyware launches a second workflow called &lt;strong&gt;WhatsApp Workflow&lt;/strong&gt;. This workflow shows an overlay that presents a survey asking the targeted person what problem they’re experiencing, while in the background it silently opens WhatsApp and links a new malicious device.&lt;/p&gt;
&lt;p&gt;On devices where Android fingerprint login is enabled, &lt;strong&gt;WhatsApp Linked Devices&lt;/strong&gt; requires a &lt;a href="https://faq.whatsapp.com/1046791737425017/?cms_platform=android" aria-label="biometric confirmation(opens in a new tab)" target="_blank"&gt;biometric confirmation&lt;/a&gt; before the pairing can complete. This prevents malicious actors from adding themselves and access all the chats and messages while the phone is unlocked.&lt;/p&gt;
&lt;p&gt;However, the spyware handles this scenario by triggering WhatsApp’s biometric request in the background and displaying a fake biometric UI on the overlay. &lt;strong&gt;When the person under surveillance taps the fingerprint sensor on the counterfeit dialog, they unknowingly grant the spyware full access to their WhatsApp account.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-10.gif" alt="The agent’s overlay requiring biometric authentication, while using it to add a WhatsApp device underneath"&gt;
 
 &lt;figcaption&gt;The agent’s overlay requiring biometric authentication, while using it to add a WhatsApp device underneath&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="elevating-privileges-through-adb"&gt;
 Elevating Privileges through ADB
&lt;/h3&gt;
&lt;p&gt;As explained earlier, during the Accessibility Workflow the spyware turns on Wireless Debugging and pairs itself with the ADB daemon. This gives it elevated &lt;code&gt;shell&lt;/code&gt; privileges and is performed by the &lt;code&gt;omglib-impl.jar&lt;/code&gt; component.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-11_hu_931c954da1856ed4.webp" alt="The ADB connection feature is named DISPERAZIONE"&gt;
 
 &lt;figcaption&gt;The ADB connection feature is named DISPERAZIONE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The agent establishes a local communication channel to ADB, and then executes a prepackaged shell script named &lt;code&gt;commands.txt&lt;/code&gt;. The script is organized in four distinct phases, each covering a different aspect of the Android privileges it requires.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;first phase&lt;/strong&gt;, the agent performs a series of &lt;code&gt;pm grant&lt;/code&gt; commands to silently grant itself every dangerous runtime permission it had declared without any user prompt. &lt;code&gt;WRITE_SECURE_SETTINGS&lt;/code&gt; and &lt;code&gt;USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER&lt;/code&gt; (the latter normally reserved for carrier apps) are granted in the same batch. The agent then registers as a notification listener, allowlists itself from &lt;a href="https://source.android.com/docs/core/power/platform_mgmt" aria-label="Doze(opens in a new tab)" target="_blank"&gt;Doze&lt;/a&gt; (excluding itself from the &lt;em&gt;battery saving&lt;/em&gt; mode) via &lt;code&gt;cmd deviceidle whitelist&lt;/code&gt;, lifts every background execution restriction through &lt;code&gt;appops&lt;/code&gt;, and finally promotes itself to &lt;strong&gt;Device Administrator&lt;/strong&gt; with &lt;code&gt;dpm set-active-admin&lt;/code&gt;. By the end of this phase the agent has unprompted access to essentially every sensitive data source on the device, unconstrained background execution, and protection against non-administrative uninstall.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;second phase&lt;/strong&gt; consists of a number of &lt;strong&gt;anti-detection&lt;/strong&gt; commands. Three commands in particular are worth highlighting:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cmd device_config put privacy camera_mic_icons_enabled false default
settings put global package_verifier_user_consent -1
[AND_SDK&amp;gt;30] service call sensor_privacy 10 i32 0 i32 0 i32 1 i32 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first line &lt;em&gt;disables the green camera and microphone indicator&lt;/em&gt; introduced in &lt;a href="https://support.google.com/android/answer/13532937?hl=en" aria-label="Android 12(opens in a new tab)" target="_blank"&gt;Android 12&lt;/a&gt;. The &lt;code&gt;camera_mic_icons_enabled&lt;/code&gt; key lives in Android&amp;rsquo;s &lt;a href="https://cs.android.com/android/platform/superproject/&amp;#43;/android-latest-release:frameworks/base/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java?q=camera_mic_icons_enabled&amp;amp;ss=android%2Fplatform%2Fsuperproject" aria-label="SystemUI DeviceConfig(opens in a new tab)" target="_blank"&gt;&lt;code&gt;SystemUI DeviceConfig&lt;/code&gt;&lt;/a&gt;, the service managing the flag used by SystemUI to decide whether to render the indicator. This flag is not available to end-users and normal applications, but it can be performed by the &lt;code&gt;shell&lt;/code&gt; user through &lt;strong&gt;ADB&lt;/strong&gt;. The exact command line used by this sample &lt;a href="https://xdaforums.com/t/how-do-deactivate-the-green-sensor-indicator-microphone-and-camera.4388359/" aria-label="was circulating on XDA(opens in a new tab)" target="_blank"&gt;was circulating on XDA&lt;/a&gt; for years. The issue was only &lt;em&gt;silently&lt;/em&gt; fixed in Android 16, which now returns a &lt;code&gt;SecurityException&lt;/code&gt; when setting dangerous flags.&lt;/p&gt;
&lt;p&gt;The second line disables Play Protect&amp;rsquo;s install time verifier consent. The third, guarded by an Android 11+ check, is a raw binder transaction into &lt;code&gt;SensorPrivacyService&lt;/code&gt;, the system service backing the Quick Settings &lt;strong&gt;&amp;ldquo;Camera access&amp;rdquo;&lt;/strong&gt; and &lt;strong&gt;&amp;ldquo;Microphone access&amp;rdquo;&lt;/strong&gt; toggles. If the user had explicitly hit the microphone kill switch in &amp;ldquo;Quick Settings&amp;rdquo;, this one liner silently flips it back.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;third phase&lt;/strong&gt; the spyware disables a number of known Antivirus software, including Google&amp;rsquo;s own SafetyCore, Bitdefender, Sophos, Avast, AVG, Malwarebytes, along with a handful of smaller &amp;ldquo;cleaner/antivirus&amp;rdquo; apps popular on low end devices. None of these requires root, and persists across reboots since the Android security model treats user&amp;rsquo;s installed anti-malware software like ordinary apps.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;fourth phase&lt;/strong&gt; the sample executes per-OEM command blocks that target the battery optimization and &amp;ldquo;phone manager&amp;rdquo; packages each brand of Android distribution uses to aggressively kill background processes. Oppo/ColorOS, Samsung, Motorola, Realme, and Huawei each get their own setup. The most thorough block is for MIUI/HyperOS: the script disables roughly a dozen MIUI specific packages then issues a sequence of commands to control behaviors like autostart, background activity, background location, and lock screen display, as MIUI restricts some by default even after the equivalent AOSP permissions are granted.&lt;/p&gt;
&lt;p&gt;The MIUI block ends with a final line:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;settings put system locked_apps &amp;#34;[{\&amp;#34;u\&amp;#34;:0,\&amp;#34;pkgs\&amp;#34;:[\&amp;#34;com.android.core\&amp;#34;]},{\&amp;#34;u\&amp;#34;:-100,\&amp;#34;pkgs\&amp;#34;:[\&amp;#34;com.jeejen.family.miui\&amp;#34;]}]&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;locked_apps&lt;/code&gt; is a MIUI specific secure settings key backing MIUI&amp;rsquo;s &amp;ldquo;Lock app in Recents&amp;rdquo; feature, which pins a package against user initiated force stop from the task switcher.&lt;/p&gt;
&lt;h2 id="attribution"&gt;
 Attribution
&lt;/h2&gt;
&lt;h3 id="aprafoco-spaghetti--gomorra"&gt;
 &amp;ldquo;Aprafoco&amp;rdquo;, Spaghetti &amp;amp; Gomorra
&lt;/h3&gt;
&lt;p&gt;In the spyware code we found several Italian linguistic artifacts, and references to Italian pop‑culture items and television series.&lt;/p&gt;
&lt;p&gt;The sample contains a native library named &lt;code&gt;libaprafocofb.so&lt;/code&gt;. Its name (&amp;ldquo;A pra foco&amp;rdquo;, a malapropism for &lt;em&gt;&amp;ldquo;a tra poco&amp;rdquo;&lt;/em&gt; meaning &lt;em&gt;&amp;ldquo;in a short time&amp;rdquo;&lt;/em&gt;) comes from a &lt;a href="https://www.youtube.com/watch?v=Rwu2Lc5dkJU&amp;amp;t=13s" aria-label="well‑known on‑air slip by journalist Luca Giurato(opens in a new tab)" target="_blank"&gt;well‑known on‑air slip by journalist &lt;em&gt;Luca Giurato&lt;/em&gt;&lt;/a&gt;.
This library is a &lt;strong&gt;fork bomb&lt;/strong&gt; (hence the &lt;code&gt;fb&lt;/code&gt; suffix in the name) that repeatedly creates new processes to exhaust system resources, forcing a reboot.&lt;/p&gt;
&lt;p&gt;Inside the &lt;code&gt;Downloader&lt;/code&gt; component, used to download new modules remotely from the Command-and-Control server, a class named &lt;code&gt;GomorraException&lt;/code&gt; is used to raise network-related errors.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-12_hu_803d9e661f62058e.webp" alt="Code snippet invoking a GomorraException with a quote from the series"&gt;
 
 &lt;figcaption&gt;Code snippet invoking a GomorraException with a quote from the series&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-13_hu_1c47fbe5ed3e09a6.webp" alt="Second code snippet invoking a GomorraException with a quote from the series"&gt;
 
 &lt;figcaption&gt;Second code snippet invoking a GomorraException with a quote from the series&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Finally, a function named &lt;code&gt;spaghettiTime&lt;/code&gt; is present to derive an MD5 hash.&lt;/p&gt;
&lt;h3 id="targets"&gt;
 Targets
&lt;/h3&gt;
&lt;p&gt;Even though the spyware appears to be &lt;em&gt;made in Italy&lt;/em&gt;, our analysis revealed translations and artifacts for several languages, both in the on‑screen text and in the strings used by the Accessibility Workflows.&lt;/p&gt;
&lt;p&gt;Specifically, the spyware includes support for devices with the following locales: &lt;strong&gt;Italian, English, Spanish, Romanian, French, and Arabic&lt;/strong&gt;. The depth of support and the set of available features, however, differ considerably from one locale to another.&lt;/p&gt;
&lt;p&gt;The spyware also has multiple customization to be able to &lt;strong&gt;run on different Android ROMs&lt;/strong&gt; and OEM devices, namely: &lt;em&gt;Xiaomi / Redmi / POCO&lt;/em&gt; (MIUI &amp;amp; HyperOS), &lt;em&gt;Realme&lt;/em&gt; (realmeUI), &lt;em&gt;Samsung&lt;/em&gt; (OneUI), &lt;em&gt;OnePlus/OPPO&lt;/em&gt; (OxygenOS/ColorOS), &lt;em&gt;Motorola / Nokia / Google&lt;/em&gt; (AOSP Stock, &lt;strong&gt;CalyxOS&lt;/strong&gt;), and more.&lt;/p&gt;
&lt;p&gt;Finally, it&amp;rsquo;s important to highlight that the sample uses &lt;strong&gt;Google’s Firebase services&lt;/strong&gt;, leaking to Google the correlation between spyware infection and the target&amp;rsquo;s Google identity, as also &lt;a href="/blog/2026/04/italian-spyware-maker-sio-still-developing-and-distributing-spyrtacus/"&gt;Spyrtacus does&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="the-malware-infrastructure"&gt;
 The Malware Infrastructure
&lt;/h3&gt;
&lt;p&gt;The malware’s configuration data are stored in an encrypted format. After decryption, the payload reveals a network endpoint: &lt;code&gt;[number].game‑host.org&lt;/code&gt;. DNS resolution for this domain returns the IP address &lt;code&gt;109.239.245.172&lt;/code&gt; and listens on TCP ports &lt;strong&gt;8443&lt;/strong&gt; and &lt;strong&gt;4443&lt;/strong&gt;. &lt;code&gt;game‑host.org&lt;/code&gt; is one of the many domains offered by Oracle&amp;rsquo;s DNS hosting service &lt;a href="https://dyn.com/" aria-label="Dyn(opens in a new tab)" target="_blank"&gt;Dyn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The IPv4 address &lt;code&gt;109.239.245.172&lt;/code&gt; belongs to &lt;strong&gt;air2bite s.r.l.&lt;/strong&gt; &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=ripe&amp;amp;key=ORG-AS1270-RIPE&amp;amp;type=organisation" aria-label="ORG‑AS1270‑RIPE(opens in a new tab)" target="_blank"&gt;ORG‑AS1270‑RIPE&lt;/a&gt;, a retail Internet service provider. A search for other hosts that share the same fingerprint yields a precise set; all of the endpoints indexed by Shodan are located in Italy. While a few of these servers are hosted on networks operated by other consumer or business ISPs such as TIM, the majority reside in IP ranges owned by &lt;strong&gt;Mobile Service Integration&lt;/strong&gt;. Representative examples include &lt;a href="https://www.shodan.io/host/195.120.31.91" aria-label="195.120.31.91(opens in a new tab)" target="_blank"&gt;195.120.31.91&lt;/a&gt; and &lt;a href="https://www.shodan.io/host/212.210.1.211" aria-label="212.210.1.211(opens in a new tab)" target="_blank"&gt;212.210.1.211&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of the related RIPE role objects reference the same contact &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=ripe&amp;amp;key=MSI50-RIPE&amp;amp;type=role" aria-label="MSI50-RIPE(opens in a new tab)" target="_blank"&gt;MSI50-RIPE&lt;/a&gt;, which lacks a name, physical address, or any corporate identifiers: details that are normally provided for a legitimate business. The listed e‑mail address, &lt;code&gt;mobservint@gmail.com&lt;/code&gt;, is a free, ad‑hoc account. This combination of generic identifiers (e.g., assistenza, service, mobile, sim, internet, navigazione) and free‑mail contacts and services is a pattern frequently observed among surveillance‑technology providers and distributors.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Mobile Service Integration&amp;rdquo; name appears in many small ranges (4-16 ips), announced by TIM. This is a classic business scenario for small enterprises to have their own naming in the registry. The IPs in these ranges also host other services. For instance, &lt;a href="https://www.shodan.io/host/217.56.196.66" aria-label="217.56.196.66(opens in a new tab)" target="_blank"&gt;217.56.196.66&lt;/a&gt; has a TLS service on port 443 that presents the following self signed certificate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subject:&lt;/strong&gt; &lt;em&gt;C=IT, ST=Italia, L=Lazio, O=IPS, OU=Mobile, CN=www.mcgplus.mobile.com/emailAddres&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The certificate’s &lt;strong&gt;Organization (O)&lt;/strong&gt; attribute is explicitly set to the literal string &lt;strong&gt;“IPS”&lt;/strong&gt;. Moreover, other IP addresses that exhibit the same fingerprint as the spyware, such as &lt;a href="https://www.shodan.io/host/2.116.18.124" aria-label="2.116.18.124(opens in a new tab)" target="_blank"&gt;2.116.18.124&lt;/a&gt;, show a corresponding RIPE database record that associate directly IPS with &amp;ldquo;Mobile Service Integration&amp;rdquo;, using what looks like a fake company address.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-14_hu_334ebb39191a1ffc.webp" alt="Whois information for 2.116.18.120 - 2.116.18.127 linking IPS INTELLIGENCE PUBLIC SECURITY S.P.A. to Mobile Service Integration"&gt;
 
 &lt;figcaption&gt;Whois information for 2.116.18.120 - 2.116.18.127 linking IPS INTELLIGENCE PUBLIC SECURITY S.P.A. to Mobile Service Integration&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="company-information"&gt;
 Company Information
&lt;/h3&gt;
&lt;p&gt;In addition, the WHOIS record for the SMS‑phishing entry point &lt;code&gt;assistenza-sim.it&lt;/code&gt; (the domain used in the phishing SMS) is as follows:&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-22-morpheus-spyware-15_hu_ccd5d3ccd99470f.webp" alt="Whois information for assistenza-sim.it showing Rever Srls as registrant"&gt;
 
 &lt;figcaption&gt;Whois information for assistenza-sim.it showing Rever Srls as registrant&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The registration details list &lt;strong&gt;Rever Srls&lt;/strong&gt; as both the registrant and administrative contact. By searching for the registrant we are directed to its website at &lt;a href="https://rever-servicenet.com" aria-label="rever‑servicenet.com(opens in a new tab)" target="_blank"&gt;rever‑servicenet.com&lt;/a&gt;. The site contains no physical address and offers only a generic description of &amp;ldquo;network‑related services&amp;rdquo;, making it impossible to verify the actual nature of the business.&lt;/p&gt;
&lt;p&gt;A query of the Italian Chamber of Commerce shows that the company is registered under VAT &lt;strong&gt;16440381008&lt;/strong&gt; as a &lt;strong&gt;S.r.l.s.&lt;/strong&gt; (società semplice) with a capital of €1,000. The sole owner is &lt;em&gt;R.A.&lt;/em&gt;. On the same date, 09 December 2021, the same individual founded a second S.r.l.s., &lt;strong&gt;Iris Telecomunicazioni&lt;/strong&gt;, registered under VAT &lt;strong&gt;16440371009&lt;/strong&gt; with an identical capital amount. Both entities are hosted on GoDaddy; Iris Telecomunicazioni’s website &lt;a href="https://iris-telecomunicazioni.it" aria-label="iris‑telecomunicazioni.it(opens in a new tab)" target="_blank"&gt;iris‑telecomunicazioni.it&lt;/a&gt; uses the same template as Rever’s site.&lt;/p&gt;
&lt;p&gt;Iris Telecomunicazioni lists high‑profile clients such as Google and Deloitte, and includes a series of testimonials, one allegedly from the CEO of Crunchbase and another from a supposed employee, despite the company’s public records indicating that it had no employees. The same owner also holds shares in &lt;strong&gt;Asso Professional Services S.r.l.&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Studio Carnevale, according to their website at &lt;a href="https://studiocarnevale.net" aria-label="studiocarnevale.net(opens in a new tab)" target="_blank"&gt;studiocarnevale.net&lt;/a&gt; is an accounting and consulting firm. In their homepage, they list &lt;em&gt;R.A.&lt;/em&gt; as part of their staff and references &lt;strong&gt;Asso Professional Services S.r.l.&lt;/strong&gt; as an associated business.&lt;/p&gt;
&lt;p&gt;The business numbers published on Rever’s website appear to be fabricated: the deposited balance sheet shows an annual turnover of less than €10k. The assembly report that approved the balance sheet lists &lt;em&gt;A.P.&lt;/em&gt; as the meeting&amp;rsquo;s secretary; she is also listed as an accountant at Studio Carnevale. It is common for small businesses to use an external accountant to fulfil statutory obligations.&lt;/p&gt;
&lt;p&gt;A separate balance sheet for IPS S.p.A. reveals that its boards of auditors is composed of accountants from Studio Carnevale as well, including &lt;em&gt;A.P.&lt;/em&gt;. This overlap indicates that IPS and Rever employed the same accounting firm during the same reporting period (tax year 2024).&lt;/p&gt;
&lt;p&gt;Thus, IPS Intelligence hosts infrastructure related to the spyware operation, and uses &amp;ldquo;Mobile Service Integration&amp;rdquo; as a cover name for some operations. Furthermore, Rever Servicenet Srls, which allegedly registered the phishing domains, is owned by an accountant working for the same firms that has IPS Intelligence as a customer.&lt;/p&gt;
&lt;h2 id="recommendations"&gt;
 Recommendations
&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;If you believe you’re an at‑risk individual or suspect you’ve been targeted, follow these steps right away.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="review-recent-activity"&gt;
 Review Recent Activity
&lt;/h3&gt;
&lt;p&gt;Recall anything unusual: a surprising message, a phone call, or a service outage. Did anyone ask you to install software, click a link, or share credentials? Did any of your contacts get an alert from Signal or WhatsApp that your device changed?&lt;/p&gt;
&lt;h3 id="verify-linked-devices-on-messaging-apps"&gt;
 Verify Linked Devices on Messaging Apps
&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;App&lt;/th&gt;
 &lt;th&gt;How to Check&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;WhatsApp&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Menu → Settings → Linked Devices&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Signal&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Menu → Linked Devices&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Telegram&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Menu → Settings → Privacy &amp;amp; Security → Active Sessions&lt;/em&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If anything looks off, terminate the session immediately and change the app’s PIN/password.&lt;/p&gt;
&lt;h3 id="audit-google-account-sessions"&gt;
 Audit Google Account Sessions
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;em&gt;Google Account → Security and sign-in → Your devices&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Review the list of devices and locations.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Sign out&lt;/em&gt; on any device you don’t recognize.&lt;/li&gt;
&lt;li&gt;Enable &lt;em&gt;2‑step verification&lt;/em&gt; for added protection.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="check-battery-usage"&gt;
 Check Battery Usage
&lt;/h3&gt;
&lt;p&gt;Spyware constantly running in the background can cause noticeable battery drain. Go to &lt;em&gt;Settings → Battery&lt;/em&gt; and review which apps are consuming the most power: unfamiliar or system‑looking apps near the top of the list are a red flag. If your phone&amp;rsquo;s battery life has become noticeably shorter, check the usage charts (where available) to identify when the drain started, as this may help pinpoint when the infection occurred.&lt;/p&gt;
&lt;h3 id="reach-out-for-help"&gt;
 Reach Out for Help
&lt;/h3&gt;
&lt;p&gt;If any of the above checks raise red flags, &lt;a href="/contacts/"&gt;contact us&lt;/a&gt; or your trusted support organization as soon as possible.&lt;/p&gt;
&lt;h2 id="iocs"&gt;
 IoCs
&lt;/h2&gt;
&lt;p&gt;IPs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;109.239.245.172&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;195.120.31.91&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;212.210.1.211&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Domains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assistenza-sim.it&lt;/code&gt; and subdomains&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gamehosts-621ba.appspot.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Android package names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;com.android.core&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.cored&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.android.corew&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;The spyware we have identified, &lt;strong&gt;Morpheus&lt;/strong&gt;, follows the classic “low‑cost spyware” model: it makes up for the absence of zero‑day exploits with an elaborate social‑engineering narrative and a surprisingly large amount of effort spent supporting multiple ROMs, device models, and languages.&lt;/p&gt;
&lt;p&gt;While &lt;a href="/nascondino/ips/"&gt;&lt;strong&gt;IPS Intelligence&lt;/strong&gt;&lt;/a&gt; is a well‑known commercial surveillance provider, this is, to our knowledge, the first report linking them to the distribution and operation of spyware.&lt;/p&gt;
&lt;p&gt;Morpheus is extremely invasive: it can record audio and video, silently pair a WhatsApp device, erase evidence, and deliberately weaken the security of the infected phone, among other malicious capabilities.&lt;/p&gt;
&lt;p&gt;As repeatedly emphasized by &lt;a href="https://edri.org" aria-label="EDRi(opens in a new tab)" target="_blank"&gt;EDRi&lt;/a&gt;, numerous NGOs, and other civil‑society organizations, tools of this nature should not exist. The companies that develop, sell, and operate them, as well as the entities that commission their use, must be held accountable.&lt;/p&gt;</description></item><item><title>Italian spyware maker SIO still developing and distributing Spyrtacus</title><link>/blog/2026/04/italian-spyware-maker-sio-still-developing-and-distributing-spyrtacus/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>/blog/2026/04/italian-spyware-maker-sio-still-developing-and-distributing-spyrtacus/</guid><description>&lt;p&gt;We analyzed a 2025 sample of the &lt;strong&gt;Spyrtacus&lt;/strong&gt; spyware, version &lt;strong&gt;8.71&lt;/strong&gt;. Among its capabilities it can record the screen and take screenshots, record voice calls, export WhatsApp messages, upload files, and dynamically execute downloaded modules. We confirm attribution to &lt;strong&gt;&lt;a href="https://osservatorionessuno.org/nascondino/sio/" aria-label="SIO S.p.A.(opens in a new tab)" target="_blank"&gt;SIO S.p.A.&lt;/a&gt;&lt;/strong&gt; and provide a small set of IoCs to detect infections of this malware family.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-04-09-spyrtacus-sample-chart.svg" alt="Flowchart of the infection, control, and collection process"&gt;
 
 &lt;figcaption&gt;Flowchart of the infection, control, and collection process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="the-spyware"&gt;
 The Spyware
&lt;/h2&gt;
&lt;h3 id="infection-method"&gt;
 Infection Method
&lt;/h3&gt;
&lt;p&gt;Like the majority of low-cost spyware, infection starts by receiving an SMS instructing the victim to install a &lt;em&gt;carrier‑provided&lt;/em&gt; app to keep their mobile service working. The SMS contains a &lt;code&gt;tinyurl.com&lt;/code&gt; shortened link, which, after a series of redirects, points to a phishing page that mimics the victim&amp;rsquo;s mobile provider website. The threat actor maintains pre‑made pages for all major Italian carriers.&lt;/p&gt;
&lt;p&gt;In this case the URL displays a page that imitates &lt;strong&gt;ho. mobile&lt;/strong&gt; (&lt;a href="https://www.ho-mobile.it/" aria-label="ho‑mobile.it(opens in a new tab)" target="_blank"&gt;ho‑mobile.it&lt;/a&gt;) and offers a download link to the malicious APK.&lt;/p&gt;
&lt;p&gt;The application itself pretends to be the &lt;strong&gt;ho. mobile&lt;/strong&gt; official app, advertising a new 5G promo. This tactic is common among low‑cost spyware families that rely on coercing users into installing malicious apps rather than employing sophisticated exploit chains.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-09-spyrtacus-sample-app-info_hu_837d0b4555244aee.webp" alt="Screenshot of the app information"&gt;
 
 &lt;figcaption&gt;Screenshot of the app information&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="the-agent"&gt;
 The Agent
&lt;/h3&gt;
&lt;p&gt;In our case the application used the package name &lt;code&gt;com.elysium.core&lt;/code&gt;, while its main activity was named &lt;strong&gt;&lt;code&gt;it.taog.app.MainActivity&lt;/code&gt;&lt;/strong&gt;. The application manifest reports &lt;code&gt;versionCode=&amp;quot;871&amp;quot;&lt;/code&gt; and &lt;code&gt;versionName=&amp;quot;8.71&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The app is signed with a key belonging to:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CN=Aziz Oukil, OU=Unknown, O=Unknown, L=Sant&amp;#39;Anastasia, ST=NApoli, C=IT
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It is &lt;strong&gt;obfuscated&lt;/strong&gt; with &lt;strong&gt;&lt;a href="https://zahidaz.github.io/awake/packers/dexguard/" aria-label="DexGuard 9.x(opens in a new tab)" target="_blank"&gt;DexGuard 9.x&lt;/a&gt;&lt;/strong&gt;. However, a string containing &lt;code&gt;spyrtacus-agent&lt;/code&gt; can be found in the resources.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Spyrtacus&lt;/strong&gt; name is not new; this sample is likely a newer variant of the well‑known agent used by &lt;a href="https://osservatorionessuno.org/nascondino/sio/" aria-label="SIO(opens in a new tab)" target="_blank"&gt;SIO&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;During its first run the malware gathers device information, including IMEIs, and sends everything to a Dispatcher server via the &lt;code&gt;/Dispatcher/GetParams&lt;/code&gt; endpoint. If no errors occur, the Dispatcher returns a set of parameters that enable or disable the spyware&amp;rsquo;s features.&lt;/p&gt;
&lt;p&gt;Some of the parameters control whether the malware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uses FTP to collect files (and whether those files are encrypted),&lt;/li&gt;
&lt;li&gt;records ambient audio,&lt;/li&gt;
&lt;li&gt;takes screenshots at a configurable interval, and&lt;/li&gt;
&lt;li&gt;installs a legitimate app as a second stage from Google Play&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The malware can also download additional &lt;strong&gt;remote modules&lt;/strong&gt;. The modules are AES‑encrypted DEX files that are loaded from memory through Android&amp;rsquo;s &lt;strong&gt;&lt;a href="https://developer.android.com/reference/dalvik/system/InMemoryDexClassLoader" aria-label="InMemoryDexClassLoader(opens in a new tab)" target="_blank"&gt;InMemoryDexClassLoader&lt;/a&gt;&lt;/strong&gt;. The key to decrypt the modules is retrieved along with other parameters from the Dispatcher.&lt;/p&gt;
&lt;p&gt;It is worth noting that in our sandboxed analysis we kept our sample offline, so we could not retrieve any of the module payloads.&lt;/p&gt;
&lt;p&gt;During the onboarding process the Dispatcher server also returns the IP address of a Command‑and‑Control (C2) server that the agent will use thereafter.
The C2 is then reached via a multitude of protocols including FTP, MQTT(S), HTTP(S), and Google’s Firebase services.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-09-spyrtacus-sample-app-permissions_hu_31103ad17c62aa4e.webp" alt="Screenshot of the app permissions"&gt;
 
 &lt;figcaption&gt;Screenshot of the app permissions&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="attribution"&gt;
 Attribution
&lt;/h3&gt;
&lt;p&gt;To validate the server&amp;rsquo;s certificate, the agent loads a key store embedded in the &lt;code&gt;res/raw/ks&lt;/code&gt; file. The key store contains the following &lt;code&gt;Issuer&lt;/code&gt; line:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C=IT, CN=Artemide/Spartacus, L=Roma, O=Coliseum, ST=Unknown, OU=Lotta Greco‑Romana
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The same certificate is being served from an IP address belonging to &lt;strong&gt;AS206173&lt;/strong&gt; (an ISP named &lt;strong&gt;“NAVIGAZIONE INTERNET”&lt;/strong&gt;, i.e., &amp;ldquo;Internet Connectivity&amp;rdquo;). This ASN is registered to &lt;strong&gt;SIOPLUS S.R.L.&lt;/strong&gt; (VAT ID &lt;em&gt;10253360969&lt;/em&gt;), a subsidiary of &lt;strong&gt;SIO S.p.A.&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2026-04-09-spyrtacus-sample-sio-subsidiaries.svg" alt="All of SIO subsidiaries"&gt;
 
 &lt;figcaption&gt;All of SIO subsidiaries&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;To further confirm the attribution, we downloaded the favicon of one of the C2 servers.&lt;/p&gt;
&lt;p&gt;The C2 favicon:&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-09-c2_favicon_hu_6323249f1edb8508.webp" alt="Favicon from a Spyrtacus C2 server"&gt;
 
 &lt;figcaption&gt;Favicon from a Spyrtacus C2 server&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;And the favicon from &lt;em&gt;asigint[.]it&lt;/em&gt;, another SIO subsidiary:&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2026-04-09-asigint_favicon_hu_68884252f5615aa0.webp" alt="Favicon from the official Asigint website"&gt;
 
 &lt;figcaption&gt;Favicon from the official Asigint website&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="extras"&gt;
 Extras
&lt;/h3&gt;
&lt;p&gt;As we anticipated, the application uses Google&amp;rsquo;s Firebase services, which is common for most Android apps because Firebase is ubiquitous on the platform.&lt;/p&gt;
&lt;p&gt;In the context of spyware, however, this is noteworthy since it leaks to Google the correlation between spyware infection and the victims&amp;rsquo; Google identity.&lt;/p&gt;
&lt;p&gt;The following are the Firebase projects used by Spyrtacus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://assist-online.firebaseio.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://dusty-apricot.firebasestorage.app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To further corroborate the attribution, and in line with what &lt;a href="https://techcrunch.com/2025/02/13/spyware-maker-caught-distributing-malicious-android-apps-for-years/" aria-label="TechCrunch previously reported about the Neapolitan dialect found in the spyware&amp;rsquo;s comments(opens in a new tab)" target="_blank"&gt;TechCrunch previously reported about the Neapolitan dialect found in the spyware&amp;rsquo;s comments&lt;/a&gt;, we uncovered the following strings in the binary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LA CODA INVIO E' VUOTA -- STATT BBUON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PARAMETRI CONNESSIONE RICEVUTI -- SCATENATE L'INFERNO!&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These strings reflect the developers&amp;rsquo; native‑language comments and further tie the sample to the known SIO‑related code base.&lt;/p&gt;
&lt;h2 id="previous-samples--analysis"&gt;
 Previous Samples &amp;amp; Analysis
&lt;/h2&gt;
&lt;p&gt;In the past, other Spyrtacus samples were analyzed, in particular see the following list:&lt;/p&gt;
&lt;p&gt;Version &lt;strong&gt;8.65&lt;/strong&gt; from &lt;em&gt;October 2024&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tria.ge/241022-g6l3aatfkj/static1" aria-label="https://tria.ge/241022-g6l3aatfkj/static1(opens in a new tab)" target="_blank"&gt;https://tria.ge/241022-g6l3aatfkj/static1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Version &lt;strong&gt;8.20&lt;/strong&gt; from &lt;em&gt;April 2022&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tria.ge/220401-nh9xrsbaa7/behavioral1" aria-label="https://tria.ge/220401-nh9xrsbaa7/behavioral1(opens in a new tab)" target="_blank"&gt;https://tria.ge/220401-nh9xrsbaa7/behavioral1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Version &lt;strong&gt;unknown from 2019&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://presidentwarfield.github.io/SpiCall_Artemide_Exodus/" aria-label="https://presidentwarfield.github.io/SpiCall_Artemide_Exodus/(opens in a new tab)" target="_blank"&gt;https://presidentwarfield.github.io/SpiCall_Artemide_Exodus/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PresidentWarfield/SpiCall_Artemide_Exodus" aria-label="https://github.com/PresidentWarfield/SpiCall_Artemide_Exodus(opens in a new tab)" target="_blank"&gt;https://github.com/PresidentWarfield/SpiCall_Artemide_Exodus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apparently, a newer version of the spyware agent &lt;strong&gt;8.72&lt;/strong&gt; exists, as documented: &lt;a href="https://www.lawfulinterceptionacademy.eu/clir/" aria-label="https://www.lawfulinterceptionacademy.eu/clir/(opens in a new tab)" target="_blank"&gt;https://www.lawfulinterceptionacademy.eu/clir/&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="iocs"&gt;
 IoCs
&lt;/h2&gt;
&lt;p&gt;IPs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;5.56.12.150&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;89.46.67.218&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Domains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;supporto-mobile.it&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;srv.servicemnt.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Android package names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;com.elysium.core&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;it.taog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;org.util.carriersvc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sys.base.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C2 favicon SHA256 hash:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ef2e1c47166fe0c5ab3bf5216baf6ad6b96f759e15ac218d1a1a3cdcc9e0994f&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;As previously stated, and as supported by many NGOs, mercenary spyware should simply not exist. We reiterate the call to ban these tools and hold their operators and developers accountable, and we continuously advocate for that through our contributions and participation in the &lt;a href="https://edri.org" aria-label="EDRi(opens in a new tab)" target="_blank"&gt;EDRi&lt;/a&gt; network.&lt;/p&gt;</description></item><item><title>Google is turning Android into a walled-garden monopoly. We must prevent it</title><link>/blog/2026/02/google-is-turning-android-into-a-walled-garden-monopoly.-we-must-prevent-it/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>/blog/2026/02/google-is-turning-android-into-a-walled-garden-monopoly.-we-must-prevent-it/</guid><description>&lt;p&gt;In August 2025, Google &lt;a href="https://developer.android.com/developer-verification" aria-label="announced(opens in a new tab)" target="_blank"&gt;announced&lt;/a&gt; that as of September 2026, it will no longer be possible to develop apps for the Android platform without first registering centrally with Google.&lt;/p&gt;
&lt;p&gt;The registration will require all developers to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pay a fee to Google&lt;/li&gt;
&lt;li&gt;Agree to Google’s Terms and Conditions and to any future changes Google may impose unilaterally.&lt;/li&gt;
&lt;li&gt;Provide Google with their government-issued ID&lt;/li&gt;
&lt;li&gt;Upload evidence of the developer’s private signing key&lt;/li&gt;
&lt;li&gt;List all current and future application identifiers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will be mandatory for every Android developer, even when they plan to distribute their app only on third-party channels (app stores like F-Droid, Aurora, Obtainium, etc), a clear &lt;a href="https://www.bbc.com/news/articles/cpvjdm4mp92o" aria-label="violation of Europe&amp;rsquo;s DMA (Digital Markets Act)(opens in a new tab)" target="_blank"&gt;violation of Europe&amp;rsquo;s DMA (Digital Markets Act)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-security-argument"&gt;
 The security argument
&lt;/h2&gt;
&lt;p&gt;We are aware that most malware and spyware is distributed via the so-called &lt;em&gt;side-loading&lt;/em&gt; mechanism (a pejorative term indicating the direct installation of software of your choosing on the device that you own without intermediaries).&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s argument is that by centralizing all the developer registration, it would be easier to detect and ban threat actors and malware, with Google&amp;rsquo;s oversight.&lt;/p&gt;
&lt;p&gt;However, this argument does not stand the test of reality. Just a few months ago it was found yet again that &lt;a href="https://lifehacker.com/tech/these-malicious-apps-managed-to-bypass-the-play-stores-anti-malware" aria-label="malware was distributed on the Play Store itself(opens in a new tab)" target="_blank"&gt;malware was distributed on the Play Store itself&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the contrary, alternative app stores like F-Droid are actively pursuing real mitigation strategies, like &lt;a href="https://f-droid.org/docs/Reproducible_Builds/" aria-label="Reproducible Builds(opens in a new tab)" target="_blank"&gt;Reproducible Builds&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The use of spyware is not illegal in most European countries, and states such as Italy make extensive use of it, often without adequate safeguards or transparency. In this context, it is unclear what Google’s role would be if a state were to request the distribution of surveillance tools through its platform. Even if the company wished to oppose such a request, it might find itself legally obliged to authorize them.&lt;/p&gt;
&lt;p&gt;In the meantime, however, Google may already have weakened or rendered impracticable independent alternatives, such as third-party app stores and decentralized distribution mechanisms, which currently represent spaces of pluralism and potentially greater security. Concentrating decision-making power in a single private entity does not equate to greater protection; rather, it creates a single point of political and legal pressure.&lt;/p&gt;
&lt;p&gt;If the goal is to protect users, the solution is not to strengthen technological monopolies but to strengthen democratic rules, transparency, and public accountability. Making the use of spyware illegal at the European level would not eliminate crime, but it would provide a structural safeguard for fundamental rights, independent of the commercial or strategic choices of any single company.&lt;/p&gt;
&lt;h2 id="keep-android-open"&gt;
 Keep Android Open
&lt;/h2&gt;
&lt;p&gt;We believe in an open ecosystem, not mandated by &lt;a href="https://time.com/4060575/alphabet-google-dont-be-evil/" aria-label="&amp;ldquo;Evil&amp;rdquo;(opens in a new tab)" target="_blank"&gt;&amp;ldquo;Evil&amp;rdquo;&lt;/a&gt; companies. For this reason we signed the &lt;a href="https://keepandroidopen.org/" aria-label="Keep Android Open(opens in a new tab)" target="_blank"&gt;Keep Android Open&lt;/a&gt; letter.&lt;/p&gt;
&lt;p&gt;Along with multiple organizations, we call upon Google to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Immediately rescind the mandatory developer registration requirement for third-party distribution.&lt;/li&gt;
&lt;li&gt;Engage in transparent dialogue with civil society, developers, and regulators about Android security improvements that respect openness and competition.&lt;/li&gt;
&lt;li&gt;Commit to platform neutrality by ensuring that Android remains a genuinely open platform where Google’s role as platform provider does not conflict with its commercial interests.&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>EDRi, an ISP, and a packed agenda</title><link>/blog/2025/12/edri-an-isp-and-a-packed-agenda/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>/blog/2025/12/edri-an-isp-and-a-packed-agenda/</guid><description>&lt;p&gt;This year, Osservatorio Nessuno embarked on projects in every direction: growing our technical work, expanding our software portfolio, strengthening our advocacy, and improving our internal structure.&lt;/p&gt;
&lt;p&gt;We welcomed our first non-founding members, and we are deeply grateful for their participation. We presented the Osservatorio and both its advocacy and technical work at several events, took part in studies on NGOs and digital rights, taught &lt;a href="https://dig-awards.org/eventi/academy-2025-autodifesa-digitale-giornalisti/" aria-label="classes to journalists(opens in a new tab)" target="_blank"&gt;classes to journalists&lt;/a&gt;, and contributed &lt;a href="https://datatracker.ietf.org/meeting/124/materials/slides-124-hotrfc-sessa-15-still-routing-like-its-the-90s-00" aria-label="to work at the IETF(opens in a new tab)" target="_blank"&gt;to work at the IETF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We showcased a &lt;a href="/blog/2025/09/bugbane-simplifying-consensual-android-forensics/"&gt;pre-release of Bugbane&lt;/a&gt;, released and deployed &lt;a href="/blog/2025/05/patela-a-basement-full-of-amnesic-servers/"&gt;Patela&lt;/a&gt; and then &lt;a href="/blog/2025/12/patela-v2-from-certificates-to-hardware/"&gt;upgraded it&lt;/a&gt;, joined the &lt;a href="https://edri.org/" aria-label="EDRi network(opens in a new tab)" target="_blank"&gt;EDRi network&lt;/a&gt;, researched &lt;a href="/blog/2025/03/a-deep-dive-into-cellebrite-android-support-as-of-february-2025/"&gt;mobile forensics tools&lt;/a&gt; and spyware, and launched a spin-off NGO.&lt;/p&gt;
&lt;p&gt;We also received unprecedented support: people donated funds, hardware, time, and knowledge. This collective effort made a real difference and allowed us to do more than ever before.&lt;/p&gt;
&lt;h2 id="a-new-website"&gt;
 A new website
&lt;/h2&gt;
&lt;p&gt;As some may have noticed, we also carried out a significant website redesign and reorganization. Beyond its updated visual identity, the new website focuses on accessibility and performance. It is fully static and uses no JavaScript, allowing it to work reliably in Tor Browser even with the safest security settings, while maintaining good accessibility.&lt;/p&gt;
&lt;p&gt;We are grateful to everyone who reported accessibility issues in the past, and we remain committed to continuously reviewing and improving the website based on this feedback.&lt;/p&gt;
&lt;h2 id="procionet-aps"&gt;
 ProcioNet APS
&lt;/h2&gt;
&lt;p&gt;Building on our experience of doing &lt;a href="/blog/2024/12/how-to-bgp-from-your-basement-and-other-tales/"&gt;BGP from our own basement&lt;/a&gt;, we wanted to push for even greater independence and control. The first step, however, is navigating a complex landscape of commercial terms—peering, transit, backhaul—and engaging with a daunting number of intermediaries. While France, for instance, has a long-running tradition of &lt;a href="https://www.fdn.fr/" aria-label="nonprofit (or at least associative) ISPs(opens in a new tab)" target="_blank"&gt;nonprofit (or at least associative) ISPs&lt;/a&gt;, Italy has had &lt;a href="https://www.senzafilisenzaconfini.org/" aria-label="very few examples(opens in a new tab)" target="_blank"&gt;very few examples&lt;/a&gt;, none of them fiber-powered. While we are not yet digging our own trenches, we aim to start by using the EU-funded Open Fiber network, pursuing economic sustainability in the short term and greater control over the longer horizon.&lt;/p&gt;
&lt;p&gt;For this purpose, together with a group of friends, we founded &lt;a href="https://procio.network" aria-label="ProcioNet APS(opens in a new tab)" target="_blank"&gt;ProcioNet APS&lt;/a&gt;. For English speakers, &lt;em&gt;procione&lt;/em&gt; means “raccoon” in Italian, hence the wordplay with the &lt;em&gt;Net&lt;/em&gt; suffix. &lt;strong&gt;APS&lt;/strong&gt; stands for something close to a &lt;em&gt;Social Promotion Association&lt;/em&gt;, which differs from the Osservatorio’s &lt;strong&gt;OdV&lt;/strong&gt; (&lt;em&gt;Volunteer Organization&lt;/em&gt;) status. ProcioNet aims to set up a network for its members, focused on research, accessibility, and reducing the digital divide. Services will be provided exclusively to members and, where applicable, at cost price.&lt;/p&gt;
&lt;p&gt;Beyond being a technically challenging and enjoyable project, ProcioNet pursues one of Osservatorio Nessuno’s core political goals: reclaiming infrastructure. By doing so, we plan to layer internet-access–specific advocacy and research on top of it, pursuing privacy-preserving deployments where possible (an approach rarely taken by commercial providers), and resisting censorship both through technical means where feasible and through advocacy where it is not.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-12-25-end-of-the-year_hu_5f332d59c7766c36.webp" alt="ProcioNet logo, a raccoon on a telegraph pole"&gt;
 
 &lt;figcaption&gt;ProcioNet logo, a raccoon on a telegraph pole&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="european-digital-rights-edri"&gt;
 European Digital Rights (EDRi)
&lt;/h2&gt;
&lt;p&gt;In the spring, we began the process of joining &lt;a href="https://edri.org" aria-label="EDRi(opens in a new tab)" target="_blank"&gt;EDRi&lt;/a&gt; as affiliates, the first step toward becoming full members. We are very grateful to the EDRi membership team for their friendliness and for guiding us through the process, as well as to all EDRi members who supported our participation.&lt;/p&gt;
&lt;p&gt;EDRi is organized into working groups that address digital rights issues from different perspectives and through different strategies. As we do not have dedicated professional advocacy staff, we are currently focusing on issues closest to our mission, such as limiting the increase of securitization, the use of spyware against civil society, and efforts to weaken or bypass encryption, including initiatives like Chat Control.&lt;/p&gt;
&lt;p&gt;We are still new to this space, and observing how the broader civil society ecosystem operates has been highly instructive. We hope to deepen our involvement and participate more actively, including in more in-person meetings, throughout 2026.&lt;/p&gt;
&lt;h2 id="so-many-events"&gt;
 So many events
&lt;/h2&gt;
&lt;p&gt;This year, members of Osservatorio Nessuno took part in a wide range of events, from academic cryptography conferences to documentary and journalism festivals, from self-organized gatherings to international standards bodies. Almost all of them were self-funded by the attending members, with only a few exceptions linked to our professional work. Despite limited resources, we managed to attend, contribute, and learn across communities that rarely meet in the same room.&lt;/p&gt;
&lt;p&gt;Through these experiences, we observed how cost, travel, and accessibility shape who can be in the room and, by extension, who helps shape the technologies and policies that define the Internet itself. Most of this is not new; it’s been well studied and reported by &lt;a href="https://www.article19.org/" aria-label="other NGOs(opens in a new tab)" target="_blank"&gt;other NGOs&lt;/a&gt; and &lt;a href="https://www.criticalinfralab.net/" aria-label="researchers(opens in a new tab)" target="_blank"&gt;researchers&lt;/a&gt;. This is simply our firsthand account!&lt;/p&gt;
&lt;p&gt;We chose events based on a mix of personal interest, existing community ties, whether we knew people or trusted the atmosphere, and relevance to our advocacy and networking work as an organization. To reiterate, we did not use any Osservatorio funds for these trips. We are all volunteers, and our limited organizational finances are fully dedicated to maintaining our infrastructure, servers, utilities, and bandwidth, which already keeps our budget tight.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Event&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Area&lt;/th&gt;
 &lt;th&gt;Location&lt;/th&gt;
 &lt;th&gt;Participants&lt;/th&gt;
 &lt;th&gt;Ticket (€)&lt;/th&gt;
 &lt;th&gt;Cost estimate (€)&lt;/th&gt;
 &lt;th&gt;Total (€)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://archive.fosdem.org/2025/" aria-label="FOSDEM(opens in a new tab)" target="_blank"&gt;FOSDEM&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Open-source&lt;/td&gt;
 &lt;td&gt;Brussels&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;400&lt;/td&gt;
 &lt;td&gt;800&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://rwc.iacr.org/2025/" aria-label="Real World Crypto(opens in a new tab)" target="_blank"&gt;Real World Crypto&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Academic&lt;/td&gt;
 &lt;td&gt;Cryptography&lt;/td&gt;
 &lt;td&gt;Sofia&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;380&lt;/td&gt;
 &lt;td&gt;500&lt;/td&gt;
 &lt;td&gt;880&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.itnog.it/itnog9/" aria-label="IT NOG(opens in a new tab)" target="_blank"&gt;IT NOG&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Networking&lt;/td&gt;
 &lt;td&gt;Bologna&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://sgkm2025.fhgr.ch/en/" aria-label="SGKM(opens in a new tab)" target="_blank"&gt;SGKM&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Academic&lt;/td&gt;
 &lt;td&gt;Media studies&lt;/td&gt;
 &lt;td&gt;Chur&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;290&lt;/td&gt;
 &lt;td&gt;600&lt;/td&gt;
 &lt;td&gt;890&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://hackmeeting.org/hackit25/" aria-label="Hackmeeting(opens in a new tab)" target="_blank"&gt;Hackmeeting&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Activism / Tech&lt;/td&gt;
 &lt;td&gt;Cagliari&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;150&lt;/td&gt;
 &lt;td&gt;450&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://tumpicon.org/" aria-label="TumpiCon(opens in a new tab)" target="_blank"&gt;TumpiCon&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Private&lt;/td&gt;
 &lt;td&gt;Security&lt;/td&gt;
 &lt;td&gt;Pinerolo&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;200&lt;/td&gt;
 &lt;td&gt;600&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.globalgathering.community/" aria-label="Global Gathering(opens in a new tab)" target="_blank"&gt;Global Gathering&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Advocacy&lt;/td&gt;
 &lt;td&gt;Estoril&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;40&lt;/td&gt;
 &lt;td&gt;500&lt;/td&gt;
 &lt;td&gt;1080&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://dig-awards.org/" aria-label="DIG Festival(opens in a new tab)" target="_blank"&gt;DIG Festival&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Journalism&lt;/td&gt;
 &lt;td&gt;Modena&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;td&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://romhack.io/romhack-conference-2025/" aria-label="Romhack(opens in a new tab)" target="_blank"&gt;Romhack&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Security&lt;/td&gt;
 &lt;td&gt;Roma&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;20&lt;/td&gt;
 &lt;td&gt;300&lt;/td&gt;
 &lt;td&gt;320&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://edri.org/our-work/privacy-camp-in-2025/" aria-label="EDRi Privacy Camp(opens in a new tab)" target="_blank"&gt;EDRi Privacy Camp&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Advocacy&lt;/td&gt;
 &lt;td&gt;Brussels&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;300&lt;/td&gt;
 &lt;td&gt;300&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://tcg2025.4711.se/" aria-label="Tor Community Gathering(opens in a new tab)" target="_blank"&gt;Tor Community Gathering&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Tor&lt;/td&gt;
 &lt;td&gt;Odense&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;400&lt;/td&gt;
 &lt;td&gt;800&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://ripe91.ripe.net/" aria-label="RIPE(opens in a new tab)" target="_blank"&gt;RIPE&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Int’l Org&lt;/td&gt;
 &lt;td&gt;Networking&lt;/td&gt;
 &lt;td&gt;Bucharest&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;400&lt;/td&gt;
 &lt;td&gt;900&lt;/td&gt;
 &lt;td&gt;1300&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://transparency.dev/summit2025/" aria-label="Transparency.dev(opens in a new tab)" target="_blank"&gt;Transparency.dev&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Development&lt;/td&gt;
 &lt;td&gt;Gothenburg&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;500&lt;/td&gt;
 &lt;td&gt;500&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://linuxdaytorino.org/2025/" aria-label="Linux Day(opens in a new tab)" target="_blank"&gt;Linux Day&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Open-source&lt;/td&gt;
 &lt;td&gt;Torino&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.ietf.org/meeting/124/" aria-label="IETF(opens in a new tab)" target="_blank"&gt;IETF&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Int’l Org&lt;/td&gt;
 &lt;td&gt;Standards&lt;/td&gt;
 &lt;td&gt;Montreal&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;990&lt;/td&gt;
 &lt;td&gt;1600&lt;/td&gt;
 &lt;td&gt;2590&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.ccc.de/en/updates/2025/39c3-power-cycles" aria-label="39C3(opens in a new tab)" target="_blank"&gt;39C3&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Community&lt;/td&gt;
 &lt;td&gt;Activism / Tech&lt;/td&gt;
 &lt;td&gt;Hamburg&lt;/td&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;190&lt;/td&gt;
 &lt;td&gt;600&lt;/td&gt;
 &lt;td&gt;3160&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;See &lt;a href="https://blog.torproject.org/bringing-tor-community-together/" aria-label="the Tor Projects&amp;rsquo;s blog post(opens in a new tab)" target="_blank"&gt;the Tor Projects&amp;rsquo;s blog post&lt;/a&gt; for a summary of the &lt;em&gt;Tor Community Gathering&lt;/em&gt; and a bonus picture.&lt;/p&gt;
&lt;p&gt;This table does not include all the events where we were invited to participate, or which were remote, such as presenting at &lt;a href="https://nexa.polito.it/lunch-125/" aria-label="Nexa Center(opens in a new tab)" target="_blank"&gt;Nexa Center&lt;/a&gt;, or at &lt;a href="https://phacker.org/programa?openProject=how-phones-get-unlocked-a-quick-guide-to-todays-capabilities" aria-label="Primavera Hacker(opens in a new tab)" target="_blank"&gt;Primavera Hacker&lt;/a&gt;, where we gave a talk remotely.&lt;/p&gt;
&lt;h3 id="reflections-on-access-and-inequality"&gt;
 Reflections on access and inequality
&lt;/h3&gt;
&lt;p&gt;One recurring observation is that the further one moves from grassroots or volunteer-driven events, the higher the barriers to entry. Events like IETF, RIPE, or Real World Crypto, while essential, remain prohibitively expensive for unaffiliated participants. High registration fees, travel costs, and luxury venues make it difficult for small nonprofits, activists, or independent researchers to take part. This reinforces existing power structures and limits diversity in technical governance spaces. Travel funds and scholarships often serve to fill inclusion quotas, not to change the underlying structures or power dynamics. Their existence is, of course, welcome, but their impact is limited, especially in contexts like RIPE, where votes determine policy, or the IETF, where consensus often forms in side meetings and informal gatherings.&lt;/p&gt;
&lt;p&gt;We would rather see less luxury and more accessibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no expensive cities or venues that are hard to reach or require difficult visas (why does the IETF still meet in the US or China?),&lt;/li&gt;
&lt;li&gt;membership fees adjusted for nonprofits,&lt;/li&gt;
&lt;li&gt;academic conferences free for students and affordable for small organizations,&lt;/li&gt;
&lt;li&gt;an end to extravagant dinners and shows that exclude more than they include.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="politics-of-participation"&gt;
 Politics of participation
&lt;/h3&gt;
&lt;p&gt;Building authority in these spaces takes both years and connections. Employers, institutional backing, or professional titles often matter far more than anyone admits. Social backgrounds are downplayed or dismissed, and the result is often an insular bubble of tech workers who, despite good intentions, can become detached from the realities faced by underrepresented people. Worse, this detachment is sometimes masked by corporate narratives about &lt;em&gt;improving the world through technology&lt;/em&gt;.
The dissonance, even for us as relatively privileged Italian technologists, is difficult and at times sad to navigate.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;ProcioNet isn’t quite ready to launch yet. We’re currently dealing with a substantial amount of paperwork and planning, as the operation is neither simple nor inexpensive. There are also a couple of developments we can’t announce just yet, but they build directly on the work we carried out this year.&lt;/p&gt;
&lt;p&gt;As in the past few years, we’ll be around at &lt;strong&gt;39C3&lt;/strong&gt;, and we’ll also be back with a talk at &lt;strong&gt;FOSDEM&lt;/strong&gt;, this time presenting &lt;em&gt;Bugbane&lt;/em&gt; (&lt;a href="https://fosdem.org/2026/schedule/event/LVQGLQ-bugbane/" aria-label="see the schedule(opens in a new tab)" target="_blank"&gt;see the schedule&lt;/a&gt;).&lt;/p&gt;</description></item><item><title>Patela v2: From certificates to hardware</title><link>/blog/2025/12/patela-v2-from-certificates-to-hardware/</link><pubDate>Sat, 13 Dec 2025 00:00:00 +0000</pubDate><guid>/blog/2025/12/patela-v2-from-certificates-to-hardware/</guid><description>&lt;p&gt;A year ago, we wrote about &lt;a href="https://osservatorionessuno.org/blog/2025/05/patela-a-basement-full-of-amnesic-servers/" aria-label="Patela v1(opens in a new tab)" target="_blank"&gt;Patela v1&lt;/a&gt;, our &lt;em&gt;diskless&lt;/em&gt; Tor relay orchestration system built for exit nodes running on &lt;a href="https://www.system-transparency.org/" aria-label="System Transparency(opens in a new tab)" target="_blank"&gt;System Transparency&lt;/a&gt;&amp;rsquo;s &lt;em&gt;stboot&lt;/em&gt;. The core idea was simple: nodes boot from read-only images, generate their own keys, and encrypt the keys locally and back them up on the server. In this post, we present an updated architecture that attests the nodes&amp;rsquo; TPMs and removes the need for backups.&lt;/p&gt;
&lt;h2 id="evolving-the-architecture"&gt;
 Evolving the architecture
&lt;/h2&gt;
&lt;p&gt;In v1, node identity was based on mTLS certificate digests. We embedded client certificates at compile time using a script, and the SHA-256 hash of each certificate became the node&amp;rsquo;s database identity.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// V1: Identity = hash(certificate)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_cert&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The authentication flow was the following: the client presents a certificate, the server validates it against its CA, then the server uses the cert digest as a database key. However, it was both cumbersome and not what we ultimately wanted to achieve; we used it as a shortcut to start the early testing. Instead, the goal was to have the keys directly in the TPM, so that they could be stored inside the chip and never backed up, having them bound to the hardware, without requiring any disk.&lt;/p&gt;
&lt;p&gt;V2 replaces this by making the TPM the source of truth:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// V2: Identity = (EK_public, AK_public, AK_name)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node_identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ek_public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ak_public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ak_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Endorsement Key (EK)&lt;/strong&gt;: Every TPM chip has a unique EK burned in at manufacture time. It cannot be changed, extracted, or cloned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attestation Key (AK)&lt;/strong&gt;: A key that proves the holder controls the specific EK. The AK is generated at runtime and certified by the EK.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AK Name&lt;/strong&gt;: A cryptographic digest of the AK&amp;rsquo;s public parameters, computed by the TPM.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The server stores this triplet in the database:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INDEX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;idx_nodes_tpm_identity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ek_public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ak_public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ak_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, authentication to the configuration server requires &lt;strong&gt;physical possession of that specific TPM chip&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="trust-on-first-use-tofu"&gt;
 Trust on first use (TOFU)
&lt;/h3&gt;
&lt;p&gt;We don&amp;rsquo;t validate EK certificates against TPM manufacturer CAs yet: when a node first connects, the server has no cryptographic proof the EK came from real hardware versus a software emulator. It&amp;rsquo;s on our todo list, but it doesn&amp;rsquo;t add a lot of guarantees in itself for our use case.&lt;/p&gt;
&lt;p&gt;We then use TOFU: new nodes are created with &lt;code&gt;enabled=0&lt;/code&gt;. An administrator should know when a new node is supposed to register, and can just run &lt;code&gt;patela node enable &amp;lt;node_id&amp;gt;&lt;/code&gt; before the node can authenticate. This prevents random devices from auto-joining the network, while keeping the whole flow mostly automated.&lt;/p&gt;
&lt;h3 id="sometimes-its-ok-to-not-have-backups"&gt;
 Sometimes it&amp;rsquo;s ok to not have backups
&lt;/h3&gt;
&lt;p&gt;The flow was this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client generates an AES key inside the TPM&lt;/li&gt;
&lt;li&gt;Client generates Tor relay keys&lt;/li&gt;
&lt;li&gt;Client encrypts relay keys using TPM-bound AES key&lt;/li&gt;
&lt;li&gt;Client uploads encrypted blobs to server&lt;/li&gt;
&lt;li&gt;On boot, client downloads blobs, decrypts with TPM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach enabled diskless Tor relays to maintain a persistent identity. Tor relays have reputation and are trusted in the network based on a few parameters, but mostly their stability and the time they&amp;rsquo;ve been running. Keeping long term keys is fundamental for our relays to be useful. The difference is that now the actual relay keys live only in TPM persistent storage, removing the requirement of backups. In the end, hardware failures should be rare enough for this type of binding to make sense.&lt;/p&gt;
&lt;p&gt;As we have not fully integrated Tor with the TPM, the key is currently stored as a byte string in the non-volatile storage, meaning it is still possible to export it. As the TPM standard does not support operations for Ed25519, this is unlikely to change in the short term, though we acknowledge it is suboptimal.&lt;/p&gt;
&lt;h3 id="improved-configuration"&gt;
 Improved configuration
&lt;/h3&gt;
&lt;p&gt;In V1, every relay got the same hardcoded &lt;code&gt;torrc&lt;/code&gt; template, string-formatted:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// V1: One template to rule them all
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;torrc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;#&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Nickname {name}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ORPort {ip}:{or_port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;DirPort {dir_port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ContactInfo your@email.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExitPolicy reject *:*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;#&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip_v4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This worked until it didn&amp;rsquo;t, as per-relay customisation was difficult to manage: some nodes needed custom &lt;code&gt;ExitPolicy&lt;/code&gt; rules, while others needed different bandwidth limits depending on upstream, and in more rare circumstances, custom ports. Every configuration change meant code changes, recompilation, redeployment.&lt;/p&gt;
&lt;p&gt;Now V2 introduces a &lt;em&gt;configuration cascade&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;
 │┌────────────────────────┐
 O ││ Default Config │
 v │└───────────┬────────────┘
 e │ │ 
 r │┌───────────▼────────────┐
 r ││ Per-machine Config │
 i │└───────────┬────────────┘
 d │ │ 
 e │┌───────────▼────────────┐
 ││ Per-instance Config │
 ▼└────────────────────────┘
&lt;/pre&gt;
&lt;p&gt;This is directly translated into the database schema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Global defaults for all relays
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;global_conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIMARY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tor_conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- torrc format
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node_conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- JSON for network settings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- Per-node overrides
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COLUMN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tor_conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COLUMN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;node_conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="c1"&gt;-- Per-relay overrides
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;relays&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COLUMN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tor_conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When a client boots, the server resolves the configuration hierarchy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Pseudo-code for config resolution
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;global_conf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node_conf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Node overrides global
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relay_conf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Relay overrides everything
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We wrote a torrc parser (&lt;code&gt;server/src/tor_config.rs&lt;/code&gt;) to handle Tor&amp;rsquo;s configuration format. The parser validates against known Tor options and merges configs intelligently, as later values override earlier ones.&lt;/p&gt;
&lt;p&gt;Now the workflow looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set global defaults (one time)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;patela torrc import misc/default.torrc default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Override ContactInfo for basement nodes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ContactInfo basement@example.com&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; basement.torrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;patela torrc import basement.torrc node --id &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Give one relay extra bandwidth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;RelayBandwidthRate 100 MB&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; high-bandwidth.torrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;patela torrc import high-bandwidth.torrc relay --id murazzano
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configuration changes are just database updates, as the nodes will fetch the most recent one associated with them from the server at startup.&lt;/p&gt;
&lt;h3 id="auth-via-partial-attestation"&gt;
 Auth via partial attestation
&lt;/h3&gt;
&lt;p&gt;The protocol uses TPM2&amp;rsquo;s &lt;code&gt;make_credential&lt;/code&gt; / &lt;code&gt;activate_credential&lt;/code&gt; challenge-response:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client sends: &lt;code&gt;EK_public&lt;/code&gt;, &lt;code&gt;AK_public&lt;/code&gt;, &lt;code&gt;AK_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Server replies: &lt;code&gt;encrypted_session_token = make_credential(EK_public, AK_name, session_token)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Client decrypts: &lt;code&gt;session_token = activate_credential(encrypted_session_token)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The client has now a bearer token that can be used to authenticate itself to the server.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;session_token&lt;/code&gt; is a &lt;a href="https://docs.rs/biscuit/latest/biscuit/" aria-label="Biscuit(opens in a new tab)" target="_blank"&gt;Biscuit&lt;/a&gt; bearer token. Only the TPM with the matching EK can decrypt it via &lt;code&gt;activate_credential&lt;/code&gt;. If the client successfully returns the decrypted token, the server has cryptographic proof the client possesses the specific TPM hardware.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;
 What&amp;rsquo;s Next
&lt;/h2&gt;
&lt;p&gt;We have two end goals, which will take some more development time and understanding. The first one is to seal the TPM secrets and storage via measured boot, and complete the setup with System Transparency and coreboot. It is ambitious, but in the end the systems should look like the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hardware root of trust measures Coreboot&lt;/li&gt;
&lt;li&gt;Coreboot measures the System Transparency&amp;rsquo;s stboot&lt;/li&gt;
&lt;li&gt;The TPM unseals thanks to the previous correct measurements&lt;/li&gt;
&lt;li&gt;stboot boots only correctly signed and transparency logged images&lt;/li&gt;
&lt;li&gt;Only publicly reproducible and auditable images can be run&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This would make the system resistant to physical compromises: even if the server is physically seized, and if a different firmware or bootloader is run, then the TPM wouldn&amp;rsquo;t unseal, making the keys non-recoverable in any alternate setup.&lt;/p&gt;
&lt;p&gt;There are also some more simple usability improvements in our todo list: an example is how to properly display to operators config diffs between global/node/relay configs before applying.&lt;/p&gt;
&lt;h2 id="testing"&gt;
 Testing
&lt;/h2&gt;
&lt;p&gt;The code is on GitHub: &lt;a href="https://github.com/osservatorionessuno/patela" aria-label="osservatorionessuno/patela(opens in a new tab)" target="_blank"&gt;osservatorionessuno/patela&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To run a v2 development setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Server setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sqlite:&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/patela.db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo sqlx database reset --source server/migrations -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set required config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-server -- torrc import misc/default.torrc default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-server -- node &lt;span class="nb"&gt;set&lt;/span&gt; ipv4_gateway 10.10.10.1 default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-server -- node &lt;span class="nb"&gt;set&lt;/span&gt; ipv6_gateway fd00::1 default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-server -- run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Client setup (requires TPM2 or swtpm emulator)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TPM2TOOLS_TCTI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;swtpm:host=localhost,port=2321&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-client -- run --server https://localhost:8020
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Approve the node (from server terminal)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-server -- list node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo run -p patela-server -- node &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;The code is still small at around 6000 lines of Rust across client and server, readable (enforced by &lt;code&gt;cargo fmt&lt;/code&gt; and &lt;code&gt;clippy&lt;/code&gt;), and partially documented. We are also still working on it. As anticipated, we will continue exploring until our setup is as robust as we want it to be.&lt;/p&gt;
&lt;p&gt;This wouldn&amp;rsquo;t be possible without:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.system-transparency.org/" aria-label="System Transparency(opens in a new tab)" target="_blank"&gt;System Transparency&lt;/a&gt;: For stboot and the vision of verifiable boot infrastructure&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parallaxsecond/rust-tss-esapi" aria-label="tss-esapi(opens in a new tab)" target="_blank"&gt;tss-esapi&lt;/a&gt;: For Rust TPM bindings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bugs, questions, patches: &lt;a href="https://github.com/osservatorionessuno/patela/issues" aria-label="github.com/osservatorionessuno/patela/issues(opens in a new tab)" target="_blank"&gt;github.com/osservatorionessuno/patela/issues&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Bugbane: Simplifying consensual Android forensics</title><link>/blog/2025/09/bugbane-simplifying-consensual-android-forensics/</link><pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate><guid>/blog/2025/09/bugbane-simplifying-consensual-android-forensics/</guid><description>&lt;p&gt;In this blog post, we introduce &lt;em&gt;Bugbane&lt;/em&gt;, an open-source Android app that makes consensual mobile forensics more accessible by leveraging Android’s local ADB service. We explain how it builds on tools like MVT and AndroidQF, guiding users through acquisitions and malware checks directly on their devices. We also highlight its reproducibility, secure export features, and our call for community feedback as development continues. Bugbane is still in early testing and not yet ready for general end-user release. &lt;a href="https://github.com/osservatorionessuno/bugbane" aria-label="Check out the GitHub repository(opens in a new tab)" target="_blank"&gt;Check out the GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We are grateful to &lt;a href="https://rwn.sh" aria-label="Rowen S(opens in a new tab)" target="_blank"&gt;Rowen S&lt;/a&gt; for their contributions to the app development and in writing this post.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;
 Background
&lt;/h2&gt;
&lt;p&gt;Mobile malware is often used against those standing up to power, but open-source tooling, community collectives, and civil society organizations can provide help to people who may otherwise be excluded from centralized forms of support: case in point, Amnesty International’s &lt;a href="https://www.amnesty.org/en/latest/research/2021/07/forensic-methodology-report-how-to-catch-nso-groups-pegasus/" aria-label="investigation into Pegasus(opens in a new tab)" target="_blank"&gt;investigation into Pegasus&lt;/a&gt; and release of the &lt;a href="http://mvt.re/" aria-label="Mobile Verification Toolkit(opens in a new tab)" target="_blank"&gt;Mobile Verification Toolkit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Besides MVT, the open-source forensics ecosystem is sustained by ongoing community contributions — for example, the &lt;a href="https://github.com/AssoEchap/stalkerware-indicators" aria-label="regularly updated stalkerware indicators list(opens in a new tab)" target="_blank"&gt;regularly updated stalkerware indicators list&lt;/a&gt; by &lt;a href="https://echap.eu.org/" aria-label="Echap(opens in a new tab)" target="_blank"&gt;Echap&lt;/a&gt;, or the digital investigations/mobile forensics platform &lt;a href="https://pts-project.org/" aria-label="PiRogue Tools Suite(opens in a new tab)" target="_blank"&gt;PiRogue Tools Suite&lt;/a&gt;. Projects like &lt;a href="https://github.com/mvt-project/androidqf" aria-label="AndroidQF(opens in a new tab)" target="_blank"&gt;AndroidQF&lt;/a&gt; have helped establish a shared format for consensual Android forensics data, while organizations such as SocialTIC have &lt;a href="https://forensics.socialtic.org/en/index.html" aria-label="produced and translated extensive documentation(opens in a new tab)" target="_blank"&gt;produced and translated extensive documentation&lt;/a&gt; to make these practices more accessible.&lt;/p&gt;
&lt;p&gt;We’ve used MVT for triaging many times over the years, including during the &lt;a href="/blog/2025/06/italys-intelligence-oversight-committee-copasir-report-on-graphite-spyware-raises-more-questions-than-it-answers/"&gt;recent Italian Paragon scandal&lt;/a&gt;, and when supporting local community members whose phones have been seized and later returned. These cases highlight the &lt;a href="/blog/2025/03/cellebrite-and-the-routine-use-of-digital-surveillance-in-italy/"&gt;widespread abuse of Cellebrite forensic tools for minor offenses&lt;/a&gt;, often carried out with little regard for the rights of the victims. The triaging process helps to decide if deeper follow-up is needed, and requires a separate computer from which to run the inspection, in-person access to the potentially-infected device, command-line skills, and additional troubleshooting ability. In practice, this means that triaging is not accessible to everyone who might need it.&lt;/p&gt;
&lt;p&gt;There have been attempts to move triage and analysis onto the device itself, most notably &lt;a href="https://securitylab.amnesty.org/latest/2023/09/fellowship-apkqf-simplifying-android-forensics/" aria-label="apkqf(opens in a new tab)" target="_blank"&gt;apkqf&lt;/a&gt;, which explored what level of on-device checks are possible using standard Android Platform APIs. These APIs are generally too limited to extract much of the information needed for reliable compromise checks, which are generally performed using &lt;a href="https://developer.android.com/tools/adb" aria-label="Android Debug Bridge(opens in a new tab)" target="_blank"&gt;Android Debug Bridge&lt;/a&gt; from a separate device. By design, most of the data available via ADB isn’t exposed to standard Android applications, due to Android’s increasing privilege separation and privacy protections; this is a good thing, because it means a given application installed on an Android phone is limited in how much sensitive information it can acquire, but it makes on-device analysis a little more difficult.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://android-developers.googleblog.com/2020/04/android-11-developer-preview-3.html" aria-label="Since Android 11(opens in a new tab)" target="_blank"&gt;Since Android 11&lt;/a&gt;, ADB has also been available locally via Wireless Debugging. The pairing flow uses a PIN-based &lt;a href="https://datatracker.ietf.org/doc/rfc9382/" aria-label="SPAKE2(opens in a new tab)" target="_blank"&gt;SPAKE2&lt;/a&gt; exchange to authenticate and establish a TLS connection. While the common case is pairing from an external computer, the same flow can be done entirely on-device, letting an Android application on a stock (unmodified, unrooted) system talk to its own local ADB service via a short sequence of user-controlled steps. Apps like &lt;a href="https://shizuku.rikka.app/" aria-label="Shizuku(opens in a new tab)" target="_blank"&gt;Shizuku&lt;/a&gt; use this functionality to acquire extra capabilities for standard Android applications, such as the ability to execute commands as the &lt;code&gt;shell&lt;/code&gt; user.&lt;/p&gt;
&lt;h2 id="bugbane"&gt;
 Bugbane
&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re pleased to announce an early preview of our new project &lt;a href="https://github.com/osservatorionessuno/bugbane" aria-label="Bugbane(opens in a new tab)" target="_blank"&gt;Bugbane&lt;/a&gt;, an open-source Android application to help users check their devices for indicators of malware by using a local ADB service.
Bugbane implements a user-friendly wizard to guide users through setup, data acquisition, and self-triage steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connecting to a trusted Wi-Fi network&lt;/li&gt;
&lt;li&gt;Granting notification permissions (necessary for the pairing flow)&lt;/li&gt;
&lt;li&gt;Enabling developer options (required for ADB use)&lt;/li&gt;
&lt;li&gt;Enabling Wireless Debugging&lt;/li&gt;
&lt;li&gt;Pairing Wireless Debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once pairing is complete, Bugbane can perform an AndroidQF-compatible, one-click acquisition and save it to local storage; &amp;ldquo;acquisition&amp;rdquo; is the MVT/AndroidQF term for data used to scan for signs of compromise. Users can perform as many acquisitions as they want; disabling developer options after every acquisition is recommended in the app, and users can use the Bugbane wizard to re-enable it for any subsequent acquisitions.&lt;/p&gt;
&lt;p&gt;Bugbane &lt;a href="https://github.com/mvt-project/mvt-indicators" aria-label="downloads the same indicators of compromise as MVT(opens in a new tab)" target="_blank"&gt;downloads the same indicators of compromise as MVT&lt;/a&gt;, and keeps the indicators up to date. Those indicators are used to check an acquisition for malware/stalkerware, just like with MVT.&lt;/p&gt;
&lt;figure class="article-figure "&gt;
 &lt;div class="frame"&gt;
 &lt;video controls muted loop playsinline&gt;
 &lt;source src="/blog/bugbane_pairing_en_av1.webm" type='video/webm; codecs="av01.0.05M.08"'&gt;
 &lt;source src="/blog/bugbane_pairing_en_vp9.webm" type='video/webm; codecs="vp9"'&gt;
 
 Your browser does not support the video tag.
 &lt;/video&gt;
 &lt;/div&gt;
 &lt;figcaption&gt;Bugbane guided ADB pairing process&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="acquire-now-detect-later"&gt;
 Acquire now, detect later
&lt;/h2&gt;
&lt;p&gt;Bugbane makes triage easier and more accessible, allowing users to self-test in just a few minutes without requiring another device. It also makes it practical for users to acquire data periodically without assistance.&lt;/p&gt;
&lt;p&gt;Crucially, Bugbane supports analyzing past acquisitions with updated IOCs. Infections that have already ended or that weren&amp;rsquo;t detected in real time might still be identified later if users perform regular Bugbane scans. Typically, forensic analysis happens only when there are compelling motivations — for example, when someone in the same social circle is known to have been compromised — as well as access to individuals or organizations able to help. Regular acquisitions may lead to more detections over time, including retroactive detection when new public IOCs are released.&lt;/p&gt;
&lt;p&gt;We hope this approach will provide support to a wider community, and will feed into more detailed, actionable threat intelligence.&lt;/p&gt;
&lt;figure class="article-figure "&gt;
 &lt;div class="frame"&gt;
 &lt;video controls muted loop playsinline&gt;
 &lt;source src="/blog/bugbane_analysis_en_av1.webm" type='video/webm; codecs="av01.0.05M.08"'&gt;
 &lt;source src="/blog/bugbane_analysis_en_vp9.webm" type='video/webm; codecs="vp9"'&gt;
 
 Your browser does not support the video tag.
 &lt;/video&gt;
 &lt;/div&gt;
 &lt;figcaption&gt;Bugbane acquisition and analysis&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="committed-to-transparency"&gt;
 Committed to transparency
&lt;/h2&gt;
&lt;p&gt;Bugbane is released under the GPLv3 license, with some components from Shizuku integrated under the Apache 2.0 license. In line with our commitment to security and transparency, we will distribute reproducible builds for the foreseeable future. Our CI already &lt;a href="https://github.com/osservatorionessuno/bugbane/actions/workflows/repro.yml" aria-label="checks reproducibility across two different environments (Ubuntu 22.04 and 24.04)(opens in a new tab)" target="_blank"&gt;checks reproducibility across two different environments (Ubuntu 22.04 and 24.04)&lt;/a&gt;, and we plan to fully support the &lt;a href="https://f-droid.org/docs/Reproducible_Builds/" aria-label="F-Droid reproducible builds(opens in a new tab)" target="_blank"&gt;F-Droid reproducible builds&lt;/a&gt; effort once we hit a stable release. Development is openly discussed and tracked on GitHub; feedback and community contributions are welcome &lt;a href="https://github.com/osservatorionessuno/bugbane/issues" aria-label="in the repository(opens in a new tab)" target="_blank"&gt;in the repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="easy-sharing-and-export"&gt;
 Easy sharing and export
&lt;/h2&gt;
&lt;p&gt;Bugbane can export &lt;a href="https://github.com/osservatorionessuno/bugbane/issues/17" aria-label="AndroidQF-compatible(opens in a new tab)" target="_blank"&gt;AndroidQF-compatible&lt;/a&gt; archives to device storage or through the system sharing dialog — allowing users to share data via email, Signal, or any other supported app. These archives are never exported in plaintext; they are always encrypted using &lt;a href="https://github.com/FiloSottile/age" aria-label="age(opens in a new tab)" target="_blank"&gt;age&lt;/a&gt; with a randomly generated, strong password. &lt;a href="https://github.com/FiloSottile/age" aria-label="age(opens in a new tab)" target="_blank"&gt;age&lt;/a&gt; is a file encryption software with multi-platform support, making it easy for others to decrypt safely. This way, users alerted by other sources — or who have self-detected something suspicious — can securely share the necessary data for further analysis.&lt;/p&gt;
&lt;figure class="article-figure "&gt;
 &lt;div class="frame"&gt;
 &lt;video controls muted loop playsinline&gt;
 &lt;source src="/blog/bugbane_export_en_av1.webm" type='video/webm; codecs="av01.0.05M.08"'&gt;
 &lt;source src="/blog/bugbane_export_en_vp9.webm" type='video/webm; codecs="vp9"'&gt;
 
 Your browser does not support the video tag.
 &lt;/video&gt;
 &lt;/div&gt;
 &lt;figcaption&gt;Bugbane encrypted export&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id="security-as-a-priority"&gt;
 Security as a priority
&lt;/h2&gt;
&lt;p&gt;As with any security-focused tool, the security of the application itself matters. The certificate used for the ADB connection is never stored in plaintext; it’s encrypted with a &lt;a href="https://developer.android.com/privacy-and-security/keystore" aria-label="Keystore(opens in a new tab)" target="_blank"&gt;Keystore&lt;/a&gt;-backed credential. Dependencies are kept to a minimum: the multi-ABI release APK is just ~12 MB, while per-ABI builds are ~6 MB. At present, acquisitions are stored unencrypted in the app’s protected storage. We plan to &lt;a href="https://github.com/osservatorionessuno/bugbane/issues/29" aria-label="add password or biometric authentication(opens in a new tab)" target="_blank"&gt;add password or biometric authentication&lt;/a&gt; to the app, so that stored acquisitions will be encrypted at rest and protected from unauthorized access.&lt;/p&gt;
&lt;h2 id="what-were-looking-for"&gt;
 What we&amp;rsquo;re looking for
&lt;/h2&gt;
&lt;p&gt;The app is ready for testing, but not for general public release. So far, we’ve done only internal testing, and we’re now looking for a broader group to provide usability and stability feedback. As with any such application, avoiding a false sense of security is critical; there are usability concepts that need to be clearly communicated, such as that the absence of detections does not mean that a device is secure.&lt;/p&gt;
&lt;p&gt;We’d also like to hear from organizations that might be interested in using Bugbane as a triaging tool: your feedback on common user pitfalls, real-world issues, and desired improvements will help us refine the app before general availability. We’re also open to implementing automated, secure sharing mechanisms — with explicit user consent — to better support civil society partners.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;We’ll be at &lt;strong&gt;&lt;a href="https://wiki.digitalrights.community/index.php?title=Global_Gathering" aria-label="Global Gathering(opens in a new tab)" target="_blank"&gt;Global Gathering&lt;/a&gt; next week&lt;/strong&gt;! While we won&amp;rsquo;t have a booth, we’d be happy to chat — &lt;a href="https://signal.me/#eu/pQJe47pHLt3tIdGyBO6960HHe5T9AnSu2lk2hnzTtH8feVG9RU9Oko85P0yMDERS" aria-label="reach out on Signal(opens in a new tab)" target="_blank"&gt;reach out on Signal&lt;/a&gt; or &lt;a href="mailto:info@osservatorionessuno.org"&gt;drop us an email&lt;/a&gt;. We&amp;rsquo;ll also be at &lt;a href="https://privacycamp.eu" aria-label="EDRi’s Privacy Camp(opens in a new tab)" target="_blank"&gt;EDRi’s Privacy Camp&lt;/a&gt; on &lt;strong&gt;September 30&lt;/strong&gt; in Brussels, and at the &lt;strong&gt;Tor Community Gathering&lt;/strong&gt; on &lt;strong&gt;October 3–5&lt;/strong&gt; in Denmark.&lt;/p&gt;
&lt;p&gt;Development of Bugbane will continue, with a general public release planned before the end of the year. Soon, we’ll need more community involvement — not just for feedback, but also for translations and contributions.&lt;/p&gt;
&lt;p&gt;As we’ve reiterated many times, stalkerware should never be available on mainstream App Stores, and government-backed spyware should not exist at all. Bugbane is our contribution to a collective response to these threats, acknowledging that when institutions fail, what remains is solidarity and collaboration.&lt;/p&gt;</description></item><item><title>The EU Commission's ProtectEU roadmap? A dangerous step toward permanent surveillance</title><link>/blog/2025/07/the-eu-commissions-protecteu-roadmap-a-dangerous-step-toward-permanent-surveillance/</link><pubDate>Fri, 25 Jul 2025 00:00:00 +0000</pubDate><guid>/blog/2025/07/the-eu-commissions-protecteu-roadmap-a-dangerous-step-toward-permanent-surveillance/</guid><description>&lt;p&gt;The &lt;a href="https://home-affairs.ec.europa.eu/news/commission-presents-roadmap-effective-and-lawful-access-data-law-enforcement-2025-06-24_en" aria-label="&amp;ldquo;roadmap&amp;rdquo; for the ProtectEU initiative(opens in a new tab)" target="_blank"&gt;&amp;ldquo;roadmap&amp;rdquo; for the ProtectEU initiative&lt;/a&gt;, recently announced by the European Commission and framed as an effort to &amp;ldquo;ensure effective and lawful access&amp;rdquo; to data for law enforcement and judicial authorities, marks a reversal of democratic priorities: privacy and fundamental rights are treated as obstacles to be managed, rather than founding values to be protected.&lt;/p&gt;
&lt;p&gt;In document COM/2025/349 final, drafted as part of the ProtectEU strategy, the new &amp;ldquo;internal security&amp;rdquo; plan unveiled by Commission President Ursula von der Leyen, we read that &amp;ldquo;security is the cornerstone upon which all fundamental freedoms are based.&amp;rdquo; This statement represents an ideological inversion, one that clashes with both the original framework of European integration and its foundational texts, starting with &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%3A12012M002" aria-label="Article 2 of the Treaty on European Union(opens in a new tab)" target="_blank"&gt;Article 2 of the Treaty on European Union&lt;/a&gt; and the &lt;a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%253A12012P%252FTXT" aria-label="Charter of Fundamental Rights of the EU(opens in a new tab)" target="_blank"&gt;Charter of Fundamental Rights of the EU&lt;/a&gt;, which place liberty and human dignity at the heart of the common legal order.&lt;/p&gt;
&lt;p&gt;The Commission&amp;rsquo;s strategy risks turning exception into rule: permanent suspicion becomes standard, preventive data collection is institutionalized, and mass surveillance is established as a governing infrastructure. It is the same security-driven approach that has been promoted for over thirty years across political camps, one that has already eroded essential freedoms, from the right to peaceful protest to the free expression of dissent, wherever it has been implemented.&lt;/p&gt;
&lt;p&gt;As a secondary consequence, it is now well documented that mass surveillance produces a chilling effect: the mere awareness of being watched leads to self-censorship, undermining pluralism. According to recent scholarship, it also narrows the space for personal and political development and drains public debate of participation. What is often at stake is not only privacy, but a portion of democracy&amp;rsquo;s very vitality.&lt;/p&gt;
&lt;h2 id="a-text-to-be-rewritten-or-abandoned"&gt;
 A text to be rewritten or abandoned
&lt;/h2&gt;
&lt;p&gt;The proposed roadmap contains a long list of critical issues, spanning a range of themes: from the misuse of AI in investigations to the all-too-familiar proposal to weaken encryption.&lt;/p&gt;
&lt;h3 id="data-retention"&gt;
 Data retention
&lt;/h3&gt;
&lt;p&gt;One of the most critical issues is data retention. The Commission promises an &amp;ldquo;impact assessment&amp;rdquo;, but the goal is already evident: to update existing rules in order to ensure broader and more systematic access to data for authorities. In other words, a return to forms of indiscriminate data retention, a practice already declared unlawful in multiple rulings by the Court of Justice of the EU (e.g., &lt;a href="https://eur-lex.europa.eu/legal-content/IT/TXT/HTML/?uri=CELEX:62012CJ0293" aria-label="CJEU, 8 April 2014. Digital Rights Ireland Ltd v Minister for Communications, Marine and Natural Resources and Others(opens in a new tab)" target="_blank"&gt;CJEU, 8 April 2014. Digital Rights Ireland Ltd v Minister for Communications, Marine and Natural Resources and Others&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id="yet-another-attack-on-encryption"&gt;
 Yet another attack on encryption
&lt;/h3&gt;
&lt;p&gt;The section dedicated to decryption is equally troubling. The Commission aims to promote &amp;ldquo;solutions that facilitate access to encrypted data&amp;rdquo; by 2030. Once again, encryption, which is one of the most effective tools available to protect sensitive communications, is in the crosshairs. This is a glaring contradiction, considering that the previous Commission, also led by Von der Leyen, &lt;a href="https://www.politico.eu/article/eu-commission-to-staff-switch-to-signal-messaging-app/" aria-label="recommended the use of Signal(opens in a new tab)" target="_blank"&gt;recommended the use of Signal&lt;/a&gt;, a messaging app known for its end-to-end encryption.&lt;/p&gt;
&lt;p&gt;Introducing backdoors into encryption technologies means making them vulnerable for everyone. There is no such thing as a &amp;ldquo;safe backdoor&amp;rdquo; that only authorities can access. Once a flaw is created, it is only a matter of time before it is exploited by malicious actors, criminal groups, or &lt;a href="https://www.politico.eu/article/press-report-merkel-and-eu-leaders-spied-on-by-nsa-via-denmark/" aria-label="foreign(opens in a new tab)" target="_blank"&gt;foreign&lt;/a&gt; and &lt;a href="https://www.politico.eu/article/hungary-viktor-orban-cia-spy-wiretap-hack-laptop-eu-officials-information-office-budapest-olaf/" aria-label="domestic(opens in a new tab)" target="_blank"&gt;domestic&lt;/a&gt; governments. It is a spectacular act of self-sabotage within a strategy that claims to promote &amp;ldquo;Internal Security&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="ai-for-forensic-analysis"&gt;
 AI for forensic analysis
&lt;/h3&gt;
&lt;p&gt;The push to develop forensic computing tools and artificial intelligence for analyzing digital data poses a direct threat to the right to a fair trial. This type of analysis often relies on data obtained &lt;a href="https://english.elpais.com/international/2025-07-13/for-years-the-eus-border-agency-illegally-transferred-data-on-migrants-and-activists-to-europol.html" aria-label="illegally(opens in a new tab)" target="_blank"&gt;illegally&lt;/a&gt;, and is conducted through algorithms that are inevitably subject to ethnic, social, religious, and gender biases. As a result, it can only produce unfounded evidence, disproportionately affecting already vulnerable groups. The questionable nature of such evidence makes it inadmissible in court.&lt;/p&gt;
&lt;h3 id="safeguards-are-neither-credible-nor-reliable"&gt;
 Safeguards are neither credible nor reliable
&lt;/h3&gt;
&lt;p&gt;The roadmap repeatedly emphasizes that access to data must be &amp;ldquo;necessary, proportionate, and respectful of fundamental rights.&amp;rdquo; But in practice, we know that once a technology exists, it will be used and abused especially by those in power. We have seen this with every instance of mass surveillance, from the Snowden revelations to the ongoing spyware crisis, which is partly European in origin and continues to be ignored by the Commission. We also know, as was the case then, that export and usage controls are ineffective, and that &lt;a href="https://osservatorionessuno.org/blog/2025/06/italys-intelligence-oversight-committee-copasir-report-on-graphite-spyware-raises-more-questions-than-it-answers/" aria-label="state investigations are deeply lacking, even when they formally fulfill legal obligations(opens in a new tab)" target="_blank"&gt;state investigations are deeply lacking, even when they formally fulfill legal obligations&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion-a-path-toward-surveillance-as-normality"&gt;
 Conclusion: A path toward surveillance as normality
&lt;/h2&gt;
&lt;p&gt;The EU Commission&amp;rsquo;s current roadmap risks becoming the infrastructure of a European digital panopticon. It is time to firmly restate that privacy is not the problem: it is part of the solution. Defending it is not an obstacle to justice, but a precondition for a truly democratic society.&lt;/p&gt;
&lt;p&gt;We call on civil society organizations, legal advocacy groups, data protection authorities, and Members of the European Parliament to urgently raise the debate around ProtectEU, before it becomes binding law without meaningful public scrutiny.&lt;/p&gt;</description></item><item><title>Italy's intelligence oversight committee (COPASIR) report on Graphite spyware raises more questions than it answers</title><link>/blog/2025/06/italys-intelligence-oversight-committee-copasir-report-on-graphite-spyware-raises-more-questions-than-it-answers/</link><pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate><guid>/blog/2025/06/italys-intelligence-oversight-committee-copasir-report-on-graphite-spyware-raises-more-questions-than-it-answers/</guid><description>&lt;p&gt;The long-awaited report by the Italian Parliamentary Committee for the Security of the Republic (COPASIR) on the use of Graphite spyware is now public. Yet rather than clarifying events, the document raises further concerns about government accountability, the cost of surveillance, and the extent of state overreach. Below we highlight some of the most troubling findings. &lt;a href="https://documenti.camera.it/_dati/leg19/lavori/documentiparlamentari/IndiceETesti/034/004/INTERO.pdf" aria-label="The full report is available on the website of the Italian Parliament (in Italian)(opens in a new tab)" target="_blank"&gt;The full report is available on the website of the Italian Parliament (in Italian)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-06-07-copasir-paragon-graphite_hu_b0843ac83417d3d9.webp" alt="COPASIR Graphite report"&gt;
 
 &lt;figcaption&gt;COPASIR Graphite report&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="targeting-a-humanitarian-ngo-for-five-years"&gt;
 Targeting a humanitarian NGO for five years
&lt;/h2&gt;
&lt;p&gt;The report confirms that Luca Casarini, a prominent figure in the humanitarian NGO Mediterranea Saving Humans, was intermittently placed under surveillance for at least five years. Initially, traditional methods were used; under the current government, however, the highly invasive Graphite spyware was deployed. Mediterranea is no secretive organization: its search and rescue missions in the Mediterranean are conducted under the watch of international observers and journalists.&lt;/p&gt;
&lt;p&gt;This raises serious questions about what could justify such a prolonged and intrusive operation targeting an organization whose goals and methods are transparent and lawful. The mismatch between the invasive tools employed, the years-long duration of the operation, and the meager investigative results is alarming — and difficult to justify.&lt;/p&gt;
&lt;h2 id="an-inconsistent-government-narrative"&gt;
 An inconsistent government narrative
&lt;/h2&gt;
&lt;p&gt;The Italian government has made conflicting and shifting statements regarding the spyware scandal. At first, it downplayed the existence of any victims; then, it acknowledged that contracts with the Israeli spyware vendor Paragon were still in effect. Later, it claimed the contracts had been suspended. &lt;a href="https://www.haaretz.com/israel-news/security-aviation/2025-06-05/ty-article/.premium/italy-admits-activists-were-hacked-with-israeli-spyware-but-not-journalists/00000197-3ff4-d079-ab97-7ff5bd8a0000" aria-label="According to Haaretz(opens in a new tab)" target="_blank"&gt;According to Haaretz&lt;/a&gt;, Prime Minister Giorgia Meloni even contacted Netanyahu directly to seek clarification.&lt;/p&gt;
&lt;p&gt;The COPASIR report, however, offers a different account: it states that the contract was unilaterally terminated by the Italian intelligence agencies, contradicting the government’s earlier version of events.&lt;/p&gt;
&lt;h2 id="is-copasir-trusting-graphical-interfaces"&gt;
 Is COPASIR trusting graphical interfaces?
&lt;/h2&gt;
&lt;p&gt;The report devotes considerable attention to the “traceability” of actions carried out using Graphite spyware:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Another legal issue related to the use of modern interception technologies, as emerged during hearings, is that data are saved in non-deletable databases by the public agencies using the system, unless the service provider is involved in the deletion process (p. 23, translation from Italian)&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;According to the information gathered by the Committee during its inquiry, every use of the Graphite spyware is logged: the operator must authenticate with a username and password, and each operation is recorded in a database or “acquisition log” and in an audit register. The database is located on the client’s premises, collects information about the target, and is not accessible to the company. The audit log, which is also hosted on servers located at the client, records all operations and system accesses, including technical access for maintenance or updates by the company. Furthermore, data in the database can be deleted by the client, but audit logs cannot be altered by the client. During site visits to the agencies on May 7, 2025, the Committee specifically requested and obtained assurances that the contents of the operations would not be accessible to Paragon Solutions. (p. 13, translation from Italian)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;But such assurances are fragile. The absence of a graphical interface to modify audit logs does not guarantee their immutability. If the audit system is under the client’s control, anyone with sufficient access could tamper with it—especially given that several months passed between the initial media exposure (January 31) and the start of any formal investigation. Only an independent forensic analysis could credibly verify the integrity of these logs.&lt;/p&gt;
&lt;p&gt;One striking example is the case of journalist Francesco Cancellato, officially deemed not to have been targeted, according to COPASIR. The explanation offered is that his device appeared in the detection results due to &amp;ldquo;false positives.&amp;rdquo; Yet his phone was not the only one affected, as multiple members of his newsroom also showed signs of compromise.&lt;/p&gt;
&lt;p&gt;Is it reasonable to expect private citizens or NGOs to provide definitive &amp;ldquo;proof&amp;rdquo; in cases where the very nature of spyware is to remain invisible, leave no trace, and render verification nearly impossible? This dynamic shifts the burden of proof to the victim, while conveniently sparing those with full operational control and privileged access from further scrutiny.&lt;/p&gt;
&lt;p&gt;The naïveté of such claims would be ironic, if not outright offensive, given the double standards they reveal. Authorities would never settle for a graphical confirmation in lieu of a forensic audit if it were a citizen or activist under investigation. Yet here, the possibility of tampering isn’t even considered. Victims and overburdened NGOs (often assisting hundreds of cases worldwide) are expected to conduct even deeper forensic investigations, despite the abundance of circumstantial and corroborating evidence: multiple infected journalists, a Meta notification, and partial independent confirmation by Citizen Lab.&lt;/p&gt;
&lt;h2 id="an-extortion-based-business-model"&gt;
 An extortion-based business model
&lt;/h2&gt;
&lt;p&gt;One passage from the report is particularly alarming:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Phone numbers with an Italian prefix are not among those contractually excluded from being subjected to surveillance through Graphite spyware. (p. 18, translation from Italian)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In plain terms: to prevent Italian citizens from being spied on by Paragon’s foreign clients, the Italian state must pay. The only way to exempt a country code from the list of potential surveillance targets is to negotiate and pay for a contractual exclusion.&lt;/p&gt;
&lt;p&gt;This reveals a business model based on extortion: if a government doesn’t pay, its citizens remain vulnerable to being targeted by foreign governments using Paragon&amp;rsquo;s tools.&lt;/p&gt;
&lt;h2 id="update--june-10"&gt;
 Update – June 10
&lt;/h2&gt;
&lt;p&gt;In the meantime, &lt;a href="https://www.haaretz.com/israel-news/security-aviation/2025-06-09/ty-article/.premium/paragon-questions-journalist-hack-probe-after-contract-nixed/00000197-511f-ddae-a1ff-5b5fb4bf0000" aria-label="Paragon has publicly responded to the COPASIR investigation(opens in a new tab)" target="_blank"&gt;Paragon has publicly responded to the COPASIR investigation&lt;/a&gt;, claiming it had offered technical cooperation to Italian authorities to verify whether its spyware had been used against Francesco Cancellato, and that it terminated its contract with Italy after the authorities declined to proceed.&lt;/p&gt;
&lt;p&gt;These statements should be treated with caution, as Paragon is a directly involved party with a clear interest in protecting its commercial image. However, on one point we agree: the investigation into the Fanpage journalists remains inadequate. And once again, we see conflicting versions from Paragon and the Italian government, raising more questions than they answer.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;
 Conclusion
&lt;/h2&gt;
&lt;p&gt;Once again, advanced surveillance tools are being used against activists and journalists, not just in the &lt;em&gt;exceptional cases&lt;/em&gt; that are often cited to justify their deployment. As previous cases in Poland, Spain, Greece, and elsewhere have shown, often in democratic countries spyware is used to target dissenting or inconvenient voices—with enormous financial costs, dubious investigative outcomes, and serious risks to global cybersecurity.&lt;/p&gt;
&lt;p&gt;The Italian government must take responsibility, provide full transparency on the actual use of Graphite, and immediately end all contracts with companies like Paragon. The European Union should act—&lt;a href="https://citizenlab.ca/2025/05/john-scott-railton-testifies-before-eu-parliaments-committee-on-civil-liberties-justice-and-home-affairs/" aria-label="as urged by Citizen Lab(opens in a new tab)" target="_blank"&gt;as urged by Citizen Lab&lt;/a&gt;—to restrict the use of such technologies, ban their production within Europe, and sanction the companies involved.&lt;/p&gt;</description></item><item><title>Patela: A basement full of amnesic servers</title><link>/blog/2025/05/patela-a-basement-full-of-amnesic-servers/</link><pubDate>Mon, 05 May 2025 00:00:00 +0000</pubDate><guid>/blog/2025/05/patela-a-basement-full-of-amnesic-servers/</guid><description>&lt;p&gt;The Osservatorio has finally activated its first experimental nodes on a diskless infrastructure, physically hosted in our own space and designed for low power consumption. In this post, we explain the reasons that led us to work on this project and the implementation we developed. We are also releasing the source code and documentation for the software we wrote, which we will continue to improve and which we hope will be useful for replicating our setup.&lt;/p&gt;
&lt;h2 id="motivations-and-threat-model"&gt;
 Motivations and Threat Model
&lt;/h2&gt;
&lt;p&gt;As we&amp;rsquo;ve often pointed out, running Tor nodes involves certain risks and fairly common issues—often due to the fact that, in the event of investigations or other problems, the authorities are not always competent enough to understand how Tor works, or, even if they are, they may still choose to act indiscriminately despite knowing they&amp;rsquo;re not targeting the actual party under investigation. There are many precedents: &lt;a href="https://www.zdnet.com/article/austrian-man-raided-for-operating-tor-exit-node/" aria-label="in Austria(opens in a new tab)" target="_blank"&gt;in Austria&lt;/a&gt;, &lt;a href="https://forum.torproject.org/t/tor-relays-artikel-5-e-v-another-police-raid-in-germany-general-assembly-on-sep-21st-2024/14533" aria-label="in Germany(opens in a new tab)" target="_blank"&gt;in Germany&lt;/a&gt;, &lt;a href="https://www.npr.org/sections/alltechconsidered/2016/04/04/472992023/when-a-dark-web-volunteer-gets-raided-by-the-police" aria-label="in the United States(opens in a new tab)" target="_blank"&gt;in the United States&lt;/a&gt;, &lt;a href="https://torservers.net/blog/2017-04-14-freebogatov-relaymob/" aria-label="in Russia(opens in a new tab)" target="_blank"&gt;in Russia&lt;/a&gt;, and likely many others. Some of our members have personally experienced that this can also be the case in Italy.&lt;/p&gt;
&lt;p&gt;In order to protect ourselves, our infrastructure, and the anonymity and privacy of our users, we must therefore consider a range of possible scenarios, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attempts to disrupt our operations&lt;/li&gt;
&lt;li&gt;Seizure of servers and data analysis&lt;/li&gt;
&lt;li&gt;Physical compromise of the servers&lt;/li&gt;
&lt;li&gt;Remote compromise of the servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the first case, the main obstacle is the constant stream of abuse reports and complaints about the activity of our network. In order to ensure our operations, as we’ve mentioned in previous posts, we now manage our own network with IP addresses we own, routed directly to our physical location—minimizing, as much as technically possible (for now!), the number of intermediaries with access or control over our infrastructure.&lt;/p&gt;
&lt;p&gt;Since the beginning of the project, we’ve followed two main intuitions: the first is that by approaching classic problems in less conventional ways, we might find solid solutions and also pave the way for other organizations and projects (like buying a physical space!). The second is that, to keep interest alive, both among our members and externally, our activities must be fun, engaging, and innovative.&lt;/p&gt;
&lt;h2 id="network-infrastructure"&gt;
 Network infrastructure
&lt;/h2&gt;
&lt;p&gt;As &lt;a href="/blog/2024/12/how-to-bgp-from-your-basement-and-other-tales/"&gt;already mentioned&lt;/a&gt;, we operate a router at a datacenter in Milan that announces our AS and IP space. It is currently connected to our basement via an XGS-PON &lt;strong&gt;10G/2.5G&lt;/strong&gt; link, but our goal is to expand our presence geographically and, where possible, reuse the same network resources (we’ll share more updates on this soon).&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2024-12-18-bgp-from-your-basement-and-other-tales-1.svg" alt="Network infrastructure diagram."&gt;
 
 &lt;figcaption&gt;Network infrastructure diagram.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;One of the key elements of this architecture is that we only trust machines to which we have exclusive access. This means that even our main router at the &lt;a href="https://www.mix-it.net/en/" aria-label="MIX(opens in a new tab)" target="_blank"&gt;MIX&lt;/a&gt; in Milan is considered potentially untrustworthy. For this reason, our main focus is on our datacenter in Turin.&lt;/p&gt;
&lt;h2 id="diskless-infra-and-system-transparency"&gt;
 Diskless infra and System Transparency
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.system-transparency.org/" aria-label="System Transparency(opens in a new tab)" target="_blank"&gt;System Transparency&lt;/a&gt; is a project originally funded by &lt;a href="https://mullvad.net" aria-label="Mullvad(opens in a new tab)" target="_blank"&gt;Mullvad&lt;/a&gt; for their VPN infrastructure, and now actively developed and maintained by &lt;a href="https://www.glasklarteknik.se/" aria-label="Glasklar Teknik(opens in a new tab)" target="_blank"&gt;Glasklar Teknik&lt;/a&gt;.&lt;br&gt;
The goal of the project is to develop a set of tools to run and certify &lt;em&gt;transparent systems&lt;/em&gt;. The idea is as follows: first, system images must be reproducible—that is, ISO files or similar images should be bit-for-bit rebuildable by anyone from source code, in order to prove the absence of tampering (or backdoors). Second, everything needed to reproduce these images must be public and well-documented, as should the images themselves. Finally, at least two additional properties must be ensured: first, only authorized system images should be allowed to run; second, there must be a public, immutable list of all authorized images (a so-called &lt;em&gt;transparency log&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;To summarize, in sequence, the concept of &lt;em&gt;system transparency&lt;/em&gt; requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building the system in a reproducible way&lt;/li&gt;
&lt;li&gt;Distributing all materials and instructions needed for reproduction&lt;/li&gt;
&lt;li&gt;Signing system images with securely stored keys&lt;/li&gt;
&lt;li&gt;Submitting all signatures to a transparency log&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Among the various tools provided by the System Transparency project, &lt;a href="https://docs.system-transparency.org/st-1.0.0/" aria-label="stboot(opens in a new tab)" target="_blank"&gt;stboot&lt;/a&gt; does most of the heavy lifting. The server boots from a minimal local image which, thanks to stboot, downloads and verifies the next stage: a reproducible and signed system image intended to run Tor (or, in the future, other services). Because of the signature verification, we can safely host these images remotely or in the cloud without major security concerns.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-05-05-patela-2_hu_e9f3891f8a81b06c.webp" alt="stboot boot screenshot."&gt;
 
 &lt;figcaption&gt;stboot boot screenshot.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Since the diskless system is still experimental—and although our goal is to make the entire infrastructure easily replaceable—we still run a few services and devices in a more traditional setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maintenance VPN server&lt;/strong&gt; on a separate network, used for remote administrator access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DHCP server&lt;/strong&gt;: only internal IPs are assigned from a private network range and used for debugging and maintenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS server&lt;/strong&gt;: best practices from the Tor project recommend running a local DNS resolver to reduce the risk of traffic analysis via domain resolution. In a Tor connection, exit nodes are responsible for resolving domains. For this reason, we’ve set up our own local recursive DNS server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP server&lt;/strong&gt;: used to serve the operating system image to the servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed switch&lt;/strong&gt;: we’ve been gifted a beautiful managed switch! Many thanks to those who chose to support us in this way!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="patela"&gt;
 Patela
&lt;/h2&gt;
&lt;p&gt;The problem with diskless software is that it doesn’t remember anything—not even the few configurations or keys needed to function correctly. In our case, there are just a few essential configurations for a Tor relay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tor&amp;rsquo;s configuration file, &lt;code&gt;/etc/torrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The relay&amp;rsquo;s identity keys, &lt;code&gt;/lib/tor/keys/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Various network settings (IP and NAT)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These configurations also need to be generated on the machine and updated later. For example, we need to be able to update the list of nodes that make up our &lt;a href="https://metrics.torproject.org/rs.html#details/08394C4873C8A71BE9F53593F9B4AD694BFCDB90" aria-label="family(opens in a new tab)" target="_blank"&gt;family&lt;/a&gt;. Clearly, maintaining a separate OS image for each machine would be both impractical and hard to maintain.&lt;/p&gt;
&lt;p&gt;While tools like &lt;a href="https://github.com/nusenu/ansible-relayor" aria-label="ansible-relayor(opens in a new tab)" target="_blank"&gt;ansible-relayor&lt;/a&gt; exist, we chose a different approach based on practical and security considerations. We prefer each node to generate its own keys and manage its own configuration, and for the configuration to be applied in &lt;strong&gt;pull&lt;/strong&gt; mode rather than &lt;strong&gt;push&lt;/strong&gt;. In other words, the node itself periodically checks for configuration updates, and only the node should have control over its keys. This is an important security distinction: a compromised configuration server should not be able to affect the security of the node or its keys.&lt;/p&gt;
&lt;p&gt;And that’s how &lt;a href="https://github.com/osservatorionessuno/patela" aria-label="patela(opens in a new tab)" target="_blank"&gt;patela&lt;/a&gt; was born.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Patela&lt;/em&gt; is a minimal software tool that downloads and uploads configuration files to a server. The server communicates network configurations (primarily assigning available IPs and the gateway via an API), and the client reads and applies them. All other files that would normally need to persist between reboots are encrypted locally using the TPM and then uploaded in encrypted form to the configuration server. This way, the configuration server never has access to the machine’s keys and cannot directly compromise it—except possibly through Denial of Service, such as distributing invalid IPs or corrupted backups.&lt;/p&gt;
&lt;p&gt;The system offers the following advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resistance to certain physical attacks, as encryption keys are stored in the TPM&lt;/li&gt;
&lt;li&gt;Anti-forensic by default, since no data is stored on disks or persistent media&lt;/li&gt;
&lt;li&gt;Nodes can be reset by reinitializing the TPM&lt;/li&gt;
&lt;li&gt;In the future, we could perform &lt;em&gt;remote attestation&lt;/em&gt; to certify that the running system images match those we published&lt;/li&gt;
&lt;li&gt;With remote attestation, TPM unsealing could happen only if the system image is genuine, ensuring a strong &lt;em&gt;chain of trust&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2025-05-05-patela-3.svg" alt="Logical diagram of patela."&gt;
 
 &lt;figcaption&gt;Logical diagram of patela.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="rust-and-tools"&gt;
 Rust and tools
&lt;/h2&gt;
&lt;p&gt;Since &lt;a href="https://gitlab.torproject.org/tpo/core/arti" aria-label="Tor is being rewritten in Rust(opens in a new tab)" target="_blank"&gt;Tor is being rewritten in Rust&lt;/a&gt;, and will soon offer everything needed to replace the classic C-Tor implementation even for relays, we decided to align with this and adopt the same language for better future compatibility.&lt;/p&gt;
&lt;p&gt;During development, it became clear that a flexible toolchain was essential, especially given the need to use C libraries and support multiple platforms. While &lt;em&gt;patela&lt;/em&gt;&amp;rsquo;s architecture isn’t conceptually very complex, making a piece of software like this maintainable over time, with so many components, is no easy task. Fortunately, the Rust ecosystem and its tooling have matured significantly in recent years, now offering almost everything we need. In practice, we aim to build both a client and a server, and we need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A database, for the server&lt;/li&gt;
&lt;li&gt;A library to download and upload resources, for the client&lt;/li&gt;
&lt;li&gt;External libraries (TPM, mTLS, crypto, etc.)&lt;/li&gt;
&lt;li&gt;Compatibility with multiple 64-bit architectures, for the client (&lt;code&gt;arm64&lt;/code&gt;, &lt;code&gt;x86_64&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;For the client, the ability to cross-compile with the target system&amp;rsquo;s libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containers are often used to meet requirements like ecosystem consistency. However, our goal is to build a simple, lightweight architecture that works on low-power machines and can modify global network configurations.&lt;/p&gt;
&lt;p&gt;There are also several things we explicitly want to avoid, some due to personal preference, others based on our chosen constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Splitting the project into many components, libraries, or subprojects, which leads to extra maintenance overhead&lt;/li&gt;
&lt;li&gt;Client and server, while performing different roles, mostly rely on the same libraries and data structures&lt;/li&gt;
&lt;li&gt;The compiled binary is the only required file: no packages or archives. And with &lt;em&gt;System Transparency&lt;/em&gt;, dynamic linking wouldn’t help either—we would still need to rebuild the system image for every update&lt;/li&gt;
&lt;li&gt;Writing a &lt;code&gt;Makefile&lt;/code&gt; to cover all these goals would likely be longer and more complex than writing the project itself&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here are the projects that helped us achieve all of this with just a few lines of code and relatively little effort:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/cargo/" aria-label="cargo(opens in a new tab)" target="_blank"&gt;cargo&lt;/a&gt;: the package manager that just works&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/clap" aria-label="clap(opens in a new tab)" target="_blank"&gt;clap&lt;/a&gt;: a solid foundation for building command-line tools&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/sqlx" aria-label="sqlx(opens in a new tab)" target="_blank"&gt;sqlx&lt;/a&gt;: a small, simple, and elegant SQL library&lt;/li&gt;
&lt;li&gt;&lt;a href="https://actix.rs/" aria-label="actix web(opens in a new tab)" target="_blank"&gt;actix web&lt;/a&gt;: a well-known and mature web framework&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/const-gen" aria-label="constgen(opens in a new tab)" target="_blank"&gt;constgen&lt;/a&gt;: lets us embed constants at compile-time, avoiding external archive management&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/cargo-zigbuild" aria-label="cargo zigbuild(opens in a new tab)" target="_blank"&gt;cargo zigbuild&lt;/a&gt;: integrates the &lt;a href="https://ziglang.org/" aria-label="Zig(opens in a new tab)" target="_blank"&gt;Zig&lt;/a&gt; compiler with cargo, making cross-compilation straightforward&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rustls/rustls" aria-label="rustls(opens in a new tab)" target="_blank"&gt;rustls&lt;/a&gt;: pure joy compared to communicating directly with OpenSSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="compilation-and-configuration"&gt;
 Compilation and configuration
&lt;/h2&gt;
&lt;p&gt;Once the &lt;em&gt;patela&lt;/em&gt; binary is compiled—with all required assets included—it’s enough to copy it into the system image before signing and distributing it.&lt;/p&gt;
&lt;p&gt;As mentioned earlier, we use &lt;em&gt;constgen&lt;/em&gt;, which makes it easy to generate compile-time constants, &lt;a href="https://github.com/osservatorionessuno/patela/blob/main/client/build.rs" aria-label="for example, embedding the client’s SSL certificates and the Tor configuration template(opens in a new tab)" target="_blank"&gt;for example, embedding the client’s SSL certificates and the Tor configuration template&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server_ca_file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;::&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;PATELA_CA_CERT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;unwrap_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;::&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;../certs/ca-cert.pem&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client_key_cert_file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;::&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;PATELA_CLIENT_CERT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server_ca&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;::&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_ca_file&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;::&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_key_cert_file&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;const_declarations&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;const_declaration!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;SERVER_CA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server_ca&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;const_declaration!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;pub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;CLIENT_KEY_CERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Although &lt;em&gt;cargo&lt;/em&gt; supports cross-compilation, when using external C dependencies like &lt;a href="https://github.com/tpm2-software/tpm2-tss" aria-label="tpm2-tss(opens in a new tab)" target="_blank"&gt;tpm2-tss&lt;/a&gt;, we must ensure that the &lt;em&gt;libc&lt;/em&gt; used during compilation is compatible with the one present in our system images. As mentioned earlier, the &lt;strong&gt;Zig&lt;/strong&gt; compiler—integrated directly with cargo via &lt;a href="https://github.com/rust-cross/cargo-zigbuild" aria-label="cargo-zigbuild(opens in a new tab)" target="_blank"&gt;cargo-zigbuild&lt;/a&gt;—allows us to specify the target &lt;em&gt;libc&lt;/em&gt; version, along with the architecture and kernel:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; cargo zigbuild --target x86_64-unknown-linux-gnu.2.36
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="network"&gt;
 Network
&lt;/h2&gt;
&lt;p&gt;We’ve previously discussed how to &lt;a href="/blog/2025/02/how-to-configure-multiple-tor-relays-on-the-same-interface-with-different-ips/"&gt;run multiple Tor servers on the same network interface with different IPs&lt;/a&gt; using a high-level firewall like &lt;em&gt;Shorewall&lt;/em&gt;.&lt;br&gt;
Now we’ve applied the same rules using &lt;em&gt;nftables&lt;/em&gt;, the native Linux interface for writing network rules.&lt;/p&gt;
&lt;p&gt;Two rules are required: one to match packets by &lt;em&gt;user ID&lt;/em&gt;, and another to configure &lt;em&gt;source NAT&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; nft &lt;span class="s1"&gt;&amp;#39;add rule ip filter OUTPUT skuid &amp;lt;process id&amp;gt; counter meta mark set &amp;lt;mark id&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; nft &lt;span class="s1"&gt;&amp;#39;add rule ip filter &amp;lt;interface&amp;gt; mark and 0xff == &amp;lt;mark id&amp;gt; counter snat to &amp;lt;source ip&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/osservatorionessuno/patela/blob/main/client/src/lib.rs#L229" aria-label="The rules are therefore applied directly by patela(opens in a new tab)" target="_blank"&gt;The rules are therefore applied directly by &lt;em&gt;patela&lt;/em&gt;&lt;/a&gt;, using the &lt;a href="https://docs.rs/nftnl/latest/nftnl/" aria-label="nftl(opens in a new tab)" target="_blank"&gt;nftl&lt;/a&gt; library.&lt;/p&gt;
&lt;h2 id="biscuits-mtls-and-tpm"&gt;
 Biscuits, mTLS and TPM
&lt;/h2&gt;
&lt;p&gt;We use Mutual TLS (mTLS) for communication. Unlike traditional TLS, where only the client verifies the server, mTLS involves mutual authentication. This offers a double benefit and elegantly solves multiple problems: on the one hand, TLS natively provides transport security and certificate revocation mechanisms; on the other, client certificate authentication allows us to uniquely identify each node or machine. We can then save and track metadata such as the assigned IP, name, and other related info in the server’s database.&lt;/p&gt;
&lt;p&gt;The main drawback of mTLS is managing certificates and their renewal. Everyone gets one bold choice per project — otherwise, where’s the fun? Ours was &lt;a href="https://www.biscuitsec.org/" aria-label="Biscuit(opens in a new tab)" target="_blank"&gt;Biscuit&lt;/a&gt;, a token-based authentication system similar to &lt;em&gt;JWT&lt;/em&gt;. The only reason we use a session token is to avoid authenticating every single API endpoint.&lt;/p&gt;
&lt;p&gt;On the client side, the magic lies in the &lt;em&gt;TPM&lt;/em&gt;. Libraries and examples are often sparse, and working with TPMs can be frustrating.&lt;br&gt;
In our case, we need a key to survive across reboots, because it’s the only &lt;em&gt;persistent&lt;/em&gt; element on the server.&lt;/p&gt;
&lt;p&gt;We use a &lt;em&gt;Trust On First Use&lt;/em&gt; (TOFU) approach: on first boot, the client generates a primary key inside the TPM and uses it to encrypt a secondary &lt;em&gt;AES-GCM&lt;/em&gt; key, which is used to encrypt configuration backups. The AES-GCM key is then stored on the server, encrypted with the TPM. This means only the physical node can decrypt its backup. To revoke a compromised node, we simply delete its encrypted key from the server. The logic for detecting whether a TPM has been initialized runs entirely on the client and is implemented in &lt;em&gt;patela&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the future, directly integrating relay long-term keys with &lt;em&gt;arti&lt;/em&gt; could be a better and more efficient solution, especially if combined with a robust measured boot process to control unsealing.&lt;/p&gt;
&lt;h2 id="future-work"&gt;
 Future work
&lt;/h2&gt;
&lt;p&gt;This post summarizes what we consider just the first phase of our project. We know there’s still a lot to do and improve, and we’d like to share our current wishlist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Open source network stack&lt;/strong&gt;: both in our Milan exchange point and in our datacenter we use routers running proprietary software (Mikrotik CCR2004-1G-12S+2XS and Zyxel XGS1250-12). We&amp;rsquo;d love to convert both to open source software on open hardware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open source Cantina-OS&lt;/strong&gt;: for now we’ve only published the &lt;a href="https://github.com/osservatorionessuno/patela" aria-label="patela(opens in a new tab)" target="_blank"&gt;patela&lt;/a&gt; code, but we’ll soon release our OS image configurations too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better certificate management&lt;/strong&gt;: right now, we recompile &lt;em&gt;patela&lt;/em&gt; for each physical node to embed the correct TLS certificate. We’d like to switch to a shared client certificate and move authentication to the TPM via remote attestation. This would simplify update workflows and enable attestation even for virtual machines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="in-practice"&gt;
 In practice
&lt;/h2&gt;
&lt;p&gt;We’ve launched four exit nodes, running with &lt;em&gt;patela&lt;/em&gt; and &lt;em&gt;System Transparency&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://metrics.torproject.org/rs.html#details/15FAD847CDCCFEC11133D8B350293C81617D7670" aria-label="murazzano(opens in a new tab)" target="_blank"&gt;murazzano&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metrics.torproject.org/rs.html#details/CA7924873CFD3CC56A8501135245019B40B68F61" aria-label="montebore(opens in a new tab)" target="_blank"&gt;montebore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metrics.torproject.org/rs.html#details/ACB8685DDC825B3E2915B84BAEAB877CFD3DC7A2" aria-label="robiola(opens in a new tab)" target="_blank"&gt;robiola&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metrics.torproject.org/rs.html#details/2BE1A08C2D37D1FFA088E6F3ED87B0CBF6E7A572" aria-label="seirass(opens in a new tab)" target="_blank"&gt;seirass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All four are running on a single &lt;a href="https://eu.protectli.com/product/v1410/" aria-label="Protectli(opens in a new tab)" target="_blank"&gt;Protectli&lt;/a&gt; with coreboot, pushing over 1 Gbps of effective total bandwidth.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-05-05-patela-1_hu_6f61e58922266c49.webp" alt="The Protectli machine in our basement."&gt;
 
 &lt;figcaption&gt;The Protectli machine in our basement.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>5x1000 donation campaign: Fiscal year 2024</title><link>/blog/2025/03/5x1000-donation-campaign-fiscal-year-2024/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><guid>/blog/2025/03/5x1000-donation-campaign-fiscal-year-2024/</guid><description>&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-31-5x1000-year-2024_hu_d4e524c9c4d818e.webp" alt="How to insert Fiscal Code inside 5x1000"&gt;
 
 &lt;figcaption&gt;How to insert Fiscal Code inside 5x1000&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;2024 was a year full of good intentions — and, incredibly, also of many concrete results! Some we had envisioned long ago, others emerged along the way.&lt;/p&gt;
&lt;p&gt;From the beginning, our goal was to experiment in order to increase the number of Tor exit nodes in Italy. To be honest, we haven’t deployed many yet, but we’ve laid solid foundations for the future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;we became an &lt;a href="/blog/2024/10/we-are-autonomous-system-214094/"&gt;Autonomous System (AS214094)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;we acquired &lt;a href="/blog/2024/12/how-to-bgp-from-your-basement-and-other-tales/"&gt;IP addresses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;and we can now deploy fiber across Italy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, we’re very close to becoming a full-fledged network operator.&lt;/p&gt;
&lt;p&gt;But Tor has never been our only goal. We’ve never set boundaries for ourselves, other than doing what we believe is right and what we genuinely enjoy.&lt;/p&gt;
&lt;p&gt;Over the past year, we have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;contributed to &lt;a href="/blog/2024/11/irpimedia-and-osservatorio-nessuno-unmasking-digital-violence/"&gt;investigative journalism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;conducted &lt;a href="/blog/2025/03/cellebrite-and-the-routine-use-of-digital-surveillance-in-italy/"&gt;independent research on surveillance in Italy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the coming months, our infrastructure dedicated to Tor will be ready, based on a fully open source and reproducible architecture.&lt;/p&gt;
&lt;p&gt;We’re working on several research projects that we plan to publish soon, and we can’t wait to get out of our basement and share our adventures.&lt;/p&gt;
&lt;h3 id="you-can-support-us-too"&gt;
 You can support us too
&lt;/h3&gt;
&lt;p&gt;Right now, there&amp;rsquo;s an easy way to support us at no cost to you. When filing your taxes in Italy, simply list our tax code as your 5x1000 beneficiary: &lt;a href="https://osservatorionessuno.org/donate/" aria-label="97871010019(opens in a new tab)" target="_blank"&gt;97871010019&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you for being with us — and for believing in what we do.&lt;/p&gt;</description></item><item><title>A deep dive into Cellebrite: Android support as of February 2025</title><link>/blog/2025/03/a-deep-dive-into-cellebrite-android-support-as-of-february-2025/</link><pubDate>Sun, 16 Mar 2025 00:00:00 +0000</pubDate><guid>/blog/2025/03/a-deep-dive-into-cellebrite-android-support-as-of-february-2025/</guid><description>&lt;p&gt;In &lt;a href="/blog/2025/03/a-deep-dive-into-cellebrite-how-it-came-to-be/"&gt;the previous blog post&lt;/a&gt;, we summarized part of the Cellebrite product history, and grasped some insights on the market of surveillance software and equipment aimed at mobile forensics. In this blog post, we will explore the current unlocking capabilities, as per their February 2025 documentation distributed to customers. We&amp;rsquo;ll also introduce some concepts and terminology, and hint at basic mitigations, though proper follow up will come in subsequent posts.&lt;/p&gt;
&lt;p&gt;For a very detailed and insightful write-up to help understand Android encryption, &lt;a href="https://blog.quarkslab.com/android-data-encryption-in-depth.html" aria-label="read
&amp;ldquo;Android Data Encryption in depth&amp;rdquo; by Quarkslab(opens in a new tab)" target="_blank"&gt;read
&amp;ldquo;Android Data Encryption in depth&amp;rdquo; by Quarkslab&lt;/a&gt; or watch &lt;a href="https://www.youtube.com/watch?v=unRFQhkK1DE" aria-label="their RECON23 talk(opens in a new tab)" target="_blank"&gt;their RECON23 talk&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="glossary"&gt;
 Glossary
&lt;/h2&gt;
&lt;p&gt;To understand the following content, it is useful to recap some of the terminology generally used in the field:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cold&lt;/strong&gt;: Powered off device, with content likely to be encrypted at rest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warm/Hot&lt;/strong&gt;: Powered on device, likely in AFU state or unlocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File Based Encryption (FBE)&lt;/strong&gt;: A method of encrypting individual files rather than the entire disk, allowing different encryption keys for different files based on user authentication and device state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full Disk Encryption (FDE)&lt;/strong&gt;: A method of encrypting the entire storage of a device requiring the PIN or passphrase to decrypt upon boot. Used mostly before Android 7, &lt;a href="https://source.android.com/docs/security/features/encryption/full-disk" aria-label="deprecated from Android 13 onwards(opens in a new tab)" target="_blank"&gt;deprecated from Android 13 onwards&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;After First Unlock (AFU)&lt;/strong&gt;: A powered-on device that has been unlocked at least once after boot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before First Unlock (BFU)&lt;/strong&gt;: A powered-off device or a powered-on device that has not been unlocked since boot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trusted Execution Environment (TEE)&lt;/strong&gt;: A secure, isolated environment within a processor that handles cryptographic operations and protects sensitive data from the main operating system. If no secure element is present, it is the main security context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure Element (SE/eSE/iSE)&lt;/strong&gt;: A hardware security chip, supported from Android 9 onwards, that implements cryptographic operations and key storage in a dedicated hardware component, such as the Titan chip. It is complementary to the TEE and not a requirement to run Android or FBE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keystore&lt;/strong&gt;: A system service in Android that provides a secure way to store and manage cryptographic keys. It ensures keys are not accessible to user-space applications and can only be used in secure operations, such as encryption, decryption, and signing. Keystore supports hardware-backed security when available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keymaster&lt;/strong&gt;: A lower-level component that works with Keystore, handling cryptographic operations within a Trusted Execution Environment (TEE) or secure element module (e.g., Titan M/Titan M2).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secure Startup&lt;/strong&gt;: A feature on Samsung Knox devices using FDE that encrypts the main key with the user PIN or password. If not enabled, user credentials are not actually required to decrypt the data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credential Encrypted (CE) Storage&lt;/strong&gt;: A type of encrypted storage that is only accessible after the user authenticates, ensuring sensitive data is protected until the device is unlocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device Encrypted (DE) Storage&lt;/strong&gt;: A form of encryption that protects data even before the user logs in, but is accessible after boot without requiring user authentication. It is generally used for system-critical files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full File System Extraction (FFS)&lt;/strong&gt;: A technique used to obtain a complete copy of a device&amp;rsquo;s file system, after operating system decryption. Analysis could also allow the retrieval of deleted files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brute Force (BF)&lt;/strong&gt;: Brute forcing PINs and passwords varies a lot depending on software and hardware implementations. The worst case is the extraction of encrypted keys and offline bruteforcing. Other cases include bypassing throttling on the TEE or secure elements for online bruteforcing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Patch Level (SPL)&lt;/strong&gt;: Indicates the date or version of the latest security updates applied to a device.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, read the &lt;a href="https://discuss.grapheneos.org/d/14344-cellebrite-premium-july-2024-documentation" aria-label="GrapheneOS forum post discussing July 2024 Cellebrite capabilities(opens in a new tab)" target="_blank"&gt;GrapheneOS forum post discussing July 2024 Cellebrite capabilities&lt;/a&gt;, and the description of &lt;a href="https://docs.samsungknox.com/admin/knox-platform-for-enterprise/kbas/kba-360039577713/" aria-label="their encryption systems from Samsung Knox(opens in a new tab)" target="_blank"&gt;their encryption systems from Samsung Knox&lt;/a&gt;. All modern Android devices have a TEE. Some devices, for instance Google Pixels, can have an extra secure element, like the &lt;a href="https://blog.google/products/pixel/titan-m-makes-pixel-3-our-most-secure-phone-yet/" aria-label="Titan M(opens in a new tab)" target="_blank"&gt;Titan M&lt;/a&gt;. Despite Google&amp;rsquo;s hardening efforts, exploitation is incredibly difficult, and vulnerabilities are very costly, &lt;a href="https://blog.quarkslab.com/attacking-titan-m-with-only-one-byte.html" aria-label="but not impossible(opens in a new tab)" target="_blank"&gt;but not impossible&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-february-2025-support-matrix"&gt;
 The February 2025 support matrix
&lt;/h2&gt;
&lt;p&gt;Cellebrite, as far as we know, publishes a support matrix for Android-based and iOS-based devices monthly or at least multiple times a year. The latest version available at time of writing is version &lt;strong&gt;7.73.1&lt;/strong&gt; released on &lt;strong&gt;February 2025&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Below is a description of the automated process. Clearly, if the phone is unlocked or if the PIN or password are already known, the process is straightforward.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-2-1_hu_ab561190456c2d20.webp" alt="High-level description of the automated process for obtaining file system dumps"&gt;
 
 &lt;figcaption&gt;High-level description of the automated process for obtaining file system dumps&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Unlocking non-flagship devices is usually easier for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many manufacturers fail to promptly release security updates, or in some cases, never release them at all.&lt;/li&gt;
&lt;li&gt;Different processors have varying security stacks and hardening measures. A secure element adds significant protections compared to a device with only a TEE, but it is not required and often not present.&lt;/li&gt;
&lt;li&gt;It is well known that some MTK (MediaTek) processors are vulnerable to bootrom exploits and the whole trust chain can be compromised by anyone, including the TEE. Bootrom exploits are not patchable.&lt;/li&gt;
&lt;li&gt;If a manufacturer has not invested in securing their devices, they may disable common security mitigations or introduce privileged software that weakens overall security.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-2-2_hu_5985a9c28518103c.webp" alt="Support matrix, high-level per chipset and manufacturer"&gt;
 
 &lt;figcaption&gt;Support matrix, high-level per chipset and manufacturer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As seen in the slides, there is a reason why almost every non-Pixel, non-Samsung device is considered unlockable, with only a few exceptions. Even using LineageOS, which typically ensures at least some level of security updates, does not make a significant difference if the underlying platform and binary blobs are not secure, which is almost never the case.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-2-3_hu_44d25576b4ea9055.webp" alt="Support matrix, distinction between cold and hot per manufacturer."&gt;
 
 &lt;figcaption&gt;Support matrix, distinction between cold and hot per manufacturer.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Brute-force can take different forms. A root exploit could allow active bruteforcing, involving methods to bypass throttling or significantly speed up the process in various ways. A TEE exploit (or, for instance, a secure boot bypass as shown in MediaTek chips by Quarkslab) could allow for offline bruteforcing, making any numerical PIN shorter than 10 digits useless. This serves as a good reminder that a 6-digit PIN or pattern will always be cracked. Increasing the length and complexity, ideally by using a password instead, provides a meaningful layer of mitigation.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-2-4_hu_9ae94f43a2347f89.webp" alt="Support matrix, MediaTek- and Exynos-based devices."&gt;
 
 &lt;figcaption&gt;Support matrix, MediaTek- and Exynos-based devices.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As anticipated, if you have a MediaTek-based device, while it is still worth using a long password, there is practically no mitigation possible, except ditching it.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-2-5_hu_f0c5c08cf0350d88.webp" alt="Support matrix, older Pixel devices up to the 5/5a."&gt;
 
 &lt;figcaption&gt;Support matrix, older Pixel devices up to the 5/5a.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Pixel devices remain quite a solid choice if kept updated. While it seems that for the standard Google ROM there are working exploits available to perform the FFS extraction in AFU state, on the contrary GrapheneOS additional hardening and protections are effective, and have been so since 2022. Brute force is generally not available, because the user credentials are stored in the secure element, and thus cannot be extracted and active attempts are heavily throttled.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-2-6_hu_ae9fac3f1dd39e89.webp" alt="Support matrix, newer Pixel devices until the 9."&gt;
 
 &lt;figcaption&gt;Support matrix, newer Pixel devices until the 9.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As you could have guessed, the more solid choice for an Android device is a newer Pixel, running GrapheneOS and with a strong password. Biometric authentication works differently, and it is generally not the main target of these attacks, meaning unless your threat model implies that you could be physically coerced to unlock your device, it is safe to use. That said, using a strong password is a minor daily inconvenience: you will only be prompted for it after a power cycle. Applications that offer separate passwords and encryption, such as Signal or many password managers should have it enabled to maximize protections in case everything else fails.&lt;/p&gt;
&lt;h2 id="conclusions"&gt;
 Conclusions
&lt;/h2&gt;
&lt;p&gt;If you think you could be in a situation where your device could be seized, it is always wise to turn it off first. You should also change your PIN, if you use one, as soon as possible in favor of a strong password. The same applies if your device currently has no PIN or if you are using a pattern. If you think there is a high chance of you being eventually targeted, you should move to a Pixel device using GrapheneOS, even just a secondhand older one (from the 6a onwards).&lt;/p&gt;
&lt;p&gt;As we stated in the first blog post, this market is unregulated and is prone to countless abuses, as widely reported by Amnesty against civil society, but possibly in instances that could be harder to detect, such as surveillance connected to gender violence. While we do not currently have direct evidence of these occurrences, anybody with a license could be performing these services, and we know they have been sold in the double-digit figures in Italy alone.&lt;/p&gt;</description></item><item><title>A deep dive into Cellebrite: How it came to be</title><link>/blog/2025/03/a-deep-dive-into-cellebrite-how-it-came-to-be/</link><pubDate>Sun, 16 Mar 2025 00:00:00 +0000</pubDate><guid>/blog/2025/03/a-deep-dive-into-cellebrite-how-it-came-to-be/</guid><description>&lt;p&gt;The widespread use of Cellebrite software is not a secret: &lt;a href="/blog/2025/03/cellebrite-and-the-routine-use-of-digital-surveillance-in-italy/"&gt;we mentioned it very recently&lt;/a&gt;, as did &lt;a href="https://securitylab.amnesty.org/latest/2024/12/a-digital-prison-surveillance-and-the-suppression-of-civil-society-in-serbia/" aria-label="Amnesty in their recent report covering abuses towards civil society(opens in a new tab)" target="_blank"&gt;Amnesty in their recent report covering abuses towards civil society&lt;/a&gt; and &lt;a href="https://securitylab.amnesty.org/latest/2025/02/cellebrite-zero-day-exploit-used-to-target-phone-of-serbian-student-activist/" aria-label="detailing vulnerabilities exploited(opens in a new tab)" target="_blank"&gt;detailing vulnerabilities exploited&lt;/a&gt;. This blogpost is the first in a series of two: here we&amp;rsquo;ll explore the general history and development of the company, while in the second one we will provide a more detailed list of its capabilities updated as of February 2025. Cellebrite is not alone in this market; other competitors, especially regarding exploitation, include &lt;a href="https://www.magnetforensics.com/products/magnet-graykey/" aria-label="Greykey(opens in a new tab)" target="_blank"&gt;Greykey&lt;/a&gt; (previously &lt;a href="https://www.grayshift.com/" aria-label="Greyshift(opens in a new tab)" target="_blank"&gt;Greyshift&lt;/a&gt;), recently acquired by Axon and integrated into Magnet Forensics.&lt;/p&gt;
&lt;h2 id="a-brief-history"&gt;
 A brief history
&lt;/h2&gt;
&lt;p&gt;Our recent interest in Cellebrite arises from two key developments. First, we have seen a surge of activists asking us to examine phones that were returned after being seized. Second, sources familiar with the matter have confirmed that, following the &lt;a href="https://www.theguardian.com/technology/2025/feb/05/activists-critical-of-italian-pm-may-have-had-their-phones-targeted-by-paragon-spyware-says-whatsapp" aria-label="recent Paragon scandal in Italy(opens in a new tab)" target="_blank"&gt;recent Paragon scandal in Italy&lt;/a&gt;, Cellebrite has attempted to reassess its customer vetting practices. However, particularly in Italy, there have been longstanding reports of erratic sales policies and practices. To understand this, let’s take a step back: companies like Cellebrite operate in a largely unregulated market. While their primary customers are law enforcement agencies, their target customer base extends to a wide range of private companies and individuals. This raises significant concerns, as some of these customers may be operating outside the law—yet, in most cases, there is no oversight to hold them accountable.&lt;/p&gt;
&lt;p&gt;The line of products sold by the company has undergone multiple rounds of rebranding and structural changes over the past four years, particularly since &lt;a href="https://signal.org/blog/cellebrite-vulnerabilities/" aria-label="Signal published their research about it(opens in a new tab)" target="_blank"&gt;Signal published their research about it&lt;/a&gt;. Cellebrite has been in the market for a long time, initially focusing on dedicated hardware for efficient forensic extraction from mobile devices, even before smartphones existed. If you &lt;a href="https://www.ebay.com/sch/i.html?_nkw=cellebrite" aria-label="buy any of their older devices(opens in a new tab)" target="_blank"&gt;buy any of their older devices&lt;/a&gt;, you might be surprised to find that even end-of-life products, such as the relatively recent &lt;a href="https://cellebrite.com/en/cellebrite-introduces-ufed-touch2-platform/" aria-label="UFED Touch 2(opens in a new tab)" target="_blank"&gt;UFED Touch 2&lt;/a&gt;, still include cables for extracting data from Nokia 1100 phones. While forensic analysis has always been central to their business model, the need to unlock devices and bypass cryptography is a relatively recent development.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-1-1_hu_4048aff3759011f6.webp" alt="Outdated versions of Cellebrite hardware are sold all over the internet."&gt;
 
 &lt;figcaption&gt;Outdated versions of Cellebrite hardware are sold all over the internet.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;While, as far as we know, Cellebrite used to ship known exploits or unlocking methods for older models, the introduction of mandatory file-based encryption (FBE) and secure elements has shifted the approach to mobile security. Rumor has it that, while there was already demand in the market and some companies were involved, many were primarily repurposing jailbreaks, known chipset vulnerabilities, and similar techniques to achieve their goals. However, &lt;a href="https://theapplewiki.com/wiki/Checkm8_Exploit" aria-label="checkm8(opens in a new tab)" target="_blank"&gt;checkm8&lt;/a&gt; changed the game for the entire industry—it made it possible to unlock all iPhones from the 4S up to the X, regardless of the software patch level. With these tools freely available and easily accessible, competitors—and even law enforcement agencies themselves—could perform the unlocking and extraction without relying on specialized vendors. As the market became more competitive, companies realized they needed to step up their game to retain and expand their customer base. This led to a significant increase in research efforts focused on acquiring and developing 0-day and 1-day vulnerabilities.&lt;/p&gt;
&lt;p&gt;While the exploits required for these types of attacks are often very different from those used in spyware infections, since they rely on hardware access rather than message-based, browsing-based, or similar entry points, they are not necessarily simpler, especially for Apple devices. For Android, being based on Linux, things seem relatively more accessible due to a larger attack surface. This includes a wide range of &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2024-53197" aria-label="USB-based drivers that have undergone little to no scrutiny over the years(opens in a new tab)" target="_blank"&gt;USB-based drivers that have undergone little to no scrutiny over the years&lt;/a&gt; and are still shipped by default, often remaining loaded even when a phone is locked. Recent reports from Amnesty have highlighted these vulnerabilities. However, advanced mitigations, such as memory tagging and other new security features on Pixel phones, are making exploitation increasingly difficult.&lt;/p&gt;
&lt;h2 id="distributing-exploits-is-such-a-difficult-job"&gt;
 Distributing exploits is such a difficult job
&lt;/h2&gt;
&lt;p&gt;And here we arrive at the second major issue in this market: previously, Cellebrite kept its most valuable vulnerabilities private, requiring customers to physically ship the devices they wanted unlocked to certain locations. Additionally, the exploitation process was largely manual: human analysts would identify devices and attempt to determine the most suitable unlocking and extraction method if it was not already covered by the suite provided to customers. This approach proved problematic for several reasons. First, some customers were unwilling to send their devices across borders, as it could compromise the chain of custody. Second, in most democracies, defendants have the right to be present during non-reproducible forensic analyses that might alter evidence, something inherent to active exploitation attacks. Lastly, scalability was a major limitation, both due to the human effort required and the delays caused by shipping. From a business standpoint, an automated solution would have benefited both Cellebrite&amp;rsquo;s operations and its customers.&lt;/p&gt;
&lt;p&gt;But this presents a fundamental challenge: if Cellebrite simply shipped its exploitation capabilities with their software suite, even with extensive obfuscation, skilled researchers could quickly reverse-engineer their vulnerabilities and expose them. This could happen either out of a commitment to security and democratic principles or, ironically, to collect bug bounties. As far as we know, Cellebrite has long used custom-made cables and, more recently, has attempted to enhance its capabilities with single multi-purpose adapters required for deploying their attacks. These hardware dependencies also make it more difficult for cracked versions of their suite to proliferate—something we have firsthand witnessed as being far from uncommon.&lt;/p&gt;
&lt;p&gt;However, as long as the core logic had to run on the customer&amp;rsquo;s computer—or even on a dedicated tablet, as marketed in previous generations—it remained relatively easy to extract and analyze.&lt;/p&gt;
&lt;p&gt;Here comes the idea: since tablets and similar devices were highly impractical and had limited resources, while current Inseyets software might &lt;a href="https://s3-static-content-marketing-us-east-1-prod.s3.amazonaws.com/wp-content/uploads/2024/07/Physical-Analyzer-7-vs.-Cellebrite-Inseyets.PA-10_A4_Jul2024.pdf" aria-label="require up to 128GB of RAM and 24-core Threadripper CPUs(opens in a new tab)" target="_blank"&gt;require up to 128GB of RAM and 24-core Threadripper CPUs&lt;/a&gt; to run smoothly on large pieces of evidence and probably to support &lt;a href="https://cellebrite.com/en/ai-powered-investigations-how-cellebrite-is-accelerating-justice-with-cutting-edge-technology/" aria-label="their &amp;ldquo;magic AI&amp;rdquo;(opens in a new tab)" target="_blank"&gt;their &amp;ldquo;magic AI&amp;rdquo;&lt;/a&gt; (&lt;a href="https://cellebrite.com/en/revolutionizing-investigations-the-future-of-generative-ai-in-assisting-law-enforcement-to-solve-crimes-faster/" aria-label="even generative AI(opens in a new tab)" target="_blank"&gt;even generative AI&lt;/a&gt;, which, of course, would &lt;em&gt;never&lt;/em&gt; hallucinate—&lt;a href="https://www.404media.co/cellebrite-is-using-ai-to-summarize-chat-logs-and-audio-from-seized-mobile-phones/" aria-label="especially in cases where people&amp;rsquo;s futures are at stake(opens in a new tab)" target="_blank"&gt;especially in cases where people&amp;rsquo;s futures are at stake&lt;/a&gt;), they opted for a hybrid approach.&lt;/p&gt;
&lt;p&gt;Instead of moving the entire suite to a dedicated appliance, Cellebrite decided to keep the main software running on the customer&amp;rsquo;s hardware. However, for selected customers permitted to purchase the Premium package (or whatever it is currently called—whether &lt;a href="https://cellebrite.com/en/premium-advanced-access/" aria-label="Premium Advanced Access(opens in a new tab)" target="_blank"&gt;Premium Advanced Access&lt;/a&gt;, &lt;a href="https://cellebrite.com/en/cellebrite-advantage-2/" aria-label="Advantage(opens in a new tab)" target="_blank"&gt;Advantage&lt;/a&gt;, &lt;a href="https://www.forensicfocus.com/podcast/acquisition-and-extraction-with-cellebrites-new-endpoint-mobile-now-and-mobile-ultra/" aria-label="Advanced Logical(opens in a new tab)" target="_blank"&gt;Advanced Logical&lt;/a&gt;, or perhaps &lt;a href="https://www.dataexpert.eu/news/the-three-levels-of-cellebrite-premium/" aria-label="Premium ES, also known as Mobile Elite(opens in a new tab)" target="_blank"&gt;Premium ES, also known as Mobile Elite&lt;/a&gt;), they now ship a specialized embedded device: the &lt;a href="https://s3-static-content-marketing-us-east-1-prod.s3.amazonaws.com/wp-content/uploads/2024/04/Cellebrite-Inseyets-upgrade-path-to-inseyets.pdf" aria-label="Turbo Link(opens in a new tab)" target="_blank"&gt;Turbo Link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-16-a-deep-dive-into-cellebrite-part-1-2_hu_e5d5e4e8b6a60c80.webp" alt="Screenshot from the Turbo Link marketing brochure."&gt;
 
 &lt;figcaption&gt;Screenshot from the Turbo Link marketing brochure.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;As we will see in the next post, the new software suite, along with the Turbo Link adapter, fully streamlines exploitation and extraction. The exploits likely never transit in cleartext on the customer&amp;rsquo;s machine and are only delivered when necessary, after the target device has been identified. From the limited pictures available, the Turbo Link appears to be actively cooled and includes an HDMI port, which requires a secondary cable from the kit to connect to the target device. A reasonable assumption about this setup is that exploits are likely end-to-end encrypted from Cellebrite&amp;rsquo;s servers to the Turbo Link device, which itself probably has to guarantee a certain level of both software and hardware integrity.&lt;/p&gt;
&lt;p&gt;According to Amnesty, the use of an HDMI port is to simplify the emulation of media peripherals, often used for exploitation. On the other side, it is connected via USB to the customer&amp;rsquo;s computer. However, for customers who wish to scale beyond their contracts—or for those needing to unlock devices while being offline—Cellebrite also sells licenses for a centralized network server called the &lt;a href="https://cellebrite.com/wp-content/uploads/2022/08/Solution_Overview_Cellebrite_Premium_ES.pdf" aria-label="Enterprise Vault Server (EVS)(opens in a new tab)" target="_blank"&gt;Enterprise Vault Server (EVS)&lt;/a&gt;. According to the brochure and &lt;a href="https://www.youtube.com/watch?v=pomUKsYitag" aria-label="their promotional videos(opens in a new tab)" target="_blank"&gt;their promotional videos&lt;/a&gt;, it &amp;ldquo;&lt;em&gt;supplies the resources necessary to gain access to advanced iOS and Android devices&lt;/em&gt;.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="conclusions"&gt;
 Conclusions
&lt;/h2&gt;
&lt;p&gt;We have explored some of Cellebrite&amp;rsquo;s history and business structure. In the next post, we&amp;rsquo;ll take a more practical look at how this translates into their current capabilities. In the coming months, we will publish mitigation strategies and guides to help you and your communities defend against these types of threats.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll reiterate again: we strongly believe that vulnerability trading is intrinsically unethical, as it fuels a vicious cycle of insecurity that puts everyone at risk.&lt;/p&gt;
&lt;p&gt;If you have information that could complement this piece, feel free to contact us. If you own old Cellebrite hardware that is end-of-life, or that no longer has a valid license, thus no longer useful, we are collecting older surveillance technology for archival purposes (more on this soon) and we will happily collect your e-waste. Visit the &lt;a href="/contacts"&gt;contacts page&lt;/a&gt; to discover how to get in touch with us securely.&lt;/p&gt;</description></item><item><title>Cellebrite and the routine use of digital surveillance in Italy</title><link>/blog/2025/03/cellebrite-and-the-routine-use-of-digital-surveillance-in-italy/</link><pubDate>Sat, 08 Mar 2025 00:00:00 +0000</pubDate><guid>/blog/2025/03/cellebrite-and-the-routine-use-of-digital-surveillance-in-italy/</guid><description>&lt;p&gt;In recent years, authorities in several countries have intensified their use of digital surveillance tools to access mobile devices, often without proper adherence to legal procedures and without the informed consent of those affected—sometimes in blatant violation of existing laws, &lt;a href="https://www.theguardian.com/technology/2025/jan/31/whatsapp-israel-spyware" aria-label="as demonstrated by the current Paragon and Graphite case(opens in a new tab)" target="_blank"&gt;as demonstrated by the current Paragon and Graphite case&lt;/a&gt;. Osservatorio Nessuno recently assisted members of the No CPR Torino assembly (a collective opposing Italy&amp;rsquo;s Centri di Permanenza per il Rimpatrio, detention centers for migrants awaiting deportation) in discovering that their phones had been unlocked and forensically analyzed using Cellebrite tools, without being given sufficient prior notice to allow their legal consultants to verify that the procedure was conducted lawfully.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2025-03-08-cellebrite-against-activists_hu_15c6a075bf51de2a.webp" alt="Archive photo of an extraction in progress using Cellebrite Touch 2"&gt;
 
 &lt;figcaption&gt;Archive photo of an extraction in progress using Cellebrite Touch 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="evidence-of-cellebrite-use"&gt;
 Evidence of Cellebrite use
&lt;/h2&gt;
&lt;p&gt;A specific case concerns three phones that were seized on March 20, 2024, during an action at Malpensa Airport. The smartphones, protected by PINs and with encryption enabled, were returned with clear signs of compromise: two of them had their PINs written on a sticker on the back, an evident indication that they had been unlocked and analyzed. As far as we know, the devices were turned off and relatively up to date, requiring an unlock method that, according to Cellebrite&amp;rsquo;s own terminology, is classified as &lt;em&gt;Before First Unlock&lt;/em&gt; (BFU), one of the most technically complex and expensive exploits to develop and acquire.&lt;/p&gt;
&lt;p&gt;Using the &lt;a href="https://mvt.re" aria-label="Mobile Verification Toolkit(opens in a new tab)" target="_blank"&gt;Mobile Verification Toolkit&lt;/a&gt;, we confirmed the compromise and found unequivocal signs of the use of tools from the Israeli company. The extracted files matched those analyzed in a recent &lt;a href="https://www.amnesty.org/en/latest/news/2024/12/serbia-authorities-using-spyware-and-cellebrite-forensic-extraction-tools-to-hack-journalists-and-activists/" aria-label="Amnesty International report, which denounces the use of Cellebrite and spyware to monitor journalists and activists in Serbia(opens in a new tab)" target="_blank"&gt;Amnesty International report, which denounces the use of Cellebrite and spyware to monitor journalists and activists in Serbia&lt;/a&gt;. The connection to Cellebrite and its UFED/Inseyets service suggests that Italian law enforcement sent the devices to third-party consultants who, equipped with these tools, extracted data from the phones without adequately informing the individuals concerned or their legal representatives.&lt;/p&gt;
&lt;p&gt;We are currently in contact with international organizations and are assisting in an in-depth technical analysis. The results of this analysis will be published at a later date.&lt;/p&gt;
&lt;h2 id="cellebrite-and-the-0-day-market-a-threat-to-everyone"&gt;
 Cellebrite and the 0-day market: a threat to everyone
&lt;/h2&gt;
&lt;p&gt;It is not just the pervasiveness of surveillance that is concerning, but also the fact that Cellebrite is active in the 0-day exploit market, which takes advantage of unknown vulnerabilities in operating systems to bypass security measures. This type of trade undermines the security of all users, including governments and businesses, fueling a vicious cycle of cybersecurity threats.&lt;/p&gt;
&lt;p&gt;Osservatorio Nessuno strongly condemns the use of tools like Cellebrite against activists, journalists, and ordinary citizens. These tools, marketed as crime-fighting solutions, are instead often used to target political dissent and civil society. Furthermore, the companies that develop and sell them—particularly in the case of Cellebrite—are not required to follow any meaningful vetting process for their customers or users. As a result, they are often freely available for purchase by third parties, including phone shops, consultants, and private companies.&lt;/p&gt;
&lt;p&gt;As an organization, we are committed to defending the right to privacy and digital security for everyone, especially those most vulnerable to state surveillance. We will continue to monitor these developments and provide support to anyone who has been a victim of abusive surveillance practices.&lt;/p&gt;
&lt;p&gt;If you are an activist or journalist concerned about the security of your devices, or if your device has been seized and you do not have a technical consultant to assist you, contact us via &lt;a href="https://signal.me/#eu/pQJe47pHLt3tIdGyBO6960HHe5T9AnSu2lk2hnzTtH8feVG9RU9Oko85P0yMDERS"&gt;Signal at this link&lt;/a&gt; or send an email to &lt;a href="mailto:support@osservatorionessuno.org"&gt;support@osservatorionessuno.org&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Updating Exit Policy and Contact Info for our (exit) relays</title><link>/blog/2025/02/updating-exit-policy-and-contact-info-for-our-exit-relays/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate><guid>/blog/2025/02/updating-exit-policy-and-contact-info-for-our-exit-relays/</guid><description>&lt;h2 id="contact-info-changes"&gt;
 Contact Info changes
&lt;/h2&gt;
&lt;p&gt;We have updated the &lt;code&gt;ContactInfo&lt;/code&gt; field in the &lt;code&gt;torrc&lt;/code&gt; configuration of all our relays to align with the proposed &lt;a href="https://nusenu.github.io/ContactInfo-Information-Sharing-Specification/" aria-label="ContactInfo Information Sharing Specification(opens in a new tab)" target="_blank"&gt;ContactInfo Information Sharing Specification&lt;/a&gt;. This standard defines a structured format for describing key attributes of a relay family operator. Ensuring operators are reachable and that relays are associated with trusted individuals or organizations is crucial for the health of the Tor Network.&lt;/p&gt;
&lt;p&gt;To enhance transparency, we have also published proof of relay ownership in our public &lt;a href="https://osservatorionessuno.org/.well-known/tor-relay/rsa-fingerprint.txt" aria-label=".well-known/tor-relay/rsa-fingerprint.txt(opens in a new tab)" target="_blank"&gt;.well-known/tor-relay/rsa-fingerprint.txt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As shown on the &lt;a href="https://nusenu.github.io/OrNetStats/" aria-label="OrNetStats(opens in a new tab)" target="_blank"&gt;OrNetStats&lt;/a&gt; page, many organizations are already participating in this initiative by providing authenticated information, facilitating accurate recognition of their relays.&lt;/p&gt;
&lt;h2 id="exit-policy-changes"&gt;
 Exit Policy changes
&lt;/h2&gt;
&lt;p&gt;For nodes physically hosted by us, specifically those in the 64.190.76.0/24 range (e.g., &lt;a href="https://metrics.torproject.org/rs.html#details/4FCA270A887D2BB0666A05EF45B393C7A6B13214" aria-label="4FCA270A887D2BB0666A05EF45B393C7A6B13214(opens in a new tab)" target="_blank"&gt;4FCA270A887D2BB0666A05EF45B393C7A6B13214&lt;/a&gt;), we have adopted the most permissive exit policy possible, blocking only port 25.&lt;/p&gt;
&lt;p&gt;Previously, exit policies on hosted nodes were tailored to minimize abuse complaints and maintain positive relationships with hosting providers. However, ports such as 22 (SSH), while sometimes exploited for brute-force attacks, serve essential legitimate uses that outweigh the risks.&lt;/p&gt;
&lt;p&gt;Ultimately, port-based restrictions are not a security measure but rather a mitigation tactic to handle a useless volume of automated abuse reports. Our approach reflects our commitment to balancing network accessibility with responsible operation.&lt;/p&gt;</description></item><item><title>How to configure multiple Tor relays on the same interface with different IPs</title><link>/blog/2025/02/how-to-configure-multiple-tor-relays-on-the-same-interface-with-different-ips/</link><pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate><guid>/blog/2025/02/how-to-configure-multiple-tor-relays-on-the-same-interface-with-different-ips/</guid><description>&lt;p&gt;The main bottleneck in Tor relays is often the processor&amp;rsquo;s clock speed. Since Tor does not support multithreading, the best solution is usually to run a separate Tor instance for each core (or thread). Given the cost of electricity, we are looking for hardware that is both power-efficient and cost-effective while still being capable of saturating the available bandwidth. The &lt;a href="https://www.pcengines.ch/apu2.htm" aria-label="apu2(opens in a new tab)" target="_blank"&gt;apu2&lt;/a&gt;, although no longer in production, remains an excellent machine, used for years and with stable support for &lt;a href="https://doc.coreboot.org/mainboard/pcengines/apu2.html" aria-label="coreboot(opens in a new tab)" target="_blank"&gt;coreboot&lt;/a&gt;. The model we are testing has the following specifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 physical cores / 4 threads @ 1GHz&lt;/li&gt;
&lt;li&gt;2GB DDR3 DRAM&lt;/li&gt;
&lt;li&gt;4x Gigabit Ethernet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We want to determine the configuration that best optimizes resource usage, considering that we have access to &lt;a href="https://osservatorionessuno.org/blog/2024/12/how-to-bgp-from-your-basement-and-other-tales/" aria-label="a full IPv4 subnet and 2.5 Gbit of upload bandwidth(opens in a new tab)" target="_blank"&gt;a full IPv4 subnet and 2.5 Gbit of upload bandwidth&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="initial-setup"&gt;
 Initial setup
&lt;/h2&gt;
&lt;p&gt;A &lt;a href="https://manpages.debian.org/testing/tor/tor-instance-create.8.en.html" aria-label="set of scripts(opens in a new tab)" target="_blank"&gt;set of scripts&lt;/a&gt; is available to efficiently manage multiple Tor processes on the same system.&lt;/p&gt;
&lt;p&gt;First, the default Tor service needs to be disabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;systemctl disable tor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;systemctl stop tor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, let&amp;rsquo;s create the desired instance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;tor-instance-create &amp;lt;name of the instance&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All configurations are located in &lt;code&gt;/etc/tor/instances&lt;/code&gt; and can be managed as separate system services.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;systemctl start tor@&amp;lt;name of the instance&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;systemctl enable tor@&amp;lt;name of the instance&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We tested with 4 processes (one per core), but due to the limited available RAM, individual instances did not exceed 4 MB/s. The minimum memory required for each instance seems to be around 400-500 MB. We therefore changed the configuration and applied some optimizations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use zram to compress memory&lt;/li&gt;
&lt;li&gt;Remove dbus: since we have no other services running, this allows us to save 50-80 MB of memory&lt;/li&gt;
&lt;li&gt;Remove Unbound: while it is recommended as a best practice for exit nodes, we chose to explicitly specify our DNS servers in &lt;code&gt;/etc/resolv.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allowed us to reduce the base system&amp;rsquo;s memory usage and leave approximately 1.6 GB of free RAM for the Tor instances.&lt;/p&gt;
&lt;h2 id="network-configuration"&gt;
 Network Configuration
&lt;/h2&gt;
&lt;p&gt;We assigned 3 IPv4 addresses and 3 IPv6 on the same network interface because we have our dedicated subnets, but often the same IP is used with different ports (&lt;a href="https://archive.torproject.org/websites/lists.torproject.org/pipermail/tor-relays/2023-June/021226.html" aria-label="however, there is a limit imposed by the directory authorities on how many nodes can share the same IPv4, currently 8(opens in a new tab)" target="_blank"&gt;however, there is a limit imposed by the directory authorities on how many nodes can share the same IPv4, currently 8&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;We thus have the following network interface:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;5: enp2s0.835@enp2s0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default qlen 1000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; link/ether 00:0d:b9:4a:bf:71 brd ff:ff:ff:ff:ff:ff
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; inet 64.190.76.2/24 brd 64.190.76.255 scope global enp2s0.835
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; inet 64.190.76.3/24 brd 64.190.76.255 scope global secondary enp2s0.835
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; inet 64.190.76.4/24 brd 64.190.76.255 scope global secondary enp2s0.835
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; inet6 2001:67c:e28:1::4/64 scope global
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; inet6 2001:67c:e28:1::3/64 scope global
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; inet6 2001:67c:e28:1::2/64 scope global
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, after a few weeks, we were contacted by the &lt;a href="https://gitlab.torproject.org/tpo/network-health/team" aria-label="Network Health Team(opens in a new tab)" target="_blank"&gt;Network Health Team&lt;/a&gt; because they detected that, despite having different IPv4 addresses, all our relays were exiting through the same one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is crucial to provide accurate contact information when operating Tor nodes for this very reason. This is not the first time we have received warnings or suggestions on how to improve our setup.&lt;/p&gt;
&lt;p&gt;To change the source IP of a Linux process, there are several solutions, including:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Manual &lt;code&gt;iptables&lt;/code&gt; rules&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/Systemd-networkd#[RoutingPolicyRule]" aria-label="RoutingPolicyRule(opens in a new tab)" target="_blank"&gt;RoutingPolicyRule&lt;/a&gt; in &lt;code&gt;systemd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Management interfaces for &lt;code&gt;iptables&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We chose the third option with &lt;a href="https://shorewall.org/" aria-label="shorewall(opens in a new tab)" target="_blank"&gt;shorewall&lt;/a&gt; for convenience. The configuration is located in &lt;code&gt;/etc/shorewall&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The files used to map processes to specific outgoing IP addresses are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/shorewall/mangle&lt;/code&gt;: marks outgoing packets based on a UID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/shorewall/snat&lt;/code&gt;: applies source NAT to marked packets using the selected IP addresses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example configuration where packets from the UID &lt;code&gt;tor-bludicapra&lt;/code&gt; are marked (&lt;code&gt;2&lt;/code&gt;), and source NAT is applied on the &lt;code&gt;enp2s0.835&lt;/code&gt; interface with IP &lt;code&gt;64.190.76.2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/etc/shorewall/mangle&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#ACTION SOURCE DEST PROTO DPORT SPORT USER
MARK(2) $FW 0.0.0.0/0 - - - _tor-bludicapra
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;/etc/shorewall/snat&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#ACTION SOURCE DEST PROTO DPORT SPORT IPSEC MARK
SNAT(64.190.76.2) - enp2s0.835 - - - - 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The prerequisite is that the outgoing addresses are configured on the WAN interface (e.g., via &lt;code&gt;/etc/network/interfaces&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Other relevant shorewall files, which do not require modifications for this configuration, are listed below in the order of filter processing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/shorewall/interfaces&lt;/code&gt;: for configuring the filtered interfaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/shorewall/rules&lt;/code&gt;: for firewall rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/shorewall/policy&lt;/code&gt;: for global policies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After each modification, you can verify the configuration and apply it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;shorewall check
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;shorewall reload
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-little-cheeses"&gt;
 The little cheeses
&lt;/h2&gt;
&lt;p&gt;From this experience, a small family of Italian cheeses was born:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://it.wikipedia.org/wiki/Tomino_%28formaggio%29" aria-label="tomino(opens in a new tab)" target="_blank"&gt;tomino&lt;/a&gt;: &lt;a href="https://metrics.torproject.org/rs.html#details/611726E3DFC01866EDFB35266DF387151DD2BA8A" aria-label="611726E3DFC01866EDFB35266DF387151DD2BA8A(opens in a new tab)" target="_blank"&gt;611726E3DFC01866EDFB35266DF387151DD2BA8A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://it.wikipedia.org/wiki/Raschera" aria-label="raschera(opens in a new tab)" target="_blank"&gt;raschera&lt;/a&gt;: &lt;a href="https://metrics.torproject.org/rs.html#details/CBFD3B3032BFB9C2F8B21A0CD0D4E7D098A6317B" aria-label="CBFD3B3032BFB9C2F8B21A0CD0D4E7D098A6317B(opens in a new tab)" target="_blank"&gt;CBFD3B3032BFB9C2F8B21A0CD0D4E7D098A6317B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;bludicapra: &lt;a href="https://metrics.torproject.org/rs.html#details/4FCA270A887D2BB0666A05EF45B393C7A6B13214" aria-label="4FCA270A887D2BB0666A05EF45B393C7A6B13214(opens in a new tab)" target="_blank"&gt;4FCA270A887D2BB0666A05EF45B393C7A6B13214&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Thanks for your 5x1000 contribution!</title><link>/blog/2024/12/thanks-for-your-5x1000-contribution/</link><pubDate>Fri, 27 Dec 2024 00:00:00 +0000</pubDate><guid>/blog/2024/12/thanks-for-your-5x1000-contribution/</guid><description>&lt;p&gt;Today, the Italian &lt;em&gt;Ministry of Labour and Social Policies&lt;/em&gt; credited our bank account with the 5x1000 donated by Italian residents when they filed their 2023 taxes.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;5x1000&lt;/em&gt; is a tax mechanism allowing Italian taxpayers to allocate 0.5% of their income tax to support nonprofit organizations, scientific research, cultural activities, or social initiatives of their choice. It provides a way for citizens to contribute to public-interest causes without incurring additional costs.&lt;/p&gt;
&lt;p&gt;As publicly disclosed by the Italian Tax Authority, we &lt;a href="https://www.agenziaentrate.gov.it/portale/documents/20143/6424197/5X1000-AF2023&amp;#43;-&amp;#43;Elenco&amp;#43;destinatari&amp;#43;ammessi&amp;#43;al&amp;#43;contributo&amp;#43;-4&amp;#43;-&amp;#43;agg.&amp;#43;16.09.2024.pdf/4578dda9-79a8-be3d-0bef-911dc033758f" aria-label="received a total of €465.14 donated by 16 people(opens in a new tab)" target="_blank"&gt;received a total of €465.14 donated by 16 people&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are thankful to everyone who supported us this year, and we hope for your continued support in 2025. If you want to donate, &lt;a href="/donate/"&gt;you can follow the instructions here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are an Italian resident and want to designate your 5x1000 to us, our tax code is &lt;em&gt;97871010019&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>How to BGP from your basement and other tales</title><link>/blog/2024/12/how-to-bgp-from-your-basement-and-other-tales/</link><pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate><guid>/blog/2024/12/how-to-bgp-from-your-basement-and-other-tales/</guid><description>&lt;p&gt;As &lt;a href="/blog/2024/10/we-are-autonomous-system-214094/"&gt;previously announced&lt;/a&gt;, we are now officially &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=RIPE&amp;amp;type=aut-num&amp;amp;key=AS214094" aria-label="AS214094(opens in a new tab)" target="_blank"&gt;AS214094&lt;/a&gt;. Additionally, we have obtained the IPv6 PI subnet &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=RIPE&amp;amp;type=inet6num&amp;amp;key=2001:67c:e28::%2F48" aria-label="2001:67c:e28::/48(opens in a new tab)" target="_blank"&gt;2001:67c:e28::/48&lt;/a&gt; and acquired the IPv4 subnet &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=RIPE&amp;amp;type=inetnum&amp;amp;key=64.190.76.0%20-%2064.190.76.255" aria-label="64.190.76.0/24(opens in a new tab)" target="_blank"&gt;64.190.76.0/24&lt;/a&gt; through a transfer from ARIN. This means we not only control and receive any related abuse reports, but we also fully own and manage all our network resources at this time.&lt;/p&gt;
&lt;p&gt;Taking it a step further, we secured a deal through a friendly provider to directly collect traffic at the &lt;a href="https://www.mix-it.net/" aria-label="Milan Internet Exchange Point (MIX)(opens in a new tab)" target="_blank"&gt;Milan Internet Exchange Point (MIX)&lt;/a&gt; from our &lt;a href="https://openfiber.it/" aria-label="OpenFiber(opens in a new tab)" target="_blank"&gt;OpenFiber&lt;/a&gt; 10G/2.5G residential link. A few days ago, we installed our own router at MIX, which we own and manage, and began announcing our address space.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works: OpenFiber, a partially publicly owned infrastructure provider, offers different reselling options. Larger providers install their own OLT and network equipment at each local POP, while smaller providers can rely on OpenFiber&amp;rsquo;s own equipment for direct delivery to an Italian Internet Exchange Point. From there, we purchase our own uplink, which involves significantly higher costs but guarantees dedicated, high-bandwidth service.&lt;/p&gt;
&lt;p&gt;This setup gives us the best of both worlds: we maintain independent physical space for server security while enjoying the same level of network control we would have if we were directly housed at MIX. This ensures network ownership goes as high as possible, while we retain the strongest physical isolation for our servers.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 &lt;img src="/blog/2024-12-18-bgp-from-your-basement-and-other-tales-1.svg" alt="Simple infrastructure diagram"&gt;
 
 &lt;figcaption&gt;Simple infrastructure diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;The current monthly cost for this setup—including the residential fiber rental, housing and power for our router at MIX, and a 1G/1G dedicated uplink—is approximately €300. This excludes the cost of network equipment at our headquarters and power usage. We are thrilled about this development, as it gives us control over a substantial part of our network infrastructure, reducing costs and eliminating potential issues when operating Tor nodes. Moreover, since OpenFiber allows traffic collection from all over Italy at MIX, we can easily distribute our IP space and network resources geographically.&lt;/p&gt;
&lt;p&gt;We have ambitious plans for 2025, both in terms of technical research and infrastructure updates. Many of us will also attend &lt;a href="https://events.ccc.de/congress/2024/infos/index.html" aria-label="38C3(opens in a new tab)" target="_blank"&gt;38C3&lt;/a&gt;. If you plan to be there and are curious about our project or want to chat, feel free to drop us an email.&lt;/p&gt;
&lt;p&gt;We are deeply grateful to everyone who contributed this year—whether financially, with their time, or by sharing resources and knowledge. As we continue to expand, our costs are increasing, so &lt;a href="/donate/"&gt;please consider donating any amount&lt;/a&gt;. Donations are tax-deductible in Italy.&lt;/p&gt;
&lt;p&gt;Currently, only a &lt;a href="https://metrics.torproject.org/rs.html#details/4FCA270A887D2BB0666A05EF45B393C7A6B13214" aria-label="test node(opens in a new tab)" target="_blank"&gt;test node&lt;/a&gt; is running to perform bandwidth measurements and hardware benchmarks. Once the testing phase is complete, we will begin running and maintaining enough instances to utilize as many addresses as possible and fully saturate the link.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2024-12-18-bgp-from-your-basement-and-other-tales-3_hu_fa162f7782356bb2.webp" alt="Mikrotik Router unboxing"&gt;
 
 &lt;figcaption&gt;Mikrotik Router unboxing&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br&gt;
&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2024-12-18-bgp-from-your-basement-and-other-tales-2_hu_39df515cb3dc8829.webp" alt="Mikrotik Router at the Milan Internet Exchange"&gt;
 
 &lt;figcaption&gt;Mikrotik Router at the Milan Internet Exchange&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>IrpiMedia and Osservatorio Nessuno: Unmasking digital violence</title><link>/blog/2024/11/irpimedia-and-osservatorio-nessuno-unmasking-digital-violence/</link><pubDate>Sat, 30 Nov 2024 00:00:00 +0000</pubDate><guid>/blog/2024/11/irpimedia-and-osservatorio-nessuno-unmasking-digital-violence/</guid><description>&lt;p&gt;&amp;ldquo;&lt;em&gt;This is an industry that should not exist&lt;/em&gt;&amp;rdquo; &lt;a href="https://www.youtube.com/watch?v=I5WjTTi67BE" aria-label="said Edward Snowden in 2021(opens in a new tab)" target="_blank"&gt;said Edward Snowden in 2021&lt;/a&gt;, referring to NSO Group&amp;rsquo;s infamous Pegasus and its competitors. It is evident that digital surveillance through spyware is one of the major threats to privacy and users worldwide.&lt;/p&gt;
&lt;p&gt;Whether it involves spyware developed by criminals for extortion, advanced tools created by well-established European companies and authorized by major democratic governments (and non-democratic ones), or low-cost, amateur software designed to spy on children or partners, all these technologies ultimately generate violence.&lt;/p&gt;
&lt;p&gt;It is precisely the latter type of spyware that &lt;a href="https://irpi.eu/" aria-label="Irpi(opens in a new tab)" target="_blank"&gt;Irpi&lt;/a&gt;, Italy&amp;rsquo;s leading investigative journalism organization, has focused on in a series of articles. These articles analyze leaks from &lt;a href="https://techcrunch.com/2023/07/24/spyhide-stalkerware-android/" aria-label="SpyHide(opens in a new tab)" target="_blank"&gt;SpyHide&lt;/a&gt; and &lt;a href="https://www.malwarebytes.com/blog/news/2024/05/pctattletale-spyware-leaks-database-containing-victim-screenshots-gets-website-defaced" aria-label="PC Tattletale(opens in a new tab)" target="_blank"&gt;PC Tattletale&lt;/a&gt;, while contacting users and victims to verify and delve deeper into their stories.&lt;/p&gt;
&lt;p&gt;Osservatorio Nessuno provided technical support and contributed to the analysis of SpyHide&amp;rsquo;s data. Thanks to Irpi&amp;rsquo;s investigative work, this led to the publication of a series of articles: &lt;a href="https://irpimedia.irpi.eu/spiarelowcost/" aria-label="spiarelowcost(opens in a new tab)" target="_blank"&gt;&lt;em&gt;spiarelowcost&lt;/em&gt;&lt;/a&gt; (translated, &lt;em&gt;lowcostspying&lt;/em&gt;) which we strongly recommend everyone to read.&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2024-11-30-irpimedia-and-osservatorionessuno-unmasking-digital-violence-1_hu_8f12383c83a637a4.webp" alt="Pc Tattletale’s website, before its closing down"&gt;
 
 &lt;figcaption&gt;Pc Tattletale’s website, before its closing down&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Preventing and countering gender-based violence is a responsibility we all share—always. Software like SpyHide, which enables and encourages such violence, simply should not exist.&lt;/p&gt;
&lt;p&gt;Read the articles in the &lt;em&gt;spiarelowcost&lt;/em&gt; investigations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://irpimedia.irpi.eu/spiarelowcost-pc-tattletale-software-spyware-lavoratori/" aria-label="PC Tattletale: the &amp;lsquo;sneaky software&amp;rsquo; that spied on Italian workers too (Italian)(opens in a new tab)" target="_blank"&gt;PC Tattletale: the &amp;lsquo;sneaky software&amp;rsquo; that spied on Italian workers too (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://irpimedia.irpi.eu/spiarelowcost-app-parental-control-sorveglianza-elettronica/" aria-label="The gray zone of the stalkerware market (Italian)(opens in a new tab)" target="_blank"&gt;The gray zone of the stalkerware market (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://irpimedia.irpi.eu/spiarelowcost-stalkerware-donne/" aria-label="Men who spy on women (Italian)(opens in a new tab)" target="_blank"&gt;Men who spy on women (Italian)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For further insights, our friends and colleagues at &lt;a href="https://radioblackout.org/shows/stakka-stakka/" aria-label="stakkastakka(opens in a new tab)" target="_blank"&gt;&lt;em&gt;stakkastakka&lt;/em&gt;&lt;/a&gt; interviewed the article&amp;rsquo;s main author. &lt;a href="https://radioblackout.org/podcast/stakkastakka-11-dicembre-spiare-low-cost/" aria-label="The podcast is available here (in Italian)(opens in a new tab)" target="_blank"&gt;The podcast is available here (in Italian)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Are you a journalist or an organization in need of a partner for analysis or a technical opinion on an investigation? Contact us at &lt;a href="mailto:support@osservatorionessuno.org"&gt;support@osservatorionessuno.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you require a secure communication channel, reach out to us on &lt;a href="https://signal.me/#eu/pQJe47pHLt3tIdGyBO6960HHe5T9AnSu2lk2hnzTtH8feVG9RU9Oko85P0yMDERS"&gt;Signal clicking here or opening this link on your mobile device&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you would like to submit anonymous information to Irpi for further analysis, consider using &lt;a href="https://irpimedia.irpi.eu/irpileaks/" aria-label="IrpiLeaks(opens in a new tab)" target="_blank"&gt;IrpiLeaks&lt;/a&gt; using the Tor Browser.&lt;/p&gt;</description></item><item><title>Censorship Attack against the Tor network</title><link>/blog/2024/10/censorship-attack-against-the-tor-network/</link><pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate><guid>/blog/2024/10/censorship-attack-against-the-tor-network/</guid><description>&lt;p&gt;In the last few days, many Tor relay operators - mainly hosting relay nodes on providers like Hetzner - began receiving abuse notices.&lt;br&gt;
All the abuses reported many failed SSH login attempts - part of a brute force attack - coming from their Tor relays.&lt;/p&gt;
&lt;p&gt;Tor relays normally only transport traffic between a &lt;em&gt;guard&lt;/em&gt; and an &lt;em&gt;exit&lt;/em&gt; node of the Tor network, and per se should not perform any SSH connections to internet-facing hosts, let alone performing SSH brute force attacks.&lt;/p&gt;
&lt;p&gt;After a &lt;a href="https://delroth.net/posts/spoofed-mass-scan-abuse/" aria-label="first analysis by delroth(opens in a new tab)" target="_blank"&gt;first analysis by delroth&lt;/a&gt;, it was discovered that the majority of the Tor relays were not performing any SSH traffic at all.&lt;/p&gt;
&lt;p&gt;Instead, &lt;strong&gt;a malicious actor began spoofing Tor relays&amp;rsquo; IP addresses while performing a large-scale SSH brute-force attack&lt;/strong&gt;, specifically targeting honeypots, and networks with intrusion detection systems that send (sometimes automated) abuse complaints.&lt;/p&gt;
&lt;p&gt;In this way, the target host will receive SSH login attempts from the relay&amp;rsquo;s IP address instead of the actor&amp;rsquo;s real IP address.&lt;/p&gt;
&lt;p&gt;Internet hosts making a high number of failed SSH login attempts are quickly added to blocklist, receive a lot of abuse notices, and their IP address will quickly get a &amp;ldquo;bad reputation&amp;rdquo;.&lt;br&gt;
For these reasons providers usually take down hosts after a small number of abuse notices, most of the time without any appeal.&lt;/p&gt;
&lt;p&gt;It is no news that many actors don&amp;rsquo;t like Tor.&lt;br&gt;
&lt;strong&gt;This censorship attack directly undermines the Tor relay infrastructure health, by explicitly forcing abuse complaints to Tor relay operators.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At the moment of writing, the scale of the attack is still moderate and the actor is still unknown.&lt;br&gt;
As for the solution, the best you can do as a relay operator against the flood of abuse complaints is to try to appeal, and run more nodes to replenish the ones that will be taken down.&lt;br&gt;
If you are a provider, before sending bogus abuse complaints verify that the information is actually true and there are enough proofs to back it up, leaving a chance for the users to appeal.&lt;/p&gt;</description></item><item><title>We are Autonomous System 214094</title><link>/blog/2024/10/we-are-autonomous-system-214094/</link><pubDate>Thu, 03 Oct 2024 00:00:00 +0000</pubDate><guid>/blog/2024/10/we-are-autonomous-system-214094/</guid><description>&lt;p&gt;We have registered with &lt;a href="https://www.ripe.net/" aria-label="RIPE NCC(opens in a new tab)" target="_blank"&gt;RIPE NCC&lt;/a&gt; as &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=ripe&amp;amp;key=ORG-ON69-RIPE&amp;amp;type=organisation" aria-label="ORG-ON69-RIPE(opens in a new tab)" target="_blank"&gt;ORG-ON69-RIPE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to a generous sponsoring LIR (Local Internet Registry) organization, we are now a sponsored organization, and we can request resources from the RIR. As such, we have applied for an Autonomous System number and have been assigned the number &lt;a href="https://apps.db.ripe.net/db-web-ui/lookup?source=RIPE&amp;amp;type=aut-num&amp;amp;key=AS214094" aria-label="214094(opens in a new tab)" target="_blank"&gt;214094&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are in the process of obtaining a PI (Provider Independent) or Legacy IPv4 /24 block and IPv6 address space as well, in order to announce it directly &lt;a href="/blog/2024/07/we-have-a-headquarters-and-it-is-soon-to-become-a-small-datacenter/"&gt;from our local urban &amp;ldquo;datacenter&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>We have a headquarters and it is soon to become a small datacenter!</title><link>/blog/2024/07/we-have-a-headquarters-and-it-is-soon-to-become-a-small-datacenter/</link><pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate><guid>/blog/2024/07/we-have-a-headquarters-and-it-is-soon-to-become-a-small-datacenter/</guid><description>&lt;p&gt;On April 11th, 2024, we signed the purchase agreement for a small basement in Turin, Italy. We chose this location mainly due to its connectivity options (OpenFiber, FiberCop, soon Digi), the small number of living units (only 4) in the building, and the low cost of the whole operation (about 3700 EUR for real estate value, plus 1500 EUR for legal costs).&lt;/p&gt;
&lt;p&gt;Having a physical dedicated space offers a great opportunity for the organization&amp;rsquo;s operations, allowing us to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better isolate the organization&amp;rsquo;s activities, including legally, from both the members and the board of directors&lt;/li&gt;
&lt;li&gt;Host dedicated infrastructure under our full control, with the option of video surveillance&lt;/li&gt;
&lt;li&gt;Research and host experimental and potentially better infrastructure compared to the classic co-location options&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The great advantage of being connected to OpenFiber and FiberCop is their business model: they offer their infrastructure to third-party providers without the necessity of being committed to a specific one. In case of legal problems, transitioning to a different provider can be simple, and we could eventually reach a point to manage even part of the upper infrastructure ourselves.&lt;/p&gt;
&lt;p&gt;We will soon have many updates on this development, so stay tuned!&lt;/p&gt;
&lt;p&gt;&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2024-07-15-we-have-a-headquarter-and-a-small-dc-1_hu_dc97646209785b6f.webp" alt="Inside view with fancy tiles"&gt;
 
 &lt;figcaption&gt;Inside view with fancy tiles&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure class="article-figure"&gt;
 
 
 
 
 
 
 &lt;img src="/blog/2024-07-15-we-have-a-headquarter-and-a-small-dc-2_hu_44e92795d32f0196.webp" alt="Outside plate view"&gt;
 
 &lt;figcaption&gt;Outside plate view&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Osservatorio Nessuno at school: Digital self-defense and hacker culture courses in Turin</title><link>/blog/2022/07/osservatorio-nessuno-at-school-digital-self-defense-and-hacker-culture-courses-in-turin/</link><pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate><guid>/blog/2022/07/osservatorio-nessuno-at-school-digital-self-defense-and-hacker-culture-courses-in-turin/</guid><description>&lt;p&gt;In recent months, we had the pleasure of collaborating with I.I.S. Ettore Majorana in Turin for a series of meetings on digital security, hacker culture, and education for a critical approach to the use of technology. The experience was incredibly positive: we met curious students eager to better understand the mechanisms of the digital world and, most importantly, to protect their online privacy.&lt;/p&gt;
&lt;h2 id="why-go-to-schools"&gt;
 Why go to schools?
&lt;/h2&gt;
&lt;p&gt;We live in an era where technology permeates every aspect of our daily lives. However, awareness of how computer systems work and how to protect oneself from digital threats is still limited. We believe that digital education must start at the local level and in schools, shaping informed users who can navigate the internet with critical thinking and autonomy.&lt;/p&gt;
&lt;h2 id="course-program"&gt;
 Course program
&lt;/h2&gt;
&lt;p&gt;Between March and June 2022, we organized a series of thematic afternoon lessons for Majorana students. Our approach was practical and interactive, always aiming to stimulate debate and active participation. Here are some of the topics covered:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Introduction to digital self-defense and hacker culture&lt;/em&gt; – An introduction to online privacy, the most common threats, and strategies for self-protection.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Linux and the command line&lt;/em&gt; – A journey into the world of free software, with practical exercises on shell usage and file and process management.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How the internet works&lt;/em&gt; – From OSI model layers to fundamental protocols, up to tools for monitoring and securing one&amp;rsquo;s connection.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Cryptography and digital security&lt;/em&gt; – How cryptography, blockchain, NFTs, and DRM work, and why cryptography is essential for online freedom.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Basic programming with Telegram Bots&lt;/em&gt; – Introduction to programming through the creation of bots on Telegram.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Social Media and the Fediverse&lt;/em&gt; – A critical analysis of social networks, user profiling, and decentralized alternatives.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hacking and cybersecurity&lt;/em&gt; – Basic concepts of security testing, web application security, and defensive tools.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Streaming, online radio, and Audacity&lt;/em&gt; – Audio production techniques and managing an online radio station.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="an-experience-worth-repeating"&gt;
 An experience worth repeating
&lt;/h2&gt;
&lt;p&gt;The enthusiasm of the students and their active participation demonstrated that there is a strong need for education on these topics. For us at Osservatorio Nessuno, this is just the first of many initiatives: we are open to collaborating with other schools, associations, and groups that want to spread a free and informed technological culture.&lt;/p&gt;
&lt;p&gt;If you are a teacher or part of an educational institution and would like to contact us, visit &lt;a href="/contacts"&gt;the contacts page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Digital culture is a right: let’s defend it together!&lt;/p&gt;</description></item><item><title>General members assembly on January 10th, 2022</title><link>/blog/2022/01/general-members-assembly-on-january-10th-2022/</link><pubDate>Mon, 10 Jan 2022 00:00:00 +0000</pubDate><guid>/blog/2022/01/general-members-assembly-on-january-10th-2022/</guid><description>&lt;p&gt;The general assembly has been scheduled for January 10th 2022 with the following agenda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;approval of the 2021 budget as required by art. 8 and 12 of the Statute&lt;/li&gt;
&lt;li&gt;extras&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The communication was sent via email to all members in compliance with the payment of the annual membership fee. If you have not received the email, please write to &lt;a href="mailto:membership@osservatorionessuno.org"&gt;membership@osservatorionessuno.org&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>