First published: Fri Sep 22 2023(Updated: )
### Summary In the AES GCM implementation of decrypt_in_place_detached, the decrypted ciphertext (i.e. the correct plaintext) is exposed even if tag verification fails. ### Impact If a program using the `aes-gcm` crate's `decrypt_in_place*` APIs accesses the buffer after decryption failure, it will contain a decryption of an unauthenticated input. Depending on the specific nature of the program this may enable Chosen Ciphertext Attacks (CCAs) which can cause a catastrophic breakage of the cipher including full plaintext recovery. ### Details As seen in the implementation of [decrypt_in_place_detached](https://docs.rs/aes-gcm/latest/src/aes_gcm/lib.rs.html#309) for AES GCM, if the tag verification fails, an error is returned. Because the decryption of the ciphertext is done in place, the plaintext contents are now exposed via `buffer`. This should ideally not be the case - as noted in page 17 of[ NIST's publication _Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC_](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf): _In Step 8, the result of Step 7 is compared with the authentication tag that was received as an input: if they are identical, then the plaintext is returned; otherwise,FAIL is returned._ This is seems correctly addressed in the [AES GCM SIV implementation](https://docs.rs/aes-gcm-siv/latest/src/aes_gcm_siv/lib.rs.html#307), where the decrypted buffer is encrypted again before the error is returned - this fix is straightforward to implement in AES GCM. To ensure that these types of cases are covered during testing, it would be valuable to add test cases like [23, 24 ](https://github.com/google/wycheproof/blob/master/testvectors/aes_gcm_test.json#L288)etc from [project wycheproof ](https://github.com/google/wycheproof)to ensure that when a bad tag is used, there is an error on decryption _**and**_ that the plaintext value is not exposed. ### PoC To reproduce this issue, I'm using [test case 23](https://github.com/google/wycheproof/blob/master/testvectors/aes_gcm_test.json#L288) from project wycheproof. ```rust let key = GenericArray::from_slice(&hex!("000102030405060708090a0b0c0d0e0f")); let nonce = GenericArray::from_slice(&hex!("505152535455565758595a5b")); let tag = GenericArray::from_slice(&hex!("d9847dbc326a06e988c77ad3863e6083")); // bad tag let mut ct = hex!("eb156d081ed6b6b55f4612f021d87b39"); let msg = hex!("202122232425262728292a2b2c2d2e2f"); let aad = hex!(""); let cipher = Aes128Gcm::new(&key); let _plaintext = cipher.decrypt_in_place_detached(&nonce, &aad, &mut ct, &tag); assert_eq!(ct, msg); ```
Credit: security-advisories@github.com security-advisories@github.com security-advisories@github.com
Affected Software | Affected Version | How to fix |
---|---|---|
Aes-gcm Project Aes-gcm | >=0.10.0<0.10.3 | |
rust/aes-gcm | >=0.10.0<=0.10.2 | 0.10.3 |
Fedoraproject Fedora | =37 | |
Fedoraproject Fedora | =38 | |
Fedoraproject Fedora | =39 |
Sign up to SecAlerts for real-time vulnerability data matched to your software, aggregated from hundreds of sources.
The severity of CVE-2023-42811 is medium with a severity value of 4.7.
If a program using the `aes-gcm` crate's `decrypt_in_place*` APIs accesses the buffer after decryption failure, the decrypted ciphertext (i.e. the correct plaintext) may be exposed.
Versions 0.10.0 to 0.10.2 of aes-gcm are affected by CVE-2023-42811.
To fix CVE-2023-42811, update the aes-gcm crate to version 0.10.3.
More information about CVE-2023-42811 can be found in the following references: [GitHub Advisory](https://github.com/RustCrypto/AEADs/security/advisories/GHSA-423w-p2w9-r7vq), [NVD](https://nvd.nist.gov/vuln/detail/CVE-2023-42811), [aes-gcm Documentation](https://docs.rs/aes-gcm/latest/src/aes_gcm/lib.rs.html#309).