PKCS7_stream: avoid out of bounds access
The inner content of SignedData is represented by a PKCS7 object, which
PKCS7_stream() assumes to be a plain data object and will thus access its
content via an ASN1_OCTET_STRING. This need not be the case after parsing.
In fact, the inner content type is essentially arbitrary.
If the inner content isn't one of the explicitly supported content types,
the fallback (via p7default_tt) will populate the union's d.other with an
ASN1_ANY which unravels to ASN1_TYPE_new() deep in the guts of tasn_dec,
allocating a 16-byte object on LP64 architectures. In that case, the
16-byte object is interpreted as an 24-byte ASN1_OCTET_STRING and if it
isn't NULL, the read+write to os->flags (a long at offset 16) is out of
bounds: os->flags | ASN1_STRING_FLAG_NDEF;
Add a check that the content is actually id-data before accessing the
d.data union member.
From Acts1631
Add test case causing an OOB access in PKCS7_stream
Test case originally from openssl/openssl#31681, exercised via a direct
call to PKCS7_stream() as in a report from Acts1631.
To be fixed in pk7_lib.c r1.33
PKCS7_stream: don't crash on omitted content
Do not access the PKCS7 content union without checking that it's actually
populated. Add NULL checks and fail. Whether that's the correct thing
to do is dubious, but since this has been broken since the "code" was
written a quarter century ago, clearly nobody ever wanted to do that.
Match OpenSSL behavior which also means more NULL checks than strictly
make sense.
CMS_stream() has very similar code, but it's not problematic in this
particular way because the content isn't OPTIONAL.
Part of a diff from Acts1631
"Stream" valid PKCS7 objects with omitted content
The PKCS#7 standard marks the content element of the ContentInfo OPTIONAL.
Accordingly, a PKCS#7 object only containing a Content Type OID is valid:
SEQUENCE {
OBJECT_IDENTIFIER { 1.2.840.113549.1.7.4 }
}
Deserializing such an object works and therefore streaming should at least
have the decency of not segfaulting. Of course there's nothing decent about
PKCS#7 be it the standard or its OpenSSL "implementation".
Exercises a problem reported by Acts1361 and currently crashes.
To be fixed in pk7_lib.c r1.32.
mention that specific files opened by __pledge_open() are only opened
by specific libc functions (with symbol visibility helping us). these fd
are marked UF_PLEDGEOPEN, and the kernel prohibits various operations
on them (basically we are trying to prevent threads from playing with them)
In execve(2), attempt to create a realpath buffer for the executable
and place the resulting string on the stack as an auxval. The two
main reasons why the attempt can fail are if the program is started
inside an unlinked directory or if the buffer exceeds PATH_MAX. libc
will be able to find this auxval and provide it in an uncoming
getexecpath(3) API.
ok kettenis beck kirill
Automatically play nicely with cargo builds when also using the devel/cargo MODULE.
devel/meson must be listed before devel/cargo in MODULES then no other change should be required.
tb@ "loved the diff at first glance"