CPE, qui signifie Common Platform Enumeration, est un système normalisé de dénomination du matériel, des logiciels et des systèmes d'exploitation. CPE fournit un schéma de dénomination structuré pour identifier et classer de manière unique les systèmes informatiques, les plates-formes et les progiciels sur la base de certains attributs tels que le fournisseur, le nom du produit, la version, la mise à jour, l'édition et la langue.
CWE, ou Common Weakness Enumeration, est une liste complète et une catégorisation des faiblesses et des vulnérabilités des logiciels. Elle sert de langage commun pour décrire les faiblesses de sécurité des logiciels au niveau de l'architecture, de la conception, du code ou de la mise en œuvre, qui peuvent entraîner des vulnérabilités.
CAPEC, qui signifie Common Attack Pattern Enumeration and Classification (énumération et classification des schémas d'attaque communs), est une ressource complète, accessible au public, qui documente les schémas d'attaque communs utilisés par les adversaires dans les cyberattaques. Cette base de connaissances vise à comprendre et à articuler les vulnérabilités communes et les méthodes utilisées par les attaquants pour les exploiter.
Services & Prix
Aides & Infos
Recherche de CVE id, CWE id, CAPEC id, vendeur ou mots clés dans les CVE
Multiple integer signedness errors in crypto/buffer/buffer.c in OpenSSL 0.9.8v allow remote attackers to conduct buffer overflow attacks, and cause a denial of service (memory corruption) or possibly have unspecified other impact, via crafted DER data, as demonstrated by an X.509 certificate or an RSA public key. NOTE: this vulnerability exists because of an incomplete fix for CVE-2012-2110.
Category : Numeric Errors Weaknesses in this category are related to improper calculation or conversion of numbers.
Métriques
Métriques
Score
Gravité
CVSS Vecteur
Source
V2
7.5
AV:N/AC:L/Au:N/C:P/I:P/A:P
nvd@nist.gov
EPSS
EPSS est un modèle de notation qui prédit la probabilité qu'une vulnérabilité soit exploitée.
Score EPSS
Le modèle EPSS produit un score de probabilité compris entre 0 et 1 (0 et 100 %). Plus la note est élevée, plus la probabilité qu'une vulnérabilité soit exploitée est grande.
Date
EPSS V0
EPSS V1
EPSS V2 (> 2022-02-04)
EPSS V3 (> 2025-03-07)
EPSS V4 (> 2025-03-17)
2022-02-06
–
–
7.56%
–
–
2022-03-27
–
–
7.56%
–
–
2022-04-03
–
–
7.56%
–
–
2022-07-17
–
–
7.56%
–
–
2022-07-24
–
–
7.56%
–
–
2022-07-31
–
–
7.56%
–
–
2022-08-07
–
–
7.56%
–
–
2022-08-21
–
–
7.56%
–
–
2023-01-01
–
–
7.56%
–
–
2023-01-08
–
–
7.56%
–
–
2023-03-12
–
–
–
9.72%
–
2024-02-11
–
–
–
9.72%
–
2024-06-02
–
–
–
9.72%
–
2024-10-27
–
–
–
10.52%
–
2024-12-15
–
–
–
11.51%
–
2024-12-22
–
–
–
11.16%
–
2025-01-19
–
–
–
11.16%
–
2025-03-18
–
–
–
–
4.66%
2025-03-30
–
–
–
–
5.34%
2025-03-30
–
–
–
–
5.34,%
Percentile EPSS
Le percentile est utilisé pour classer les CVE en fonction de leur score EPSS. Par exemple, une CVE dans le 95e percentile selon son score EPSS est plus susceptible d'être exploitée que 95 % des autres CVE. Ainsi, le percentile sert à comparer le score EPSS d'une CVE par rapport à d'autres CVE.
Date de publication : 2012-04-18 22h00 +00:00 Auteur : Tavis Ormandy EDB Vérifié : Yes
Incorrect integer conversions in OpenSSL can result in memory corruption.
--------------------------------------------------------------------------
CVE-2012-2110
This advisory is intended for system administrators and developers exposing
OpenSSL in production systems to untrusted data.
asn1_d2i_read_bio in OpenSSL contains multiple integer errors that can cause
memory corruption when parsing encoded ASN.1 data. This error can be exploited
on systems that parse untrusted data, such as X.509 certificates or RSA public
keys.
The following context structure from asn1.h is used to record the current state
of the decoder:
typedef struct asn1_const_ctx_st
{
const unsigned char *p;/* work char pointer */
int eos; /* end of sequence read for indefinite encoding */
int error; /* error code to use when returning an error */
int inf; /* constructed if 0x20, indefinite is 0x21 */
int tag; /* tag from last 'get object' */
int xclass; /* class from last 'get object' */
long slen; /* length of last 'get object' */
const unsigned char *max; /* largest value of p allowed */
const unsigned char *q;/* temporary variable */
const unsigned char **pp;/* variable */
int line; /* used in error processing */
} ASN1_const_CTX;
These members are populated via calls to ASN1_get_object and asn1_get_length
which have the following prototypes
int ASN1_get_object(const unsigned char **pp,
long *plength,
int *ptag,
int *pclass,
long omax);
int asn1_get_length(const unsigned char **pp,
int *inf,
long *rl,
int max);
The lengths are always stored as signed longs, however, asn1_d2i_read_bio
casts ASN1_const_CTX->slen to a signed int in multiple locations. This
truncation can result in numerous conversion problems.
The most visible example on x64 is this cast incorrectly interpreting the
result of asn1_get_length.
222 /* suck in c.slen bytes of data */
223 want=(int)c.slen;
A simple way to demonstrate this is to prepare a DER certificate that contains
a length with the 31st bit set, like so
$ dumpasn1 testcase.crt
0 NDEF: [PRIVATE 3] {
2 2147483648: [1]
...
}
Breakpoint 2, asn1_d2i_read_bio (in=0x9173a0, pb=0x7fffffffd8f0) at a_d2i_fp.c:224
224 if (want > (len-off))
(gdb) list
219 }
220 else
221 {
222 /* suck in c.slen bytes of data */
223 want=(int)c.slen;
224 if (want > (len-off))
225 {
226 want-=(len-off);
227 if (!BUF_MEM_grow_clean(b,len+want))
228 {
(gdb) p c.slen
$18 = 2147483648
(gdb) p want
$19 = -2147483648
This results in an inconsistent state, and will lead to memory corruption.
--------------------
Affected Software
------------------------
All versions of OpenSSL on all platforms up to and including version 1.0.1 are
affected.
Some attack vectors require an I32LP64 architecture, others do not.
--------------------
Consequences
-----------------------
In order to explore the subtle problems caused by this, an unrelated bug in the
OpenSSL allocator wrappers must be discussed.
It is generally expected that the realloc standard library routine should support
reducing the size of a buffer, as well as increasing it. As ISO C99 states "The
realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. The contents of the
new object shall be the same as that of the old object prior to deallocation,
up to the lesser of the new and old sizes."
However, the wrapper routines from OpenSSL do not support shrinking a buffer,
due to this code:
void *CRYPTO_realloc_clean(void *str, int old_len, int num, const char *file, int line)
{
/* ... */
ret=malloc_ex_func(num,file,line);
if(ret)
{
memcpy(ret,str,old_len);
OPENSSL_cleanse(str,old_len);
free_func(str);
}
/* ... */
return ret;
}
The old data is always copied over, regardless of whether the new size will be
enough. This allows us to turn this truncation into what is effectively:
memcpy(heap_buffer, <attacker controlled buffer>, <attacker controlled size>);
We can reach this code by simply causing an integer to be sign extended and
truncated multiple times. These two protoypes are relevant:
int BUF_MEM_grow_clean(BUF_MEM *str, size_t len);
void *CRYPTO_realloc_clean(void *str, int old_len, int num, const char *file, int line);
BUF_MEM_grow_clean accepts a size_t, but the subroutine it uses to handle the
allocation only accepts a 32bit signed integer. We can exploit this by
providing a large amount of data to OpenSSL, and causing the length calculation
here to become negative:
/* suck in c.slen bytes of data */
want=(int)c.slen;
if (want > (len-off))
{
want-=(len-off);
if (!BUF_MEM_grow_clean(b,len+want))
{
ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE);
goto err;
}
Because want is a signed int, the sign extension to size_t for
BUF_MEM_grow_clean means an unexpectedly size_t is produced. An
example is probably helpful:
(gdb) bt
#0 asn1_d2i_read_bio (in=0x9173a0, pb=0x7fffffffd8f0) at a_d2i_fp.c:223
#1 0x0000000000524ce8 in ASN1_item_d2i_bio (it=0x62d740, in=0x9173a0, x=0x0) at a_d2i_fp.c:112
#2 0x000000000054c132 in d2i_X509_bio (bp=0x9173a0, x509=0x0) at x_all.c:150
#3 0x000000000043b7a7 in load_cert (err=0x8a1010, file=0x0, format=1, pass=0x0, e=0x0, cert_descrip=0x5ebcc0 "Certificate") at apps.c:819
#4 0x0000000000422422 in x509_main (argc=0, argv=0x7fffffffe458) at x509.c:662
#5 0x00000000004032d9 in do_cmd (prog=0x9123e0, argc=3, argv=0x7fffffffe440) at openssl.c:489
#6 0x0000000000402ee6 in main (Argc=3, Argv=0x7fffffffe440) at openssl.c:381
(gdb) list
218 want=HEADER_SIZE;
219 }
220 else
221 {
222 /* suck in c.slen bytes of data */
223 want=(int)c.slen;
224 if (want > (len-off))
225 {
226 want-=(len-off);
227 if (!BUF_MEM_grow_clean(b,len+want))
(gdb) pt len
type = int
(gdb) pt want
type = int
(gdb) p len
$28 = 1431655797
(gdb) p want
$29 = 2147483646
(gdb) p len+want
$30 = -715827853
(gdb) s
BUF_MEM_grow_clean (str=0x917440, len=18446744072993723763) at buffer.c:133
(gdb) p/x len
$31 = 0xffffffffd5555573
Here len+want wraps to a negative value, which is sign extended to a large
size_t for BUF_MEM_grow_clean. Now the call to CRYPTO_realloc_clean() truncates
this back into a signed int:
CRYPTO_realloc_clean (str=0x7fff85be4010, old_len=1908874388, num=477218632, file=0x626661 "buffer.c", line=149) at mem.c:369
Now old_len > num, which openssl does not handle, resulting in this:
ret = malloc_ex_func(num, file, line);
memcpy(ret, str, old_len);
Effectively a textbook heap overflow. It is likely this code is reachable via
the majority of the d2i BIO interfaces and their wrappers, so most applications
that handle untrusted data via OpenSSL should take action.
Note that even if you do not use d2i_* calls directly, many of the higher level
APIs will use it indirectly for you. Producing DER data to demonstrate this
is relatively easy for both x86 and x64 architectures.
-------------------
Solution
-----------------------
The OpenSSL project has provided an updated version to resolve this issue.
http://www.openssl.org/
http://www.openssl.org/news/secadv_20120419.txt
-------------------
Credit
-----------------------
This bug was discovered by Tavis Ormandy, Google Security Team.
Additional thanks to Adam Langley also of Google for analysis and designing a fix.
--
-------------------------------------
taviso at cmpxchg8b.com | pgp encrypted mail preferred
-------------------------------------------------------