Headline
CVE-2018-14633: security flaw in iscsi target code
A security flaw was found in the chap_server_compute_md5() function in the ISCSI target code in the Linux kernel in a way an authentication request from an ISCSI initiator is processed. An unauthenticated remote attacker can cause a stack buffer overflow and smash up to 17 bytes of the stack. The attack requires the iSCSI target to be enabled on the victim host. Depending on how the target’s code was built (i.e. depending on a compiler, compile flags and hardware architecture) an attack may lead to a system crash and thus to a denial-of-service or possibly to a non-authorized access to data exported by an iSCSI target. Due to the nature of the flaw, privilege escalation cannot be fully ruled out, although we believe it is highly unlikely. Kernel versions 4.18.x, 4.14.x and 3.10.x are believed to be vulnerable.
oss-sec mailing list archives****CVE-2018-14633: Linux kernel: security flaw in iscsi target code
From: Vladis Dronov <vdronov () redhat com>
Date: Mon, 24 Sep 2018 06:03:44 -0400 (EDT)
Heololo,
“Vincent Pelletier” <plr.vincent () gmail com> has found a security flaw in the chap_server_compute_md5() function in the ISCSI target code in the Linux kernel in a way an authentication request from an ISCSI initiator is processed. An unauthenticated remote attacker can cause a stack buffer overflow and smash up to 17 bytes of the stack. The attack requires the iSCSI target to be enabled on the victim host.
This flaw was assigned a CVE-ID of CVE-2018-14633 and I would suggest to use it in the future communications re: this:
https://bugzilla.redhat.com/show_bug.cgi?id=1626035
The suggested patches:
https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?h=4.19/scsi-fixes&id=1816494330a83f2a064499d8ed2797045641f92c
https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?h=4.19/scsi-fixes&id=8c39e2699f8acb2e29782a834e56306da24937fe
The impact analysis follows. The flaw resides in this code:
[drivers/target/iscsi/iscsi_target_auth.h] #define CHAP_CHALLENGE_LENGTH 16 #define MD5_SIGNATURE_SIZE 16 /* 16 bytes in a MD5 message digest */ #define MAX_RESPONSE_LENGTH 64 /* sufficient for MD5 */ #define MAX_CHAP_N_SIZE 512
[drivers/target/iscsi/iscsi_target_auth.c] static int chap_server_compute_md5( … char *nr_in_ptr, char *nr_out_ptr, … ) { … unsigned char client_digest[MD5_SIGNATURE_SIZE]; unsigned char server_digest[MD5_SIGNATURE_SIZE]; unsigned char chap_r[MAX_RESPONSE_LENGTH]; … if (extract_param(nr_in_ptr, "CHAP_R", MAX_RESPONSE_LENGTH, chap_r, &type) < 0) { …exit… } … chap_string_to_hex(client_digest, chap_r, strlen(chap_r)); … // int crypto_shash_finup(struct shash_desc *desc, const u8 *data, // unsigned int len, u8 *out) // note, server_digest is *out ret = crypto_shash_finup(desc, chap->challenge, CHAP_CHALLENGE_LENGTH, server_digest); … chap_binaryhex_to_asciihex(response, server_digest, MD5_SIGNATURE_SIZE);
Here chap_string_to_hex() (which basically does hex2bin()) can have max 64-bytes input string, then it converts the input to a 32-bytes binary string and writes it plus the trailing \0 to the 16-bytes on-stack buffer client_digest[], making this a classical buffer overflow.
chap_r is attacker-controlled, the question is what an attack can overwrite. The overwrite can be 16 bytes + zero byte. Checking what is where on the stack in, for example, RHEL-7/x86_64, server_digest[] and the 1st byte of response[] can be overwritten. According to the code, server_digest[] and response[] are not used after the overwrite and are filled with correct values later by the crypto_shash_finup() and the chap_binaryhex_to_asciihex().
This means the flaw has no impact on the RHEL-7/x86_64 systems.
Depending on how the other distriutions’ kernel is built (i.e. depending on a compiler, compiler flags and hardware architecture) a compiler may put other local variables or function arguments on the stack after the client_digest. This may lead to different outcomes, like chap_server_compute_md5() may erroneously return with a result of a successful authentication by rewriting auth_ret, and so expose all the target’s content to an attacker. Or, if nr_out_ptr is overwritten, this can damage other kernel memory content via later sprintf() and thus lead to a system crash.
At last, with distribution kernels where stack canary is disabled the overwrite may corrupt a return pointer, saved registers and other function’s stack frame. Due to this, privilege escalation cannot be fully ruled out, although we believe this is highly unlikely.
Best regards, Vladis Dronov | Red Hat, Inc. | Product Security Engineer
Current thread:
- CVE-2018-14633: Linux kernel: security flaw in iscsi target code Vladis Dronov (Sep 24)