libressl-2.6.2 is susceptible to an out-of-bounds read: #include <openssl/des.h> int main(void) { char salt[3] = {0xf8, 0xd0, 0x00}; char out[32]; DES_fcrypt("foo", salt, out); }
Place in libressl's fcrypt.c: x=ret[0]=((salt[0] == '\0')?'A':salt[0]); Eswap0=con_salt[x]<<2; // boom ASM: => 0x00007ffff77a6fa8 <+56>: movzbl (%rcx,%rdx,1),%ebp rcx = con_salt rdx = 0xfffffff8 Because salt[0] is -8, x will be 0xfffffff8 due to type promotion and conversion. con_salt[0xfffffff8] is then evaluted, which bombs out. openssl 1.1.x has it fixed (but 1.0.2l does not!) - their commit seems to be 6493e4801e9edbe1ad1e256d4ce9cd55c8aa2242 in https://github.com/openssl/openssl .