blob: f5d80c2e6260dc1507495ee28e502776bfe8aa8a [file]
.. _docs-security-threat_model:
====================
Agentic threat model
====================
This document contains a general threat model that applies globally to Pigweed.
Individual modules may provide a supplementary ``security.rst`` in their
respective directories to detail module-specific assets, threat vectors, and
safety assumptions.
This threat model and the supplementary per-module threat models are intended
to be consumed by agents. As a result, this document has many contextual
details and direct instructions.
-----------------------
Environment and context
-----------------------
Pigweed includes libraries, called “modules”, which are prefixed by ``pw_``.
These libraries are used in MCU environments that typically:
* Lack an MMU, and have deterministic or nearly-deterministic memory layouts.
* Operate with few or no trust levels. Some may use MPUs to distinguish between
privileged and unprivileged code, while others may treat all code as equally
privileged.
* Persist any state or logs in the clear without encryption.
* Interact with peripherals via MMIO registers and occasionally DMA.
* Do not have any notion of internal security principals, but may authenticate
connections to other devices.
Some modules are “facades” which specify behavior to be implemented by “backend”
modules, many of which are platform-specific. Backend module names are prefixed
by their facade name, e.g. “pw_uart_mcuxpresso” implements “pw_uart”.
Platform-specific backend modules often integrate with an RTOS that provides:
* MPU managements to enforce privileges, limit DMA by devices, etc.
* Thread creation, scheduling, and reaping.
* ISR context switching
The actual devices and their complete software images are assembled by
downstream consumers of Pigweed. Pigweed also contains build environments and
developer tooling that are used by downstream consumers but that are not
included on downstream devices.
Target Deployment and Safety
============================
Pigweed is intended for consumer electronics and other non-safety-critical
applications. It has **not** undergone evaluation or certification for
safety-critical or high-threat applications, and makes no claims or guarantees
in these environments.
While downstream product teams may consider physical tampering or bus sniffing
in-scope for their specific products, these hardware-level attacks are
out-of-scope for the Pigweed project itself.
MPU and Privilege Assumptions
=============================
Pigweed does not assume an MPU is always present and supports configurations
without one. The final security posture depends on the integration decisions
made by the downstream product team. For threat evaluation purposes:
* **MPU Bypass:** For cases where a vulnerability is claimed to bypass MPU
protections, the MPU is assumed to be **present** and active.
* **MPU Mitigation:** For cases where an MPU would be required to mitigate a
vulnerability, the MPU is assumed to be **absent** (ensuring Pigweed remains
resilient by default).
* MPUs are explicitly supported by the RTOS backends (e.g., ``_embos``,
``_freertos``, ``_threadx``, ``_zephyr``).
---------------
Attack surfaces
---------------
The primary trust boundary on a Pigweed device is between the MCU and other
hardware devices or components. The most sensitive attack surfaces are any
sections of code that handle untrusted input in the form of messages between
devices and components, including:
* Bluetooth communications
* RPC messages
* SPI, UART, and DigitalIO data
Another very important trust boundary is between privileged and unprivileged
modes of execution when an MPU is present. The data flows across this boundary
may be calls to RTOS or specific hardware events such as interrupts.
The boundary between Pigweed code and other device code is important. It is not
a true trust boundary as both sides represent the same level of privilege, but
it provides an opportunity for Pigweed's APIs to be safe by default. This
attack surfaces requires an attacker to have first gained some control over
other device code. Since Pigweed cannot ensure its consumers' code is free of
vulnerabilities, it strives to be resilient against any valid call or
sequence of calls. Devices interact with Pigweed code in multiple ways,
including:
* By direct calls to a module's public API, which can usually be found in the
public functions and public and protected methods of types defined in header
files somewhere under a "public/" directory.
* Via previously registered callbacks or handlers responding to hardware
events, timers, interrupts, etc.
Finally Pigweed is concerned with keeping developers safe in addition to users.
The development tools provided by Pigweed and used for writing, compiling, and
debugging device code are also a valid attack surface.
------
Assets
------
An attacker may value any of the following objectives on a Pigweed device:
* Gaining code execution: This allows an attacker to achieve any other goal.
* User data: This includes secrets like tokens, credentials, or keys, as well
as sensitive data like identifiers, location data, microphone data, etc.
* Cryptographic materials: This includes private/secret keys, key-derivation
states, and cryptographically secure random seeds.
* Integrity of firmware: The ability to run unsigned or unauthorized firmware.
* Access to other devices or services: This may allow an attacker to move
laterally through a user's devices.
* Log suppression: This may allow an attacker to exploit other vulnerabilities
without being detected.
* MPU bypass: This may allow an attacker to escalate into a more privileged mode
on some RTOSes, e.g. FreeRTOS.
* Remote denial of service: An attacker may wish to render all nearby devices
inoperable.
* Cross-connection leaks: There is rarely any “authentication” in terms of
security principals, but such leaks may facilitate lateral movement.
* Fine-grained control of memory allocations: While not an exploit in and of
itself, the ability to "groom" the heap may make other vulnerabilities such
as use-after-frees or buffer overflows more severe.
-----
Scope
-----
When examining potential software defects, include the following in the set of
issues considered to be vulnerabilities:
* Include arbitrary memory writes (write-what-where, or W3) as more severe. Due
to the lack of fine-grain privileges or virtual memory, arbitrary memory
writes very often provide arbitrary code execution (CodeExec).
* Include use-after-free (UAF) vulnerabilities as severe, especially if the
type in question contains vtables or function pointers.
* Memory allocation may be moderately to highly deterministic.
* If an attacker can control allocations from the same allocator, consider
this more severe as they can likely groom the heap.
* Include any buffer overflows (BO) of the stack, of statically-allocated
data, or of dynamically-allocated data.
* Include any out-of-bounds reads (OOBR) or writes (OOBW).
* Include any integer overflows (IOF) or underflows (IUF), especially if the
results are used to calculate indices, offsets, or sizes.
* Include any unauthenticated, remote means of exfiltrating data.
* Include crashes and other denials of service (DoS) but only if they result
from data sent by an attacker to a device.
* Include any data races (Race) or time-of-check-time-of-use (TOCTOU) bugs in
code that includes synchronization (i.e. locks) or is documented as being
thread-safe or ISR-safe.
* Include any accesses of uninitialized memory (UMA).
* Include type conversion errors (TCE) if the resulting value is something an
attacker could not have otherwise set.
* Include type confusion errors (Type).
* Include cryptographic failures in modules providing cryptographic, update, or
verification functionality (e.g., bypasses of signature checks,
predictability in random number generators).
* Include vulnerabilities in examples, as those are often copied and pasted.
----------
Exclusions
----------
When examining potential software defects, exclude the following in the set of
issues considered to be vulnerabilities:
* Do not include them if they require other software on the device to
deliberately misuse the module’s interface according to the module’s
documentation or comments.
* For example, do not include data races or TOCTOU bugs in code documented
as being single-threaded.
* However, API design flaws that make the safe path highly error-prone or
introduce implicit safety risks under standard usage may still be
evaluated as design vulnerabilities.
* Do not include attacks that require physical presence to probe hardware
buses, extract keys via physical side-channels (e.g., power analysis), or
physically tamper with internal silicon.
* However, software-level bypasses of integrity checks (such as signature
verification bypasses in update or boot modules) are **fully in-scope**,
regardless of how the payload is delivered to flash. Detailed
module-specific threat models are located in their respective module
directories.
* Do not include vulnerabilities in host-side developer tools that require
inputs from a maliciously programmed target device. Host-side tools are
assumed to only be used to develop and debug devices fully under the control
of a developer with physical access, and the connected devices are assumed
to be non-malicious.
* Do not include any partial, temporary DoS where the system can fail and
recover gracefully.
* For example, do not include a DoS caused by an attacker exhausting the
memory used to handle messages if new messages can be handled again some
time after the attacker stops flooding the device.
* Do not include any attacks which assume the attacker already has the ability
to execute arbitrary code.
* Do not include vulnerabilities in code that is only reachable by calling
functions or methods within an "internal" namespace or defined in header
files within an "internal/" directory.
* Do not include any vulnerabilities in the "environment/" directory.
* Do not include any vulnerabilities in tests or size reports.
* Do not include flaws found in third-party dependencies; please report those
directly to the respective upstream maintainers.
* Do not include simple compiler warnings or static analysis tool noise that do
not result in a practical security risk.