exponenta event banner

Отсутствует переупорядочивание байтов при передаче данных

Различная структура хоста и сети

Описание

Этот дефект возникает, когда функция упорядочения байтов не используется:

  • Перед отправкой данных на сетевой сокет.

  • После получения данных с сетевого сокета.

Риск

Некоторые системные архитектуры реализуют малое упорядочение байтов endian (первый наименее значимый байт), а другие системы реализуют большой endian (первый наиболее значимый байт). Если полнота отправленных данных не соответствует полноте принимающей системы, значение, возвращаемое при считывании данных, является неверным.

Зафиксировать

После получения данных из сокета используйте функцию упорядочивания байтов, такую как ntohl(). Перед отправкой данных на сокет используйте функцию упорядочивания байтов, такую как htonl() .

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>


unsigned int func(int sock, int server)
{
    unsigned int num;   /* assume int is 32-bits */
    if (server)
    {
        /* Server side */
        num = 0x17;
		/* Endianness of server host may not match endianness of network. */
        if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num)) 
        {
            /* Handle error */
        }
        return 0;
    }
    else {
        /* Endianness of client host may not match endianness of network. */
        if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num))  
        {
            /* Handle error */
        }
		
		/* Comparison may be inaccurate */
        if (num> 255)  
        {
            return 255;
        }
        else
        {
            return num;
        }
    }
}
        
      

В этом примере переменная num присвоено шестнадцатеричное значение 0x17 и передается по сети клиенту с сервера. Если хост сервера - это маленький endian, а сеть - большой endian, num передается как 0x17000000. Затем клиент считывает неверное значение для num и сравнивает его с локальным числовым значением.

Коррекция - использовать функцию упорядочения байтов

Перед отправкой num с хоста сервера, использовать htonl() для преобразования из хоста в сетевой порядок байтов. Аналогично, перед чтением num на клиентском хосте, используйте ntohl() для преобразования из сети в порядок байтов хоста.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>

unsigned int func(int sock, int server)
{
    unsigned int num;   /* assume int is 32-bits */
    if (server)
    {
        /* Server side */
        num = 0x17;
		
		/* Convert to network byte order. */
        num = htonl(num); 
        if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num)) 
        {
            /* Handle error */
        }
        return 0;
    }
    else {
        if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num)) 
        {
            /* Handle error */
        }
		
		/* Convert to host byte order. */
        num = ntohl(num); 
        if (num > 255) 
        {
            return 255;
        }
        else
        {
            return num;
        }
    }
} 

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: MISSING_BYTESWAP
Воздействие: среднее
CWE ID: 188, 198
Представлен в R2017b