Commit Graph
19762 Commits
Author SHA1 Message Date
Tobias Brunner 032d8adcd4 github: Continue crypto tests even if OpenSSL tests fail
These can sometimes fail because of sync issues with Ubuntu debug symbol
packages, let other crypto tests continue.
2026-04-09 09:53:36 +02:00
Tobias Brunner e8e34c4b33 Use wolfSSL 5.9.1 for tests 2026-04-09 09:53:36 +02:00
Tobias Brunner 99e9db478d unit-tests: Use longer input for ECDSA tests
wolfSSL 5.9.1 starts to enforce a minimum (and maximum) length for the
hash when signing.  Since we'll always require SHA-1, use 20 bytes as
input in the tests to succeed with SIGN_ECDSA_WITH_NULL.
2026-04-09 09:53:36 +02:00
Tobias Brunner b9d9f8ad95 fuzz: Remove unnecessary calls to set plugin dirs
All the plugins are linked statically into the binaries, so there
is no reason to set the directories that are only required when loading
them from files.
2026-04-08 15:57:17 +02:00
Tobias Brunner 444a1dc0e3 fuzz: Create fuzzers with default and custom crypto plugins
The pa_tnc fuzzer does not rely on any plugins and the pb_tnc fuzzer is
a bit special in that it does use code from the tnccs-20 plugin, but that
doesn't actually have to be loaded as such. The fuzzer directly calls
statically linked code from the plugin.
2026-04-08 15:56:42 +02:00
Tobias Brunner 521c6e05c5 github: Update actions so they don't use deprecated Node.js 20 2026-04-07 18:57:40 +02:00
Tobias Brunner b56b3d48b6 tls-server: Avoid allocating large buffer for cipher suites on stack
The `cipher_suites` field has a 16-bit length field, so up to 32k 2-byte
cipher suites could technically be proposed.  With `tls_cipher_suite_t`
typically being 4 bytes wide, the necessary allocation for the temporary
array can be up to 128 KiB.  Even though this should be fine on typical
systems, we avoid potentially overflowing the stack by using malloc()
instead of alloca().
2026-04-02 08:34:23 +02:00
Tobias Brunner a3c5fad1ff libipsec: Reject policies for anything but ESP tunnel mode
This is only relevant for trap policies as similar SAs are already
rejected when negotiated.
2026-04-02 08:34:20 +02:00
Tobias Brunner 2a63343968 trap-manager: Ignore acquires without selectors for wildcard traps
We need to know the actual destination address to process these.
2026-04-02 08:33:30 +02:00
Tobias Brunner 66fffdb1bf ike-init: Remove redundant check for more key exchanges during rekeying
We only call derive_keys() after a successful key_exchange_done() call
during rekeying, so this will always return FALSE.
2026-04-02 08:17:05 +02:00
Tobias Brunner 05807b1b1b openssl: Handle EdDSA keys from engines special again
Fixes: 052a939553 ("openssl: Add support for Ed25519 via AWS-LC")
2026-04-02 08:17:05 +02:00
Tobias Brunner 4af485d87d certreq: Avoid OOB read when enumerating hashes in OCSP CERTREQ
These certificate requests also contain SHA-1 hashes, which is assumed
in `ike_cert_pre.c::process_certreq()` when enumerating key IDs.

Because the parser allocates a separate chunk for the data and the
enumerator doesn't read beyond that chunk's length after the first
iteration, only lengths between 1 and 19 are problematic (0 doesn't
cause an enumeration because chunk_empty is assigned).

Whether the OOB read then can cause a segmentation fault depends on the
allocator, its alignment rules, and its minimum overhead.  For instance,
with glibc on a typical 64-bit system (8 bytes for pointers and size_t),
the alignment is 16 bytes and the minimum allocated size is 32 bytes,
with typically 24 that are technically available for data, even if only
0 bytes are allocated (as returned by `malloc_usable_size()`).  So with
an allocation between 1 and 19, we can always safely read 20 bytes.

Assuming that other allocators behave similar for small allocations, it
seems unlikely that this causes a crash.

Fixes: 15612b3a42 ("Add support for IKEv2 OCSP extensions (RFC 4806)")
2026-04-02 08:17:05 +02:00
Tobias Brunner 20b07f2cbf vici: Prevent uninitialized memory access if VICI_LIST_ITEM is too short
If there is only a single length byte, `value` is not changed and points
to uninitialized data.
2026-04-02 08:17:05 +02:00
Tobias Brunner 513f25ce12 tnccs_11: Avoid crash if TNCCS-ReasonStrings is empty or only contains empty nodes
`xmlNodeGetContent()` returns `NULL` if `child` is `NULL`, which causes
a segmentation fault in `chunk_from_str()`.

Fixes: ec1eab0319 ("fixed XML parsing of TNCCS 1.1 ReasonString message")
2026-04-02 08:17:05 +02:00
Tobias Brunner 65fcf08cdb eap-sim: Prevent infinite loop if version list contains more than one entry
Fixes: ac4dd5439b ("Migrated EAP-SIM to libsimaka, separated server/peer implementations")
2026-04-02 08:17:04 +02:00
Tobias Brunner 7b0190cb26 revocation: Fix memory leak if nonce in OCSP response doesn't match 2026-04-02 08:17:04 +02:00
Tobias Brunner 1e1dd2976d message: Drop fragments with total fragment count lower than before
The RFC only allows that the number of fragments increases (if the
sender reduces the MTU).

Not enforcing this before could cause early reassembly as the trigger was
that the number of received fragments matches the total count of the
current packet (which was a bit weird anyway).  Only an active MITM could
trigger this as individual fragments are encrypted and authenticated.
2026-04-02 08:17:04 +02:00
Tobias Brunner 06e5462a4b credential-factory: Enforce an upper limit when creating nested credentials
This mainly intended as defense-in-depth measure to avoid parsing
massively nested structures that could cause a call stack overflow due
to the massive recursion.  In particular PKCS#7 signed data is prone to
this as these can be nested basically infinitely.  When used in IKEv1 via
ENC_PKCS7_WRAPPED_X509 CERT payloads, our default of 10000 bytes for IKE
messages guards against this, but that's configurable and there might be
a chance for some bug that triggers problematic recursive parsing for
smaller input.

The upper limit is chosen arbitrarily, but there are currently no known
cases that require a depth of more than 10 levels.
2026-04-02 08:16:07 +02:00
Tobias Brunner 236ef93c50 tls-peer: Ensure TLS 1.3 CertificateRequest structure is valid
If nothing was read from the message, the previous code could result in
a crash depending on where `ext.ptr` pointed to, as determined by the
current stack contents.  Since TLS 1.3 is still disabled by default and
this is usually used for TLS-based EAP methods after validating the
IKEv2 server's certificate, the real world impact seems relatively low.

Fixes: 9ef46cfaf9 ("tls-peer: Mutual authentication support for TLS 1.3")
2026-04-02 08:14:29 +02:00
Tobias Brunner e454b4adb3 libsimaka: Prevent out-of-bounds read when parsing attributes with actual length field
These attributes contain a 16-bit length field for the actual length of
the data in bits or bytes, as compared to the length in 4-byte blocks in
the attribute header.  The previous code didn't correctly account for the
length of the fixed header (4 bytes) when it compared the parsed length
to the length in the header.  This could cause an out-of-bounds read of
up to four bytes beyond the end of the attribute/message.

Fixes: f8330d0395 ("Added a libsimaka library with shared message handling code for EAP-SIM/AKA")
2026-04-02 08:14:29 +02:00
Tobias Brunner 0b053e048d nm: Ignore all .gmo files 2026-04-02 07:54:04 +02:00
Tobias Brunner b377a41336 dhcp: Use correct getter for boolean force_server_address option 2026-04-01 19:33:09 +02:00
Tobias Brunner 3c637c7521 openssl: Fix return value if returning EdDSA public key fails 2026-04-01 19:33:09 +02:00
Tobias Brunner 440b7e7940 Use Botan 3.11.1 for tests 2026-04-01 19:33:09 +02:00
Ekaterine Papava 988d777ebb nm: Add Georgian translation
Closes strongswan/strongswan#3041

Signed-off-by: Ekaterine Papava <[email protected]>
2026-04-01 19:31:33 +02:00
Andreas Steffen 1fdcd5b0d3 Ignore tarball checksums and signatures 2026-03-23 17:24:53 +01:00
Andreas Steffen 62f5d17c12 Version bump to 6.0.5 2026-03-23 13:41:52 +01:00
Tobias Brunner 01908d59b0 NEWS: Add info about CVE-2026-25075 2026-03-20 16:28:20 +01:00
Tobias Brunner 73aff21077 eap-ttls: Prevent crash if AVP length header field is invalid
The length field in the AVP header includes the 8 bytes of the header
itself.  Not checking for that and later subtracting it causes an
integer underflow that usually triggers a crash when accessing a
NULL pointer that resulted from the failing chunk_alloc() call because
of the high value.

The attempted allocations for invalid lengths (0-7) are 0xfffffff8,
0xfffffffc, or 0x100000000 (0 on 32-bit hosts), so this doesn't result
in a buffer overflow even if the allocation succeeds.

Fixes: 79f2102cb4 ("implemented server side support for EAP-TTLS")
Fixes: CVE-2026-25075
2026-03-19 16:49:41 +01:00
Tobias Brunner 0fcece9fff Use wolfSSL 5.9.0 for tests 2026-03-19 09:18:08 +01:00
Tobias Brunner b23387a3d6 conf: Install charon-specific snippets also when charon itself is not built
To make the default strongswan.conf, with `load_modular` enabled, work
if charon itself is not built, we enable generating the charon-specific
snippets also for the two other daemons that fall back on reading
options from the `charon` section.
2026-03-17 08:32:34 +01:00
Tobias Brunner 0d10fa6dda conf: Generate and install config snippets also for charon-cmd and charon-nm
This allows easier customization for distributions (e.g. disable some
plugins by default).
2026-03-17 08:08:38 +01:00
Tobias Brunner 9d268feabd github: Use AWS-LC 1.70.0 for tests 2026-03-16 16:39:09 +01:00
Arthur Chan 005a3fb168 fuzz: Add dependency to fuzz RADIUS message parsing
Due to the static build, libcharon will depend on libradius as soon as
eap-radius is enabled even if not actually used.  So in order to avoid
breaking the build of fuzz_ike when enabling this in CIFuzz, enable
it now before adding the actual fuzzer.

Closes strongswan/strongswan#3028

Signed-off-by: Arthur Chan <[email protected]>
2026-03-16 16:37:57 +01:00
Tobias Brunner e535e13079 vici: Prevent uninitialized memory access when finding VICI_END in message
VICI_END (7) shouldn't be encoded in a message.  However, if we encounter
it, we should at least set `out` accordingly so callers can abort the
enumeration.  By not doing so previously and returning TRUE, callers
might access the possibly uninitialized name/value arguments passed to
the enumerator.
2026-03-13 09:35:28 +01:00
Tobias Brunner 358653d06a gmp: Reject public keys with public exponent e < 3
This ensures that we don't load a key with e=1, which basically renders
RSA into a no-op.  Since keys are universally generated with e=65537 and
no reputable CA will sign keys with e=1, allowing this before didn't have
any real world impact.
2026-03-13 09:28:32 +01:00
Andreas Steffen 8fd2c3a3bc Version bump to 6.0.5dr1 2026-03-12 18:37:36 +01:00
Tobias Brunner 6856bfe5bc github: Use AWS-LC 1.69.0 for tests 2026-03-04 16:30:48 +01:00
Dustin Kirkland d6b1574e2a string: Fix -Werror=discarded-qualifiers with GCC 15
GCC 15 tightened its built-in declarations for strchr() and strstr() so
that they now propagate const from their first argument, triggering
-Werror=discarded-qualifiers on three assignments in string.c:

  translate():
    char *match = strchr(from, *pos)
    `from` is const char *, so the result of strchr() is const char *.
    `match` is only used for pointer arithmetic (match - from), so
    declaring it const char * is correct and safe.

  strreplace():
    found = strstr(str, search)         [line ~73]
    found = strstr(pos, search)         [line ~89, while condition]
    `str`/`pos` are derived from a const char * parameter, so strstr()
    returns const char *. `found` is used as a mutable char * later
    (pos = found + slen), consistent with the existing (char*) casts
    already used throughout this function for the same reason.
    Add explicit (char*) casts to match the established pattern.

Closes strongswan/strongswan#3015
2026-03-04 16:28:56 +01:00
Tobias Brunner 77e89bdcdc NEWS: Add news for 6.0.5 2026-03-03 14:58:16 +01:00
Tobias Brunner ec2d1dc911 Use distinct identifier for "command" group in pki/swanctl to fix apidoc 2026-03-02 16:45:01 +01:00
Tobias Brunner 7f9f9bd375 Fixed some typos, courtesy of codespell 2026-03-02 16:30:12 +01:00
Tobias Brunner d5e95342b5 swanctl: Check for conflicts with existing and shared options when registering commands 2026-02-23 11:25:00 +01:00
Tobias Brunner d25b5db9ba pki: Avoid conflict between --verify and --debug
Add shared options to the man page.
2026-02-23 11:24:56 +01:00
Tobias Brunner 9b4bbbbccf swanctl: Check for conflicts with shared options when registering commands
Also suppress errors when pre-processing shared options (this was missing
here but already used in pki).
2026-02-23 11:24:56 +01:00
Tobias Brunner 357296a4d4 swanctl: Avoid conflict between --uninstall and --uri
Also update the man page (including the -V change in the previous commit
and documenting the global options).
2026-02-23 11:24:44 +01:00
Andreas Steffen 3141a5fc4f swanctl: Assigned -V to --version since -v is now used for global --debug 2026-02-22 10:22:19 +01:00
Tobias Brunner 589c74009b stream: Clarify that some methods must not be called from callbacks 2026-02-20 12:44:55 +01:00
seantywork 14cbe0bf24 whitelist: Fix deadlock when handling client disconnection
Calling stream_t::destroy from the stream_t::on_read callback will
block the thread in watcher_t::remove because the FD is currently "in
callback".  A similar issue was fixed in the lookip plugin with
961409b668 ("lookip: Disconnect asynchronously to avoid dead-locking
watcher unregistration").

Fixes: 85ebf6abd4 ("whitelist: Add error handling to socket reads and fix a memory leak")
2026-02-20 12:44:55 +01:00
Tobias Brunner 8a6f9ba70e kernel-netlink: Don't fallback to peer address as gateway/nexthop
This doesn't really seem useful (perhaps it was before we started to
configure the outbound interface on our routes). And it can actually
cause the route installation to fail e.g. for routes over point-to-point
interfaces where we'd get "Error: Nexthop has invalid gateway" errors.

Note that we can't return NULL if we find an interface as e.g. the updown
plugin uses this method to determine the outbound interface (it ignores
the nexthop), which it passes to the script.  If we returned NULL, it
would pass "unknown" instead, which would cause the firewall rules to
mismatch.  While it seems that 0.0.0.0/:: is ignored as nexthop by the
kernel on the installed route, I still explicitly ignore such addresses
to avoid any unintended side-effects.

The automatic route installation in the ikev2/shunt-manual-prio scenario
had to be disabled on the clients.  The reason is that the route in table
220 won't have a nexthop set (the peers are directly connected), so when
trying to reach alice or venus via SSH, which matches the port-specific
bypass policies for which we don't install throw routes, the hosts will
do ARP requests for the target IPs instead of routing the packets via
moon.

Closes strongswan/strongswan#2548
2026-02-20 12:44:55 +01:00