Commit Graph
20030 Commits
Author SHA1 Message Date
Tobias Brunner b6ff363e1c stroke: Avoid sharing a certificate printer between multiple clients
If multiple clients call list commands concurrently, each would replace
the global certificate printer instance the previous client created
and then operate on shared state.  The destruction then causes a
double-free or NULL-pointer dereference.

Fixes: 02d431022c ("Refactored certificate management for the vici and stroke interfaces")
2026-07-24 08:47:39 +02:00
Tobias Brunner f00b85dbf4 windows: Fix potential use-after-free when joining a thread
Because the flag was set before running the TLS cleanup, a thread
waiting in `join()` could exit the loop and destroy the thread object
before `docleanup()` is called in `end_thread()`.

This change removes the `terminated` flag and instead properly waits for
the thread to exit in `join()`.  By always removing the threads from the
hashtable in `end_thread()`, we also avoid requiring to check any flags
in `cleanup_tls()`, as it now only finds an object for external threads.

We now also make sure to call `docleanup()` before removing the thread
from the hashtable.  Otherwise, if a TLS cleanup callback calls
`thread_current[_id]()`, a new thread object would get created that is
never cleaned up.

Fixes: 0fa9c95811 ("windows: Provide a complete native Windows threading backend")
2026-07-24 08:47:39 +02:00
Tobias Brunner 677b915efe iv-manager: Don't allow zero max_ikev1_exchanges
This would cause a use-after-free because `lookup_iv()` inserts, removes
and destroys the still returned entry.

Fixes: aeaab528e8 ("ikev1: Factor out IV and QM management")
2026-07-24 08:47:39 +02:00
Tobias Brunner 8bcc47b818 fips-prf: Increase log level when logging secret state
Fixes: f27f6296e6 ("merged EAP framework from branch into trunk includes a lot of other modifications")
2026-07-24 08:47:39 +02:00
Tobias Brunner 1b9b037816 sha3: Fix applying second padding bit on big-endian platforms
Fixes: 56f4b2096a ("sha3: Fix Keccak when compiled with GCC 13.x")
2026-07-24 08:47:39 +02:00
Tobias Brunner ac7f071673 child-sa-manager: Correctly remove replaced entry in lookup tables
In the (very) unlikely case that a unique ID is reused (e.g. due to
counter wraparound) while the original SA is still in this manager,
the entries should properly get removed from the other lookup tables
before the entry is destroyed to prevent stale pointers from getting
used in later lookups.

Fixes: e732fb11a9 ("child-sa-manager: Add a global manager storing CHILD_SA relations")
2026-07-24 08:47:39 +02:00
Tobias Brunner 00830ddc36 ikev2: Make sure to correctly compare nonces of unequal length
The previous code would not correctly compare nonces of unequal length
where the shorter is the prefix of the longer one.
2026-07-24 08:47:39 +02:00
Tobias Brunner 8aca7f9231 chunk: Add utility that compares the prefix of two chunks
Unlike chunk_compare() this first compares the prefix of two nonces,
then falls back to comparing the length.  This is basically intended to
compare nonces as specified in RFC 7296:

   "Lowest" means an octet-by-octet comparison (instead of, for instance,
   comparing the nonces as large integers).  In other words, start by
   comparing the first octet; if they're equal, move to the next octet,
   and so on.  If you reach the end of one nonce, that nonce is the
   lower one.
2026-07-24 08:47:39 +02:00
Tobias Brunner 0ffc3f3fd6 gcrypt: Fix zeroing padding when extracting RSA value from S-expression
When left-padding a value shorter than the RSA key, the code previously
calculated the length incorrectly so that some bytes might have been
cleared if the value was shorter than half the required length.

Fixes: a2f1bb238e ("enforce correct RSA signature lenght in gcrypt")
2026-07-24 08:47:39 +02:00
Tobias Brunner 322d947a04 eap-sim-pcsc: Properly release context if determining list of readers fails
Fixes: 80dca77a50 ("Added SIM card backend based on pcsc-lite")
2026-07-24 08:47:39 +02:00
Tobias Brunner 918e052ae1 eap-md5: Avoid memory leak caused by repeated challenges
Fixes: 4b403e7672 ("merged EAP-MD5 into trunk")
2026-07-24 08:47:39 +02:00
Tobias Brunner 4eaaf19217 kernel-netlink: Properly clean up pending entry if VIP installation failed
This could prevent the VIP from getting installed later and actually
causes those threads to block indefinitely as they wait for the entry to
either get removed or the VIP marked as installed, which will never
happen.

Fixes: c6b401581a ("Changed how kernel-netlink handles virtual IP addresses")
2026-07-24 08:47:39 +02:00
Tobias Brunner c52fd0c518 ha: Fix offset checks in HA address pool
This applies some of the same fixes found in the previous commit but also
ensures that the offsets are valid before accessing the bitmask.  Because
of an off-by-one error in the latter, the last address could get released
incorrectly (the pool constructor explicitly excludes it).

Fixes: 98d0343870 ("Implemented a HA enabled in-memory address pool")
2026-07-24 08:47:39 +02:00
Tobias Brunner e3607d546d mem-pool: Enforce size limit also for range-based pools and fix overflow
Due to the overflow when mapping addresses to offsets, no addresses could
get released when the pool was defined in a way that the last address
assignable is 255.255.255.255 (probably never the case in practice).

While not really useful in practice, the range 0.0.0.0-255.255.255.255
resulted in an empty pool (`size = 0xffffffff + 1`), which triggers the
%config like behavior.  Since the implementation currently uses signed
integers throughout, we make sure the largest assignable offset is
INT_MAX.

The two off-by-one fixes (`>= pool->size`) were never an issue in practice
because `get_new()` has a guard that caps the offset at the size and
released addresses originally came from the pool so are always in range.

Fixes: 0897cda33b ("Add a constructor to create in-memory pools from an address range")
2026-07-24 08:47:39 +02:00
Tobias Brunner a3ebaa82de xauth-pam: Use proper method to read session option 2026-07-24 08:47:38 +02:00
Tobias Brunner ad7d50f846 nm: Fix double-free of IKE config in error cases and some leaks and potential NULL dereferences 2026-07-24 08:47:38 +02:00
Tobias Brunner bde21aa4f9 openssl: Fix memory leak when verifying plain RSA signatures with old BoringSSL versions
Fixes: 21b586c61c ("openssl: Fixes for RSA with OpenSSL 3.0")
2026-07-24 08:47:38 +02:00
Tobias Brunner c64554b17f pt-tls-client: Don't store PT-TLS message on stack
Basically the same as the previous commit.
2026-07-24 08:47:38 +02:00
Tobias Brunner 3150e61e00 pt-tls-server: Don't store PT-TLS message on stack
The size of that buffer was ~2 MB, which is not ideal for systems
with restricted stack sizes.
2026-07-24 08:47:38 +02:00
Tobias Brunner 268c11fa8c vici: Fix leak if selectors for redirect command are missing or invalid
Fixes: 43b46b26ea ("vici: Add redirect command")
2026-07-24 08:47:38 +02:00
Tobias Brunner 6dca323ae0 shunt-manager: Fix potential race between install and uninstall
If the installation fails while a shunt is concurrently uninstalled,
the entry could already be destroyed when trying to remove and destroy
it after acquiring the lock again in `install()`.

This change handles the conflict the same way trap-manager does since
69cbe2ca3f ("trap-manager: Wait for install to finish before
uninstalling").

Fixes: 616ff9a236 ("shunt-manager: Remove stored entries if installation fails")
2026-07-24 08:47:38 +02:00
Tobias Brunner 40f40973c0 pem: Properly handle encrypted PEM files without DEK-Info
Since `key_size` remained zero, this caused a buffer overflow when the
derived key in `pem_decrypt()` was copied to the zero-length local
buffer.

Also fixed two potential memory leaks if hashing fails and make sure
the decryption key is wiped.

Fixes: 160f4c225d ("moved PEM parsing functionality to its own plugin")
2026-07-24 08:47:38 +02:00
Tobias Brunner 2367cda71e android: Fix reading split-tunneling block settings in managed configs
The key in a Bundle is apparently case-sensitive.  Also align the
spelling with the rest of the app.

Fixes: c2007d5b09 ("android: Add managed_configuration.xml")
2026-07-24 08:47:38 +02:00
Tobias Brunner e03ec46466 vici: Fix memory leaks if loading CA cert in authority section fails
The return value is now also fixed.  The reply allocation previously
prevented that sections with failed CA certs were rejected.

Also fixes two potential leaks if duplicate settings are sent by a VICI
client.

Fixes: 63d370387d ("vici: Certification Authority support added.")
2026-07-24 08:47:38 +02:00
Tobias Brunner 98fd5e9893 ha: Fix memory leak if Child SA key derivation fails
Fixes: aa334daa9b ("Use a sync message cache to resynchronize IKE_SAs without rekeying")
2026-07-24 08:47:38 +02:00
Tobias Brunner 77cfa835cd connmark: Only install one rule per Child SA in PREROUTING
These rules don't depend on traffic selectors, so for SAs with multiple
traffic selectors we'd install several duplicate rules.  Since this
plugin is used for transport mode SAs, it probably never was an issue
in practice.

Fixes: b8973b2661 ("connmark: Add CONNMARK rules to select correct output SA based on conntrack")
2026-07-24 08:47:38 +02:00
Tobias Brunner 71fff07aba charon-tkm: Fix potential use-after-free in chunk map
This isn't a problem in practice as the nonces stored in the map are
tied to the IKE SA that's currently checked out, so a found entry can't
get removed/replaced concurrently.
2026-07-24 08:47:38 +02:00
Tobias Brunner 4224c3f647 sha3: Make sure state and rate input buffers are 8-byte aligned
Both buffers are accessed directly by casting to `uint64_t`.  On platforms
that don't allow unaligned accesses this could cause a SIGBUS.  The
reorder should avoid extra padding between the two buffers.

Fixes: 5ff88c9622 ("xof: Implemented SHAKE128 and SHAKE256 Extended Output Functions")
Fixes: 83c1883d0b ("Use word-aligned XOR in sha3_absorb()")
2026-07-24 08:47:38 +02:00
Tobias Brunner 50177b4004 ike-auth: Enforce PPK required constraint on the initiator
Fixes: a9e60c96dc ("ike-auth: Add basic PPK support")
2026-07-24 08:47:38 +02:00
Tobias Brunner c40e8214ed ike-init: Make sure we received a KE payload as initiator
On the responder, dc8b479eb8 ("ike-init: Fix key derivation if SA is
reset after IKE_INTERMEDIATE retransmits") fixed this.  But the initiator
still accepted IKE_INTERMEDIATE exchanges without KE payload.

Fixes: 0d49ddec2e ("ike-init: Add support for multiple key exchanges")
2026-07-24 08:47:38 +02:00
Tobias Brunner 889d83b997 Make sure KEM implementations don't return an empty shared secret
If `set_public_key` is never called we won't have a shared secret to
return.  This aligns the implementations with the one in the openssl
plugin.
2026-07-24 08:47:38 +02:00
Tobias Brunner 455b3e2298 android: Fix leak of JNI local ref in IMC when creating string array
Fixes: 036fa7a166 ("android: Overload for getMeasurement() that takes a String array as argument")
2026-07-24 08:47:38 +02:00
Tobias Brunner dd6a984afb xauth-generic: Make sure to only use secrets that match the username
This ensures that secrets that are associated with the server identity,
usually they are assigned to the username exclusively, will only be tried
if the username also matched.  Otherwise, it could be possible for users
who know at least one password to impersonate another user.

Fixes: 462c9a4f72 ("Try all matching XAuth secrets we find, not only the first one")
2026-07-24 08:47:38 +02:00
Tobias Brunner 485f7645a2 kernel-wfp: Add support for SA deletion in either order
The code was written with `child_sa_t::destroy` in mind, which deletes
the inbound SA before the outbound SA.  The problem is that the rekeying
code was changed meanwhile so the outbound SA is removed before the
inbound SA in order to avoid traffic loss.  That could cause a
use-after-free as the already destroyed item remained in the `isas` list.

This change fixes this so the SAs can be removed in any order.  The SPIs
are used as marker for whether a specific direction is installed.  It
also fixes an issue in `expire_job()`, which removed the entry from
`osas` without holding the lock.

Fixes: f351d9ef7d ("kernel-wfp: Reference SA/SP sets by SPI and destination, not reqid")
Fixes: 44107cb7b7 ("child-delete: Delay the removal of the inbound SA of rekeyed CHILD_SAs")
2026-07-24 08:47:38 +02:00
Tobias Brunner 4ebd1c524a host: Do some proper validation when parsing CIDR-style subnets
The previous code returned negative or too large values (e.g. /33 or /-1)
to the caller, which some would then use unchecked.  In particular the
attribute parser in the vici plugin would use it directly to generate a
subnet mask using shifts by `32 - mask`, which could trigger undefined
behavior.

Fixes: 65697c2734 ("Added a CIDR notation based host constructor")
2026-07-24 08:47:38 +02:00
Tobias Brunner 6419fc8d3c eap-radius: Limit number of concurrently cached DAE responses
An attacker who knows the shared secret could send DAE requests from
different IPs/ports to produce basically unlimited cached responses.
2026-07-24 08:47:38 +02:00
Tobias Brunner cd24806543 simaka-message: Prevent buffer overflow when generating messages
A malicious (authenticated) server could send a long AT_NEXT_PSEUDONYM
or AT_NEXT_REAUTH_ID attribute (max. 1016 bytes) that the client then
attempts to return in an AT_IDENTITY attribute that could overflow the
fixed-sized stack buffer `out_buf` by a few bytes (writing into the
`encr_buf` buffer).

This refactoring first calculates the length required to encode the
attributes (with and without encryption) and accounts for the overhead
necessary for AT_ENCR_DATA, AT_PADDING, and AT_MAC (some limits are
enforced and error handling is added where appropriate).  Then correctly
sized buffers are allocated and the attributes are encoded pretty much
as before.  Except that the encoding of AT_RES is corrected (it actually
worked fine for up to 31 bytes, so in practice it wasn't a problem),
AT_PADDING is not added if data is already block-aligned, and it corrects
handling of AT_NOTIFICATION (they are never sent encrypted according to
the RFCs, but protected with a MAC).

Fixes: f8330d0395 ("Added a libsimaka library with shared message handling code for EAP-SIM/AKA")
2026-07-24 08:47:38 +02:00
Tobias Brunner f4798de88c pkcs11: Avoid race condition in token hot-plug handling
If a token is removed during initialization, where `token_event_cb()` is
called manually, the callback could be triggered after the credential set
was added to the list but before it was registered with the manager.
This could then cause a use-after-free if the manager accesses it after
the other thread destroyed it.  Note that there is still a race if the
removal runs before the other thread even acquires the mutex.  We'd end
up with a registered but defunct credential set that is not backed by a
valid token.  But that shouldn't cause any crashes.

Fixes: a6d2ec331b ("Implemented a credential set on top of a PKCS#11 token")
2026-07-24 08:47:38 +02:00
Tobias Brunner a4a123eb4f hasher: Avoid theoretical memory leaks for hashers that could potentially fail
These `get_hash()` implementations could potentially fail (realistically
only for serious system errors like OOM).  This change ensures we comply
with the documented behavior (i.e. only allocate memory on success), as
no callers currently expect they have to clean up on failure.
2026-07-24 08:47:38 +02:00
Tobias Brunner 4d843d3da8 pkcs11: Fix memory leak in the hasher_t implementation
If state was stored (for incremental hashing), the allocated memory was
leaked.  Added some limits for the allocation and use chunk_t to simplify
it.  The state is now also wiped just to be safe.

Also removed the useless mutex.  If the goal was to protect access
to the hasher from multiple threads, then no other hasher currently
implements such protection.  And if the idea was to serialize access to
the token (i.e. only allow a single hasher to concurrently load its state
into the token and update it), then a per-hasher mutex was not the right
approach.  If that was the reason, we'd need a token-level mutex that
all hashers shared.  Should `get_hash()` fail due to such an issue with
a transient error (e.g. `CKR_DEVICE_MEMORY`), we now at least don't leak
memory from `allocate_hash()`.

Fixes: 6e4f4d2fdf ("Save/Load state of PKCS#11 hasher")
2026-07-24 08:47:37 +02:00
Tobias Brunner 09d48b73f4 tls-eap: Only process ACKs on the server after processing an actual packet
This prevents us from calling build() before ever calling process() on
a server-side EAP method that might not expect that.
2026-07-24 08:47:37 +02:00
Tobias Brunner fd7fccabe8 tls-eap: Reject EAP Start packets from clients
The Start flag should only be set in the first packet from server to
client so we never should process one received from a client.
2026-07-24 08:47:37 +02:00
Tobias Brunner f1c70a04d5 tnccs-dynamic: Add missing checks for underlying TNCCS instance
In order for the TNCCS instance to get created, `process()` has to be
called first.  However, if the client responds to the initial request
with an empty EAP packet, `tls_eap_t` interprets that as acknowledgement
and directly calls `build_pkt()`, which attempts to call `build()` here
and triggers a NULL-pointer dereference.  Similarly, `process()` is
skipped if the client sends an EAP packet that has the EAP_TLS|PT_START
flag set.

The `get_pdp_server()` method is called when the EAP-TNC method that
owns this instance is destroyed and would likewise trigger a crash if
e.g. the client never responded and the EAP-TNC instance is destroyed
without `process()` ever being called.

Fixes: f652995b21 ("implemented dynamic detection of TNCCS protocol")
2026-07-24 08:47:37 +02:00
Tobias Brunner 313d1ef88a watcher: Properly handle conflict during concurrent FD removal
If an FD we intend to remove is currently busy in a callback, we wait
on a condvar to retry later.  If the FD is not the first in the list,
`prev` will be set to the previous entry in the list.  This is fine
when no other threads are concurrently removing FDs, the same entry will
be found on the next try and prev points to the same value again.
However, if other threads also remove one or more FDs and the initial FD
is now the first in the list `prev` should be NULL and not point to a
removed entry.

Fixes: b27663399b ("watcher: Avoid allocations due to enumerators")
2026-07-24 08:47:37 +02:00
Tobias Brunner 3ec8d3cff1 wolfssl: Use Absorb/SqueezeBlocks API for SHAKE-128/256 XOFs
This API is available since 5.5.1 (released in 2022) and allows us to
avoid the inefficient previous implementation (don't think it's worth
keeping that around for older versions).  Also added support for
SHAKE-128.  Note that the only user of SHAKE is the ml plugin nowadays
and since wolfSSL also provides ML-KEM, this might not actually
get used much.
2026-07-24 08:47:37 +02:00
Tobias Brunner e6dc515c97 Revert "nm: Pass back the username auth-dialog runs as to access ssh-agent socket"
This partially reverts commit d7608ca192.

This was not actually an improvement over just doing the access as root.
The auth-dialog is not run by NM directly.  Instead, it requests secrets
via DBus from anybody who implements the SecretAgent interface.  It's
then e.g. nm-applet who starts the auth-dialog.  But this can really be
anybody, i.e. it's easy to return arbitrary information to the plugin.
So we can't trust the returned username.  This means that we can't
improve the situation for system-wide connections that don't provide
a username from the config.

We keep resetting the cached agent socket that the commit also added.
2026-07-24 08:47:37 +02:00
Tobias Brunner 8efb533008 capabilities: Log warning if UID changes and no capability backend is compiled in
In this case, we preserve the complete set of capabilities not just the
ones we actually need.  Removing the `prctl()` call isn't an option as
the daemon wouldn't be functional without the capabilities.  But we now
warn users about this.  We also only call `prctl()` if we actually switch
to a non-zero UID, `has_capability()` in turn already checks that we are
running as root in the `!CAPABILITIES` case.

A similar warning has been added to the configure script if a user has
been set at compile time.
2026-07-24 08:47:37 +02:00
Tobias Brunner 47a583dfa2 socket-win: Bind the sockets exclusively
This prevents other processes from binding the same ports and
misusing the protocol/port-specific bypass rules installed in WFP to
bypass the VPN.

Fixes: 11e7d0677c ("socket-win: Install IKE bypass policies using bypass_socket()")
2026-07-24 08:47:37 +02:00
Tobias Brunner 2ed81ed53a eap-radius: Fix access to IKE_SA when sending interim updates
The previous code checked in the IKE_SA before using it again to
add attributes based on it to the interim update message.  This
change ensures the IKE_SA is only accessed while it is checked out.
The Acct-Status-Type attribute is still sent first, but the
Acct-Session-Id and Class attributes are now sent after the IKE
parameters, which shouldn't really matter, though.

Fixes: d019764ab6 ("Add support for RADIUS Interim accounting updates")
2026-07-24 08:47:37 +02:00
Tobias Brunner 588c7a80d1 array: Avoid issue when re-inserting existing element in value-based arrays
The insertion can cause the existing data to get reallocated/moved.  So
if the caller attempts to insert another copy of an existing element into
the array via its pointer, this can cause a undefined behavior or even
a use-after-free because the pointer might get invalid.

There is such a case in `mem_pool_t::get_existing()` since the referenced
commit.

Fixes: d4a0dd9f93 ("mem-pool: Fix issue with make-before-break reauth and multiple IKE_SAs")
2026-07-24 08:47:37 +02:00