summaryrefslogtreecommitdiffstats
path: root/crypto/include/internal/bn_int.h
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-02-22 10:27:18 +0000
committerMatt Caswell <matt@openssl.org>2016-02-29 16:32:18 +0000
commit99ba9fd02fd481eb971023a3a0a251a37eb87e4c (patch)
tree131030cfec9639b7309183ca1db2c510f2c256bc /crypto/include/internal/bn_int.h
parent15e58273da866e47832ee46ef3023beeefb870a9 (diff)
Fix BN_hex2bn/BN_dec2bn NULL ptr/heap corruption
In the BN_hex2bn function the number of hex digits is calculated using an int value |i|. Later |bn_expand| is called with a value of |i * 4|. For large values of |i| this can result in |bn_expand| not allocating any memory because |i * 4| is negative. This leaves ret->d as NULL leading to a subsequent NULL ptr deref. For very large values of |i|, the calculation |i * 4| could be a positive value smaller than |i|. In this case memory is allocated to ret->d, but it is insufficiently sized leading to heap corruption. A similar issue exists in BN_dec2bn. This could have security consequences if BN_hex2bn/BN_dec2bn is ever called by user applications with very large untrusted hex/dec data. This is anticipated to be a rare occurrence. All OpenSSL internal usage of this function uses data that is not expected to be untrusted, e.g. config file data or application command line arguments. If user developed applications generate config file data based on untrusted data then it is possible that this could also lead to security consequences. This is also anticipated to be a rare. Issue reported by Guido Vranken. CVE-2016-0797 Reviewed-by: Andy Polyakov <appro@openssl.org>
Diffstat (limited to 'crypto/include/internal/bn_int.h')
-rw-r--r--crypto/include/internal/bn_int.h3
1 files changed, 1 insertions, 2 deletions
diff --git a/crypto/include/internal/bn_int.h b/crypto/include/internal/bn_int.h
index a7c0fd4879..8ea5193606 100644
--- a/crypto/include/internal/bn_int.h
+++ b/crypto/include/internal/bn_int.h
@@ -56,13 +56,12 @@
# define HEADER_BN_INT_H
# include <openssl/bn.h>
+# include <limits.h>
#ifdef __cplusplus
extern "C" {
#endif
-# define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\
- (a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2))
BIGNUM *bn_wexpand(BIGNUM *a, int words);
BIGNUM *bn_expand2(BIGNUM *a, int words);