[하루한줄] CVE-2024-45751: tgt의 CHAP authentication 우회 취약점

URL

https://seclists.org/oss-sec/2024/q3/254

Target

  • tgt < 1.0.93

Explain

tgt(The Linux target framework)는 iSCSI, iSER 등의 전송 프로토콜을 지원하는 SCSI 타겟 프레임워크입니다.

tgt는 CHAP(Challenge-Handshake Autentication Protocol) 인증을 지원하는데 이때 사용되는 난수(challenge)를 rand 함수를 통해 생성합니다.

static int chap_initiator_auth_create_challenge(struct iscsi_connection *conn)
{
        char *value, *p;
        char text[CHAP_CHALLENGE_MAX * 2 + 8];
        static int chap_id;
        int i;

        [...]

        /*
         * FIXME: does a random challenge length provide any benefits security-
         * wise, or should we rather always use the max. allowed length of
         * 1024 for the (unencoded) challenge?
         */
        conn->auth.chap.challenge_size = (rand() % (CHAP_CHALLENGE_MAX / 2)) + CHAP_CHALLENGE_MAX / 2;

        conn->auth.chap.challenge = malloc(conn->auth.chap.challenge_size);
        if (!conn->auth.chap.challenge)
                return CHAP_TARGET_ERROR;

        p = text;
        strcpy(p, "0x");
        p += 2;
        for (i = 0; i < conn->auth.chap.challenge_size; i++) {
                conn->auth.chap.challenge[i] = rand();
                sprintf(p, "%.2hhx", conn->auth.chap.challenge[i]);
                p += 2;
        }
        text_key_add(conn, "CHAP_C",  text);

        return 0;
}

이때 위와 같이 srand 함수 호출 없이 rand를 사용하는 것을 볼 수 있고 이로 인해 default seed 값이 사용되면서 rand가 반환하는 난수를 예측할 수 있어 취약점이 발생했습니다.

매 인증마다 기본 seed가 사용되면서 인증에 사용되는 challenge 값들과 그 순서가 항상 동일하게 되기 때문에 iSCSI target과 initiator 사이의 통신을 스니핑해서 알아낸 challenge 값을 재사용하는 것으로 CHAP 인증을 우회할 수 있습니다. 인증이 우회되면 공격자는 사용자의 권한으로 iSCSI 타겟을 조작하는 등의 행위가 가능합니다.

Reference